> 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
Probieren Sie es online!
Dies gibt eine leere Liste für Nicht-Pillai-Primzahlen und ansonsten eine nicht leere Liste zurück.
Wie es funktioniert
Whispers wurde für die Manipulation von reellen / komplexen Zahlen entwickelt, wobei ein wenig Array-Befehle hinzugefügt wurden, um eine gute Messung zu ermöglichen, daher die wiederholte Verwendung von Each
die generierten Listen durchlaufen werden können.
Hintergrundinformationen zu Whispers:
Whispers unterscheidet sich in seinem Ausführungspfad geringfügig von den meisten anderen Sprachen. Anstatt jede Zeile linear durchzuarbeiten und nur nach Bedingungen zu verzweigen, beginnt Whispers in der letzten Zeile der Datei mit >
(die Regeln sind etwas komplizierter, aber das ist alles, was wir jetzt wissen müssen) und den Bedeutungen von Zahlen unterscheiden sich je nachdem, ob die Zeile mit >
oder beginnt >>
.
Wenn die Zeile mit oder beginnt >
, ist dies eine konstante Zeile. Sie gibt jedes Mal den gleichen Wert zurück. Hier stellen Zahlen ihre numerische Form dar, sodass die erste Zeile immer 1 zurückgibt> 1
> Input
zurückgibt.
Wenn die Zeile >>
jedoch mit beginnt , werden Zahlen als Verweise auf andere Zeilen behandelt, sozusagen als Funktionsaufrufe. In der Zeile >> 1…2
wird der …
Befehl beispielsweise nicht für die Ganzzahlen 1 und 2 ausgeführt , sondern für die von den Zeilen 1 und 2 zurückgegebenen Werte . In diesem Fall sind diese Werte die Ganzzahl 1 und die ganze Zahl, die wir als Eingabe übergeben haben.
In diesem Beispiel betrachten wir die Eingabe von 23 . Beachten Sie, dass aufgrund der Vorverarbeitung von Whispers die zweite Zeile ( > Input
) in konvertiert wird > 23
.
Unser erster Befehl ist in Zeile 3: >> 1…2
. …
ist der dyadische Bereich, in diesem Fall von 1 bis 23 , was {1, 2, ... 22, 23} ergibt . Als nächstes fahren wir mit den Zeilen 9 bis 12 fort :
>> Each 4 3
>> Each 5 9
>> Each 6 10
>> Each 7 11 3
Hier haben wir 4 aufeinanderfolgende Each
Anweisungen, von denen jede über das vorherige Ergebnis iteriert und im Wesentlichen die 4 Befehle über das Array in Zeile 3 abbildet : den Bereich. Die ersten drei Anweisungen sind einfache Karten mit den Zeilen 4 , 5 und 6 :
>> L!
>> L+1
>> L∣2
Diese drei Befehle, über eine ganze Zahl n , Ausbeuten (n! +1) |x , wo ! bezeichnet Fakultät , ∣ bezeichnet Teilbarkeit und x ist die Eingabe. Schließlich hat Linie 12 eine dyadische Kartenstruktur .
Eine dyadische Kartenstruktur besteht aus drei ganzen Zahlen: Das Ziel (links und rechts) verweist jeweils auf andere Zeilen. Hier zippen wir links und rechts, um eine Liste von Paaren zu erstellen, und reduzieren dann jedes Paar um den dyadischen Befehl (das Ziel). Wenn hier die Eingabe 23 ist , lauten die Listen {1, 2, ... 22, 23} und {0, 0, ... 1, 0}, und der Befehl lautet
>> L⋅R
Dies multipliziert das linke Argument mit dem rechten. Dies erzeugt ein Array von Ganzzahlen, wobei 0 bei den Indizes von Ganzzahlen, deren Fakultäten inkrementiert sind, nicht durch die Eingaben teilbar sind, und den ursprünglichen Index, in dem sie sich befinden. Wir werden dieses Array nennen A . Als nächst wir die entfernen 0 s von A , indem die Mengendifferenz zwischen {0} und A :
> {0}
>> 12∖13
In unserem Beispiel ergibt dies die Menge {14, 18, 22} . Als nächstes nehmen wir den Rest der Eingabe, der durch jeden Wert in der Menge geteilt wird, und prüfen, ob dieser Rest ungleich 1 ist :
>> 2%L
>> Each 8 14
>> L≠1
>> Each 16 15
Wieder haben wir eine Liste von entweder 0 oder 1 s und müssen die 0 s entfernen und die 1 s durch die ursprünglichen Werte ersetzen . Hier wiederholen wir den Code, den wir oben gesehen haben, aber mit >> 18∖13
anstatt 12
. Schließlich setzen wir diesen resultierenden Satz für eine abschließende Prüfung in eine Liste um. Leider muss unser Code auch zusammengesetzte Zahlen ablehnen, die alle diese Kriterien erfüllen, z. B. 437 . Also addieren wir unsere letzte Prüfung und multiplizieren unsere letzte Liste mit der Primalität der Eingabe. Aufgrund der Funktionsweise der Python-Multiplikation für Listen ersetzt 0 diese durch eine leere Liste und 1 hat keine Auswirkung. Wir berechnen also die Primalität der Eingabe und multiplizieren diese mit der Liste von ms für die Eingabe und Ausgabe des Endergebnisses:
>> 2’
>> 21⋅20
>> Output 22