🐋🚂🍇🐖🅰️➡🚂🍇🍊⬅🐕1🍇🍎1🍉🍮s 0🔂k⏩0🐕🍇🍦t➖🐕k🍮r t🔂i⏩1 t🍇🍊😛🚮t i 0🍇🍮➕r i🍉🍉🍮➕s✖r🅰️k🍉🍎➗s🐕🍉🍉
Provalo online!
-3 byte usando "minore di o uguale a 1" invece di "minore di 2" perché l'emoji "minore di" ha una codifica UTF-8 piuttosto lunga. Inoltre ha reso t
un congelato per silenziare un avviso senza influire sul conteggio dei byte.
Estende la classe 🚂 (intera) con un metodo chiamato 🅰️. Puoi scrivere un semplice programma che prende un numero dall'input, chiama 🅰️ sul numero e stampa il risultato in questo modo:
🏁🍇
🍦str🔷🔡😯🔤Please enter a number🔤
🍊🍦num🚂str 10🍇
😀🔡🅰️num 10
🍉🍓🍇
😀🔤Learn what a number is, you moron!🔤
🍉
🍉
Questa parte potrebbe essere giocata a golf omettendo i messaggi e la gestione degli errori, ma non è inclusa nella partitura, quindi preferisco mostrare più funzionalità di Emojicode, migliorando nel contempo la leggibilità lungo il percorso.
Ungolfed
🐋🚂🍇
🐖🅰️➡🚂🍇
🍊◀️🐕2🍇
🍎1
🍉
🍮sum 0
🔂k⏩0🐕🍇
🍦nmk➖🐕k
🍮sig nmk
🔂i⏩1 nmk🍇
🍊😛🚮nmk i 0🍇
🍮➕sig i
🍉
🍉
🍮➕sum✖sig🅰️k
🍉
🍎➗sum🐕
🍉
🍉
Spiegazione
Nota: molta scelta delle emoji non ha molto senso nell'emojicode 0.5. È 0.x, dopo tutto. 0.6 risolverà questo.
Emojicode è un linguaggio di programmazione orientato agli oggetti che presenta generici, protocolli, optionals e chiusure, ma questo programma non utilizza chiusure e tutti i generici e protocolli possono essere considerati impliciti, mentre l'unica opzione appare nello stub I / O.
Il programma funziona solo su alcuni tipi: 🚂 è il tipo intero, 🔡 è il tipo di stringa e ⏩ è il tipo di intervallo. Appaiono anche alcuni booleani (👌), ma sono usati solo in condizioni. I booleani possono assumere un valore di 👍 o 👎, che corrispondono rispettivamente a vero e falso.
Attualmente non ci sono operatori in Emojicode, quindi addizioni, comparazioni e altre operazioni che normalmente sono operatori vengono implementate come funzioni, facendo sì che le espressioni utilizzino la notazione con prefisso . Gli operatori sono inoltre previsti in 0.6.
Affrontiamo prima il programma di test.
🏁
Questo è il blocco 🏁, che può essere paragonato al principale da altre lingue.
🍇 ... 🍉
Uva e angurie dichiarano blocchi di codice in emojicode.
🍦str🔷🔡😯🔤Please enter a number🔤
Questo dichiara un nome "congelato" str
e lo imposta su una nuova stringa creata usando l'inizializzatore (costruttore) 😯, che accetta un prompt come stringa e quindi immette una riga dall'utente. Perché usare un congelato anziché una variabile? Non cambierà, quindi una variabile emetterebbe un avviso.
🍊🍦num🚂str 10
Analizziamolo. 🚂str 10
chiama il metodo on sul str
congelato con l'argomento 10. Per convenzione, i metodi denominati con il nome di un tipo convertono l'oggetto in quel tipo. 10 è la base da utilizzare per la conversione di numeri interi. Questo metodo restituisce un optional, 🍬🚂
. Gli optionals possono contenere un valore del tipo base o il nulla, ⚡. Quando la stringa non contiene un numero, viene restituito ⚡. Per utilizzare il valore, è necessario scartare l'opzione opzionale usando 🍺, che genera un errore di runtime se il valore è ⚡. Pertanto, è buona norma verificare la presenza di nulla prima di scartare un optional. È così comune, infatti, che Emojicode ha una scorciatoia per questo. Normalmente, 🍊
è un "if".🍊🍦 variable expression
significa: valuta l'espressione. Se il facoltativo contiene nulla, la condizione viene valutata 👎 (falso). Altrimenti, variable
viene creato un nome congelato con il valore non scartato dell'opzione facoltativa e la condizione restituisce 👍, (vero). Pertanto, nell'uso normale, 🍇 ... 🍉
viene inserito il blocco che segue il condizionale.
😀🔡🅰️num 10
🅰️ è il metodo che il codice principale aggiunge a 🚂 usando 🐋 che calcola il numero di partizioni. Questo chiama 🅰️ sul num
congelato che abbiamo dichiarato nel condizionale e converte il risultato in una stringa usando la base 10 con il metodo 🔡. Quindi, 😀 stampa il risultato.
🍓🍇 ... 🍉
🍓 significa "altro", quindi questo blocco viene inserito quando l'utente non ha inserito un numero correttamente.
😀🔤Learn what a number is, you moron!🔤
Stampa il valore letterale della stringa.
Ora diamo un'occhiata al programma principale. Spiegherò la versione non golfata; la versione golfata ha appena rimosso lo spazio bianco e le variabili sono state rinominate con nomi a lettera singola.
🐋🚂🍇 ... 🍉
Estendi la classe 🚂. Questa è una funzionalità che non si trova comunemente nei linguaggi di programmazione. Invece di creare una nuova classe con 🚂 come superclasse, 🐋 modifica 🚂 direttamente.
🐖🅰️➡🚂🍇 ... 🍉
Crea un nuovo metodo chiamato 🅰️ che restituisce 🚂. Restituisce il numero di partizioni calcolate utilizzando la formulaa(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)
🍊⬅🐕1🍇
🍎1
🍉
🐕 è simile this
o self
proveniente da altre lingue e si riferisce all'oggetto sul quale è stato chiamato il metodo. Questa implementazione è ricorsiva, quindi questa è la condizione finale: se il numero su cui è stato chiamato il metodo è minore o uguale a 1, restituisce 1.
🍮sum 0
Crea una nuova variabile sum
e impostala su 0. Assume implicitamente il tipo 🚂.
🔂k⏩0🐕
🔂 scorre su tutto ciò che implementa il protocollo 🔂🐚⚪️, mentre ⏩ è un intervallo letterale che capita di implementare 🔂🐚🚂. Un intervallo ha un valore iniziale, un valore di arresto e un valore di passo, che si presume sia 1 se start < stop
o -1 altrimenti. Si può anche specificare il valore del passo usando ⏭ per creare l'intervallo letterale. Il valore iniziale è inclusivo, mentre il valore finale è esclusivo, quindi questo è equivalente for k in range(n)
o Sum_{k=0..n-1}
nella formula.
🍦nmk➖🐕k
Dobbiamo calcolare sigma (n - k), o la somma dei divisori di n - k
in altre parole, e l'argomento è necessario alcune volte, quindi questo memorizza n - k
nella variabile nmk
per salvare alcuni byte.
🍮sig nmk
🔂i⏩1 nmk
Questo imposta la sig
variabile sull'argomento di sigma e scorre su tutti i numeri da 1 a nmk - 1
. Potrei inizializzare la variabile su 0 e iterare su 1..nmk ma farlo in questo modo è più breve.
🍊😛🚮nmk i 0
🚮 calcola il resto, o modulo e 😛 verifica l'uguaglianza, quindi la condizione sarà 👍 se i
è un divisore di nmk
.
🍮➕sig i
Questo è un incarico su chiamata, simile alla += -= >>=
famiglia dell'operatore in alcune delle lingue inferiori, prive di emoji. Questa riga può anche essere scritta come 🍮 sig ➕ sig i
. Pertanto, al termine del ciclo interno, sig
conterrà la somma dei divisori di n - k
, osigma(n - k)
🍮➕sum✖sig🅰️k
Un altro compito per chiamata, quindi questo si aggiunge sigma(n - k) * A(k)
al totale, proprio come nella formula.
🍎➗sum🐕
Infine, la somma viene divisa per n e viene restituito il quoziente. Questa spiegazione probabilmente ha richiesto tre volte tanto quanto scrivere il codice stesso ...