[Archivo] Matemáticas puras, física, química, etc.: problemas de entrenamiento cerebral no relacionados con el comercio de ninguna manera - página 511

 

MaxZ:

Entiendo los cambios. Es que todavía no me he dado cuenta:

   for(int i=5;i>-1;i--)
     {
      XX|=int(1<<A[i]);
     }
   if(XX==0x7E) {return true;}

¿"|=" es el OR lógico? Y entonces es un callejón sin salida...

"|=" es, en este caso, un "o" a nivel de bits. Esta cosa levanta los bits por XX en posiciones iguales a A[i].

Y si, después del bucle, todos los bits del uno al seis son 1, significa que todos los dígitos del 1 al 6 se han encontrado exactamente una vez en el número X.

0x7E es la representación hexadecimal del número binario 1111110. (el bit de la derecha es cero)

 
jartmailru:

¿O tal vez esté en C++?
.
Validar- una función de un solo parámetro.
Tal vez deberíamos hacerlo a la antigua... asignar memoria y almacenar en caché un bool
para todos los valores válidos del argumento?

En MQL puedes abrir una orden en caso de que, por algún milagro, los números de hockey se dividan por igual. :))

Pero en serio, definitivamente no soy tu igual.


MetaDriver:

"|=" es un "o" a nivel de bits en este caso. Esto eleva los bits en XX en posiciones iguales a A[i].

Y si después del bucle todos los bits del uno al seis son 1, significa que todos los dígitos del 1 al 6 aparecen exactamente una vez en el número X.

0x7E es la representación hexadecimal del número binario 1111110. (el bit derecho es cero)
Eso es lo que más me molestó. Gracias. ¡Lo tengo!
 
jartmailru:

1. Pero, ¿qué hay de C++?
.
2. Función de validación de un parámetro.
Tal vez deberíamos hacerlo a la antigua usanza... ...asignar memoria y almacenar en caché un bool
para todos los valores válidos del argumento?

1. Bueno, la lengua y el entorno no son realmente la cuestión. La cuestión es el propio algoritmo.

2....Uh... ¿Qué más?

 
MaxZ:

Pero está claro que 125 ms no está al día.

No deberías hacer eso. Su lectura es de 47 ms.

Lástima que no tenga una solución, es difícil comparar los resultados... :)))

.

Pero sigo sin entender por qué hay que comparar por personajes.

if(A6!=B6 && A5!=B5 && A4!=B4 && A3!=B3 && A2!=B2 && A1!=B1)

?

Parece que los solapamientos en una misma posición son acríticos?

 
MetaDriver:

No deberías hacer eso. Su lectura es de 47 ms.

Lástima que no tenga una solución, es difícil comparar los resultados... :)))

.

Pero sigo sin entender por qué hay que comparar por personajes.

if(A6!=B6 && A5!=B5 && A4!=B4 && A3!=B3 && A2!=B2 && A1!=B1)

?

Me parece que las coincidencias en una misma posición son acríticas?

¡Mira eso! :DDD


Estaba luchando por la velocidad.

Creo que la condición:

if (A6 != B6 && A5 != B5 && A4 != B4 && A3 != B3 && A2 != B2 && A1 != B1)

Se ejecutará muchas veces más rápido que las siguientes líneas:

int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1;
int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1;

Y esta condición se activa más de una vez. No es una mala ganancia de velocidad. Aunque puede no ser tan significativo. Podemos quitarlo y comprobarlo. Pero aún así, estoy del lado de que esta condición se justifica por sí misma.

 
MaxZ:


Estaba luchando por la velocidad:

Creo que la condición:

if (A6 != B6 && A5 != B5 && A4 != B4 && A3 != B3 && A2 != B2 && A1 != B1)

se ejecutará muchas veces más rápido que las siguientes líneas:

int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1;
int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1;

Y esta condición se activa más de una vez. Resulta ser una buena ganancia de rendimiento. Aunque quizá no sea tan considerable. Puede quitarlo y comprobarlo. Pero aún así estoy en el lado de que esta condición se justifica

Pero parece que es incorrecto. Por ejemplo, si A4==B4 la condición será falsa, mientras que los números pueden ser diferentes (por ejemplo, 654321 y 124365)
 

corregido, hecho así.

                                    for(int B1=1; B1<=6; B1++)
                                      {
                                       if(B1==B2 || B1==B3 || B1==B4 || B1==B5 || B1==B6) continue;
//                                       if(A6!=B6 && A5!=B5 && A4!=B4 && A3!=B3 && A2!=B2 && A1!=B1)
                                         {
                                          int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1;
                                          int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1;
                                          if (A==B) continue;
                                          if(MathMod(A,B)==0)
                                             Print(A6,A5,A4,A3,A2,A1,"/",B6,B5,B4,B3,B2,B1,"=",A/B);
                                         }
                                      }
                                   }

Los mismos 47 ms.

Por lo tanto, no es necesario preocuparse por esta condición.

 
MetaDriver:

corregido, hecho así.

Los mismos 47 ms.

Así que - no te molestes con esa condición.

Se equivocó... ¡Y hablo de velocidad! :)) No puedo pensar con claridad. Ya se ha pasado mi hora de dormir. Mi hora local es las 6:00 de la mañana...

Así es como se hace el código:

                                    for (int B1=1; B1<=6; B1++)
                                    {
                                       if (B1==B2 || B1==B3 || B1==B4 || B1==B5 || B1==B6) continue;
                                       if (A6==B6 && A5==B5 && A4==B4 && A3==B3 && A2==B2 && A1==B1) continue;
                                       
                                       int A = A6*100000+A5*10000+A4*1000+A3*100+A2*10+A1;
                                       int B = B6*100000+B5*10000+B4*1000+B3*100+B2*10+B1;
                                       if (A < B) continue;
                                       if (MathMod(A,B)==0)
                                           Print(A6,A5,A4,A3,A2,A1,"/",B6,B5,B4,B3,B2,B1,"=",A/B);
                                    }

Eso es demasiado.

                                       if (A==B) continue;
                                       if (MathMod(A,B)==0)

porque el guión tendría que dividir el menos por el más...

 

Mierda. Volodya ¿Y tienes que congelar con eso? Ahí lo tienes, ¡fuego! ¡Cuántas veces!

El tuyo es un cerdo. Sinceramente...

 
MaxZ:

Así se hace con el código:


Sí, así está mejor. 31 ms.

Svinozavr 22.08.2011 01:58

Mierda. Volodya ¿Y esto es para congelar? Ya está, ¡déjalo! ¡Cuánto se puede!

El tuyo es Pig. Sinceramente...

Capricho del artista.... :)

Las motivaciones mercantiles se vuelven aburridas en una semana. A veces se puede bajar por amor al arte. ;)

Razón de la queja: