Mini golf de lunes: una serie de desafíos de código corto de golf , publicados (¡con suerte!) Todos los lunes.
Se obtiene una secuencia similar a Fibonacci utilizando el mismo método que la famosa secuencia de Fibonacci ; es decir, cada número F (n) se encuentra sumando los dos números anteriores en la secuencia ( F (n) = F (n-1) + F (n-2) ), o restando los dos números siguientes ( F (n) = F (n + 2) - F (n + 1) ). La principal diferencia es que estas secuencias pueden comenzar con dos números cualquiera. La indexación cero de estas secuencias es discutible, pero por ahora, vamos a usar esta regla:
- El número 0 en una secuencia similar a Fibonacci es el último número que es más pequeño que el número anterior.
Como ejemplo, la secuencia de Fibonacci podría escribirse como 1, 0, 1, 1, 2, 3, 5...
, por lo que el número 0 en la secuencia es el único 0
.
Reto
El objetivo del desafío es escribir un programa o función que tome tres enteros, en cualquier formato:
- A y B , los dos números con los que comenzar a generar una secuencia.
- N , la longitud de la secuencia resultante a la salida.
Y genera los primeros N números de la secuencia, comenzando en el 0.
Detalles
- A , B y N pueden tomarse en cualquier orden y formato, siempre que estén visiblemente separados. Si utiliza un orden / formato diferente, especifique cuál es.
- Puede suponer que A , B y N son siempre enteros positivos.
- Puede suponer que N no es más de 100 y que la secuencia resultante no contendrá
x >= 2^31
. - Si A es mayor que B , entonces B es el número 0 de la secuencia.
- La salida debe estar separada por espacios, comas y / o nuevas líneas.
- Se permite un espacio final o una nueva línea, pero no una coma final.
Casos de prueba
Ejemplo 1:
8 13 10
Trabajando hacia atrás desde 8 13
que encontramos un número mayor que el anterior, obtenemos 13 8 5 3 2 1 1 0 1
. Por lo tanto, 0
es el número 0 en esta secuencia. Trabajando a partir de esto, imprimimos 0
y los siguientes 9 miembros:
0 1 1 2 3 5 8 13 21 34
Ejemplo 2
23 37 5
Nuevamente trabajando hacia atrás para encontrar el número 0, encontramos 37 23 14 9 5 4 1 3
. Esta vez el número 0 es 1
, así que lo imprimimos, junto con los siguientes 4 miembros:
1 4 5 9 14
Ejemplo 3
4 3 8
Con este, no tenemos que trabajar hacia atrás para encontrar el número 0, porque 3
es más pequeño que 4
:
3 7 10 17 27 44 71 115
Ejemplo 4
29 47 11
Resultado:
1 3 4 7 11 18 29 47 76 123 199
Tanteo
Este es el código de golf , por lo que gana el código válido más corto en bytes. Tiebreaker va a la presentación publicada anteriormente. El ganador será elegido el próximo lunes 28 de septiembre. ¡Buena suerte!
Editar: ¡ Felicidades a tu ganador, @Jakube, por usar Pyth por unos increíbles 23 bytes!
[8, 13, 10]
)?Respuestas:
Pyth, 23 bytes
Pruébelo en línea: Demostración o conjunto de pruebas
Estilo bastante inusual de programación Pyth. A veces, la programación funcional tiene sus desventajas.
Explicación:
fuente
Retina ,
6554 bytesAquí,
<empty>
representa una línea final vacía. Ejecute el código como un solo archivo con la-s
bandera.El formato de entrada es
donde los números están representados en unario . La salida es una lista separada por comas, también en unario. Por ejemplo:
sería
y rendir
Explicación
Primero, reducimos
A
yB
al elemento 0 y -1. El+
le dice a Retina que siga repitiendo esta sustitución de expresiones regulares hasta que la expresión regular deje de coincidir o la sustitución no modifique la cadena. La expresión regular capturaA
en el grupo 1 con(1*)
, y luego se asegura de queB
sea al menos tan grande comoA
durante la capturaB-A
con\1(1*)
en el grupo 2. Esto asegura que este ciclo finalice una vezA>B
.La sustitución simplemente convierte
A,B
enB-A,A
estableciendo el partido a$2,$1
.Ahora ya tenemos el primer número de la salida requerida en la cadena (así como el anterior, del cual tendremos que deshacernos más adelante). Esta sustitución ahora agrega otro número como la suma de los dos últimos números mientras toma un
1
deN
. Como ya tenemos un número, queremos que esto suceda soloN-1
. Hacemos esto asegurándonos de\B
que todavía hay al menos;11
al final de la cadena. Si llamamos a los dos últimos valores de la secuenciaC
yD
, la expresión regular se capturaC
en el grupo 1 y,D
en el grupo dos. Los escribimos de vuelta con$1$2
. Luego también escribimos lo$2$1
que se traduce en,D+C
. Tenga en cuenta que no escribimos el single con el1
que coincidimosN
, decrementándolo así.Finalmente, necesitamos deshacernos del -1º elemento de la secuencia, así como los restos
;1
deN
, lo que simplemente hacemos al unir cualquiera de ellos y reemplazarlo con la cadena vacía.fuente
Python 2,
9387676160 bytesObtiene la entrada (como una lista literal de Python
[8,10,13]
)Resuelve el término 0
Luego imprime la secuencia de adiciones hasta alcanzar la longitud
fuente
for _ in[1]*l:
, es un poco más corto de hacerexec"stuff;"*l
for _ in[1]*l:stuff
aexec"stuff;"*l
. @xnor no puso la parte de cosas en el bucle for. Ofor _ in[1]*l:
aexec";"*l
j>=i
conj/i
. ¡Acabo de descubrir eso! (Debido a que Usted puede asumir que A, B, y N son siempre números enteros positivos )CJam,
2623 bytesGracias a Dennis por guardar 3 bytes.
Toma la entrada en orden
N B A
(separados por cualquier tipo de espacio en blanco). Imprime el resultado como una lista separada por una nueva línea y termina con un error .Pruébalo aquí.
Explicación
Esto va un paso más allá al encontrar el elemento 0. Es decir, termina una vez que uno de los valores es negativo.
fuente
q~{_@\-_g)}g\@{_@+_p}*t
(N B A
) guarda tres bytes.B>A
tiene que verificarB not smaller than A
o algo así, pero no puedo entender cómo hacerlo en CJam. EDITAR: la solución de Dennis imprime la salida correcta.<!
lugar de>
.!
en esto. Simplemente agregué uno para que funcione;)Laberinto ,
5854494644 bytesGracias a Sp3000 por sugerir el uso de la negación bit a bit, que ahorró dos bytes.
El formato de entrada es
B A N
. El resultado es una lista separada por una nueva línea.Explicación
(Ligeramente desactualizado. La idea básica sigue siendo la misma, pero el diseño del código es diferente ahora).
Esto usa la misma idea que mi respuesta de CJam (por lo que los créditos aún van a Dennis): cuando retrocedemos la secuencia no nos detenemos hasta que obtenemos un valor negativo (lo que nos deja con el elemento -1 ° y -2 ° de la secuencia). Luego, comenzamos a agregarlos antes de imprimir el primer valor.
Esto utiliza un par de ingeniosos trucos de golf Labyrinth. Veamos el código en secciones:
La IP comienza a la
?
derecha (que se leeA
). En el"
(un no-op) llega a un callejón sin salida, por lo que se da vuelta, ejecutando?
nuevamente (lecturaB
). Por último, se}
mueveB
a la pila auxiliar. El callejón sin salida salva un byte sobre el ingenuoAhora el ciclo que encuentra el comienzo de la secuencia:
El
)(
(incremento-decremento) no funciona, pero es necesario asegurarse de que la parte superior de la pila sea positiva en la unión (de modo que la IP gire hacia el este).:
duplicadosA
,{
se mueveB
atrás a la chimenea principal,-
computaA-B
. SinB-A
embargo, lo que realmente queremos es que`
niegue el valor.Este es ahora un cruce de cuatro vías. Para obtener resultados negativos, la IP gira a la izquierda hacia
?
, leyendoN
y pasando a la siguiente parte del programa. Si el resultado es cero, la IP sigue avanzando hacia el sur, gira en la esquina y permanece en el bucle. Si el resultado es positivo, el IP da un giro a la derecha (oeste), gira en la esquina y da otro giro a la derecha (oeste nuevamente) para que también permanezca en el bucle. Creo que esto podría convertirse en un patrón común, para distinguir valores negativos de valores no negativos (o positivos de no positivos):Al menos todavía no he podido encontrar un diseño más compacto / útil para este caso.
De todos modos, mientras
A
no es negativo, el bucle continúa, se}
mueveA
a la pila auxiliar y=
cambiaA
yB
.Una vez que
A
es negativo,?
leeN
y pasamos al segundo ciclo:Sabemos que
N
es positivo, por lo que podemos confiar en que la IP gire a la izquierda (norte). El cuerpo del bucle ahora es simplemente:En palabras: mueve ambos
N
yA
sobre la pila auxiliar. DuplicarB
, intercambiar la copia conA
y agregarA
a la otra copia deB
. Duplíquelo nuevamente para imprimir el valor actual deB
. Imprime una nueva línea. MoverB
yN
volver a la pila principal y disminuirN
.Si bien
N
es positivo, la IP tomará un giro a la derecha (norte) continuando el ciclo. Una vez queN
llega a cero, el código termina de una manera bastante elegante:El IP sigue avanzando en línea recta (oeste). Los
?
intentos para leer otro número entero, pero ya han llegado a EOF, por lo que en realidad empuja0
su lugar.`
intenta negar eso, pero eso sigue siendo cero. Por lo tanto, la IP aún se mueve hacia el oeste, da una vuelta en la esquina y luego sigue bajando hacia la@
que termina el programa.Me pregunto si podía colocar el
@
en una posición aún más barato (que actualmente cuesta 3 caracteres de espacio en blanco) girando los tres"
alrededor de la`
en el compuesto no-ops (como)(
), pero no he sido capaz de hacer que el trabajo todavía.fuente
C,
105102100 bytes¡Gracias a @ C0deH4cker por jugar 2 bytes!
Pruébelo en línea en Ideone .
fuente
Matlab / Octave, 115
125bytesLa función debe llamarse como
f([8 13],10)
.Ejemplo (Matlab):
O pruébelo en línea (Octave) .
fuente
f([a b],n)
debe permitirse.x=f(x,n)
en el recuento de cabecera de la función ...Haskell,
67 6556 bytesGracias a @nimi por las sugerencias.
Esto define una función infija ternaria
%
, que se invoca en el formato(n%a)b
, por ejemplo:Explicación
La función infija binario
#
, definida en la primera línea, toma en dos enterosa
yb
y devuelve el infinito Fibonacci-como secuencia en la quea
yb
se producen como elementos consecutivos.La función
%
simplemente toma los primerosn
elementos dea#b
.fuente
let f=a:scanl(+)(a+b)f in f
(-> full#
:a#b|a>b=let f=a:scanl(+)(a+b)f in f|1>0=(b-a)#a
y guardar dos bytes.> <>,
3331 + 1 para -v = 32 bytesLa entrada debe insertarse en la pila usando -v ya que analizar números decimales no es trivial en> <>.
Explicacion:
Representaré la pila después de cada (grupo de) operaciones. Comienza con [F (n), F (n + 1), N]
Las primeras líneas bajan de la serie a su término 0:
La segunda línea sube la serie hasta que haya impreso N términos:
fuente
00.
en la primera línea a&
. Teóricamente,!
debería funcionar, pero creo que> <> rellena el ancho de las líneas para que coincida con el ancho de la más larga (editar: es por eso que imagino que tenía00.
en primer lugar).!
o?
(al final de la línea) si está en la línea más larga. Puede probarlo con algo así1n!
y generará un error, pero si hay una línea debajo de él con algo más largo que esolorumipsum
, no lo hará.Java,
1137876 bytesEl crédito va a ETHproduction por proporcionar el algoritmo que uso en esta respuesta.
Tratar aquí .
Explicación:
Enfoque original,
11393 bytesParece más golfy;)
Pruébalo aquí .
Explicación:
fuente
b=b-a
ab-=a
, y lo mismo cona=b+a
. Ahorrará 2 bytesJavascript (ES6),
837363 bytesEsto podría haber sido jugado al máximo. Ya veremos.
Sin golf:
fuente
Mathematica 112
Lo jugará golf eventualmente
fuente
CJam, 40 bytes
Pequeños pasos. Este es mi primer programa CJam, así que estoy orgulloso de que funcione.
Toma entrada en la misma forma que en los ejemplos.
Ahora he visto que podría reducirlo a 33 bytes usando la
{ ... }*
construcción.E incluso podría reducirlo en uno más utilizando el operador ternario para limpiar la pila y producir un error.
fuente
Ruby, 141 bytes
Ejecución
La función f produce la salida deseada, los nombres de los argumentos coinciden con los nombres de las variables de la pregunta
Nada inteligente:
fuente
Mathematica, 59 bytes
fuente
Rubí,
817573Acortado por 6 Bytes al reemplazar for-loop con range.map
Se guardaron otros 2 bytes moviendo la declaración de impresión
fuente
Pyke, 24 bytes (no competitivos)
Pruébalo aquí!
fuente
Jalea , 14 bytes
Pruébalo en línea!
fuente
Lisp común, 91 bytes
Pruébalo en línea!
fuente