Usemos las cuatro operaciones básicas, suma +
, multiplicación *
, resta -
y división /
(flotante, no entero).
La secuencia de Stewie se define de la siguiente manera:
x = [x(1), x(2)] // Two initial numbers (one indexed)
x(3) = x(1) + x(2)
x(4) = x(2) * x(3)
x(5) = x(3) - x(4)
x(6) = x(4) / x(5)
x(7) = x(5) + x(6)
... and so on.
Reto:
Tome dos enteros no negativos ( x(1), x(2)
) y un entero positivo N
como entrada.
x(1)
y x(2)
serán los dos primeros números de su secuencia, y N
será la longitud de la secuencia que debe generar. (Puede elegir tener la lista basada en 0, en cuyo caso N
será una menor que la longitud).
- No puedes asumir eso
x(2) >= x(1)
. N
siempre será>2
si está basado en 1 (>1
si está basado en 0).- No tiene que manejar la división por cero errores.
- Tenga en cuenta el segundo caso de prueba. No obtendrá
0, 1
, yN=6
como entrada, ya que eso dará como resultado la división por cero, pero debe admitir0, 1
yN=5
.
- Tenga en cuenta el segundo caso de prueba. No obtendrá
- Suponga que solo se dará una entrada válida.
- La entrada y la salida pueden estar en cualquier formato conveniente, pero debe admitir al menos 3 dígitos después de los puntos decimales si la salida no es entera.
Casos de prueba:
1 3
8
1, 3, 4, 12, -8, -1.5, -9.5, 14.25
0 1
5
0, 1, 1, 1, 0 // N=6 would give division by zero error. You don't need to handle that case.
1 0
9
1, 0, 1, 0, 1, 0, 1, 0, 1
6 3
25
6, 3, 9, 27, -18, -1.5, -19.5, 29.25, -48.75, -0.6, -49.35, 29.61, -78.96, -0.375, -79.335, 29.7506, -109.086, -0.272727, -109.358, 29.825, -139.183, -0.214286, -139.398, 29.8709, -169.269
N
estar basado en 0? Por lo tanto, tome como entradas 1 menos que la N que se muestra en sus ejemplos. Supongo que tomar N-2 es demasiado pedir ... :-PRespuestas:
MATL ,
191817 bytesLa entrada está en el formato:
N
(basado en 0)x(1)
,x(2)
(como cadenas); todo separado por nuevas líneas.Pruébalo en línea! O verificar todos los casos de prueba (código ligeramente modificado; secuencias de salida separadas por una línea en blanco).
Explicación
MATL no tiene una
eval
función adecuada , peroU
(str2num
) puede evaluar expresiones numéricas con operadores infijos.Cada nuevo término se calcula y se empuja a la pila, manteniendo los términos anteriores. Toda la pila se imprime al final.
fuente
Haskell,
696864 bytesx1
yx2
se toman como una lista. Ejemplo de uso:[1,3] # 8
->[1.0,3.0,4.0,12.0,-8.0,-1.5,-9.5,14.25]
.La pereza hace posible definir una lista recursiva infinita donde tomamos los primeros n elementos.
Haskell, 66 bytes
Enfoque diferente, un poco más largo. Orden de los argumentos es
N
,x2
,x1
. Ejemplo de uso:( (.a).(.).take ) 8 3 1
->[1.0,3.0,4.0,12.0,-8.0,-1.5,-9.5,14.25]
.Define las 4 funciones
a
,b
,c
yd
que toman dos argumentosy
,x
y hacer una lista poniendox
en frente de una llamada a la función siguiente cony
como segundo argumento yx op y
como el primero. Por ejemploa
es:a y x = x : (b (x+y) y)
,b
hace multiplicación:b y x = x : (c (x*y) y)
, etc.Editar: @Michael Klein guardó un byte en la primera variante (
#
). Afortunadamente, también encontré un byte para la segunda variante, por lo que ambos tienen la misma longitud nuevamente.Edición II: @Zgarb encontró 2 bytes en la segunda versión para guardar, y 4 en la primera, por lo que ya no tienen la misma longitud.
fuente
(.)
está compuesto con otras funciones: pg x=(`take`f)where
no guarda un byte: - /(h%g)y x=x:g(h x y)y
ES6 (Javascript),
79,6765 bytesACTUALIZAR
Golfed
Prueba
fuente
++i
para evitar tener que sumar 1 ai
dos veces??S(n,a,i+1,a.push(...)):a
podría ahorrarle algunos bytes.a.push
devuelve la nueva duración,S=(n,a,i=2)=>i<n?S(n,a,a.push(...)):a
i=2
.S=(n,a,i=2)=>i<n?S(n,a,a.push(eval(a[i-2]+"+*-/"[i%4]+a[i-1]))):a
para guardar 2 bytes.Pitón 3,
908074 bytesxnor probablemente va a venir y destruir esta solución ...
La función modifica la lista que se le pasa. Usar así:
Prueba en repl.it!
-6 bytes gracias a Copper
fuente
O
una vez, puede guardar algunos bytes haciendo'-/+*'[i%4]
y quitando la declaración deO
. Además, es posible que pueda evitar las llamadas repetidasstr
haciendo algo comoeval('%s'*3%(s[-2],'-/+*'[i%4],s[-1]))
.s+=[...]
puede ser reemplazado pors+=...,
(tenga en cuenta la coma final).i
como entrada, por lo que no necesita el valor predeterminado para ello (i=2
puede ser justoi
). Dos bytes de descuento.n
elemento th en la secuencia, esto es 1 byte más corto con recursión:f=lambda x,n:n<2and x[n-1]or eval('%s'*3%(f(x,n-2),'*-/+'[n%4],f(x,n-1)))
Perl 6 ,
75 7161 bytesPruébalo
Pruébalo
Pruébalo
Expandido:
fuente
Mathematica, 68 bytes
Apenas se coló en el 3er lugar! Función sin nombre de tres argumentos, que utiliza un operador unario auxiliar
±
tal que±n
es exactamente el enésimo elemento x (n) de la secuencia Stewie. Los primeros dos argumentos son x (1) yx (2), y el tercer argumento es el N que indica qué x (N) sacamos.Implementación directa, utilizando un cálculo de mod-4 para elegir qué función binaria aplicar a los dos términos anteriores. Escoger la función binaria correcta, que es lo que
1##[#-#2,#/#2,+##]
ayuda, utiliza algunos de estos divertidos trucos de golf de Mathematica .fuente
05AB1E ,
211918 bytesLa entrada se toma en el orden N (basado en 0), x (2) , x (1) .
Guardado 1 byte gracias a carusocomputing .
Pruébalo en línea!
Explicación
Construimos iterativamente la pila con el último elemento de la secuencia en la parte superior, manteniendo todos los elementos anteriores en orden.
Luego envolvemos la pila en una lista al final para mostrar todos los valores a la vez.
fuente
XY
yUV
puede ahorrarte bytes.UX
:)Lisp común, 158
No es realmente competitivo, pero me gusta cómo se expresa de forma bastante natural:
Ignoramos los errores al calcular R, lo que hace que R (y luego B) posiblemente tome el valor NIL. Eso permite generar el resultado actual incluso si el siguiente valor no está definido. Luego, eventualmente el ciclo fallará, pero eso está dentro de las reglas.
Pruebas
Nombramos la función
F
y verificamos que los valores esperados sean aproximadamente iguales a los probados.La razón de la prueba aproximada es porque los valores calculados son un poco más precisos de lo requerido; aquí, para
(f 6 3 25)
:fuente
dc,
112110108 bytesA veces
dc
respuestas pueden ser muy largas, y otras veces pueden ser muy cortas. Todo depende del desafío en cuestión, como es el caso con muchos otros idiomas. De todos modos, esto solicita una entrada de línea de comando indizada y separada por espacios de 3 enteros,x(1), x(2), N
al invocar, y genera cada elemento de la secuencia en líneas separadas con salidas no enteras que contienen 5 dígitos después del punto decimal.Por ejemplo, la entrada
6 3 25
da como resultado la siguiente salida:fuente
Perl, 62 + 3 (
-pla
bandera) = 65 bytesUtilizando:
fuente
Ruby, 79 bytes
Sospecho que esto está muy lejos de ser óptimo (y aún no he visto las otras respuestas), pero de todos modos es divertido.
Quería divertirme un poco
Enumerable#cycle
, pero lamentablemente, son 4 caracteres menos para usar%4
.fuente
C ++ 14, 118 bytes
Como lambda sin nombre modificando su entrada. Requiere
v
ser unvector<double>
ovector<float>
.Sin golf y uso:
fuente
Código de máquina x86-64, 34 bytes
Convención de llamada = x86-64 Sistema V x32 ABI (registro de argumentos con punteros de 32 bits en modo largo).
La firma de la función es
void stewie_x87_1reg(float *seq_buf, unsigned Nterms);
. La función recibe los valores de inicialización x0 y x1 en los dos primeros elementos de la matriz, y extiende la secuencia a al menos N elementos más. El búfer debe rellenarse a 2 + N-redondeado-al-siguiente-múltiplo de 4. (es decir2 + ((N+3)&~3)
, o solo N + 5).Requerir buffers acolchados es normal en el ensamblaje para funciones de alto rendimiento o vectorizadas SIMD, y este bucle desenrollado es similar, por lo que no creo que esté doblando las reglas demasiado. La persona que llama puede ignorar fácilmente (y debería) ignorar todos los elementos de relleno.
Pasar x0 y x1 como una función arg que aún no está en el búfer nos costaría solo 3 bytes (para
movlps [rdi], xmm0
aomovups [rdi], xmm0
), aunque esto sería una convención de llamada no estándar ya que el Sistema V pasastruct{ float x,y; };
en dos registros XMM separados.Esto se
objdump -drw -Mintel
genera con un poco de formato para agregar comentariosEsta implementación de referencia C compila (con
gcc -Os
) un código algo similar. gcc elige la misma estrategia que yo, de mantener solo un valor anterior en un registro.Experimenté con otras formas, incluida una versión x87 de dos registros que tiene un código como:
Lo haría de esta manera si fuera por la velocidad (y SSE no estuviera disponible)
Poner las cargas de la memoria dentro del bucle en lugar de una vez en la entrada podría haber ayudado, ya que podríamos almacenar los resultados sub y div fuera de orden, pero aún necesita dos instrucciones FLD para configurar la pila en la entrada.
También intenté usar las matemáticas escalares SSE / AVX (comenzando con valores en xmm0 y xmm1), pero el tamaño de instrucción más grande es asesino. Usar
addps
(ya que es 1B más corto queaddss
) ayuda un poco. Utilicé los prefijos AVX VEX para instrucciones no conmutativas, ya que VSUBSS es solo un byte más largo que SUBPS (y la misma longitud que SUBSS).Probado con este arnés de prueba:
Compilar con
nasm -felfx32 -Worphan-labels -gdwarf2 golf-stewie-sequence.asm &&
gcc -mx32 -o stewie -Og -g golf-stewie-sequence.c golf-stewie-sequence.o
Ejecute el primer caso de prueba con
./stewie 8 1 3
Si no tiene instaladas bibliotecas x32, use
nasm -felf64
y deje gcc usando el predeterminado-m64
. Usé enmalloc
lugar defloat seqbuf[seqlen+8]
(en la pila) para obtener una dirección baja sin tener que construir realmente como x32.Dato curioso: YASM tiene un error: utiliza un rel32 jcc para la rama de bucle, cuando el objetivo de la rama tiene la misma dirección que un símbolo global.
se ensambla para ...
11f: 0f 8f db ff ff ff jg 100 <stewie_x87_1reg>
fuente
05AB1E , 12 bytes
Pruébalo en línea!
fuente
Japt , 20 bytes
Intentalo
fuente
Bash, 224 bytes (SIN CONCURSO)
Una implementación tremendamente grande en BASH .
Toma la tarea literalmente y hace todo en una tubería continua, sin estructuras de flujo de control impías o recursividad.
Entrada
Golfed
Menos golf
Prueba
Etapas de la tubería
Genere una tabla de índices de elementos + op, para cada elemento de secuencia de salida (uno por línea):
Use sed para convertir esto en un programa lineal bc :
alimenta esto a bc y deja que haga todo el trabajo
fuente
Pyth - 20 bytes
La salida de todos
n
me cuesta.No funciona en línea porque de eval.
fuente
Ceilán, 195 bytes
Formateado y comentado:
Ejemplo de uso:
Salida de ejemplo:
El segundo ejemplo muestra cómo esto manejaría la división por cero. El último ejemplo muestra que los resultados se desvían un poco dependiendo del tipo de aritmética (y redondeo) que uno esté usando ... Creo que la aritmética de coma flotante de 64 bits de Ceylon está un poco más cerca de lo que debería ser que lo publicado en la pregunta .
fuente
Clojure, 99 bytes
Esta versión es más agradable de usar en la práctica pero tiene 110 bytes:
Tuve problemas para activar la función iterada y una secuencia cíclica de operaciones, así que tuve que usar un contador en su lugar. También intenté usar una tabla de transición FSM como
{+ * * - - / / +}
pero no pude exprimirla a menos código.Podría expresarse como una función anónima
Sin golf:
Debe llamarse con flotadores,
(f 6.0 3.0 25)
ya que de lo contrario obtendrá números racionales. Alternativamente, la iteración podría iniciarse a partir de lo[a (float b) 0]
cual trae algunos caracteres adicionales.fuente
Octava , 91 bytes
Pruébalo en línea!
Algunos campos de golf:
eval
llamadaeval
llamada*-/+
(no es posible en MATLAB)'
y"
para evitar escapar de los apóstrofes (no es posible en MATLAB)n=@num2str
ya que se usa dos veces (no es posible en MATLAB)fuente