Emojicode 0,5, 204 201 octets
🐋🚂🍇🐖🅰️➡🚂🍇🍊⬅🐕1🍇🍎1🍉🍮s 0🔂k⏩0🐕🍇🍦t➖🐕k🍮r t🔂i⏩1 t🍇🍊😛🚮t i 0🍇🍮➕r i🍉🍉🍮➕s✖r🅰️k🍉🍎➗s🐕🍉🍉
Essayez-le en ligne!
-3 octets en utilisant "inférieur ou égal à 1" au lieu de "inférieur à 2" car l'émoji "inférieur à" a un encodage UTF-8 assez long. Également fait t
un gel pour faire taire un avertissement sans affecter le nombre d'octets.
Étend la classe 🚂 (entier) avec une méthode nommée 🅰️. Vous pouvez écrire un programme simple qui prend un nombre de l'entrée, appelle 🅰️ sur le numéro et imprime le résultat comme ceci:
🏁🍇
🍦str🔷🔡😯🔤Please enter a number🔤
🍊🍦num🚂str 10🍇
😀🔡🅰️num 10
🍉🍓🍇
😀🔤Learn what a number is, you moron!🔤
🍉
🍉
Cette partie pourrait être beaucoup jouée en omettant les messages et la gestion des erreurs, mais elle n'est pas incluse dans le score, donc je préfère montrer plus de fonctionnalités d'Emojicode à la place, tout en améliorant la lisibilité en cours de route.
Non golfé
🐋🚂🍇
🐖🅰️➡🚂🍇
🍊◀️🐕2🍇
🍎1
🍉
🍮sum 0
🔂k⏩0🐕🍇
🍦nmk➖🐕k
🍮sig nmk
🔂i⏩1 nmk🍇
🍊😛🚮nmk i 0🍇
🍮➕sig i
🍉
🍉
🍮➕sum✖sig🅰️k
🍉
🍎➗sum🐕
🍉
🍉
Explication
Remarque: beaucoup de choix d'emoji n'a pas beaucoup de sens dans emojicode 0.5. C'est 0.x, après tout. 0.6 corrigera cela.
Emojicode est un langage de programmation orienté objet comprenant des génériques, des protocoles, des options et des fermetures, mais ce programme n'utilise aucune fermeture et tous les génériques et protocoles peuvent être considérés comme implicites, tandis que le seul facultatif apparaît dans le talon d'E / S.
Le programme ne fonctionne que sur quelques types: 🚂 est le type entier, 🔡 est le type chaîne et ⏩ est le type plage. Quelques booléens (👌) apparaissent également, mais ils ne sont utilisés que dans des conditions. Les booléens peuvent prendre une valeur de 👍 ou 👎, qui correspondent respectivement à vrai et faux.
Il n'y a actuellement aucun opérateur dans Emojicode, donc l'addition, les comparaisons et d'autres opérations qui sont normalement des opérateurs sont implémentées en tant que fonctions, ce qui fait que les expressions utilisent la notation de préfixe . Des opérateurs sont également prévus en 0.6.
Abordons d'abord le programme de test.
🏁
Il s'agit du bloc 🏁, qui peut être comparé au principal des autres langues.
🍇 ... 🍉
Les raisins et les pastèques déclarent des blocs de code en emojicode.
🍦str🔷🔡😯🔤Please enter a number🔤
Cela déclare un "gelé" nommé str
et lui attribue une nouvelle chaîne créée à l'aide de l'initialiseur (constructeur) which, qui prend une invite sous forme de chaîne, puis entre une ligne de l'utilisateur. Pourquoi utiliser un gelé au lieu d'une variable? Il ne changera pas, donc une variable émettrait un avertissement.
🍊🍦num🚂str 10
Décomposons-le. 🚂str 10
appelle la méthode 🚂 sur le str
gelé avec l'argument 10. Par convention, les méthodes nommées avec le nom d'un type convertissent l'objet en ce type. 10 est la base à utiliser pour la conversion d'entiers. Cette méthode retourne une option, 🍬🚂
. Les options peuvent contenir une valeur de type de base ou néant, ⚡. Lorsque la chaîne ne contient pas de nombre, ⚡ est renvoyé. Pour utiliser la valeur, il faut déballer l'option en utilisant 🍺, ce qui déclenche une erreur d'exécution si la valeur est ⚡. Par conséquent, il est recommandé de vérifier le néant avant de déballer une option. C'est tellement courant, en fait, qu'Emojicode a un raccourci pour ça. Normalement, 🍊
c'est un "si".🍊🍦 variable expression
signifie: évaluer l'expression. Si l'option facultative ne contient rien, la condition est évaluée à 👎 (faux). Sinon, un nom figévariable
est créé avec la valeur non encapsulée de l'option, et la condition est évaluée à 👍, (true). Par conséquent, en utilisation normale, le 🍇 ... 🍉
bloc suivant le conditionnel est entré.
😀🔡🅰️num 10
🅰️ est la méthode que le code principal ajoute à 🚂 en utilisant 🐋 qui calcule le nombre de partitions. Cela appelle 🅰️ sur le num
gelé que nous avons déclaré au conditionnel et convertit le résultat en une chaîne utilisant la base 10 par la méthode 🔡. Ensuite, 😀 imprime le résultat.
🍓🍇 ... 🍉
🍓 signifie "autre", donc ce bloc est entré lorsque l'utilisateur n'a pas entré correctement un numéro.
😀🔤Learn what a number is, you moron!🔤
Imprime la chaîne littérale.
Maintenant, regardons le programme principal. Je vais expliquer la version non golfée; la version golfée a simplement supprimé les espaces et renommé les variables en noms de lettre unique.
🐋🚂🍇 ... 🍉
Étendez la classe 🚂. Il s'agit d'une fonctionnalité que l'on ne trouve pas couramment dans les langages de programmation. Au lieu de créer une nouvelle classe avec 🚂 comme superclasse, 🐋 modifie 🚂 directement.
🐖🅰️➡🚂🍇 ... 🍉
Crée une nouvelle méthode nommée 🅰️ qui renvoie un 🚂. Il renvoie le nombre de partitions calculé à l'aide de la formulea(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)
🍊⬅🐕1🍇
🍎1
🍉
🐕 est similaire this
ou self
provenant d'autres langages et fait référence à l'objet sur lequel la méthode a été appelée. Cette implémentation est récursive, il s'agit donc de la condition de fin: si le nombre auquel la méthode a été appelée est inférieur ou égal à 1, retournez 1.
🍮sum 0
Créez une nouvelle variable sum
et définissez-la sur 0. Suppose implicitement le type 🚂.
🔂k⏩0🐕
🔂 itère sur tout ce qui implémente le protocole 🔂🐚⚪️, tandis que ⏩ est un littéral de plage qui arrive à implémenter 🔂🐚🚂. Une plage a une valeur de début, une valeur d'arrêt et une valeur de pas, qui est supposée être 1 si start < stop
, ou -1 sinon. On peut également spécifier la valeur de l'étape en utilisant le ⏭ pour créer le littéral de plage. La valeur de départ est inclusive, tandis que la valeur d'arrêt est exclusive, c'est donc équivalent à for k in range(n)
ou Sum_{k=0..n-1}
dans la formule.
🍦nmk➖🐕k
Nous devons calculer sigma (n - k), ou la somme des diviseurs de n - k
en d'autres termes, et l'argument est nécessaire plusieurs fois, donc cela stocke n - k
dans la variable nmk
pour économiser quelques octets.
🍮sig nmk
🔂i⏩1 nmk
Cela définit la sig
variable sur l'argument de sigma et itère sur tous les nombres de 1 à nmk - 1
. Je pourrais initialiser la variable à 0 et itérer sur 1..nmk mais le faire de cette façon est plus court.
🍊😛🚮nmk i 0
🚮 calcule le reste, ou module et 😛 vérifie l'égalité, donc la condition sera 👍 si i
est un diviseur de nmk
.
🍮➕sig i
Il s'agit d'une affectation par appel, similaire à la += -= >>=
famille des opérateurs dans certaines des langues inférieures, sans emoji. Cette ligne peut également s'écrire 🍮 sig ➕ sig i
. Par conséquent, une fois la boucle intérieure terminée, sig
contiendra la somme des diviseurs de n - k
, ousigma(n - k)
🍮➕sum✖sig🅰️k
Une autre affectation par appel, donc cela ajoute sigma(n - k) * A(k)
au total, tout comme dans la formule.
🍎➗sum🐕
Enfin, la somme est divisée par n et le quotient est renvoyé. Cette explication a probablement pris trois fois plus de temps que d'écrire le code lui-même ...