21, 21, 23, 20, 5, 25, 31, 24,?
Inspirado en este rompecabezas , dado un número entero , imprima la siguiente secuencia hasta que llegue a un número entero (estropeado, en caso de que quiera resolver el rompecabezas usted mismo primero)
o más intuitivamente: * 1, +2, -3, / 4, * 5, +6, -7, / 8, ...
Casos de prueba:
1: 1, 1, 3, 0, 0, 0, 6, -1
2: 2, 2, 4, 1
3: 3, 3, 5, 2
4: 4, 4, 6, 3
5: 5, 5 , 7, 4, 1, 5, 11, 4
6: 6, 6, 8, 5
9: 9, 9, 11, 8, 2, 10, 16, 9
21: 21, 21, 23, 20, 5, 25, 31, 24, 3, 27, 37, 26
La entrada y salida pueden tomarse en cualquier formato razonable, las lagunas estándar están tan prohibidas como de costumbre.
En el espíritu del código golf , ¡la respuesta más corta en bytes gana!
Sandbox: https://codegolf.meta.stackexchange.com/a/18142/59642
Respuestas:
05AB1E (heredado) ,
1817 bytesPruébelo en línea o verifique todos los casos de prueba .
Explicación:
Estoy usando la versión heredada de 05AB1E aquí, y también calculo primero el siguiente número antes de imprimirlo, porque el bucle está basado en 0 y lo hará
/0
en la primera iteración. Esto salvó un byte en comparación con el anteriorN>
y"*+-/"
. Esto solo funciona, porque en la versión heredada un número que se divide por 0 sigue siendo el mismo; mientras que en la nueva versión se convertiría en 0; y en matemática real daría una división por cero error.fuente
Scratch 3.0 39 bloques / 323 bytes
Intentalo
líneascratch!Alternativamente, como sintaxis SB:
Miren a ustedes, divirtiéndose con su imaginación
eval
declaraciones! ¡Pues yo no! No ... Scratch no tiene evaluaciones, así que tuve que hacer las cosas de la manera más difícil ... si las declaraciones.Al menos no es
goto
s ...fuente
goto
sy un ciclo de resta para verificar si podemos dividir, en un lenguaje basado en la pila. . ; p (¡En serio, buena respuesta, +1 de mi parte! No pude resistirme a citarlo en mi respuesta de Whitespace que acaba de terminar .)Espacio en blanco ,
251227202 bytesSe agregaron letras
S
(espacio),T
(tabulación) yN
(nueva línea) solo como resaltado.[..._some_action]
agregado solo como explicación.Pruébalo en línea (solo con espacios en bruto, pestañas y nuevas líneas).
-24 bytes después de un comentario de @JoKing sugiriendo
n%i > 0
. Aunque soloif(x < 0)
yif(x == 0)
están disponibles en espacios en blanco, simplemente marcandoif(x*-1 < 0)
es básicamente el mismo queif(x > 0)
.Un -25 bytes adicionales gracias a @JoKing .
Explicación:
Cita del respuesta Scratch :
Alguien dijo
goto
? El espacio en blanco no tiene más quegoto
crear bucles y sentencias if. xD Además, es un lenguaje basado en pila, por lo que tengo que intercambiar / descartar / copiar con bastante frecuencia. Y para colmo: el espacio en blanco ni siquiera tiene puntos flotantes y solo división de enteros, por lo que solían % i * -1 < 0
salir del programa si el entero no puede dividir el número actual.Pseudocódigo:
fuente
if(n == 0)
o estáif(n < 0)
disponible. Lamentablemente noif(n > 0)
oif(n != 0)
. Pero estoy seguro de que algunos aspectos pueden simplificarse. Esta solución actual fue una prueba y error de depuración, pero tal vez debería dar un paso atrás y repensar un enfoque más corto. Cuando tenga tiempo otra vez. Y arreglé el pseudocódigo, tenías razón, cambiéi
/n
en la mayoría de los lugares ...m = n%i; n = n/i; if (m == 0) jump to LOOP; exit program
?swap top two, copy second item
al ciclo general en lugar de copiarlo en cada sección?Haskell ,
75 7473 bytes-1 byte gracias a Will Ness -1 byte gracias a nimi
Pruébalo en línea!
Evita el uso de entradas fraccionales para guardar en bytes
fuente
JavaScript (V8) , 52 bytes
Imprime grupos de 4 términos. Inspirado por la respuesta de GB Ruby .
Pruébalo en línea!
JavaScript (V8) , 54 bytes
Imprime los términos de la secuencia.
Pruébalo en línea!
JavaScript (ES6),
5958 bytesDevuelve una matriz.
Pruébalo en línea!
fuente
Perl 6 , 44 bytes
Pruébalo en línea!
Bloque de código anónimo que toma un número y devuelve una secuencia. Si pudiéramos omitir el primer elemento (que siempre es el mismo que el segundo elemento de todos modos), podríamos ahorrar 3 bytes eliminando el
$_,
fuente
Python 3 , 60 bytes
Pruébalo en línea!
fuente
Piet ,
297190144 CODELs (432 bytes)Intenté un nuevo enfoque usando un
pointer
comando como interruptor (k mod 4) para unificar el código de salida, lo que resultó en una imagen de código 10x19 más densa. Luego jugué golf por 1 fila y 2 columnas a 8x18.Aquí hay un rastro, para ver cómo funciona:
La primera línea empuja un 0 en la pila como índice inicial (ya que solo podemos
push
números naturales, empujamos 2 unos y luego restamos), luego lee la entrada como número.La columna de la izquierda tiene el código compartido de duplicar el número y sacar uno a la salida, luego mueve el índice en la parte superior de la pila, incrementándolo y luego duplicándolo tres veces. Luego ingresamos el bloque en forma de r de color rojo pastel a través del codel cian oscuro para obtener un
pointer
comando que nos da diferentes caminos para el resto de nuestro mod de índice 4.Mod 1, salimos por la parte superior para multiplicar. Primero barajamos una copia de nuestro índice hacia abajo para luego, luego realizamos la multiplicación. Después de pasar por el blanco para un noop, ingresamos a la columna de arriba para corregir la paridad cc (se debe voltear un número par de veces para mantener el ciclo estable), seguido de un
pointer (1)
de ingresar a la barra magenta: actúa como un coger nuestros cuatro caminos y enviarnos de vuelta al bucle.Mod 2, salimos hacia atrás para sumar. La forma del bloque de código en colores pastel significa que salimos de una fila arriba de donde ingresamos, y usamos el 3 que empujamos hacia la pila al salir a través del códec rojo hacia
pointer (3)
nosotros. Esta columna tiene el espacio en blanco antes de la aritmética y un orden ligeramente diferente de presionar y cambiar cc, porque de lo contrario tendríamos una superposición de color con códeles con valores enteros en la columna adyacente.Mod 3 envíanos hacia abajo para restar. El mismo trato que la multiplicación, excepto que cruzamos el camino de división en el camino hacia arriba (como el cc tiene paridad diferente al ingresar a la barra verde pastel, las dos ejecuciones salen de esa barra en diferentes extremos). Mientras lo hacemos, tomamos un
duplicate
comando no deseado , por lopop
que retrocedemos con el códec verde oscuro antes de ingresar a la barra de corrección y colección de cc.Mod 4, vamos hacia adelante para dividir. Aquí, primero tenemos que volver a barajar la pila más severamente para obtener dos pares de n y a para realizar operaciones, porque necesitamos probar si es entero. Hacemos lo que hago
mod
en el primer par, luegonot
en el resultado, luego lo usamos para unpointer
: si no es divisible, seguimos recto, lo que nos envía con dospointer
comandos a la esquina opuesta al bloque ineludible y así termina el programa. De lo contrario, giramos a la derecha y obtenemos undivide
comando al ingresar a la barra magenta.Versión antigua
Código muy sencillo: empuja un 1 y la entrada en la pila, luego recorre las cuatro operaciones: barajando el índice en la parte superior de la pila, incrementándolo en 1, duplicándolo, barajando una copia hacia abajo, realizando la operación aritmética, duplicando el número y sacando uno a la salida.
Para la división, que es la única en la que la secuencia puede terminar, crea una pila más complicada para verificar primero si n mod index == 0, de lo contrario, ingresa al códele ineludible y termina. De lo contrario, utiliza su segunda copia de i y n para realizar la división.
fuente
push (1) pointer
o para una celda negra encima de una de color.C # (compilador interactivo de Visual C #) ,
72,70, 69 bytesPruébalo en línea!
fuente
Ruby ,
56 5452 bytesPruébalo en línea!
Después de algún intento (fallido) con
eval
, descubrí que la solución más feliz es construir la matriz con 4 elementos a la vez, al menos en rubí.Gracias a Arnauld por -2 bytes.
fuente
R ,
90 bytes ,73 bytes87 bytes85 bytes80 bytes74Una implementación simple de las reglas:
Pruébalo en línea!
con lo
T<13
siguiente de un análisis más profundo del rompecabezas. De hecho, solo hay tres tipos de secuencias: las de longitud 4, cuando a⁰ no es congruente con 1 módulo 8; los de longitud 12 cuando a⁰ es congruente con 21 módulo 32; y los de longitud 8 para los casos restantes.Un código alternativo que evita los bucles termina siendo más largo con 87 bytes:
Pruébalo en línea!
fuente
{}
de -2 bytes.length
.Haskell ,
1048685 bytesPruébalo en línea!
Se
h=
puede omitir ya que solo se usa para pruebas.Ah, codifique el golf, donde un aumento cuadrático en la complejidad del tiempo vale la pena para la reducción de un personaje.
104 bytes
Pruébalo en línea!
Me gusta más esta respuesta, pero por desgracia es más larga.
fuente
Japt ,
2524 bytesOtra adaptación de la solución Ruby de GB .
Intentalo
El truco principal aquí está en la sobrecarga del
c
método para matrices. Páselo otra matriz como argumento y lo concatena a la matriz original. Pase un número como argumento, como sucede en la última llamada recursiva, y aplana la matriz original en tantos niveles,1
en este caso, después del redondeo. Pero, como la matriz solo tiene un nivel de profundidad, el aplanamiento no tiene ningún efecto.fuente
Java 8, 84 bytes
Pruébalo en línea.
La creación de una matriz con los cuatro valores está inspirada en la respuesta Ruby de @GB , aunque ahora me doy cuenta de que usar una declaración if ternaria es la misma cantidad de bytes:
Pruébalo en línea.
fuente
Perl 5 , 53 bytes
Pruébalo en línea!
fuente
Rojo , 102 bytes
Pruébalo en línea!
fuente
AWK , 57 bytes
Pruébalo en línea!
fuente
Rutger , 310 bytes
Pruébalo en línea!
Ya es hora de que vuelva a usar Rutger. Desafortunadamente, puede que no sea el mejor lenguaje para la tarea, ya que no tiene forma de
eval
obligarme a usar cuatro declaraciones ifCómo funciona
¿Cómo funciona Rutger?
Un breve prólogo sobre cómo funciona el lenguaje: todo es una asignación o una función, y cada función toma exactamente un argumento. Para operaciones que requieren más de un argumento (por ejemplo, multiplicación), la primera llamada devuelve una función parcial que, cuando se llama nuevamente con el segundo argumento, devuelve el resultado esperado. Por ejemplo:
imprimirá 30: ¡ Pruébelo en línea!. Si bien esto suele ser más largo que la alternativa habitual, a veces puede guardar bytes, si se llama a una función repetidamente con un argumento constante y un argumento cambiante, por ejemplo, al imprimir tablas de tiempos.
Esta regla de argumento se aplica a todo lo que no es una constante o una variable, incluidos los bucles y condicionales. Sin embargo, los bucles y condicionales (
For
,Each
,While
,DoWhile
,If
yIfElse
) son factibles , lo que significa que con el fin de ejecutar de hecho ellos, elDo
función debe ser llamada (véase la última línea de la respuesta). Nuevamente, esto puede ahorrar bytes cuando se ejecuta repetidamente el mismo bucle, o le permite ejecutar código arbitrario entre la definición y la ejecución de bucles.Finalmente, hay tres formas de referirse a las variables, todas las cuales se utilizan en este programa. El primero es la referencia directa , donde el nombre de la variable tiene como prefijo un
$
símbolo. Esto accede al valor de la variable directamente y lo devuelve. El segundo es la referencia funcional , que no tiene un carácter de prefijo. Esto permite que el código distinga entre funciones (potencialmente parciales) asignadas a variables y variables reales que contienen un valor específico. Finalmente, la referencia indirecta , con el prefijo de un@
símbolo, crea una variable (si aún no existe) y devuelve el objeto variable dentro de un ámbito determinado. Esto le permite crear una variable de bucle (por ejemplo,i
enfor i in range(...)
).Cómo funciona la solución real
Aquí está el código sin golf:
Pruébalo en línea!
Como se puede ver, se inicia mediante la asignación de las tres variables
n
,e
ya
, lo que representa la entrada, el elemento de cambio en la secuencia, y el número de modificación para cada nuevo elemento, respectivamente. Luego creamos un ciclo while:Las llaves (1 como segundo argumento, volviendo 0 0 para enteros y un entero distinto de cero para flotantes. Luego calculamos el no lógico de esto, mapeo0 → 1 y n → 0 , n ≠ 0 .
{
y}
) definen un bloque de código, donde la declaración final en el bloque es la condición para el ciclo while. En este caso, comenzamos definiendo una función de módulo parcial, que tomará un segundo argumentom
y regresaráe % m
. Luego llamamos a esta función parcial conLuego llegamos a la monstruosidad absoluta que consiste en el cuerpo del bucle while:
La parte principal de este ciclo es un ciclo for, que itera4 4 veces cada iteración del ciclo while, tiene una variable de iteración de
x
y consiste en:La primera declaración imprime cada iteración de la secuencia antes de modificarla. Luego creamos una función parcial para verificar la igualdad con la variable de bucle
x
, y encontramos cuatro declaraciones if. Cada uno de los estados comprueba six
es igual a 1, 2, 3 o 4, respectivamente, y entonces asignak
a cada función en*
,+
,-
y/
, a continuación, lo hace en una función parcial cone
como su argumento. Finalmente, se asignae
ak
correr cona
como segundo argumento, y el incrementoa
.fuente
Ruby , 52 bytes
Pruébalo en línea!
fuente
i=0
y use un flotante como argumento para la función.C (clang) , 80 bytes
Pruébalo en línea!
Gracias a muchas mejoras de @ceilingcat.
fuente
dzaima / APL,
3433 bytesPruébalo en línea!
-1 gracias a ngn
fuente
TI83 / 84 BÁSICO, 69 Bytes
Configuramos un contador en A y borramos L1 para poder usarlo para rastrear la secuencia. Luego repetimos hasta que el paso de división causa una fracción. Dentro del bucle, primero almacenamos N en la lista. El almacenamiento en un elemento más allá del final de una lista o una lista vacía crea ese elemento, por lo que este almacén agrega el resultado de la división cuando no causa una fracción e inicializa la lista durante el primer paso. Luego usamos aumentar para agregar los siguientes 3 términos de la secuencia. La matemática resuelve algunos bytes más pequeños calculando el término A4k + 3 en la variable O y luego basando A4k + 2 y A4k + 4 en O. Luego hacemos la división por separado para restablecer N para la verificación repetida y sumar 4 a A.
Puse un Disp L1 al final, pero no estoy seguro de lo ideal que es, ya que no hay una buena manera de ajustar todos los términos en la pantalla. Siendo realistas, el usuario ejecutaría L1 después de que el programa se ejecute manualmente para desplazarse por los resultados.
fuente
Carbón , 29 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Ingrese el valor inicial.
Repita hasta que el valor ya no sea un número entero.
Imprima el valor en su propia línea.
Calcule las cuatro operaciones aritméticas disponibles y seleccione la correcta según el número de línea de salida actual.
fuente
Python 3 ,
7876 bytesPruébalo en línea!
Toma la entrada como una lista de 1 elemento y agrega recursivamente el siguiente elemento de la secuencia hasta que no sea un entero.
En el caso de que no se permita tomar entradas como una lista, aquí hay una versión parcheada muy rápida que toma entradas como int.
Entrada como un entero, 102 bytes
Pruébalo en línea!
+2 bytes gracias a mí olvidando nombrar la función recursiva ...
-4 bytes gracias a Jitse
fuente
f=
en su código principal. Sin embargo, también puede guardar 4 bytes desde entoncesn[-1]
ylen(n)
no necesita estar entre llaves. Pruébalo en línea!n[:-(n[-1]%1>0)]or f...
ahorraría un byteRamita , 164 bytes
De acuerdo, esto fue realmente horrible de escribir.
Limitaciones:
returns
! Usted sale o no salewhile
bucles. Usted debe utilizar la recursividad o nadaset
etiquetabreak
,continue
,goto
o similar. Esto hace que un bucle sea imposible de usar.for ... in ....
y recorre todos los elementos de una matriz, sin forma de detenerse.¡Todos esos hicieron el código masivo!
¡Hey, incluso lo hice más largo que la respuesta de Java!
¡Es tan largo como la respuesta de JavaScript de @ Arnauld ! ... Con las 3 alternativas combinadas.
Aquí está el código:
Puedes probarlo en https://twigfiddle.com/zw5zls
Cómo utilizar:
Simplemente importe el archivo y llame a la primera macro.
Para tener una matriz utilizable, puede hacerlo
a.a(21)|split(',')
.Sin golf:
Debería ser fácil de leer.
Esta respuesta no reflejada NO dará el resultado correcto, ya que arrojará espacios en blanco al azar.
Existe simplemente para ser legible humanamente.
fuente