Dado um número inteiro n
(onde n < 10001
) como entrada, escreva um programa que produzirá os primeiros n
números Ulam . Um número Ulam é definido da seguinte maneira:
- L 1 =
1
, L 2 =2
. - Pois
n > 2
, U n é o menor número inteiro maior que U n-1, que é a soma de dois termos anteriores distintos , exatamente de uma maneira.
Por exemplo, L 3 representa 3
(2 + 1), L 4 representa 4
(3 + 1) (Note-se que (2 + 2) não conta que as condições não são distintas), e L 5 seja 6
, (L 5 não é 5 porque 5 pode ser representado como 2 + 3 ou 4 + 1). Aqui estão os primeiros números da Ulam:
1, 2, 3, 4, 6, 8, 11, 13, 16, 18, 26, 28, 36, 38, 47, 48, 53, 57, 62, 69, 72, 77, 82, 87, 97, 99
Isso é código de golfe, portanto a entrada mais curta vence.
code-golf
number
number-theory
sequence
absinto
fonte
fonte
n
que temos que lidar?Respostas:
CJam,
474137 bytesExperimente online.
Exemplo de execução
Como funciona
Essa ideia básica é a seguinte:
Comece com a matriz
A := [ 0 U₁ U₂ ... Uₖ ]
.Computar
S
, a matriz de todas as somasx + y
tais quex,y ∊ A
ex < y
.Descartar todas as somas não exclusivas de
S
. Como todo número Ulam maior que 2 é a soma de dois menores e a soma de zero e ele próprio, isso descarta os números UlamU₃, U₄, ... Uₖ
.A matriz restante é
[ U₁ U₂ Uₖ₊₁ ... ]
, portanto, o próximo número Ulam é o terceiro menor elemento. Anexe-oA
e volte para a etapa 1.fonte
100
já leva vários segundos. Suponho que calcular a entrada máxima 1e5 levaria idades?J - 46 char
Função tomada
n
como argumento.Explicado por explosão:
fonte
+_*
...T-SQL,
301300288287Eu cometi um pouco de abuso leve de SQL.
Experimentá-lo em SQL Server 2008 aqui .
@N mantém o número inteiro de entrada. Mude o exemplo "100" para o que n deve ser. "10000" provavelmente terminará eventualmente, mas eu não deixei isso terminar. A contagem de caracteres desta entrada é para uma entrada de um dígito. A saída está no formulário de resultado da consulta.
fonte
Haskell,
7067 caracteresuso:
fonte
GolfScript (
4137 bytes)Demonstração online
Os produtos cartesianos no GolfScript são bastante longos, portanto, isso requer uma abordagem diferente. O crescimento a longo prazo dos números de Ulam é que o
n
número de Ulam é sobre13.5n
, mas nos primeiros 10000 termos a maior proporção entre on
número de Ulam en
está abaixo13.3
. Então, dadon
que podemos filtrar o primeiro14n
números para encontrar aqueles que pertencem à sequência.Com agradecimentos a Dennis por 41-> 37.
fonte
n = 1000
leva menos de um minuto com GolfScript; uma porta para CJam terminan = 1000
em 8 segundos en = 10000
em 1h 20 m. - Você pode salvar quatro bytes combinando sua abordagem com a minha, incluindo 0 no array e descartando-o posteriormente. Isso permite a utilização de união conjunto em vez do bloco e elimina a necessidade de uma variável:~.14*,4,\{1$.{2$1$-.@<*}%&,2=*|}/1><`
14
.14
é justoE
. Mas você precisa ler a partir de STDIN, converter o número inteiro em um singleton antes de executar a união do conjunto (apresentarei um relatório de bug sobre isso) e2$
não funcionará no loop interno, pois o CJam modifica a pilha após cada iteração ... tentei vários truques diferentes, mas o mais curto tinha exatamente 37 bytes:li4,1$E*{__{I1$-_@<*}%&,2=I*a|}fI1><`
JavaScript ES6,
100 ... 9390 caracteresExecute isso no console da Web ou no Scratchpad do Firefox mais recente (noturno ou versão).
EDIT 8 Golfei muito !!! e reduziu para
94 caracteres9390 caracteres (graças a @openorclose). (Meu primeiro sub 100)Aqui está minha versão, que é muito mais rápida,
mas tem 3 caracteres mais (107 caracteres)e é exatamente a mesma quantidade de caracteres acimae é muito menor que o método de força bruta abaixo !, (graças a edc65):Vou continuar tentando jogar mais. Mas estamos espremendo-o fora do escopo de JS: P
Aqui estão alguns números quando eu executo isso dentro de uma tag de script em uma página da web:
Esta é minha primeira submissão, fortemente inspirada na resposta de @ rink.attendant.6 em JavaScript.
Eu sei que isso pode ser jogado ainda mais. Também publicarei uma solução não forçada, que pode ser ainda mais curta.
EDIT 1 : Jogou um pouco mais e corrigiu para n = 1
Devo dizer que invejo Haskell e J por atalhos super úteis para todo tipo de requisito -_-
fonte
u=n=>{for(s=[,1,1],r=[i=1,l=2];c=l<n;!c?s[r[l++]=i]=1:0,i++)for(j of r)c-=j<i/2&s[i-j];return n>1?r:[1]}
e talvez até maisreturn
. 100:u=n=>(s=>{for(r=[i=1,l=2];c=l<n;i+=!c?s[r[l++]=i]=1:1)for(j of r)c-=j<i/2&s[i-j]})([,1,1])|n>1?r:[1]
u=n=>(s=>{for(r=[i=l=1];c=l<n;i+=c&&i-2?1:s[r[l++]=i]=1)for(j of r)c-=j<i/2&s[i-j]})([,1])||r
u=n=>(s=>{for(r=[i=l=1];c=l<n;i+=c&&i-2?1:s[r[l++]=i]=1)r.map(j=>c-=j<i/2&s[i-j])})([])||r
A menos que o [, 1] seja necessário em algum lugarPerl - 71 bytes
Experimente online!
Contando o shebang como um.
Usar uma segunda matriz para armazenar as somas parece ser significativamente mais rápido que um hash. O uso de memória também é menor, o que eu não esperava.
Uso da amostra:
Saída de amostra:
Durações aproximadas:
fonte
n == 1e4
. Surpreendente! A saída paran == 1
está incorreta; deve imprimir um único número.Java, 259
A força bruta funciona bem para isso.
fonte
1
deve ser um único número.APL (Dyalog Extended) ,
3635 bytes-1 byte por Adám
Experimente online!
Quando fazemos a tabela de adição, os elementos diagonais são duas vezes as entradas em ⍵. Elementos não diagonais são somas de elementos distintos, com cadax ocorrendo duas vezes para cada sentido x pode ser escrito como uma soma de elementos distintos. Portanto, cada númerox ocorre 2 a + b vezes, onde uma é o número de maneiras x pode ser escrito como uma soma de elementos distintos de ⍵ e b é 1 iff x é duas vezes uma entrada em ⍵. Nós queremosa = 1 , portanto, é suficiente verificar 2 a + b ∈ { 2 , 3 } .
* (Em ngn / APL, uma constante pode terminar um trem sem usar
⍨
. Mas ngn / APL não tem contagem, portanto precisamos de ⍨ em algum lugar.)fonte
{(2 3∊⍨⍵⍧⍵)/⍵}
→(∊⊢⊆⍨⍧⍨∊2 3⍨)
PHP 5.4+, 164
Mesma abordagem que minhas respostas:
fonte
Gelatina , 20 bytes
Experimente online!
fonte
CoffeeScript,
119114Ultimamente, tenho praticado o CoffeeScript para melhorar o JavaScript no golfe, então aqui está minha resposta do JavaScript compilada no CoffeeScript:
Eu não entendo muito bem loops e compreensões no CoffeeScript, então talvez isso possa ser melhorado, mas é o que tenho por enquanto. As novas linhas são contadas como um caractere (estilo Unix).
fonte
JavaScript,
147154150 (136)Fortemente inspirado na solução Java de força bruta de @ Ypnypn postada anteriormente:
Obrigado por @Dennis por raspar 4 a 18 bytes da minha versão original
Versão perigosa (usando
for..in
loops)Eu não recomendaria executar isso porque o loop através de um objeto que usa um loop pode fazer com que sua máquina se queime e / ou se transforme em uma máquina de matar furiosa, mas aqui está:
instanceof
Array
for..in
Ungolfed
fonte
z=0
dentro do loop, precisará dele apenas uma vez. 2.for(j in l)for(k in l)z+=l[j]<l[k]&l[j]+l[k]==i;
é muito mais curto que al.forEach
abordagem.Mathematica,
10791 bytesÉ uma implementação muito direta das especificações.
Também estou aplicando o truque de Dennis de incluir somas
0
, mas o problema é que isso torna o terceiro elemento da lista0
antes de continuar como seria de esperar, então preciso remover esse elemento da lista.Ele lida com uma entrada
1000
em alguns segundos, mas duvido que você obtenha um resultado de 10k em um período de tempo razoável. Mas também não acho que nenhum dos outros tenha um bom desempenho nisso.fonte
OCaml - 254 caracteres
O código usa uma tabela de hash para armazenar a soma dos elementos atuais da lista e atualizá-la sempre que um novo elemento é calculado.
Uso:
No intérprete do OCaml:
Ungolfed
fonte
Python,
137128126 caracteres.Este é o meu primeiro golfe, e reduzi de ~ 250 caracteres, estou muito feliz, mas adoraria sugestões de como melhorar!
fonte
for b in U:t[a+b]+=a!=b
e linhas 8 e 9 awhile t[i]-2:i+=1
for
U,i=[1,2],2
aU,i=[1],2
einput()-2
ainput()-1
et=_*3*i
at=_*3*i;U+=[i]
e remova;U+=[i]
no final do paraC #, 257
Abordagem de força bruta, usando LINQ:
Ungolfed, Com Arnês de Teste
fonte
Pitão,
2725 bytesExperimente online aqui .
Editar: golfou 2 bytes executando a soma antes de agrupar. Versão anterior:
<uaGh-mssdfq1lT.gsk.cG2GQS2
fonte
C, 478 bytes
No Tio, agora em 9 segundos, ele encontraria 10000 valores (e aí imprimem os primeiros 100 valores). O truque é usar a pesquisa não linear no loop interno, mas a busca binária ... Estas são funções bem identadas e legíveis (finalmente para mim):
fonte
APL (NARS), 278 caracteres, 556 bytes
seria a tradução em APL de C que enviei. Parece que eu não entendo quando usar ∇∇ no lugar de possible ... possível ∇∇ é usado quando há um argumento e uma função (e não outro tipo). "u bs x, a, b" deve ser a pesquisa de posição na matriz "u" para o valor "x" no intervalo a..b; retornaria 1, indexWhereFind ou 0, indexWhereEndOfsearch. Com o argumento 200 p function leve + - um minuto aqui ...
fonte
∇∇
em um dop refere-se ao próprio operador, enquanto∇
refere-se à função derivada que consiste no operador com seus operandos. Portanto, em um operador monádico∇
é o mesmo que(⍺⍺∇∇)
em um operador diádico, isso significa(⍺⍺∇∇⍵⍵)
.