> Input
> Input
>> 1²
>> (3]
>> 1%L
>> L=2
>> Each 5 4
>> Each 6 7
>> L⋅R
>> Each 9 4 8
> {0}
>> {10}
>> 12∖11
>> Output 13
Provalo online!
∅) quando non esiste una soluzione.
Come funziona
Non sorprende che funzioni quasi in modo identico con la maggior parte delle altre risposte: genera un elenco di numeri e controlla ognuno per modulo inverso con l'argomento.
Se hai familiarità con il funzionamento della struttura del programma di Whispers, passa alla linea orizzontale. In caso contrario: sostanzialmente, Whispers lavora su un sistema di riferimento riga per riga, a partire dall'ultima riga. Ogni riga è classificata come una delle due opzioni. O è una linea nilad o è una linea operatore .
Le linee di Nilad iniziano con >
, ad esempio> Input
o> {0}
e restituiscono il valore esatto rappresentato su quella linea, ovvero > {0}
restituisce l'insieme{ 0 }. > Input
restituisce la riga successiva di STDIN, valutata se possibile.
Le righe dell'operatore iniziano con >>
, come >> 1²
o >> (3]
e indicano l'esecuzione di un operatore su uno o più valori. Qui, i numeri usati non fanno riferimento a quei numeri espliciti, invece fanno riferimento al valore su quella riga. Ad esempio, ²
è il comando quadrato (n → n2), quindi >> 1²
non restituisce il valore12, invece restituisce il quadrato della riga 1 , che, in questo caso, è il primo input.
Di solito, le linee dell'operatore funzionano solo usando i numeri come riferimenti, ma potresti aver notato le linee >> L=2
e >> L⋅R
. Questi due valori L
e R
, sono usati insieme alle Each
istruzioni. Each
le dichiarazioni funzionano prendendo due o tre argomenti, sempre come riferimenti numerici. Il primo argomento (ad es. 5
) È un riferimento a una riga dell'operatore che utilizza una funzione e il resto degli argomenti sono array. Quindi eseguiamo l'iterazione della funzione sull'array, in cui l' elemento L
e R
nella funzione rappresentano gli elementi correnti negli array su cui si esegue l'iterazione. Come esempio:
Permettere A = [ 1 , 2 , 3 , 4 ], B = [ 4 , 3 , 2 , 1 ] e f( x , y) = x + y. Supponendo che stiamo eseguendo il seguente codice:
> [1, 2, 3, 4]
> [4, 3, 2, 1]
>> L+R
>> Each 3 1 2
Abbiamo quindi una dimostrazione di come Each
funzionano le dichiarazioni. Innanzitutto, quando si lavora con due array, li comprimiamo per formareC= [ ( 1 , 4 ) , ( 2 , 3 ) , ( 3 , 2 ) , ( 4 , 1 ) ] quindi mappa f( x , y) su ogni coppia, formando il nostro array finale D = [ f( 1 , 4 ) , f( 2 , 3 ) , f( 3 , 2 ) , f( 4 , 1 ) ] = [ 5 , 5 , 5 , 5 ]
Provalo online!
Come funziona questo codice
Lavorando in modo contro intuitivo al funzionamento di Whispers, partiamo dalle prime due righe:
> Input
> Input
Questo raccoglie i nostri due input, diciamo X e ye li memorizza rispettivamente nelle righe 1 e 2 . Quindi archiviamoX2sulla riga 3 e creare un intervalloA : = [ 1 . . . X2]sulla linea 4 . Quindi, passiamo alla sezione
>> 1%L
>> L=2
>> Each 5 4
>> Each 6 7
La prima cosa eseguita qui è la linea 7 , >> Each 5 4
che itera la linea 5 sulla linea 4 . Questo produce l'arrayB : = [ i%X|io ∈ A ], dove un'%Bè definito come il modulo diun' e B.
Abbiamo poi eseguiamo linea 8 , >> Each 6 7
che itera linea 6 sopraB, producendo un array C: = [ ( i%x ) = y|io ∈ A ].
Per gli input x = 5 , y= 2, noi abbiamo A = [ 1 , 2 , 3 , . . . , 23 , 24 , 25 ], B = [ 0 , 1 , 2 , 1 , 0 , 5 , 5 , . . . , 5 , 5 ] e C= [ 0 , 0 , 1 , 0 , 0 , . . . , 0 , 0 ]
Saliamo quindi a
>> L⋅R
>> Each 9 4 8
che è il nostro esempio di una Each
dichiarazione diadica . Qui, la nostra funzione è la linea 9, cioè i >> L⋅R
nostri due arrayUN e C. Moltiplichiamo ogni elemento inUN con l'elemento corrispondente in C, che produce un array, E, in cui ciascun elemento funziona dalla seguente relazione:
Eio= { 0UNioCio= 0Cio= 1
Finiamo quindi con un array composto da 0se i moduli inversi di X e y. Per rimuovere il0s, convertiamo questo array in un set ( >> {10}
), quindi prendiamo la differenza del set tra questo set e{ 0 }, cedendo, quindi producendo, il nostro risultato finale.