Un derivado de Brainfuck
Definamos un lenguaje de programación simple similar a Brainfuck . Tiene una cinta de celdas bidireccional, y cada celda contiene un bit. Todos los bits son inicialmente 0. Hay una cabeza móvil en la cinta, inicialmente en la posición 0. Un programa es una cadena sobre los caracteres <>01!
, ejecutada de izquierda a derecha, con la siguiente semántica:
<
mueve la cabeza un paso hacia la izquierda.>
mueve la cabeza un paso hacia la derecha.0
pone 0 en la celda actual.1
pone 1 en la celda actual.!
voltea la celda actual.
No hay bucles, por lo que un programa de n caracteres termina después de exactamente n pasos. Un programa es aburrido si todas las celdas contienen 0 al final de la ejecución, y emocionante si hay al menos uno 1. Tenga en cuenta que el tamaño de la cinta no está especificado, por lo que, dependiendo de la implementación, puede ser bidireccional infinito o circular.
Un programa de ejemplo
Considera el programa 1>>>!<<<<0>!>>>!
. En una cinta infinita, la ejecución se realiza de la siguiente manera:
v
00000000000000 Put 1
v
00000100000000 Move by >>>
v
00000100000000 Flip
v
00000100100000 Move by <<<<
v
00000100100000 Put 0
v
00000100100000 Move by >
v
00000100100000 Flip
v
00000000100000 Move by >>>
v
00000000100000 Flip
v
00000000000000
Al final, todas las celdas son 0, por lo que este programa es aburrido. Ahora, ejecutemos el mismo programa en una cinta circular de longitud 4.
v
0000 Put 1
v
1000 Move by >>>
v
1000 Flip
v
1001 Move by <<<< (wrapping around at the edge)
v
1001 Put 0
v
1000 Move by > (wrapping back)
v
1000 Flip
v
0000 Move by >>>
v
0000 Flip
v
0001
Esta vez, hay una celda con valor 1, ¡así que el programa es emocionante! Vemos que si un programa es aburrido o emocionante depende del tamaño de la cinta.
La tarea
Su entrada es una cadena no vacía <>01!
que representa un programa en el lenguaje de programación anterior. Una matriz de caracteres también es un formato de entrada aceptable. Se garantiza que el programa será aburrido cuando se ejecuta en una cinta infinita. Su salida será la lista de longitudes de cinta en las que el programa es emocionante. Tenga en cuenta que solo necesita probar el programa en cintas que son más cortas que la longitud del programa.
La solución con el recuento de bytes más bajo en cada idioma es la ganadora. Aplican reglas estándar de código de golf .
Casos de prueba
> : []
110 : []
1>0<! : [1]
0>>1>0<<>! : [1]
1>>>!<<<<0>!>>>! : [2, 4]
!<!<><<0>!>!<><1!>>0 : [2]
>>!>><>001>0<1!<<!>< : [1, 2, 3]
1!><<!<<<!!100><>>>! : [1, 3]
!!1>!>11!1>>0<1!0<!<1><!0<!<0> : [3, 4]
<><<>>!<!!<<<!0!!!><<>0>>>>!>> : [1, 2, 4]
0>>><!<1><<<0>!>>!<<!!00>!<>!0 : [3]
0000!!!!><1<><>>0<1><<><<>>!<< : []
!>!>!>!>!>1>!>0<!<!<!<0<!<0<!<!<!<1>!>0<<! : [1, 2, 5, 7]
<!!>!!><<1<>>>!0>>>0!<!>1!<1!!><<>><0<<!>><<!<<!>< : [1, 2, 4, 5]
!>1<<11<1>!>!1!>>>0!!>!><!!00<><<<0<<>0<<!<<<>>!!> : [1, 2, 3, 5, 6]
<>01!
?Respuestas:
Haskell, 119 bytes
Pruébalo en línea!
La función
#
es el intérprete para un solo comandoc
. Todo el programap
se ejecutafold
ing#
con la cinta de inicio enp
.f
se ejecutap
para cada cinta y mantiene aquellas donde la suma de las celdas es al menos 1.fuente
n<-[1..length p] ... 0<$[1..n]
parece bastante largo, debe haber un camino más corto.n
como resultado, por lo que si construiste0<$[1..n]
una forma diferente (digamos conscanr(:)
), deberías tomarlalength
. (También intentado usar1
(para reemplazarlength
asum
) oFalse
(para usaror
para la prueba) en vez de0
, pero no salió más corta.)n<-init$scanr(:)[]$0<$p ... n
que es 2 bytes más corto, pero devuelve una lista de cintas de inicio en lugar de su longitud, por ejemplo[[0],[0,0,0]]
. Con un poco de flexión de reglas, podría ver las cintas como números unarios, así que tal vez esté bien.init$
se puede reemplazar poniendo una[0]
lista inicial, pero aún así no se acortó lo suficiente. Creo que el unario solo está permitido para idiomas sin una representación numérica más natural .Stax ,
5654433835 bytes CP43742 bytes cuando está desempaquetado,
¡Ejecute y depure en línea!
-2 bytes por comentario por @recursive
Explicación
Usaré la versión con un prefijo
i
(es deciri%fz(y{{|(}{|)}{B!s+}{0_]e&}4ls"><! "I@!F|a
) para explicar y explicaré por quéi
se puede eliminarCódigo para ejecutar el programa:
fuente
i
cheque.0]*
puede ser reemplazado conz(
. Además, si se cambia la cadena en "<>!", A continuación,0
y1
dará índice de -1, por lo que la forma en la lista de bloqueo sólo necesita 4 cuadras, en lugar de 5. Esto funciona ya que las0
y1
los controladores son de todas formas idénticas.CJam ,
57564946 bytes-7 gracias a @MartinEnder
Pruébalo en línea!
fuente
Perl 5 ,
83827977 bytesIncluye
+3
para-F
Dar instrucciones como una línea en STDIN
Pruébalo en línea!
fuente
Perl 5 (
-F
), 101 bytesPruébalo en línea!
fuente
Rojo , 243 bytes
Pruébalo en línea!
Prety implementación detallada y sencilla. La indexación 1 de Red no me permite reducir el recuento de bytes mediante el uso de la aritmética modular para recorrer las cintas circulares.
Sin golf
fuente
Python 2 ,
139135133132131 bytes-3 bytes gracias al Sr. Xcoder
Pruébalo en línea!
fuente
Retina , 121 bytes
Pruébalo en línea! Explicación:
Cree una matriz de cintas de cada longitud hasta la longitud del programa de entrada.
Bucle hasta que se consuma el programa.
Si el siguiente carácter en el programa es un 0 o 1, cambie el primer carácter en cada línea a ese carácter.
Si es un,
!
entonces alternar el primer carácter en cada línea.Si es un
>
o,<
luego gire la línea. (Más fácil que mover la cabeza).Elimine la instrucción y finalice el ciclo.
Mantenga solo las líneas emocionantes.
Cuenta la longitud de cada línea.
fuente
JavaScript (ES6),
126118 bytesGuardado 3 bytes gracias a @ user71546
Toma la entrada como una matriz de cadenas de 1 carácter.
Pruébalo en línea!
fuente
t.some(x=>x)?
en su+t.join``?
lugar, verifique la matriz como dígitos (y 0 indica una cinta completamente cero), pero 3 bytes menos.APL (Dyalog Unicode) ,
796454 bytes ( SBCS de Adám )Pruébalo en línea!
-15 gracias a Adám (se olvidó de lo monádico
⍸
).-10 gracias a ngn .
fuente
↓
). Lo investigaré y actualizaré. :)↓
necesitará un;
, ¿no?MATL ,
4639 bytesPruébalo en línea! O verificar todos los casos de prueba .
Cómo funciona
fuente
APL (Dyalog Unicode) ,
19278 bytesPruébalo en línea! (resultado no aplanado)
Pruébalo en línea! (aplanado)
Después de pasar algún tiempo golpeando mi cabeza contra la pared, decidí hacer un Tradfn en lugar de un Dfn. Este es el resultado. Las personas más inteligentes que yo pueden jugar al golf.Sorpresa, sorpresa, alguien más inteligente que yo hice campo de los diablos de esto. Gracias Adám por 114 bytes.
Él dijo:
La función asume
⎕IO←0
.¿Cómo?
(Esta explicación utiliza una versión "sin golf" para facilitar la lectura)
fuente
t←l⍴0
bet←l⍴i←0
y eliminando la línea que se encuentra sobre él. También puede guardar otro cambiandot[i|⍨≢t]←1-t[i|⍨≢t]
at[i|⍨≢t]←~t[i|⍨≢t]
.∇
s?∇
s? Es una función tácita.Jalea , 41 bytes
Pruébalo en línea!
fuente
C (clang) , 171 bytes
Pruébalo en línea!
Tuve que usar clang, ya que usarlo
char*p,t[l=strlen(S)]
como la expresión de inicialización por alguna razón hace que GCC piense que quiero declarar enstrlen
lugar de llamarlo.Bastante sencillo: ejecuta el programa en cintas circulares de longitud decreciente, generando cualquier longitud que resulte en un 1 en algún lugar de la cinta.
Intenté acortar la maraña de los operadores ternarios, pero terminé necesitando más paréntesis de los sanos.
fuente
i=0,bzero(t,l)
lugar dememset(t,i=0,l)
y en*p-62?t[i]=*p^33?*p-48:t[i]^1:(i=~i+l?i+1:0)
lugar de*p==62?i=i^l-1?i+1:0:*p^33?t[i]=*p-48:(t[i]^=1)