Em Gödel, Escher, Bach , Douglas Hofstadter introduz uma sequência inteira que é geralmente chamada de sequência figura-figura:
2, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, ...
Você pode gostar de elaborar a definição da sequência como parte do desafio, mas se não puder ou não quiser descobrir, poderá encontrá-la no OEIS como sequência A030124 e uma definição um pouco mais clara na Wikipedia .
Escreva um programa ou função que, fornecido n
via STDIN, ARGV ou argumento de função, imprima uma lista dos primeiros n
números da sequência em STDOUT em qualquer formato razoável de lista.
Este é o código golf, a solução mais curta em bytes vence.
code-golf
number
number-theory
sequence
Martin Ender
fonte
fonte
Ruby,
5448Demo
Edit: Golfed isso um pouco mais uma vez eu percebi que não preciso manter a sequência completa de complemento na memória. Eis como funciona agora: Usamos
x
para rastrear o maior número computado na sequência do complemento eb
é um pool de candidatos à sequência.n
vezes, produzimos o menor elemento restanteb
e o adicionamosx
para calcular o próximo número na sequência do complemento. Em seguida, removemos os dois números do pool de candidatos, para que sempre apresentemos o menor número que ainda não foi adicionado a nenhuma sequência.Truques de golfe em Ruby: A sintaxe lambda estável é mais curta que uma definição de método. O requisito que a saída é fornecida para STDOUT em vez de como valor de retorno inspirou-me a usar o fato de que o valor de retorno
p(x)
éx
, o qual normalmente não me lembro porque não é o caso da versão Ruby usada no Anarchy Golf.fonte
2..2*n
. Eu tenho que usá-lon*n
porque estou fazendob = [x]^b
isso de maneira eficaz . Preciso que o maior elementob
seja maior que o maior valorx
, mas vocêb -= [x]
só precisa queb
contenha o maior valor possível da sequência de saída.Haskell,
676160565553 caracteresde volta ao primeiro algoritmo.
esta solução calcula a sequência do complemento somando os elementos iniciais da sequência. depois calcula a sequência como todos os números entre os números de sequência do complemento.
(#)
é a função que calcula os números entre a sequência do complemento.h
é a própria sequência.g
é a função que responde à pergunta.a função g é definida para tirar apenas a quantidade necessária de elementos de h.
sutilezas:
h
é realmente a sequência da figura, exceto pelos 2 primeiros elementos.não a sequência do complemento é calculada, mas a sequência do complemento com 1 adicionado para cada elemento.
essas duas sutilezas são a razão
scanl(+)8h
(que é o código para a sequência do complemento (exceto os 2 primeiros elementos) com 1s adicionados)8
. é para o terceiro elemento da sequência do complemento com 1 adicionado a ele.a razão que o cálculo não está faltando os dois primeiros elementos é porque eles são adicionados
g
no2:4:h
.exemplo:
fonte
GolfScript (
2421 bytes)Demonstração online
Isso começou de maneira bem diferente, mas acabou convergindo para uma porta GolfScript da solução Ruby do histocrat , antes que Dennis fizesse algumas sugestões que a levassem em uma direção um pouco diferente. Em particular, imprimir os números à medida que os identificamos economiza bastante em reuni-los em uma matriz para impressão no final; O motivo é que isso significa que em nenhum momento precisamos nos preocupar com mais de 3 itens na pilha.
Dissecação
fonte
^
por\-
, poderá substituir).*
por3*
. Isso não salva nenhum bytes, mas reduz drasticamente o tempo de execução e o uso de memória. - Você poderá salvar um byte mantendo o número inteiro na parte superior da matriz. O loop terá a mesma contagem de bytes, mas a inicialização será um byte menor.~.3*,1>\{(\(.p@+\|}*;
J - 28 car
Função tomada
n
como argumento.Executamos uma função, com o
n
argumento esquerdo, repetidamente no argumento direito até que não produza alteração. O argumento para começar é a lista2 4
.Na própria função, pegamos as somas parciais
+/\
e a soma total+/
e depois incrementamos as duas com&:>:
. Em seguida, geramos todos os números inteiros de 2 para um que seja mais que soma total (2+i.
) e definimos subtrair (-.
) as somas parciais, deixando uma sequência de figura-figura mais longa por definição. Por fim, reduzimos ou estendemos ciclicamente a listan
.O resultado é que
2 4
se torna3 7
, e isso é removido da2..8
partida2 4 5 6 8
. Após outra rodada,2 4 5 6 8
torna-3 7 12 18 26
seDessa maneira, estendemos repetidamente a sequência figura-figura. O
$
comportamento do comprimento é apenas uma maneira não trivial de economizar caracteres, aguardando que a sequência cresça para um comprimenton
ou mais e produzindo osn
primeiros valores quando eles param de mudar. Também não precisamos esperar muito: podemos obter 46336 termos em quatro aplicações do verbo interno.A mesma função em k:
{{x#y@&~_lin[y:1+!1+/y;1+\y]}[x]/2 4}
{{x#y@&~(y:2+!1+/y)in\:1+\y}[x]/2 4}
fonte
Java -
183158Foi o máximo que eu já joguei em qualquer coisa, e tenho orgulho disso! (Embora não esteja nem perto do topo dos gráficos (porque é Java))
Obrigado a Peter Taylor pelas sugestões
Maior -
fonte
Byte.valueOf
salva três e, como a pergunta não especifica o intervalo de entrada, acho que deve ser aceitável. Fora dos loops,m
é usado apenas para inicializarn
, o quek++<m
poderia serm-->0
, eliminandok
completamente.int[] n
pode ser inicializado comoint n[]
e mesclado no inicializador anterior.n
nunca possui valores diferentes de1
, entãon[...]!=0
poderia sern[...]>0
. O inicializador pode então se tornar a parte do primeirofor
loop do inicializador .u
e usar++w
, não há necessidade de configurarn[q]
oun[w]
. Há um erro, no qual você corre no final den
quandom==2
, o que parece ser melhor corrigido ao inicializarn=new int[2*m*m]
, mas acho que o tamanho é de 157 bytes.for(int q=1,w=2,m=...,n[]=...;m-->0;){...
salvando um ponto e vírgula.Python 2 - 77 bytes
Código:
Funciona da mesma forma que a solução do @ histocrat, exceto que a entrada vem do stdin.
fonte
Python 2-68
fonte
Gelatina , 15 bytes
Experimente online!
Erro de memória na entrada de 6.
Como funciona
Versão mais eficiente, 16 bytes
Experimente online!
Usa uma idéia de esta resposta J . Trunque no comprimento desejado a cada iteração e use o ponto de correção. Pensei em usar
S
(soma) em vez deṀ‘
(max + 1), mas não posso garantir sua correção.fonte