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🐕🍉🍉
Pruébalo en línea!
-3 bytes usando "menor o igual que 1" en lugar de "menor que 2" porque el emoji "menor que" tiene una codificación UTF-8 bastante larga. También hechot
un congelado para silenciar una advertencia sin afectar el conteo de bytes.
Extiende la clase 🚂 (entero) con un método llamado 🅰️. Puede escribir un programa simple que tome un número de la entrada, llame a 🅰️ en el número e imprima el resultado de esta manera:
🏁🍇
🍦str🔷🔡😯🔤Please enter a number🔤
🍊🍦num🚂str 10🍇
😀🔡🅰️num 10
🍉🍓🍇
😀🔤Learn what a number is, you moron!🔤
🍉
🍉
Esta parte se puede jugar mucho al omitir los mensajes y el manejo de errores, pero no está incluida en el puntaje, por lo que prefiero mostrar más características de Emojicode, al tiempo que mejora la legibilidad en el camino.
Sin golf
🐋🚂🍇
🐖🅰️➡🚂🍇
🍊◀️🐕2🍇
🍎1
🍉
🍮sum 0
🔂k⏩0🐕🍇
🍦nmk➖🐕k
🍮sig nmk
🔂i⏩1 nmk🍇
🍊😛🚮nmk i 0🍇
🍮➕sig i
🍉
🍉
🍮➕sum✖sig🅰️k
🍉
🍎➗sum🐕
🍉
🍉
Explicación
Nota: muchas opciones de emoji no tienen mucho sentido en emojicode 0.5. Es 0.x, después de todo. 0.6 solucionará esto.
Emojicode es un lenguaje de programación orientado a objetos que presenta genéricos, protocolos, opcionales y cierres, pero este programa no utiliza cierres y todos los genéricos y protocolos pueden considerarse implícitos, mientras que el único opcional aparece en el código auxiliar de E / S.
El programa funciona solo con unos pocos tipos: 🚂 es el tipo entero, 🔡 es el tipo de cadena y ⏩ es el tipo de rango. También aparecen algunos booleanos (👌), pero solo se usan en condiciones. Los booleanos pueden tomar un valor de 👍 o 👎, que corresponden a verdadero y falso, respectivamente.
Actualmente no hay operadores en Emojicode, por lo que además, las comparaciones y otras operaciones que normalmente son operadores se implementan como funciones, lo que hace que las expresiones utilicen la notación de prefijo . Los operadores también están previstos en 0.6.
Abordemos primero el programa de prueba.
🏁
Este es el bloque 🏁, que se puede comparar con main desde otros idiomas.
🍇 ... 🍉
Las uvas y las sandías declaran bloques de código en emojicode.
🍦str🔷🔡😯🔤Please enter a number🔤
Esto declara un nombre "congelado" str
y establece su valor en una nueva cadena creada usando el inicializador (constructor) 😯, que toma una solicitud como una cadena y luego ingresa una línea del usuario. ¿Por qué usar un congelado en lugar de una variable? No cambiará, por lo que una variable emitirá una advertencia.
🍊🍦num🚂str 10
Vamos a desglosarlo. 🚂str 10
llama al método on en el str
congelado con el argumento 10. Por convención, los métodos nombrados con el nombre de un tipo convierten el objeto a ese tipo. 10 es la base a utilizar para la conversión de enteros. Este método devuelve un opcional, 🍬🚂
. Los opcionales pueden contener un valor del tipo base o nada, ⚡. Cuando la cadena no contiene un número, se devuelve ⚡. Para usar el valor, uno tiene que desenvolver el opcional usando 🍺, lo que genera un error de tiempo de ejecución si el valor es ⚡. Por lo tanto, es una buena práctica verificar la nada antes de desenvolver un opcional. Es tan común, de hecho, que Emojicode tiene una abreviatura para eso. Normalmente, 🍊
es un "si".🍊🍦 variable expression
significa: evaluar la expresión. Si lo opcional no contiene nada, la condición se evalúa como 👎 (falso). De lo contrario, un nombre congeladovariable
se crea con el valor desenvuelto de lo opcional y la condición se evalúa como 👍, (verdadero). Por lo tanto, en uso normal, 🍇 ... 🍉
se ingresa el bloque que sigue al condicional.
😀🔡🅰️num 10
🅰️ es el método que el código principal agrega a 🚂 usando 🐋 que calcula el número de particiones. Esto llama a 🅰️ en el num
congelado que declaramos en el condicional y convierte el resultado en una cadena usando la base 10 por el método 🔡. Entonces, 😀 imprime el resultado.
🍓🍇 ... 🍉
🍓 significa "más", por lo que este bloque se ingresa cuando el usuario no ingresó un número correctamente.
😀🔤Learn what a number is, you moron!🔤
Imprime la cadena literal.
Ahora, veamos el programa principal. Explicaré la versión sin golf; la versión de golf acababa de eliminar el espacio en blanco y las variables cambiaron su nombre a letras individuales.
🐋🚂🍇 ... 🍉
Extiende la clase 🚂. Esta es una característica que no se encuentra comúnmente en los lenguajes de programación. En lugar de crear una nueva clase con 🚂 como la superclase, 🐋 modifica 🚂 directamente.
🐖🅰️➡🚂🍇 ... 🍉
Crea un nuevo método llamado 🅰️ que devuelve un 🚂. Devuelve el número de particiones calculadas usando la fórmulaa(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)
🍊⬅🐕1🍇
🍎1
🍉
🐕 es similar a this
o self
de otros idiomas y se refiere al objeto del método se llama en. Esta implementación es recursiva, por lo que esta es la condición de finalización: si el número al que se llamó el método es menor o igual a 1, devuelve 1.
🍮sum 0
Cree una nueva variable sum
y configúrela en 0. Asume implícitamente el tipo 🚂.
🔂k⏩0🐕
🔂 itera sobre cualquier cosa que implemente el protocolo 🔂🐚⚪️, mientras que ⏩ es un rango literal que implementa 🔂🐚🚂. Un rango tiene un valor de inicio, un valor de parada y un valor de paso, que se supone que es 1 si start < stop
, o -1 en caso contrario. También se puede especificar el valor del paso usando ⏭ para crear el rango literal. El valor de inicio es inclusivo, mientras que el valor de detención es exclusivo, por lo que es equivalente for k in range(n)
ao Sum_{k=0..n-1}
en la fórmula.
🍦nmk➖🐕k
Necesitamos calcular sigma (n - k), o la suma de los divisores de n - k
en otras palabras, y el argumento es necesario varias veces, por lo que esto se almacena n - k
en la variable nmk
para guardar algunos bytes.
🍮sig nmk
🔂i⏩1 nmk
Esto establece la sig
variable al argumento de sigma e itera sobre todos los números del 1 al nmk - 1
. Podría inicializar la variable a 0 e iterar sobre 1..nmk pero hacerlo de esta manera es más corto.
🍊😛🚮nmk i 0
🚮 calcula el resto, o módulo y 😛 verifica la igualdad, por lo que la condición será 👍 si i
es un divisor de nmk
.
🍮➕sig i
Esta es una asignación por llamada, similar a la += -= >>=
familia del operador en algunos de los idiomas inferiores libres de emoji. Esta línea también se puede escribir como 🍮 sig ➕ sig i
. Por lo tanto, después de que finalice el ciclo interno, sig
contendrá la suma de divisores de n - k
, osigma(n - k)
🍮➕sum✖sig🅰️k
Otra asignación por llamada, por lo que esto se suma sigma(n - k) * A(k)
al total, como en la fórmula.
🍎➗sum🐕
Finalmente, la suma se divide por n y se devuelve el cociente. Esta explicación probablemente tomó tres veces más tiempo que escribir el código en sí ...