Dado un entero n
(donde n < 10001
) como entrada, escriba un programa que genere los primeros n
números Ulam . Un número de Ulam se define de la siguiente manera:
- U 1 =
1
, U 2 =2
. - Porque
n > 2
, U n es el número entero más pequeño que es mayor que U n-1, que es la suma de dos términos anteriores distintos exactamente de una manera.
Por ejemplo, U 3 es 3
(2 + 1), U 4 es 4
(3 + 1) (tenga en cuenta que (2 + 2) no cuenta ya que los términos no son distintos), y U 5 es 6
, (U 5 no es 5 porque 5 puede representarse como 2 + 3 o 4 + 1). Aquí están los primeros números de 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
Este es el código de golf, por lo que gana la entrada más corta.
code-golf
number
number-theory
sequence
Ajenjo
fuente
fuente
n
que tenemos que manejar?Respuestas:
CJam,
474137 bytesPruébalo en línea.
Ejecución de ejemplo
Cómo funciona
Esta idea básica es la siguiente:
Comience con la matriz
A := [ 0 U₁ U₂ ... Uₖ ]
.Calcule
S
, la matriz de todas las sumasx + y
tales quex,y ∊ A
yx < y
.Descarta todas las sumas no únicas de
S
. Dado que cada número de Ulam mayor que 2 es la suma de dos números más pequeños y la suma de cero y de sí mismo, esto descarta los números de UlamU₃, U₄, ... Uₖ
.El conjunto restante es
[ U₁ U₂ Uₖ₊₁ ... ]
, por lo que el siguiente número de Ulam es el tercer elemento más pequeño. AñádeloA
y vuelve al paso 1.fuente
100
ya lleva varios segundos. ¿Supongo que calcular la entrada máxima 1e5 llevaría años?J - 46 char
Función tomando
n
como argumento.Explicado por explosión:
fuente
+_*
...T-SQL,
301300288287He cometido un pequeño abuso de SQL ligero.
Pruébelo en SQL Server 2008 aquí .
@N contiene el entero de entrada. Cambie el ejemplo "100" a lo que debería ser n. "10000" probablemente terminará eventualmente, pero no he dejado que eso se complete. El recuento de caracteres de esta entrada es para una entrada de un dígito. La salida está en forma de resultado de consulta.
fuente
Haskell
7067 caracteresuso:
fuente
GolfScript (
4137 bytes)Demostración en línea
Los productos cartesianos en GolfScript son bastante largos, por lo que esto toma un enfoque diferente. El crecimiento a largo plazo de los números de Ulam es que el
n
número de Ulam es aproximadamente13.5n
, pero en los primeros 10000 términos, la mayor proporción entre eln
número de Ulam yn
está justo por debajo13.3
. Entonces dadon
que podemos filtrar el primero14n
números para encontrar los que pertenecen a la secuencia.Gracias a Dennis por 41-> 37.
fuente
n = 1000
toma menos de un minuto con GolfScript; un puerto a CJam se completan = 1000
en 8 segundos yn = 10000
en 1h 20 m. - Puede guardar cuatro bytes combinando su enfoque con el mío, es decir, incluir 0 en la matriz y descartarlo después. Eso permite usar set union en lugar del bloque y elimina la necesidad de una variable:~.14*,4,\{1$.{2$1$-.@<*}%&,2=*|}/1><`
14
.14
es justoE
. Pero necesita leer desde STDIN, convertir el entero a un singleton antes de realizar la unión de conjunto (presentaré un informe de error al respecto) y2$
no funcionará en el bucle interno ya que CJam modifica la pila después de cada iteración ... I He intentado varios trucos diferentes, pero el más corto tenía exactamente 37 bytes:li4,1$E*{__{I1$-_@<*}%&,2=I*a|}fI1><`
JavaScript ES6,
100 ... 9390 caracteresEjecuta esto en la consola web o en el bloc de notas de la última versión de Firefox (nocturno o de lanzamiento)
EDIT 8 Golfed mucho! y lo redujo a
94 caracteres9390 caracteres (gracias a @openorclose). (Mi primer sub 100)¡Aquí está mi versión, que es mucho más rápida
pero tiene 3 caracteres más (107 caracteres)y es exactamente la misma cantidad de caracteres que el anteriory es mucho más pequeña que el método de fuerza bruta a continuación! (Gracias a edc65):Seguiré intentando seguir jugando al golf. Pero lo estamos exprimiendo fuera del alcance de JS: P
Aquí hay algunos números cuando ejecuto esto dentro de una etiqueta de script en una página web:
Esta es mi primera presentación, que está muy inspirada en la respuesta de @ rink.attendant.6 en JavaScript.
Sé que esto se puede jugar aún más. También publicaré una solución sin fuerza bruta, que podría ser aún más corta.
EDITAR 1 : Golfed un poco más y arreglado para n = 1
Debo decir que envidio a Haskell y J por esos atajos súper prácticos para cada tipo de requisito -_-
fuente
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]}
y tal vez aún másreturn
. 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
menos que se necesite el [, 1] en algún lugarPerl - 71 bytes
Pruébalo en línea!
Contando el shebang como uno.
El uso de una segunda matriz para almacenar las sumas parece ser significativamente más rápido que un hash. El uso de memoria también es menor, lo que no hubiera esperado.
Uso de la muestra:
Salida de muestra:
Tiempos de ejecución aproximados:
fuente
n == 1e4
. ¡Increíble! Sinn == 1
embargo, la salida para es incorrecta; debería imprimir un solo número.Java, 259
La fuerza bruta funciona bien para esto.
fuente
1
debe ser un solo número.APL (Dyalog Extended) ,
3635 bytes-1 byte por Adám
Pruébalo en línea!
* (En ngn / APL, una constante puede terminar un tren sin usar
⍨
. Pero ngn / APL no tiene conteo, por lo que necesitamos ⍨ en alguna parte).fuente
{(2 3∊⍨⍵⍧⍵)/⍵}
→(∊⊢⊆⍨⍧⍨∊2 3⍨)
PHP 5.4+, 164
El mismo enfoque que mis respuestas:
fuente
Jalea , 20 bytes
Pruébalo en línea!
fuente
CoffeeScript,
119114Últimamente he estado practicando CoffeeScript para mejorar el golf en JavaScript, así que aquí está mi respuesta de JavaScript compilada en CoffeeScript:
No entiendo muy bien los bucles y las comprensiones en CoffeeScript, por lo que tal vez esto pueda desarrollarse más, pero es lo que tengo por ahora. Las líneas nuevas se cuentan como un carácter (estilo Unix).
fuente
JavaScript,
147154150 150 (136)Muy inspirado por la solución Java de fuerza bruta de @ Ypnypn publicada anteriormente:
Gracias por @Dennis por eliminar 4 a 18 bytes de mi versión original
Versión peligrosa (usando
for..in
bucles)No recomendaría ejecutar esto porque recorrer un objeto que está usando un bucle podría hacer que su máquina estalle en llamas y / o se transforme en una máquina de matar enojada, pero aquí está:
instanceof
Array
for..in
Sin golf
fuente
z=0
dentro del bucle, solo lo necesitas una vez. 2.for(j in l)for(k in l)z+=l[j]<l[k]&l[j]+l[k]==i;
es mucho más corto que ell.forEach
enfoque.Mathematica,
10791 bytesEs una implementación muy directa de la especificación.
También estoy aplicando el truco de Dennis de incluir sumas
0
, pero el problema es que esto hace que el tercer elemento de la lista se0
reanude como cabría esperar, por lo que necesito eliminar ese elemento de la lista.Maneja una entrada de
1000
unos pocos segundos, pero dudo que obtenga un resultado de 10k en un tiempo razonable. Pero tampoco creo que ninguno de los otros funcione bien en eso.fuente
OCaml - 254 caracteres
El código utiliza una tabla hash para almacenar la suma de los elementos actuales de la lista y actualizarla cada vez que se calcula un nuevo elemento.
Uso:
Dentro del intérprete de OCaml:
Sin golf
fuente
Python,
137128126 caracteres.Este es mi primer golf, y lo he reducido de ~ 250 caracteres, estoy muy contento, ¡pero me encantaría recibir sugerencias sobre cómo mejorar!
fuente
for b in U:t[a+b]+=a!=b
y las líneas 8 y 9 awhile t[i]-2:i+=1
for
U,i=[1,2],2
aU,i=[1],2
yinput()-2
haciainput()-1
yt=_*3*i
haciat=_*3*i;U+=[i]
y eliminar;U+=[i]
al final de forC #, 257
Enfoque de fuerza bruta, usando LINQ:
Sin golf, con arnés de prueba
fuente
Pyth,
2725 bytesPruébelo en línea aquí .
Editar: golfed 2 bytes realizando la suma antes de agrupar. Versión previa:
<uaGh-mssdfq1lT.gsk.cG2GQS2
fuente
C, 478 bytes
En Tio, ahora en 9 segundos, encontraría 10000 valores (y allí imprimiría los primeros 100 valores). El truco consiste en utilizar la búsqueda no lineal en el bucle interno, sino la búsqueda binaria ... Estas siguientes son funciones bien sangradas y completamente legibles (por fin para mí):
fuente
APL (NARS), 278 caracteres, 556 bytes
sería la traducción en APL de C uno que envié. Parece que no entiendo cuándo usar ∇∇ en lugar de ∇ ... posible ∇∇ se usa cuando hay un argumento es una función (y no otro tipo). "u bs x, a, b" debe ser la búsqueda de bin en la matriz "u" para el valor "x" en el rango a..b; devolvería 1, indexWhereFind o 0, indexWhereEndOfsearch. Con el argumento 200 p, la función toma + - un minuto aquí ...
fuente
∇∇
en un dop se refiere al operador en sí, mientras que se∇
refiere a la función derivada que consiste en el operador con su (s) operando (s). Entonces, en un operador monádico∇
es lo mismo(⍺⍺∇∇)
que en un operador diádico significa(⍺⍺∇∇⍵⍵)
.