Autor Tema: Problemas sencillos de programación para resolver  (Leído 19278 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Problemas sencillos de programación para resolver
« en: 26 de Marzo de 2014, 11:55:24 »
Este no es el hilo adecuado, pero es que no hay un subforo para otros lenguajes de programación para PC.

En este blog tratan el tema de qué es lo que piden las empresas cuando buscan programadores:
http://juanmacias.net/2013/01/hay-programadores-en-espana-o-monos/

Casi al final del artículo aparece este sencillo problema, con comentario sobre su dificultad:
Citar
CHOCO-LATE. Escribe un algoritmo en cualquier lenguaje de programación (uno de los 20 que aparecen aqui:http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html ) que cuente del 1 al 100 y que muestre por pantalla “CHOCO” cuando el número sea divisible por 3, “LATE” cuando se divisible por 5 y “CHOCOLATE” cuando sea divisible por 15.

La mayoría de los que respondieron a la pregunta lo hicieron de forma incorrecta y ninguno dio una respuesta mejor o igual a la que había dado yo. Y no fallaron por que no supieran programar, fallaron por que no leyeron correctamente el problema, no hicieron un análisis exhaustivo, simplemente se pusieron a programar.

Bueno, me ha picado la curiosidad y me he puesto a programar en Python una solución:

Código: [Seleccionar]
print "\n".join([str(i)+" "+"CHOCO"*((i%3)==0)+"LATE"*((i%5)==0) for i in range(1,101)])

Saludos.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problemas sencillos de programación para resolver
« Respuesta #1 en: 26 de Marzo de 2014, 12:53:35 »
Me parece que el enunciado puede resultar capcioso.

Uno podría interpetar que, por ejemplo, ante el número 15 podría imprimirse como: CHOCO, CHOCOLATECHOCOLATE o CHOCHOLATE para dicho número, según como interprete el enunciado.

CHOCO resultaría porque el número 15 es divisible por 3, lo que imprimiría CHOCO y dejaría de analizar el resto de las condiciones.

CHOCOLATECHOCOLATE resultaría porque el número 15 cumple las tres condiciones, divisible por 3 (aporta CHOCO), divisible por 5 (aporta LATE) y divisible por 15 (aporta nuevamente CHOCOLATE).

CHOCOLATE resultaría de que al ser el número 15 divisible por 3 y por 5, cada uno aportaría CHOCO y LATE respectivamente, y se omitiría el divisible por 15

Sinceramente creo que es más un truco de la lengua que un verdadero problema algorítimco.

Saludos.
« Última modificación: 26 de Marzo de 2014, 12:58:22 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problemas sencillos de programación para resolver
« Respuesta #2 en: 26 de Marzo de 2014, 13:18:42 »
Por lo que entiendo primero se verifica que sea divisible por 3 y aporta choco y cuando es 5 aporta el late, entonces cuando es 15, ambos aportan y da chocolate.

algo asi:

Código: C
  1. for(int i=1;i<101;i++
  2. {
  3.         if((i%3)==0)printf("Choco");
  4.         if((i%5)==0)printf("late");
  5.         if(((i%5)==0) || ((i%3)==0))printf("\n");
  6. }


aunque también podría ser choco+late+chocolate por el 3,5 y 15.
"Nada es imposible, no si puedes imaginarlo"

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 936
Re: Problemas sencillos de programación para resolver
« Respuesta #3 en: 26 de Marzo de 2014, 13:52:41 »
Comparto Plenamente lo dicho por Bruno.

El enunciado no es del todo claro en al menos indicar que en caso de ser divisible por 3 y por 5 ( en cuyo caso es divisible también por 15) si se desea que obtenga CHOCOLATE o en su defecto CHOCOLATECHOCOLATE por cumplir con lo solicitado.

Aunque también comparto que en muchos casos el programador se pone a programar sin tratar de comprender bien cual es el problema planteado.

Salud  8)


Me parece que el enunciado puede resultar capcioso.

Uno podría interpetar que, por ejemplo, ante el número 15 podría imprimirse como: CHOCO, CHOCOLATECHOCOLATE o CHOCHOLATE para dicho número, según como interprete el enunciado.

CHOCO resultaría porque el número 15 es divisible por 3, lo que imprimiría CHOCO y dejaría de analizar el resto de las condiciones.

CHOCOLATECHOCOLATE resultaría porque el número 15 cumple las tres condiciones, divisible por 3 (aporta CHOCO), divisible por 5 (aporta LATE) y divisible por 15 (aporta nuevamente CHOCOLATE).

CHOCOLATE resultaría de que al ser el número 15 divisible por 3 y por 5, cada uno aportaría CHOCO y LATE respectivamente, y se omitiría el divisible por 15

Sinceramente creo que es más un truco de la lengua que un verdadero problema algorítimco.

Saludos.
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Problemas sencillos de programación para resolver
« Respuesta #4 en: 26 de Marzo de 2014, 14:12:57 »
Otra versión del mismo programa publicado en esta página:
http://skiel85.blogspot.com.es/2010/02/entrevistas-con-tests-de-programacion.html

Citar
Escriba un programa que imprima los números del 1 al 100. Pero para los múltiplos de 3 imprima "Fizz" en lugar del número y para los múltiplos de 5 imprima "Buzz". Para los números que son múltiplos de ambos imprima "FizzBuzz"

Saludos.
« Última modificación: 26 de Marzo de 2014, 14:21:00 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Problemas sencillos de programación para resolver
« Respuesta #5 en: 26 de Marzo de 2014, 14:13:23 »
 Solución en Python:

Código: [Seleccionar]
for i in range(1, 101):
    a = ((i%3)==0)
    b = ((i%5)==0)
    if a or b: print "Fizz" * a + "Buzz" * b
    else: print i

Resultado:
Código: [Seleccionar]
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
« Última modificación: 26 de Marzo de 2014, 14:20:34 por Picuino »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problemas sencillos de programación para resolver
« Respuesta #6 en: 26 de Marzo de 2014, 14:15:55 »
Otra versión del mismo programa:

http://skiel85.blogspot.com.es/2010/02/entrevistas-con-tests-de-programacion.html

Citar
Escriba un programa que imprima los números del 1 al 100. Pero para los múltiplos de 3 imprima "Fizz" en lugar del número y para los múltiplos de 5 imprima "Buzz". Para los números que son múltiplos de ambos imprima "FizzBuzz"

Saludos.


en esa versión si se entiende que solo sería una vez la palabra cuando sea múltiplo de 15, tambien dice que se debe imprimir el número, así esta mejor redactado
"Nada es imposible, no si puedes imaginarlo"

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problemas sencillos de programación para resolver
« Respuesta #7 en: 26 de Marzo de 2014, 14:18:46 »
un mejor test que esos sería el del concurso que hizo Nocturno, y que queden contratados solo los primeros lugares  :mrgreen:

http://www.micropic.es/mpblog/2013/06/resultados-primer-concurso-de-programacion-numeros-romanos/.
"Nada es imposible, no si puedes imaginarlo"

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Problemas sencillos de programación para resolver
« Respuesta #8 en: 26 de Marzo de 2014, 14:28:02 »
Una página que te hace test para conocer tus habilidades como programador:
https://codility.com/c/intro/demo9YYR32-7XK

Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Problemas sencillos de programación para resolver
« Respuesta #9 en: 26 de Marzo de 2014, 14:40:29 »
A ver quien se atreve con este programa un poco complejo:

Hay que ordenar la siguiente lista de 500 números aleatorios:
Código: [Seleccionar]
1497
2094
8094
3331
1126
0736
5999
9688
3593
3353
3555
9778
4371
2817
9020
2504
6217
2796
8904
0764
6700
4105
4468
8504
3201
7426
8780
7518
8846
6228
3026
2895
3145
1950
4887
0542
8124
3730
7725
4798
8733
1024
7326
0669
5985
4882
5867
2991
4641
1964
9245
0501
6406
9280
7916
9477
7166
5616
5183
6264
1024
6136
1894
2402
6529
9646
9749
1208
0909
6844
7741
2101
8181
8332
1594
9510
9052
1812
1105
3009
5306
4086
6918
5059
6416
7600
7700
4758
7016
3580
7689
5376
7879
1153
0945
8274
0790
8415
9890
1811
5117
5787
3264
6903
0555
1337
5062
5881
3592
5533
6056
9723
5849
0352
7148
6921
4568
2615
7105
4869
4685
2987
0086
6671
8651
3713
6700
5162
6996
8931
7627
1921
6782
2964
1723
2496
6492
1102
3194
6286
9070
8809
8284
3924
6185
6910
9044
4132
0421
6176
0003
4527
7189
0268
7978
3881
2497
1252
2330
4674
6657
3652
7182
1810
2569
1545
1963
3168
3266
6167
9575
0200
7064
3931
6748
8158
4523
2391
4649
4348
8598
3430
4983
9916
5575
2091
5675
8954
0761
3242
7649
3842
6078
1123
8144
1939
4487
6824
5786
4455
9169
2353
7104
0014
3532
6235
3737
3446
8497
1608
5947
9078
0411
9139
2823
3858
7542
2447
0629
0799
0932
2034
7641
6301
9415
0024
8822
4243
5918
7770
3517
3742
8472
9127
3351
8108
6206
9826
9462
3508
0094
8209
5372
9358
0223
7268
9840
8529
0771
3572
9937
7143
3051
8448
5031
4636
8590
3294
5210
5741
3634
9242
8400
5990
8113
1154
1555
5658
9085
9179
8736
4712
6754
5967
6848
7139
9501
6505
5333
3315
7737
7527
5977
6657
2070
1140
5534
9133
7690
5258
6915
0792
9924
9933
9601
5346
9188
2199
1091
7259
4932
0242
8314
8326
1129
7811
1933
4677
4867
3075
3132
0810
9029
0727
9055
5940
1442
5141
0459
0627
9792
3026
8012
8760
5954
2642
2583
7230
3431
2174
8984
4221
2782
7529
6415
2073
9761
5659
6208
0559
3602
6420
5917
0489
4267
0675
4343
4515
3388
5903
7493
3408
5463
7913
7004
1043
5956
8239
4803
6724
6532
8070
0550
7118
2546
4519
7225
7742
9187
6297
8010
0691
0027
2058
4568
5860
2821
9680
5322
3375
7767
2586
8182
0500
2286
9836
4814
5092
0969
7444
5085
0487
8035
3482
4246
0361
7185
3827
6742
6705
4416
2750
0989
4263
9161
7310
6412
5782
1174
0307
4382
0464
7345
5385
5629
0465
8815
2334
9408
1466
3045
8856
4975
5449
1861
7048
9815
8885
5492
5345
3349
6925
6863
1659
6273
8183
0341
3461
0952
2726
6124
3483
6073
1571
4614
8278
3868
7124
8762
8298
5478
6643
7519
9364
4932
2554
1261
9594
7183
0345
3712
6647
9640
0370
8654
4381
7962
4694
2931
5007
0685
6414
5349
4396
5994
7944
5011
2190
3240
9377
4256
8256
6413
9956
2922
1004
2709
0215
5639
7081
8260
2812
6636
2429
4114
4715
6381
6933
2137
0378

Para que podamos comparar algoritmos con diferentes lenguajes de programación, el tiempo de ejecución se debe contar de la siguiente manera:
Cada vez que comparemos dos números, se suma uno a la variable tics
Cada vez que se copie un número a otra posición, se suma uno a la variable tics
Al final del programa, el que menos tics tenga es el algoritmo más eficiente.

Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Problemas sencillos de programación para resolver
« Respuesta #10 en: 26 de Marzo de 2014, 15:06:22 »
Una solución en python con el algoritmo de selección directa (es un algoritmo lento):

Comparaciones = 124750
Movimientos = 1497
Tics = 126247

Código: Python
  1. """Algoritmo de ordenacion de datos por Seleccion directa"""
  2. def seleccion_directa(datos):
  3.    comps = 0
  4.    moves = 0
  5.    for i in range(0, len(datos)-1):
  6.       min_data = i
  7.       for j in range(i+1, len(datos)):
  8.          comps += 1
  9.          if datos[j] < datos[min_data]:
  10.             min_data = j
  11.       moves += 3
  12.       temp = datos[i]
  13.       datos[i] = datos[min_data]
  14.       datos[min_data] = temp
  15.      
  16.    return comps, moves
  17.  
  18.  
  19. datos = [
  20.    1497, 2094, 8094, 3331, 1126, 0736, 5999, 9688, 3593, 3353,
  21.    3555, 9778, 4371, 2817, 9020, 2504, 6217, 2796, 8904, 0764,
  22.    6700, 4105, 4468, 8504, 3201, 7426, 8780, 7518, 8846, 6228,
  23.    3026, 2895, 3145, 1950, 4887, 0542, 8124, 3730, 7725, 4798,
  24.    8733, 1024, 7326,  669, 5985, 4882, 5867, 2991, 4641, 1964,
  25.    9245, 0501, 6406, 9280, 7916, 9477, 7166, 5616, 5183, 6264,
  26.    1024, 6136, 1894, 2402, 6529, 9646, 9749, 1208,  909, 6844,
  27.    7741, 2101, 8181, 8332, 1594, 9510, 9052, 1812, 1105, 3009,
  28.    5306, 4086, 6918, 5059, 6416, 7600, 7700, 4758, 7016, 3580,
  29.    7689, 5376, 7879, 1153,  945, 8274,  790, 8415, 9890, 1811,
  30.    5117, 5787, 3264, 6903,  555, 1337, 5062, 5881, 3592, 5533,
  31.    6056, 9723, 5849, 0352, 7148, 6921, 4568, 2615, 7105, 4869,
  32.    4685, 2987,   86, 6671, 8651, 3713, 6700, 5162, 6996, 8931,
  33.    7627, 1921, 6782, 2964, 1723, 2496, 6492, 1102, 3194, 6286,
  34.    9070, 8809, 8284, 3924, 6185, 6910, 9044, 4132, 0421, 6176,
  35.    0003, 4527, 7189,  268, 7978, 3881, 2497, 1252, 2330, 4674,
  36.    6657, 3652, 7182, 1810, 2569, 1545, 1963, 3168, 3266, 6167,
  37.    9575, 0200, 7064, 3931, 6748, 8158, 4523, 2391, 4649, 4348,
  38.    8598, 3430, 4983, 9916, 5575, 2091, 5675, 8954, 0761, 3242,
  39.    7649, 3842, 6078, 1123, 8144, 1939, 4487, 6824, 5786, 4455,
  40.    9169, 2353, 7104, 0014, 3532, 6235, 3737, 3446, 8497, 1608,
  41.    5947, 9078, 0411, 9139, 2823, 3858, 7542, 2447,  629,  799,
  42.     932, 2034, 7641, 6301, 9415, 0024, 8822, 4243, 5918, 7770,
  43.    3517, 3742, 8472, 9127, 3351, 8108, 6206, 9826, 9462, 3508,
  44.      94, 8209, 5372, 9358, 0223, 7268, 9840, 8529,  771, 3572,
  45.    9937, 7143, 3051, 8448, 5031, 4636, 8590, 3294, 5210, 5741,
  46.    3634, 9242, 8400, 5990, 8113, 1154, 1555, 5658, 9085, 9179,
  47.    8736, 4712, 6754, 5967, 6848, 7139, 9501, 6505, 5333, 3315,
  48.    7737, 7527, 5977, 6657, 2070, 1140, 5534, 9133, 7690, 5258,
  49.    6915,  792, 9924, 9933, 9601, 5346, 9188, 2199, 1091, 7259,
  50.    4932,  242, 8314, 8326, 1129, 7811, 1933, 4677, 4867, 3075,
  51.    3132,  810, 9029,  727, 9055, 5940, 1442, 5141,  459,  627,
  52.    9792, 3026, 8012, 8760, 5954, 2642, 2583, 7230, 3431, 2174,
  53.    8984, 4221, 2782, 7529, 6415, 2073, 9761, 5659, 6208,  559,
  54.    3602, 6420, 5917,  489, 4267, 0675, 4343, 4515, 3388, 5903,
  55.    7493, 3408, 5463, 7913, 7004, 1043, 5956, 8239, 4803, 6724,
  56.    6532, 8070,  550, 7118, 2546, 4519, 7225, 7742, 9187, 6297,
  57.    8010,  691,   27, 2058, 4568, 5860, 2821, 9680, 5322, 3375,
  58.    7767, 2586, 8182, 0500, 2286, 9836, 4814, 5092,  969, 7444,
  59.    5085,  487, 8035, 3482, 4246, 0361, 7185, 3827, 6742, 6705,
  60.    4416, 2750,  989, 4263, 9161, 7310, 6412, 5782, 1174, 0307,
  61.    4382, 0464, 7345, 5385, 5629, 0465, 8815, 2334, 9408, 1466,
  62.    3045, 8856, 4975, 5449, 1861, 7048, 9815, 8885, 5492, 5345,
  63.    3349, 6925, 6863, 1659, 6273, 8183,  341, 3461,  952, 2726,
  64.    6124, 3483, 6073, 1571, 4614, 8278, 3868, 7124, 8762, 8298,
  65.    5478, 6643, 7519, 9364, 4932, 2554, 1261, 9594, 7183, 0345,
  66.    3712, 6647, 9640,  370, 8654, 4381, 7962, 4694, 2931, 5007,
  67.     685, 6414, 5349, 4396, 5994, 7944, 5011, 2190, 3240, 9377,
  68.    4256, 8256, 6413, 9956, 2922, 1004, 2709, 0215, 5639, 7081,
  69.    8260, 2812, 6636, 2429, 4114, 4715, 6381, 6933, 2137,  378,
  70. ]
  71.  
  72.  
  73. #main program
  74. comps, moves = seleccion_directa(datos)
  75. print "Comparaciones =", comps
  76. print "Movimientos =", moves
  77. print "Tics =", comps + moves
  78. print "Datos = [\n  ",
  79. print "".join(["%04d" % datos[i] + ", " + "\n   "*((i+1)%10==0) for i in range(0, len(datos))]),
  80. print "]"


Resultado:

Código: [Seleccionar]
Comparaciones = 124750
Movimientos = 1497
Tics = 126247
Datos = [
   0003, 0012, 0020, 0027, 0086, 0094, 0128, 0141, 0147, 0199,
   0229, 0234, 0241, 0242, 0265, 0268, 0273, 0308, 0309, 0320,
   0321, 0341, 0354, 0370, 0378, 0445, 0459, 0478, 0487, 0489,
   0497, 0500, 0550, 0555, 0559, 0627, 0629, 0669, 0685, 0691,
   0727, 0771, 0790, 0792, 0799, 0810, 0909, 0932, 0945, 0952,
   0969, 0989, 1004, 1024, 1024, 1043, 1091, 1102, 1105, 1123,
   1126, 1129, 1140, 1153, 1154, 1174, 1208, 1252, 1261, 1337,
   1442, 1466, 1497, 1545, 1555, 1571, 1594, 1608, 1659, 1723,
   1810, 1811, 1812, 1861, 1894, 1921, 1933, 1939, 1950, 1963,
   1964, 2034, 2058, 2070, 2073, 2091, 2094, 2101, 2137, 2174,
   2190, 2199, 2286, 2330, 2334, 2353, 2391, 2402, 2429, 2447,
   2496, 2497, 2504, 2546, 2554, 2569, 2583, 2586, 2615, 2642,
   2709, 2726, 2750, 2782, 2796, 2812, 2817, 2821, 2823, 2895,
   2922, 2931, 2964, 2987, 2991, 3009, 3026, 3026, 3045, 3051,
   3075, 3132, 3145, 3168, 3194, 3201, 3240, 3242, 3264, 3266,
   3294, 3315, 3331, 3349, 3351, 3353, 3375, 3388, 3408, 3430,
   3431, 3446, 3461, 3482, 3483, 3508, 3517, 3532, 3555, 3572,
   3580, 3592, 3593, 3602, 3634, 3652, 3712, 3713, 3730, 3737,
   3742, 3827, 3842, 3858, 3868, 3881, 3924, 3931, 4086, 4105,
   4114, 4132, 4221, 4243, 4246, 4256, 4263, 4267, 4343, 4348,
   4371, 4381, 4382, 4396, 4416, 4455, 4468, 4487, 4515, 4519,
   4523, 4527, 4568, 4568, 4614, 4636, 4641, 4649, 4674, 4677,
   4685, 4694, 4712, 4715, 4758, 4798, 4803, 4814, 4867, 4869,
   4882, 4887, 4932, 4932, 4975, 4983, 5007, 5011, 5031, 5059,
   5062, 5085, 5092, 5117, 5141, 5162, 5183, 5210, 5258, 5306,
   5322, 5333, 5345, 5346, 5349, 5372, 5376, 5385, 5449, 5463,
   5478, 5492, 5533, 5534, 5575, 5616, 5629, 5639, 5658, 5659,
   5675, 5741, 5782, 5786, 5787, 5849, 5860, 5867, 5881, 5903,
   5917, 5918, 5940, 5947, 5954, 5956, 5967, 5977, 5985, 5990,
   5994, 5999, 6056, 6073, 6078, 6124, 6136, 6167, 6176, 6185,
   6206, 6208, 6217, 6228, 6235, 6264, 6273, 6286, 6297, 6301,
   6381, 6406, 6412, 6413, 6414, 6415, 6416, 6420, 6492, 6505,
   6529, 6532, 6636, 6643, 6647, 6657, 6657, 6671, 6700, 6700,
   6705, 6724, 6742, 6748, 6754, 6782, 6824, 6844, 6848, 6863,
   6903, 6910, 6915, 6918, 6921, 6925, 6933, 6996, 7004, 7016,
   7048, 7064, 7081, 7104, 7105, 7118, 7124, 7139, 7143, 7148,
   7166, 7182, 7183, 7185, 7189, 7225, 7230, 7259, 7268, 7310,
   7326, 7345, 7426, 7444, 7493, 7518, 7519, 7527, 7529, 7542,
   7600, 7627, 7641, 7649, 7689, 7690, 7700, 7725, 7737, 7741,
   7742, 7767, 7770, 7811, 7879, 7913, 7916, 7944, 7962, 7978,
   8010, 8012, 8035, 8070, 8094, 8108, 8113, 8124, 8144, 8158,
   8181, 8182, 8183, 8209, 8239, 8256, 8260, 8274, 8278, 8284,
   8298, 8314, 8326, 8332, 8400, 8415, 8448, 8472, 8497, 8504,
   8529, 8590, 8598, 8651, 8654, 8733, 8736, 8760, 8762, 8780,
   8809, 8815, 8822, 8846, 8856, 8885, 8904, 8931, 8954, 8984,
   9020, 9029, 9044, 9052, 9055, 9070, 9078, 9085, 9127, 9133,
   9139, 9161, 9169, 9179, 9187, 9188, 9242, 9245, 9280, 9358,
   9364, 9377, 9408, 9415, 9462, 9477, 9501, 9510, 9575, 9594,
   9601, 9640, 9646, 9680, 9688, 9723, 9749, 9761, 9778, 9792,
   9815, 9826, 9836, 9840, 9890, 9916, 9924, 9933, 9937, 9956,
    ]

Saludos
« Última modificación: 27 de Marzo de 2014, 19:42:14 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re: Problemas sencillos de programación para resolver
« Respuesta #11 en: 27 de Marzo de 2014, 06:16:27 »
Otro programa para ordenar.
Este se basa en el algoritmo de la inserción binaria. Realiza menos comparaciones entre elementos, pero hace más movimientos entre ellos.

El resultado es un algoritmo en teoría más rápido con sólo 67337 tics frente a los 126247 tics del algoritmo anterior:
Comparaciones = 3790
Movimientos = 63547
Total = 67337

En la práctica el algoritmo maneja muchos datos auxiliares que lo ralentizan. Si la comparación o movimiento de los datos no cuesta mucho, estos cálculos adicionales también deberán tenerse en cuenta.

Código: Python
  1. """Algoritmo de ordenacion de datos por insercion binaria"""
  2. def insercion_binaria(data):
  3.    comps = 0
  4.    moves = 0
  5.  
  6.    for i in range(1, len(data)):
  7.       moves += 1
  8.       temp = data[i]
  9.      
  10.       pos1 = 0
  11.       pos2 = i-1
  12.       while(pos1 <= pos2):
  13.          medio = (pos1 + pos2) // 2
  14.          comps += 1
  15.          if data[medio] > temp:
  16.             pos2 = medio - 1
  17.          else:
  18.             pos1 = medio + 1
  19.       j = i - 1
  20.       while (j >= pos1):
  21.           moves += 1
  22.           data[j+1] = data[j]
  23.           j -= 1
  24.       moves += 1
  25.       data[pos1] = temp
  26.    return comps, moves
  27.  
  28.  
  29. data = [
  30.    1497, 2094, 8094, 3331, 1126, 0736, 5999, 9688, 3593, 3353,
  31.    3555, 9778, 4371, 2817, 9020, 2504, 6217, 2796, 8904, 0764,
  32.    6700, 4105, 4468, 8504, 3201, 7426, 8780, 7518, 8846, 6228,
  33.    3026, 2895, 3145, 1950, 4887, 0542, 8124, 3730, 7725, 4798,
  34.    8733, 1024, 7326,  669, 5985, 4882, 5867, 2991, 4641, 1964,
  35.    9245, 0501, 6406, 9280, 7916, 9477, 7166, 5616, 5183, 6264,
  36.    1024, 6136, 1894, 2402, 6529, 9646, 9749, 1208,  909, 6844,
  37.    7741, 2101, 8181, 8332, 1594, 9510, 9052, 1812, 1105, 3009,
  38.    5306, 4086, 6918, 5059, 6416, 7600, 7700, 4758, 7016, 3580,
  39.    7689, 5376, 7879, 1153,  945, 8274,  790, 8415, 9890, 1811,
  40.    5117, 5787, 3264, 6903,  555, 1337, 5062, 5881, 3592, 5533,
  41.    6056, 9723, 5849, 0352, 7148, 6921, 4568, 2615, 7105, 4869,
  42.    4685, 2987,   86, 6671, 8651, 3713, 6700, 5162, 6996, 8931,
  43.    7627, 1921, 6782, 2964, 1723, 2496, 6492, 1102, 3194, 6286,
  44.    9070, 8809, 8284, 3924, 6185, 6910, 9044, 4132, 0421, 6176,
  45.    0003, 4527, 7189,  268, 7978, 3881, 2497, 1252, 2330, 4674,
  46.    6657, 3652, 7182, 1810, 2569, 1545, 1963, 3168, 3266, 6167,
  47.    9575, 0200, 7064, 3931, 6748, 8158, 4523, 2391, 4649, 4348,
  48.    8598, 3430, 4983, 9916, 5575, 2091, 5675, 8954, 0761, 3242,
  49.    7649, 3842, 6078, 1123, 8144, 1939, 4487, 6824, 5786, 4455,
  50.    9169, 2353, 7104, 0014, 3532, 6235, 3737, 3446, 8497, 1608,
  51.    5947, 9078, 0411, 9139, 2823, 3858, 7542, 2447,  629,  799,
  52.     932, 2034, 7641, 6301, 9415, 0024, 8822, 4243, 5918, 7770,
  53.    3517, 3742, 8472, 9127, 3351, 8108, 6206, 9826, 9462, 3508,
  54.      94, 8209, 5372, 9358, 0223, 7268, 9840, 8529,  771, 3572,
  55.    9937, 7143, 3051, 8448, 5031, 4636, 8590, 3294, 5210, 5741,
  56.    3634, 9242, 8400, 5990, 8113, 1154, 1555, 5658, 9085, 9179,
  57.    8736, 4712, 6754, 5967, 6848, 7139, 9501, 6505, 5333, 3315,
  58.    7737, 7527, 5977, 6657, 2070, 1140, 5534, 9133, 7690, 5258,
  59.    6915,  792, 9924, 9933, 9601, 5346, 9188, 2199, 1091, 7259,
  60.    4932,  242, 8314, 8326, 1129, 7811, 1933, 4677, 4867, 3075,
  61.    3132,  810, 9029,  727, 9055, 5940, 1442, 5141,  459,  627,
  62.    9792, 3026, 8012, 8760, 5954, 2642, 2583, 7230, 3431, 2174,
  63.    8984, 4221, 2782, 7529, 6415, 2073, 9761, 5659, 6208,  559,
  64.    3602, 6420, 5917,  489, 4267, 0675, 4343, 4515, 3388, 5903,
  65.    7493, 3408, 5463, 7913, 7004, 1043, 5956, 8239, 4803, 6724,
  66.    6532, 8070,  550, 7118, 2546, 4519, 7225, 7742, 9187, 6297,
  67.    8010,  691,   27, 2058, 4568, 5860, 2821, 9680, 5322, 3375,
  68.    7767, 2586, 8182, 0500, 2286, 9836, 4814, 5092,  969, 7444,
  69.    5085,  487, 8035, 3482, 4246, 0361, 7185, 3827, 6742, 6705,
  70.    4416, 2750,  989, 4263, 9161, 7310, 6412, 5782, 1174, 0307,
  71.    4382, 0464, 7345, 5385, 5629, 0465, 8815, 2334, 9408, 1466,
  72.    3045, 8856, 4975, 5449, 1861, 7048, 9815, 8885, 5492, 5345,
  73.    3349, 6925, 6863, 1659, 6273, 8183,  341, 3461,  952, 2726,
  74.    6124, 3483, 6073, 1571, 4614, 8278, 3868, 7124, 8762, 8298,
  75.    5478, 6643, 7519, 9364, 4932, 2554, 1261, 9594, 7183, 0345,
  76.    3712, 6647, 9640,  370, 8654, 4381, 7962, 4694, 2931, 5007,
  77.     685, 6414, 5349, 4396, 5994, 7944, 5011, 2190, 3240, 9377,
  78.    4256, 8256, 6413, 9956, 2922, 1004, 2709, 0215, 5639, 7081,
  79.    8260, 2812, 6636, 2429, 4114, 4715, 6381, 6933, 2137,  378,
  80. ]
  81.  
  82.  
  83. #main program
  84. comps, moves = insercion_binaria(data)
  85. print "Comparaciones =", comps
  86. print "Movimientos =", moves
  87. print "Tics =", comps + moves
  88. print "Data = [\n  ",
  89. print "".join(["%04d" % data[i] + ", " + "\n   "*((i+1)%10==0) for i in range(0, len(data))]),
  90. print "]"


Resultado:
Código: [Seleccionar]
Comparaciones = 3790
Movimientos = 63547
Tics = 67337
Data = [
   0003, 0012, 0020, 0027, 0086, 0094, 0128, 0141, 0147, 0199,
   0229, 0234, 0241, 0242, 0265, 0268, 0273, 0308, 0309, 0320,
   0321, 0341, 0354, 0370, 0378, 0445, 0459, 0478, 0487, 0489,
   0497, 0500, 0550, 0555, 0559, 0627, 0629, 0669, 0685, 0691,
   0727, 0771, 0790, 0792, 0799, 0810, 0909, 0932, 0945, 0952,
   0969, 0989, 1004, 1024, 1024, 1043, 1091, 1102, 1105, 1123,
   1126, 1129, 1140, 1153, 1154, 1174, 1208, 1252, 1261, 1337,
   1442, 1466, 1497, 1545, 1555, 1571, 1594, 1608, 1659, 1723,
   1810, 1811, 1812, 1861, 1894, 1921, 1933, 1939, 1950, 1963,
   1964, 2034, 2058, 2070, 2073, 2091, 2094, 2101, 2137, 2174,
   2190, 2199, 2286, 2330, 2334, 2353, 2391, 2402, 2429, 2447,
   2496, 2497, 2504, 2546, 2554, 2569, 2583, 2586, 2615, 2642,
   2709, 2726, 2750, 2782, 2796, 2812, 2817, 2821, 2823, 2895,
   2922, 2931, 2964, 2987, 2991, 3009, 3026, 3026, 3045, 3051,
   3075, 3132, 3145, 3168, 3194, 3201, 3240, 3242, 3264, 3266,
   3294, 3315, 3331, 3349, 3351, 3353, 3375, 3388, 3408, 3430,
   3431, 3446, 3461, 3482, 3483, 3508, 3517, 3532, 3555, 3572,
   3580, 3592, 3593, 3602, 3634, 3652, 3712, 3713, 3730, 3737,
   3742, 3827, 3842, 3858, 3868, 3881, 3924, 3931, 4086, 4105,
   4114, 4132, 4221, 4243, 4246, 4256, 4263, 4267, 4343, 4348,
   4371, 4381, 4382, 4396, 4416, 4455, 4468, 4487, 4515, 4519,
   4523, 4527, 4568, 4568, 4614, 4636, 4641, 4649, 4674, 4677,
   4685, 4694, 4712, 4715, 4758, 4798, 4803, 4814, 4867, 4869,
   4882, 4887, 4932, 4932, 4975, 4983, 5007, 5011, 5031, 5059,
   5062, 5085, 5092, 5117, 5141, 5162, 5183, 5210, 5258, 5306,
   5322, 5333, 5345, 5346, 5349, 5372, 5376, 5385, 5449, 5463,
   5478, 5492, 5533, 5534, 5575, 5616, 5629, 5639, 5658, 5659,
   5675, 5741, 5782, 5786, 5787, 5849, 5860, 5867, 5881, 5903,
   5917, 5918, 5940, 5947, 5954, 5956, 5967, 5977, 5985, 5990,
   5994, 5999, 6056, 6073, 6078, 6124, 6136, 6167, 6176, 6185,
   6206, 6208, 6217, 6228, 6235, 6264, 6273, 6286, 6297, 6301,
   6381, 6406, 6412, 6413, 6414, 6415, 6416, 6420, 6492, 6505,
   6529, 6532, 6636, 6643, 6647, 6657, 6657, 6671, 6700, 6700,
   6705, 6724, 6742, 6748, 6754, 6782, 6824, 6844, 6848, 6863,
   6903, 6910, 6915, 6918, 6921, 6925, 6933, 6996, 7004, 7016,
   7048, 7064, 7081, 7104, 7105, 7118, 7124, 7139, 7143, 7148,
   7166, 7182, 7183, 7185, 7189, 7225, 7230, 7259, 7268, 7310,
   7326, 7345, 7426, 7444, 7493, 7518, 7519, 7527, 7529, 7542,
   7600, 7627, 7641, 7649, 7689, 7690, 7700, 7725, 7737, 7741,
   7742, 7767, 7770, 7811, 7879, 7913, 7916, 7944, 7962, 7978,
   8010, 8012, 8035, 8070, 8094, 8108, 8113, 8124, 8144, 8158,
   8181, 8182, 8183, 8209, 8239, 8256, 8260, 8274, 8278, 8284,
   8298, 8314, 8326, 8332, 8400, 8415, 8448, 8472, 8497, 8504,
   8529, 8590, 8598, 8651, 8654, 8733, 8736, 8760, 8762, 8780,
   8809, 8815, 8822, 8846, 8856, 8885, 8904, 8931, 8954, 8984,
   9020, 9029, 9044, 9052, 9055, 9070, 9078, 9085, 9127, 9133,
   9139, 9161, 9169, 9179, 9187, 9188, 9242, 9245, 9280, 9358,
   9364, 9377, 9408, 9415, 9462, 9477, 9501, 9510, 9575, 9594,
   9601, 9640, 9646, 9680, 9688, 9723, 9749, 9761, 9778, 9792,
   9815, 9826, 9836, 9840, 9890, 9916, 9924, 9933, 9937, 9956,
    ]
« Última modificación: 27 de Marzo de 2014, 19:41:29 por Picuino »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Problemas sencillos de programación para resolver
« Respuesta #12 en: 27 de Marzo de 2014, 12:40:36 »
Tengo este código

no esta tan optimizado como creí, me dió 126572 ticks

Código: C
  1. int compara(int val1, int val2, long *t);
  2. void printvector(int *v,int len);
  3. void move(int *val1,int *val2, long *t);
  4.  
  5. int main(int argc, char* argv[])
  6. {
  7.         char a;
  8.         int i=0,j=0;
  9.         int len=500;           
  10.         int temp;
  11.         long ticks=0;
  12.         char str[80];
  13.  
  14.         int m1[500]={
  15.    1497, 2094, 8094, 3331, 1126, 0736, 5999, 9688, 3593, 3353,
  16.    3555, 9778, 4371, 2817, 9020, 2504, 6217, 2796, 8904, 0764,
  17.    6700, 4105, 4468, 8504, 3201, 7426, 8780, 7518, 8846, 6228,
  18.    3026, 2895, 3145, 1950, 4887, 0542, 8124, 3730, 7725, 4798,
  19.    8733, 1024, 7326,  669, 5985, 4882, 5867, 2991, 4641, 1964,
  20.    9245, 0501, 6406, 9280, 7916, 9477, 7166, 5616, 5183, 6264,
  21.    1024, 6136, 1894, 2402, 6529, 9646, 9749, 1208,  909, 6844,
  22.    7741, 2101, 8181, 8332, 1594, 9510, 9052, 1812, 1105, 3009,
  23.    5306, 4086, 6918, 5059, 6416, 7600, 7700, 4758, 7016, 3580,
  24.    7689, 5376, 7879, 1153,  945, 8274,  790, 8415, 9890, 1811,
  25.    5117, 5787, 3264, 6903,  555, 1337, 5062, 5881, 3592, 5533,
  26.    6056, 9723, 5849, 0352, 7148, 6921, 4568, 2615, 7105, 4869,
  27.    4685, 2987,   86, 6671, 8651, 3713, 6700, 5162, 6996, 8931,
  28.    7627, 1921, 6782, 2964, 1723, 2496, 6492, 1102, 3194, 6286,
  29.    9070, 8809, 8284, 3924, 6185, 6910, 9044, 4132, 0421, 6176,
  30.    0003, 4527, 7189,  268, 7978, 3881, 2497, 1252, 2330, 4674,
  31.    6657, 3652, 7182, 1810, 2569, 1545, 1963, 3168, 3266, 6167,
  32.    9575, 0200, 7064, 3931, 6748, 8158, 4523, 2391, 4649, 4348,
  33.    8598, 3430, 4983, 9916, 5575, 2091, 5675, 8954, 0761, 3242,
  34.    7649, 3842, 6078, 1123, 8144, 1939, 4487, 6824, 5786, 4455,
  35.    9169, 2353, 7104, 0014, 3532, 6235, 3737, 3446, 8497, 1608,
  36.    5947, 9078, 0411, 9139, 2823, 3858, 7542, 2447,  629,  799,
  37.     932, 2034, 7641, 6301, 9415, 0024, 8822, 4243, 5918, 7770,
  38.    3517, 3742, 8472, 9127, 3351, 8108, 6206, 9826, 9462, 3508,
  39.      94, 8209, 5372, 9358, 0223, 7268, 9840, 8529,  771, 3572,
  40.    9937, 7143, 3051, 8448, 5031, 4636, 8590, 3294, 5210, 5741,
  41.    3634, 9242, 8400, 5990, 8113, 1154, 1555, 5658, 9085, 9179,
  42.    8736, 4712, 6754, 5967, 6848, 7139, 9501, 6505, 5333, 3315,
  43.    7737, 7527, 5977, 6657, 2070, 1140, 5534, 9133, 7690, 5258,
  44.    6915,  792, 9924, 9933, 9601, 5346, 9188, 2199, 1091, 7259,
  45.    4932,  242, 8314, 8326, 1129, 7811, 1933, 4677, 4867, 3075,
  46.    3132,  810, 9029,  727, 9055, 5940, 1442, 5141,  459,  627,
  47.    9792, 3026, 8012, 8760, 5954, 2642, 2583, 7230, 3431, 2174,
  48.    8984, 4221, 2782, 7529, 6415, 2073, 9761, 5659, 6208,  559,
  49.    3602, 6420, 5917,  489, 4267, 0675, 4343, 4515, 3388, 5903,
  50.    7493, 3408, 5463, 7913, 7004, 1043, 5956, 8239, 4803, 6724,
  51.    6532, 8070,  550, 7118, 2546, 4519, 7225, 7742, 9187, 6297,
  52.    8010,  691,   27, 2058, 4568, 5860, 2821, 9680, 5322, 3375,
  53.    7767, 2586, 8182, 0500, 2286, 9836, 4814, 5092,  969, 7444,
  54.    5085,  487, 8035, 3482, 4246, 0361, 7185, 3827, 6742, 6705,
  55.    4416, 2750,  989, 4263, 9161, 7310, 6412, 5782, 1174, 0307,
  56.    4382, 0464, 7345, 5385, 5629, 0465, 8815, 2334, 9408, 1466,
  57.    3045, 8856, 4975, 5449, 1861, 7048, 9815, 8885, 5492, 5345,
  58.    3349, 6925, 6863, 1659, 6273, 8183,  341, 3461,  952, 2726,
  59.    6124, 3483, 6073, 1571, 4614, 8278, 3868, 7124, 8762, 8298,
  60.    5478, 6643, 7519, 9364, 4932, 2554, 1261, 9594, 7183, 0345,
  61.    3712, 6647, 9640,  370, 8654, 4381, 7962, 4694, 2931, 5007,
  62.     685, 6414, 5349, 4396, 5994, 7944, 5011, 2190, 3240, 9377,
  63.    4256, 8256, 6413, 9956, 2922, 1004, 2709, 0215, 5639, 7081,
  64.    8260, 2812, 6636, 2429, 4114, 4715, 6381, 6933, 2137,  378,
  65.         };
  66.  
  67.  
  68.        
  69.          printvector(m1,len);
  70. //     
  71.         for(i=1;i<(len);i++)
  72.         {              
  73.                 if(compara(m1[i],m1[i-1],&ticks))
  74.                 {                      
  75.                         j=i-1;
  76.                         move(&temp,&m1[i],&ticks);                     
  77.                         move(&m1[i],&m1[i-1],&ticks);
  78.                
  79.                         while((j>=1))
  80.                         {                      
  81.                                 if(!compara(temp,m1[j-1],&ticks))
  82.                                 {                                      
  83.                                        
  84.                                         break;
  85.                                 }      
  86.                                 move(&m1[j],&m1[j-1],&ticks);
  87.                                 j--;                           
  88.                                
  89.                         }
  90.                         move(&m1[j],&temp,&ticks);
  91.                 }
  92.        
  93.                
  94.         }
  95.         printvector(m1,len);
  96.         sprintf(str,"ticks:%d\n;",ticks);
  97.                 printf(str);
  98.        
  99.  
  100.         a=getchar();
  101.         return 0;
  102. }
  103.  
  104.  
  105. int compara(int val1, int val2, long *t)
  106. {
  107.         *t=*t+1;
  108.         if(val1<val2)return 1;
  109.         else return 0;
  110. }
  111.  
  112.  
  113. void printvector(int *v,int len)
  114. {
  115.         int i;
  116.                 char outt[20];
  117.  
  118.         for(i=0;i<(len);i++)
  119.         {
  120.                 sprintf(outt,"%i;",v[i]);
  121.                 printf(outt);
  122.                        
  123.         }
  124.         printf("\n");
  125. }
  126.  
  127. void move(int *val1,int *val2, long *t)
  128. {
  129.        
  130.         *val1=*val2;
  131.         *t=*t+1;
  132. }
« Última modificación: 27 de Marzo de 2014, 12:43:08 por rivale »
"Nada es imposible, no si puedes imaginarlo"

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 936
Re: Problemas sencillos de programación para resolver
« Respuesta #13 en: 27 de Marzo de 2014, 13:50:28 »
Tengo entendido que uno de los métodos más pobres es el algoritmo burbuja.
Aquí hay amplia información al respecto e información de su rendimiento frente a otros algoritmos.

http://es.wikipedia.org/wiki/Ordenamiento_de_burbuja

Salud  8)
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 936
Re: Problemas sencillos de programación para resolver
« Respuesta #14 en: 27 de Marzo de 2014, 13:53:50 »
Aquí información de una buena cantidad de métodos de ordenamiento.

http://es.wikipedia.org/wiki/Algoritmo_de_ordenamiento

Salud   8)
No hay preguntas tontas...
Solo hay tontos que no preguntan.


 

anything