[Archives] Mathématiques pures, physique, chimie, etc. : problèmes d'entraînement cérébral sans rapport avec le commerce. - page 511

 

MaxZ:

Je comprends les changements. C'est juste que je ne l'ai pas encore compris :

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

"|=" est le OU logique ? Et puis c'est une impasse...

"|=" est dans ce cas un "ou" par bit. Ce truc lève les bits par XX à des positions égales à A[i].

Et si, après la boucle, tous les bits 1 à 6 sont à 1, cela signifie que tous les chiffres 1 à 6 se sont rencontrés exactement une fois dans le nombre X.

0x7E est la représentation hexadécimale du nombre binaire 1111110. (le bit de droite est zéro)

 
jartmailru:

Ou peut-être que c'est en C++ ?
.
Valider - une fonction d'un seul paramètre.
Peut-être que nous devrions le faire à l'ancienne... allouer de la mémoire et mettre en cache un bool
pour toutes les valeurs valides de l'argument ?

Dans MQL, vous pouvez ouvrir un ordre au cas où, par miracle, les numéros de hockey se répartissent équitablement ! :))

Mais sérieusement, je ne suis définitivement pas ton égal.


MetaDriver:

Dans ce cas, "|=" est un "ou" au sens du bit. Ce truc augmente les bits de XX dans les positions égales à A[i].

Et si, après la boucle, tous les bits de 1 à 6 sont à 1, cela signifie que tous les chiffres de 1 à 6 apparaissent exactement une fois dans le nombre X.

0x7E est la représentation hexadécimale du nombre binaire 1111110. (le bit de droite est zéro)
C'est ce qui m'a le plus dérangé. Merci. Je l'ai eu !
 
jartmailru:

1) Et le C++, alors ?
.
2. Valider la fonction d'un paramètre.
Peut-être que nous devrions le faire à l'ancienne... ...allouer de la mémoire et mettre en cache un bool
pour toutes les valeurs valides de l'argument ?

1. La langue et l'environnement ne sont pas vraiment le sujet. Il s'agit de l'algorithme lui-même.

2....Uh...Et quoi encore ?

 
MaxZ:

Mais il est clair que le 125 ms ne rattrape pas son retard.

Tu ne devrais pas faire ça. Votre lecture est de 47 ms.

Dommage que vous n'ayez pas de solution, c'est difficile de comparer les résultats... :)))

.

Mais je ne comprends toujours pas pourquoi nous devons comparer par personnages.

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

?

Il semblerait que les recoupements dans une même position ne soient pas critiques ?

 
MetaDriver:

Tu ne devrais pas faire ça. Votre lecture est de 47 ms.

Dommage que vous n'ayez pas de solution, c'est difficile de comparer les résultats... :)))

.

Mais je ne comprends toujours pas pourquoi nous devons comparer par personnages.

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

?

Il me semble que les coïncidences dans une seule position ne sont pas critiques ?

Regardez ça ! :DDD


Je luttais pour la vitesse.

Je crois que la condition :

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

S'exécutera plusieurs fois plus vite que les lignes suivantes :

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;

Et cette condition est déclenchée plus d'une fois. Ce n'est pas un mauvais gain de vitesse. Même si ce n'est pas si important. Nous pouvons le retirer et le vérifier. Mais je suis toujours d'avis que cette condition se justifie d'elle-même.

 
MaxZ:


Je luttais pour la vitesse :

Je crois que la condition :

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

s'exécutera plusieurs fois plus vite que les lignes suivantes :

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;

Et cette condition est déclenchée plus d'une fois. Cela s'avère être un gain de performance appréciable. Bien que ce ne soit peut-être pas si considérable. Vous pouvez le retirer et le vérifier. Mais je suis toujours d'avis que cette condition se justifie d'elle-même.

Mais il semble que ce soit incorrect. Par exemple, si A4==B4, la condition sera fausse, alors que les chiffres peuvent être différents (par exemple 654321 et 124365).
 

corrigé, fait comme ça.

                                    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);
                                         }
                                      }
                                   }

Même 47 ms.

Donc - pas besoin de se préoccuper de cette condition.

 
MetaDriver:

corrigé, fait comme ça.

Même 47 ms.

Donc - ne vous embêtez pas avec cette condition.

Je me suis trompé... Et je parle de vitesse ! :)) Ma tête est toute retournée. J'ai passé l'heure de me coucher. Mon heure locale est 6 heures du matin...

C'est comme ça que tu fais le code :

                                    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);
                                    }

C'est trop.

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

...car le script devrait diviser le moins par le plus...

 

Merde. Volodya Et tu dois geler avec ça ? Et voilà, le feu ! Combien de fois !

Le tien est un porc. Sincèrement...

 
MaxZ:

C'est comme ça qu'on fait avec le code :


Oui, c'est mieux. 31 ms.

Svinozavr 22.08.2011 01:58

Merde. Volodya Et c'est pour geler ? Voilà, arrêtez ! Combien vous pouvez !

Le tien est un cochon. Sincèrement...

Caprice d'artiste.... :)

Les motivations mercantiles deviennent ennuyeuses en une semaine. Parfois, on peut s'en sortir pour l'amour de l'art. ;)

Raison: