Emojicode 0.5, 204 201 Bytes
🐋🚂🍇🐖🅰️➡🚂🍇🍊⬅🐕1🍇🍎1🍉🍮s 0🔂k⏩0🐕🍇🍦t➖🐕k🍮r t🔂i⏩1 t🍇🍊😛🚮t i 0🍇🍮➕r i🍉🍉🍮➕s✖r🅰️k🍉🍎➗s🐕🍉🍉
Probieren Sie es online!
-3 Bytes bei Verwendung von "kleiner oder gleich 1" anstelle von "kleiner als 2", da das Emoji "kleiner als" eine recht lange UTF-8-Codierung aufweist. Außerdem wurde t
eine Warnung eingefroren, um sie zum Schweigen zu bringen, ohne die Byteanzahl zu beeinflussen.
Erweitert die Klasse 🚂 (Ganzzahl) mit einer Methode mit dem Namen 🅰️. Sie können ein einfaches Programm schreiben, das eine Zahl aus der Eingabe entnimmt, die Zahl mit 🅰️ aufruft und das Ergebnis wie folgt ausgibt:
🏁🍇
🍦str🔷🔡😯🔤Please enter a number🔤
🍊🍦num🚂str 10🍇
😀🔡🅰️num 10
🍉🍓🍇
😀🔤Learn what a number is, you moron!🔤
🍉
🍉
Dieser Teil könnte durch das Weglassen der Meldungen und der Fehlerbehandlung erheblich verbessert werden, ist jedoch nicht in der Partitur enthalten. Ich bevorzuge es, stattdessen mehr Funktionen von Emojicode zu zeigen und gleichzeitig die Lesbarkeit zu verbessern.
Ungolfed
🐋🚂🍇
🐖🅰️➡🚂🍇
🍊◀️🐕2🍇
🍎1
🍉
🍮sum 0
🔂k⏩0🐕🍇
🍦nmk➖🐕k
🍮sig nmk
🔂i⏩1 nmk🍇
🍊😛🚮nmk i 0🍇
🍮➕sig i
🍉
🍉
🍮➕sum✖sig🅰️k
🍉
🍎➗sum🐕
🍉
🍉
Erläuterung
Hinweis: Viele Emojis machen in Emojicode 0.5 wenig Sinn. Immerhin ist es 0.x. 0.6 wird dies beheben.
Emojicode ist eine objektorientierte Programmiersprache mit Generika, Protokollen, Optionen und Abschlüssen. Dieses Programm verwendet jedoch keine Abschlüsse. Alle Generika und Protokolle können als implizit betrachtet werden, während die einzige Option im E / A-Stub angezeigt wird.
Das Programm arbeitet nur mit wenigen Typen: 🚂 ist der Integer-Typ, 🔡 ist der String-Typ und ⏩ ist der Range-Typ. Einige Boolesche Werte (👌) werden ebenfalls angezeigt, sie werden jedoch nur unter Bedingungen verwendet. Boolesche Werte können einen Wert von 👍 oder 👎 annehmen, der true bzw. false entspricht.
Derzeit gibt es in Emojicode keine Operatoren. Daher werden Additionen, Vergleiche und andere Operationen, die normalerweise Operatoren sind, als Funktionen implementiert, sodass die Ausdrücke die Präfixnotation verwenden . Betreiber sind auch in 0.6 geplant.
Lassen Sie uns zuerst das Testprogramm in Angriff nehmen.
🏁
Dies ist der 🏁-Block, der mit dem Hauptblock aus anderen Sprachen verglichen werden kann.
🍇 ... 🍉
Trauben und Wassermelonen deklarieren Codeblöcke in Emojicode.
🍦str🔷🔡😯🔤Please enter a number🔤
Dies deklariert einen "eingefrorenen" Namen str
und setzt diesen Wert auf eine neue Zeichenfolge, die mit dem Initialisierer (Konstruktor) erstellt wurde. Er nimmt eine Eingabeaufforderung als Zeichenfolge und gibt dann eine Zeile vom Benutzer ein. Warum ein Frozen anstelle einer Variablen verwenden? Es ändert sich nicht, sodass eine Variable eine Warnung ausgibt.
🍊🍦num🚂str 10
Lassen Sie es uns aufschlüsseln. 🚂str 10
ruft die 🚂 -Methode für das str
eingefrorene Objekt mit dem Argument 10 auf. Konventionell konvertieren Methoden mit dem Namen eines Typs das Objekt in diesen Typ. 10 ist die Basis für die Ganzzahlkonvertierung. Diese Methode gibt eine optionale, 🍬🚂
. Optionals können einen Wert vom Basistyp oder Nichts enthalten, ⚡. Wenn die Zeichenfolge keine Zahl enthält, wird ⚡ zurückgegeben. Um den Wert zu verwenden, muss man das optionale mit 🍺 auspacken, was einen Laufzeitfehler auslöst, wenn der Wert ⚡ ist. Aus diesem Grund ist es empfehlenswert, vor dem Auspacken eines optionalen Geräts zu prüfen, ob keine Informationen vorliegen. Tatsächlich ist es so üblich, dass Emojicode eine Abkürzung dafür hat. Normalerweise 🍊
ist ein "wenn".🍊🍦 variable expression
bedeutet: bewerte den Ausdruck. Wenn das optionale Element nichts enthält, wird die Bedingung mit false (falsch) bewertet. Andernfalls wird ein eingefrorener Name variable
mit dem nicht umbrochenen Wert der Option erstellt, und die Bedingung wird mit to (wahr) ausgewertet. Daher wird im normalen Gebrauch der 🍇 ... 🍉
Block eingegeben , der der Bedingung folgt.
😀🔡🅰️num 10
🅰️ ist die Methode, die der Hauptcode zu 🚂 hinzufügt, indem er 🐋 verwendet, um die Anzahl der Partitionen zu berechnen. Dies ruft 🅰️ auf der num
eingefrorenen Bedingung auf, die wir in der Bedingung deklariert haben, und konvertiert das Ergebnis mit der Methode 🔡 zur Basis 10 in einen String. Dann druckt 😀 das Ergebnis.
🍓🍇 ... 🍉
🍓 bedeutet "else", daher wird dieser Block eingegeben, wenn der Benutzer eine Nummer nicht korrekt eingegeben hat.
😀🔤Learn what a number is, you moron!🔤
Gibt das String-Literal aus.
Nun schauen wir uns das Hauptprogramm an. Ich werde die ungolfed Version erklären; Bei der Golf-Version wurde nur das Leerzeichen entfernt und die Variablen in Einzelbuchstaben umbenannt.
🐋🚂🍇 ... 🍉
Erweitern Sie die Klasse 🚂. Dies ist eine Funktion, die in Programmiersprachen nicht häufig vorkommt. Anstatt eine neue Klasse mit 🚂 als Oberklasse zu erstellen, wird, direkt geändert.
🐖🅰️➡🚂🍇 ... 🍉
Erstellt eine neue Methode mit dem Namen 🅰️, die ein 🚂 zurückgibt. Es gibt die Anzahl der Partitionen zurück, die mit der Formel berechnet wurdena(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)
🍊⬅🐕1🍇
🍎1
🍉
🐕 ähnelt this
oder stammt self
aus anderen Sprachen und bezieht sich auf das Objekt, für das die Methode aufgerufen wurde. Diese Implementierung ist rekursiv, daher ist dies die Abschlussbedingung: Wenn die Zahl, auf die die Methode aufgerufen wurde, kleiner oder gleich 1 ist, wird 1 zurückgegeben.
🍮sum 0
Erstellen Sie eine neue Variable sum
und setzen Sie sie auf 0. Nimmt implizit den Typ 🚂 an.
🔂k⏩0🐕
🔂 iteriert über alles, was das Protokoll implementiert, während ⏩ ein Bereichsliteral ist, das gerade implementiert. Ein Bereich hat einen Startwert, einen Stoppwert und einen Schrittwert, der als 1 wenn start < stop
oder -1 sonst angenommen wird. Sie können den Schrittwert auch angeben, indem Sie mit ⏭ das Bereichsliteral erstellen. Der Startwert ist inklusive, während der Stoppwert exklusiv ist. Dies ist also äquivalent zu for k in range(n)
oder Sum_{k=0..n-1}
in der Formel.
🍦nmk➖🐕k
Wir müssen Sigma (n - k) oder mit n - k
anderen Worten die Summe der Teiler von berechnen , und das Argument wird einige Male benötigt, sodass es n - k
in der Variablen gespeichert wird nmk
, um einige Bytes zu sparen.
🍮sig nmk
🔂i⏩1 nmk
Dies setzt die sig
Variable auf das Argument von Sigma und durchläuft alle Zahlen von 1 bis nmk - 1
. Ich könnte die Variable auf 0 initialisieren und über 1..nmk iterieren, aber dies ist kürzer.
🍊😛🚮nmk i 0
🚮 berechnet den Rest oder Modul und 😛 prüft auf Gleichheit, so dass die Bedingung 👍 ist, wenn i
ein Teiler von ist nmk
.
🍮➕sig i
Dies ist eine telefonische Aufgabe, ähnlich der += -= >>=
Bedienerfamilie in einigen der minderwertigen, emojifreien Sprachen. Diese Zeile kann auch als geschrieben werden 🍮 sig ➕ sig i
. Enthält daher nach Beendigung der inneren Schleife sig
die Summe der Teiler von n - k
odersigma(n - k)
🍮➕sum✖sig🅰️k
Eine weitere Zuweisung per Anruf, dies addiert sigma(n - k) * A(k)
sich also genau wie in der Formel zur Gesamtsumme.
🍎➗sum🐕
Schließlich wird die Summe durch n dividiert und der Quotient zurückgegeben. Diese Erklärung hat wahrscheinlich dreimal so lange gedauert wie das Schreiben des Codes selbst ...