> 1
> Input
>> 1…2
>> L!
>> L+1
>> L∣2
>> L⋅R
>> 2%L
>> Each 4 3
>> Each 5 9
>> Each 6 10
>> Each 7 11 3
> {0}
>> 12∖13
>> Each 8 14
>> L≠1
>> Each 16 15
>> Each 7 17 15
>> 18∖13
>> [19]
>> 2’
>> 21⋅20
>> Output 22
Provalo online!
Ciò restituisce un elenco vuoto per numeri primi non Pillai e un elenco non vuoto in caso contrario.
Come funziona
Whispers è stato progettato per essere manipolato su numeri reali / complessi, con un po 'di comandi di array aggiunti per una buona misura, quindi l'uso ripetuto di Each
iterare sugli elenchi generati.
Un po 'di background su Whispers:
Whispers è leggermente diverso nel suo percorso di esecuzione rispetto alla maggior parte delle altre lingue. Invece di lavorare su ogni riga in modo lineare, ramificando solo i condizionali, Whispers inizia sull'ultima riga del file che inizia con >
(le regole sono leggermente più complicate di così, ma per ora è tutto ciò che dobbiamo sapere), e il significato dei numeri differiscono, a seconda che la linea inizi con >
o >>
.
Se la linea inizia con >
, come > 1
o > Input
, si tratta di una linea costante : restituisce lo stesso valore ogni volta. Qui, i numeri rappresentano la loro forma numerica, quindi la prima riga restituirà sempre 1 quando viene chiamata.
Se la linea inizia con >>
, tuttavia, i numeri vengono trattati come riferimenti ad altre linee, una sorta di chiamate di funzione simili, se lo desideri. Ad esempio, nella riga >> 1…2
, questo non esegue il …
comando sugli interi 1 e 2 , ma piuttosto sui valori restituiti dalle righe 1 e 2 . In questo caso, quei valori sono il numero intero 1 e qualunque numero intero siamo passati come input.
Per questo esempio, consideriamo l'input di 23 . Tieni presente che, a causa della preelaborazione di Whispers, la seconda riga ( > Input
) viene convertita in > 23
.
Il nostro primo comando è sulla linea 3: >> 1…2
. …
è intervallo diadico, in questo caso da 1 a 23 , producendo {1, 2, ... 22, 23} . Quindi, passiamo alle righe da 9 a 12 :
>> Each 4 3
>> Each 5 9
>> Each 6 10
>> Each 7 11 3
Qui abbiamo 4 Each
affermazioni consecutive , ognuna delle quali scorre sul risultato precedente, essenzialmente mappando i 4 comandi sull'array sulla linea 3 : l'intervallo. Le prime tre affermazioni sono mappe semplici, con le linee 4 , 5 e 6 :
>> L!
>> L+1
>> L∣2
Questi tre comandi, su un numero intero n , producono (n! +1) ∣x , dove ! indica fattoriale , ∣ indica divisibilità e x è l'input. Infine, la linea 12 ha una struttura di mappa diadica .
Una struttura di mappa diadica prende tre numeri interi: il bersaglio, il sinistro e il destro, ciascuno si indicizza su altre linee. Qui, comprimiamo la sinistra e la destra per produrre un elenco di coppie, quindi riduciamo ciascuna coppia con il comando diadico (il bersaglio). Qui, se l'ingresso è 23 , le liste sono {1, 2, ... 22, 23} e {0, 0, ... 1, 0} e il comando è
>> L⋅R
che moltiplica l'argomento sinistro per il diritto. Questo produce una matrice di numeri interi, con 0 in corrispondenza degli indici di numeri interi i cui fattoriali incrementati non sono divisibili per gli input e l'indice originale in cui si trovano. Chiameremo questo array A . Quindi, rimuoviamo gli 0 s da A prendendo la differenza impostata tra {0} e A :
> {0}
>> 12∖13
Con il nostro esempio di input, questo produce l'insieme {14, 18, 22} . Quindi prendiamo il resto dell'input diviso per ciascun valore nell'insieme e controlliamo se quel resto non è uguale a 1 :
>> 2%L
>> Each 8 14
>> L≠1
>> Each 16 15
Ancora una volta, abbiamo un elenco di 0 o 1 se dobbiamo rimuovere gli 0 se sostituire gli 1 con i valori originali. Qui ripetiamo il codice che abbiamo visto sopra, ma con >> 18∖13
piuttosto che 12
. Infine, abbiamo inserito questo set risultante in un elenco per un controllo finale. Sfortunatamente, il nostro codice deve anche rifiutare i numeri compositi che soddisfano tutti questi criteri, come 437 . Quindi aggiungiamo il nostro controllo finale, moltiplicando il nostro elenco finale per la primalità dell'input. A causa del modo in cui la moltiplicazione Python funziona sugli elenchi, 0 lo sostituisce con un elenco vuoto e 1 non ha alcun effetto. Quindi calcoliamo la primalità dell'input, moltiplicandola per l'elenco di ms per l'input e risultato finale:
>> 2’
>> 21⋅20
>> Output 22