[Matematica pura, fisica, chimica, ecc.: problemi di allenamento del cervello non legati in alcun modo al commercio - pagina 511

 

MaxZ:

Capisco i cambiamenti. È solo che non l'ho ancora capito:

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

"|=" è l'OR logico? E poi è un vicolo cieco...

"|=" è in questo caso un "o" bitwise. Questa cosa solleva i bit di XX in posizioni uguali a A[i].

E se, dopo il ciclo, tutti i bit da uno a sei sono 1, significa che tutte le cifre da 1 a 6 si sono incontrate esattamente una volta nel numero X.

0x7E è la rappresentazione esadecimale del numero binario 1111110. (il bit di destra è zero)

 
jartmailru:

O forse è in C++?
.
Convalida- funzione di un singolo parametro.
Forse dovremmo farlo alla vecchia maniera... alloca la memoria e mette in cache un bool
per tutti i valori validi dell'argomento?

In MQL è possibile aprire un ordine nel caso in cui, per qualche miracolo, i numeri dell'hockey si dividano equamente! :))

Ma seriamente, non sono sicuramente al tuo livello.


MetaDriver:

"|=" è un "o" bitwise in questo caso. Questa cosa alza i bit di XX in posizioni uguali a A[i].

E se dopo il ciclo tutti i bit da uno a sei sono 1, significa che tutte le cifre da 1 a 6 si presentano esattamente una volta nel numero X.

0x7E è la rappresentazione esadecimale del numero binario 1111110. (il bit di destra è zero)
Questo è quello che mi ha dato più fastidio. Grazie. Capito!
 
jartmailru:

1. E il C++, invece?
.
2. Convalida- una funzione di un parametro.
Forse dovremmo farlo alla vecchia maniera... ...alloca la memoria e mette in cache un bool
per tutti i valori validi dell'argomento?

1. Beh, la lingua e l'ambiente non sono proprio il punto. Il punto è l'algoritmo stesso.

2....Uh...Cosa c'è di più?

 
MaxZ:

Ma 125 ms non sta chiaramente recuperando.

Non dovresti farlo. La tua lettura è di 47 ms.

Peccato che tu non abbia una soluzione, è difficile confrontare i risultati... :)))

.

Ma continuo a non capire perché dobbiamo fare il confronto in base ai personaggi.

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

?

Sembrerebbe che le sovrapposizioni in una singola posizione siano acritiche?

 
MetaDriver:

Non dovresti farlo. La tua lettura è di 47 ms.

Peccato che tu non abbia una soluzione, è difficile confrontare i risultati... :)))

.

Ma continuo a non capire perché dobbiamo fare il confronto in base ai personaggi.

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

?

Mi sembra che le coincidenze in una singola posizione siano acritiche?

Guarda un po'! :DDD


Stavo lottando per la velocità.

Credo che la condizione:

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

Verrà eseguito molte volte più velocemente delle seguenti linee:

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;

E questa condizione si attiva più di una volta. Non è un cattivo guadagno di velocità. Anche se potrebbe non essere così significativo. Possiamo rimuoverlo e controllarlo. Ma sono ancora dalla parte che questa condizione si giustifica da sola.

 
MaxZ:


Stavo lottando per la velocità:

Credo che la condizione:

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

sarà molto più veloce delle linee seguenti:

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;

E questa condizione si attiva più di una volta. Risulta essere un bel guadagno in termini di prestazioni. Anche se forse non è così considerevole. Potete rimuoverlo e controllarlo. Ma sono ancora dalla parte che questa condizione si giustifica

Ma sembra che non sia corretto. Per esempio, se A4==B4 la condizione sarà falsa, mentre i numeri possono essere diversi (per esempio 654321 e 124365)
 

corretto, fatto così.

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

Lo stesso 47 ms.

Quindi - non c'è bisogno di preoccuparsi di questa condizione.

 
MetaDriver:

corretto, fatto così.

Lo stesso 47 ms.

Quindi - non preoccupatevi di questa condizione.

Ho sbagliato... E sto parlando di velocità! :)) Non riesco a pensare bene. È passata l'ora di andare a letto. La mia ora locale è le 6:00 del mattino...

Ecco come si fa il codice:

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

Questo è troppo.

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

...perché lo script dovrebbe dividere il meno per il più...

 

Merda. Volodya E devi congelare con quello? Ecco fatto - fuoco! Quante volte!

Il tuo è un maiale. Sinceramente...

 
MaxZ:

È così che si fa con il codice:


Sì, così va meglio. 31 ms.

Svinozavr 22.08.2011 01:58

Merda. Volodya E questo è per congelare? Ecco - smettila! Quanto si può!

Il tuo è Maiale. Sinceramente...

Capriccio d'artista.... :)

Le motivazioni mercantili diventano noiose in una settimana. A volte si può scendere per amore dell'arte. ;)

Motivazione: