Vocês já devem estar familiarizados com a sequência de Conway (também conhecida como sequência de "olhe e diga") :
1
11
21
1211
111221
312211
etc
Você também pode começar por qualquer número arbitrário como ponto de partida. Let f(s)
Ser o próximo elemento da seqüência. Agora, para cada dado s
que podemos encontrar f(s)
. O inverso não é tão trivial: não é y
possível encontrar o predecessor de s
tal maneira que seja possível f(s) = y
. Por exemplo, porque y = 1
não conseguimos encontrar um antecessor. Mas se y
tiver um comprimento par, você pode dividi-lo em pares de dígitos que descrevem cada parte de um predecessor:
513211 divides in 51,32,11
so: 51 comes from 11111
32 comes from 222
11 comes from 1
put together: 111112221
Dessa forma, podemos definir um predecessor exclusivo para todos os y
comprimentos pares.
Nota : O 'predecessor' s
definido dessa maneira geralmente NÃO é satisfatório f(s) = y
.
Objetivo
Escreva um trecho de função / programa que aceite uma sequência de dígitos como entrada que
- calcula o próximo elemento da sequência de Conway se o comprimento da sequência de entrada for ímpar
- calcula o predecessor da sequência de entrada, conforme definido acima, se o comprimento da sequência de entrada for par .
O menor código em bytes vence.
Perguntas recentes baseadas nas seqüências do tipo look-and-say:
513111
se divide em51
,32
e11
?11111111111111
ser? De acordo com suas especificações, seria1111111
. Você deve modificar sua especificação para definir uma resposta razoável para isso.11111111111111
simplesmente não tem antecessor. É uma entrada ilegal.Respostas:
CJam,
4645444342 bytesTeste aqui. Ele pega o número em STDIN e imprime o resultado em STDOUT.
fonte
si
->~
= 45Rubi,
125 120 119101 bytesEntrada de string obtida através da função
f
:Expandido com notas:
fonte
Prolog - 170 bytes
Este recorte define a função
(-)/2
. Você pode invocá-lo comoParece haver apenas um comprimento nesta sequência com uma paridade ímpar: a inicial
[1]
.Legível:
fonte
Python: 139 caracteres
caso de teste único
fonte
s)] if
paras)]if
.2 else
Haskell,
134 128115Se ele precisa ser de stdin / stdout, adicione
main=interact l
para150 144131 caracteres totais. A função é chamadal
.fonte
l "11"
trabalho, recebo uma exceção coml "111"
oul "1111111111111"
Perl - 98 bytes
O tamanho de todas essas instruções de controle me incomoda, mas estou muito feliz com a maneira como as expressões regulares funcionaram.
Descomprimido:
fonte
Erlang, 205
A função principal é f, pegando a entrada como uma string Erlang e retornando a saída como uma string também.
A função pode ser reduzida em 15 bytes (190) eliminando os requisitos de maiúsculas e minúsculas de mais de 9 caracteres idênticos.
f
chamadasg
que calculam o predecessor recursivamente e, se o número de caracteres for ímpar (encontrado quando a computação termina), ele chama a função com ai
qual, emparelhadoh
, calcula o próximo elemento.fonte
Haskell, 105
Eu acho que é legal que acabou por não usar nenhuma função auxiliar :-).
fonte
|x:y:z<-r
- Eu totalmente não sabia que você poderia fazer isso. Isto é tão legal!APL (45)
Sim, essa é uma definição de função válida, mesmo com a
∊
parte externa.fonte
Java 7, Pontuação =
252235 bytesSim, é java novamente; a pior linguagem de golfe do mundo. Essa abordagem usa seqüências de caracteres. Inteiros arbitrariamente grandes são suportados em java, mas precisariam de muito mais espaço para codificar.
Ligue com
f(intputString)
. Retorna a string correspondente.Golfe:
Golfe Expandido com código de estrutura:
Parcialmente Golfed:
Completamente expandido:
Para executar, primeiro compile a segunda entrada com:
javac LookAndSayExpandedGolfed.java
Em seguida, execute com:
java LookAndSayExpandedGolfed
Edit: Corrigido erro.
fonte
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4 at java.lang.String.charAt(String.java:658)
--1
deveria ser--i
?513211
->11111
.Javascript (no navegador, ES5, IE8 +), 152
Pode ser reduzido em 4 caracteres se você pular var, ou mais alguns caracteres com outras globais intermediárias não alteradas também, mas vamos fingir que não somos maus programadores por um minuto.
Alternando para a função de sintaxe curta ES6 com argumento e valor de retorno, em vez de usar prompt, o alerta para E / S pode economizar mais.
JSFiddle aqui: http://jsfiddle.net/86L1w6Lk/
fonte
var
s ... somos todos "maus programadores" aqui. ;)Python 3 - 159 bytes
fonte
Cobra - 217
(186 se eu puder assumir que uma
use
declaraçãoSystem.Text.RegularExpressions
existe em outro lugar)fonte
JavaScript (ES6) 85
Usando expressão regular, substitua por function. Regexp diferente e função diferente, dependendo do comprimento da entrada ser par ou ímpar.
fonte