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🐕🍉🍉
Experimente online!
-3 bytes usando "menor que ou igual a 1" em vez de "menor que 2" porque o emoji "menor que" possui uma codificação UTF-8 bastante longa. Também feitot
congelou para silenciar um aviso sem afetar a contagem de bytes.
Estende a classe integ (número inteiro) com um método chamado 🅰️. Você pode escrever um programa simples que pega um número da entrada, chama 🅰️ no número e imprime o resultado assim:
🏁🍇
🍦str🔷🔡😯🔤Please enter a number🔤
🍊🍦num🚂str 10🍇
😀🔡🅰️num 10
🍉🍓🍇
😀🔤Learn what a number is, you moron!🔤
🍉
🍉
Esta parte pode ser muito jogada por omitir as mensagens e o tratamento de erros, mas não está incluída na pontuação, então prefiro mostrar mais recursos do Emojicode, melhorando a legibilidade ao longo do caminho.
Ungolfed
🐋🚂🍇
🐖🅰️➡🚂🍇
🍊◀️🐕2🍇
🍎1
🍉
🍮sum 0
🔂k⏩0🐕🍇
🍦nmk➖🐕k
🍮sig nmk
🔂i⏩1 nmk🍇
🍊😛🚮nmk i 0🍇
🍮➕sig i
🍉
🍉
🍮➕sum✖sig🅰️k
🍉
🍎➗sum🐕
🍉
🍉
Explicação
Nota: muitas opções de emoji não fazem muito sentido no emojicode 0.5. É 0.x, afinal. 0,6 corrigirá isso.
O Emojicode é uma linguagem de programação orientada a objetos com genéricos, protocolos, opcionais e fechamentos, mas este programa não usa fechamentos e todos os genéricos e protocolos podem ser considerados implícitos, enquanto a única opção aparece no stub de E / S.
O programa opera em apenas alguns tipos: 🚂 é o tipo inteiro, 🔡 é o tipo de string e ⏩ é o tipo de faixa. Alguns booleanos (👌) também aparecem, mas são usados apenas em condições. Os booleanos podem assumir um valor de 👍 ou 👎, que corresponde a verdadeiro e falso, respectivamente.
Atualmente, não há operadores no Emojicode, portanto, adição, comparsões e outras operações que normalmente são operadores são implementadas como funções, fazendo com que as expressões usem a notação de prefixo. . Os operadores também estão planejados em 0,6.
Vamos abordar o programa de teste primeiro.
🏁
Este é o bloco,, que pode ser comparado ao main de outros idiomas.
🍇 ... 🍉
Uvas e melancias declaram blocos de código no emojicode.
🍦str🔷🔡😯🔤Please enter a number🔤
Isso declara um nome "congelado" str
e define seu valor como uma nova sequência criada usando o inicializador (construtor) 😯, que recebe um prompt como uma sequência e depois insere uma linha do usuário. Por que usar um congelado em vez de uma variável? Como não muda, uma variável emitirá um aviso.
🍊🍦num🚂str 10
Vamos dividir. 🚂str 10
chama o método on no str
congelado com o argumento 10. Por convenção, os métodos nomeados com o nome de um tipo convertem o objeto nesse tipo. 10 é a base a ser usada para conversão de número inteiro. Este método retorna um opcional, significa: avaliar a expressão. Se o opcional contiver nada, a condição será avaliada como 👎 (falso). Caso contrário, um nome congelado é criado com o valor desembrulhado do opcional e a condição é avaliada como 👍, (verdadeiro). Portanto, no uso normal, o bloco após a condicional é inserido.🍬🚂
,. Os opcionais podem conter um valor do tipo base ou do nada, ⚡. Quando a string não contém um número, ⚡ é retornado. Para usar o valor, é necessário desembrulhar o opcional usando 🍺, o que gera um erro de tempo de execução se o valor for ⚡. Portanto, é uma boa prática verificar o nada antes de desembrulhar um opcional. É tão comum, de fato, que o Emojicode tenha uma abreviação para isso. Normalmente, 🍊
é um "se".🍊🍦 variable expression
variable
🍇 ... 🍉
😀🔡🅰️num 10
🅰️ é o método que o código principal adiciona a 🚂 usando 🐋 que calcula o número de partições. Isso chama 🅰️ no num
congelado que declaramos no condicional e converte o resultado em uma string usando a base 10 pelo método 🔡. Então, 😀 imprime o resultado.
🍓🍇 ... 🍉
🍓 significa "else", portanto esse bloco é inserido quando o usuário não digitou um número corretamente.
😀🔤Learn what a number is, you moron!🔤
Imprime a string literal.
Agora, vejamos o programa principal. Eu vou explicar a versão não destruída; a versão golfed acabou de remover o espaço em branco e as variáveis renomeadas para nomes de letras únicas.
🐋🚂🍇 ... 🍉
Estenda a classe.. Esse é um recurso que não é comumente encontrado em linguagens de programação. Em vez de criar uma nova classe com 🚂 como superclasse, ifies modifica 🚂 diretamente.
🐖🅰️➡🚂🍇 ... 🍉
Cria um novo método chamado that️ que retorna a 🚂. Retorna o número de partições calculadas usando a fórmulaa(n) = (1/n) * Sum_{k=0..n-1} sigma(n-k)*a(k)
🍊⬅🐕1🍇
🍎1
🍉
🐕 é semelhante a this
ou self
de outras línguas e refere-se ao objeto em que o método foi chamado. Essa implementação é recursiva, portanto, esta é a condição final: se o número em que o método foi chamado for menor ou igual a 1, retorne 1.
🍮sum 0
Crie uma nova variável sum
e defina-a como 0. Assume implicitamente o tipo 🚂.
🔂k⏩0🐕
🔂 itera sobre qualquer coisa que implemente o protocolo 🔂🐚⚪️, enquanto ⏩ é um literal de intervalo que implementa 🔂🐚🚂. Um intervalo possui um valor inicial, um valor de parada e um valor de etapa, que é assumido como 1 se start < stop
, ou -1, caso contrário. Também é possível especificar o valor da etapa usando ⏭ para criar o literal do intervalo. O valor inicial é inclusivo, enquanto o valor de parada é exclusivo, portanto isso é equivalente a for k in range(n)
ou Sum_{k=0..n-1}
na fórmula.
🍦nmk➖🐕k
Precisamos calcular sigma (n - k), ou a soma dos divisores de n - k
em outras palavras, e o argumento é necessário algumas vezes, portanto, isso armazena n - k
na variável nmk
para salvar alguns bytes.
🍮sig nmk
🔂i⏩1 nmk
Isso define a sig
variável para o argumento de sigma e itera sobre todos os números de 1 a nmk - 1
. Eu poderia inicializar a variável para 0 e repetir 1..nmk, mas fazê-lo dessa maneira é mais curto.
🍊😛🚮nmk i 0
🚮 calcula o restante, ou módulo e 😛 verifica a igualdade; portanto, a condição será 👍 se i
for um divisor de nmk
.
🍮➕sig i
Essa é uma tarefa por chamada, semelhante à += -= >>=
família de operadores em alguns dos idiomas inferiores sem emoji. Esta linha também pode ser escrita como 🍮 sig ➕ sig i
. Portanto, depois que o loop interno terminar, sig
ele conterá a soma dos divisores de n - k
, ousigma(n - k)
🍮➕sum✖sig🅰️k
Outra atribuição por chamada, portanto, isso adiciona sigma(n - k) * A(k)
ao total, assim como na fórmula.
🍎➗sum🐕
Finalmente, a soma é dividida por n e o quociente é retornado. Essa explicação provavelmente levou três vezes mais tempo do que escrever o próprio código ...