Los autómatas celulares son realmente fascinantes. Los que generalmente se mencionan son los binarios, es decir, los representables por un número. Sin embargo, esos, en mi opinión, se han hecho a la muerte. Las AC ternarias son más interesantes, ¡pero tenemos que considerar todas las ASCII! ¡Qué divertido podría ser eso!
En lugar de decidir un conjunto de reglas para cada personaje, usaré una regla de decisión simple de la que hablaré pronto. Para decidir la próxima generación, observamos las tres células "superiores", de forma muy similar a un autómata celular. Observa un ejemplo:
QWERTY
X Y Z
La "parte superior" de Y
es WER
, siendo las celdas arriba y derecha, arriba y arriba y izquierda. Y será el resultado de la función que estoy a punto de definir, que es una función en cadenas de tres caracteres. La "parte superior" de X
es QW
, o un espacio que llena la celda inexistente / faltante .
Ahora, para la función divertida ! Llamo a esta secuencia la secuencia XOROR por una razón. Sea A
el código de char de la celda superior izquierda, el código de char de B
la celda anterior y el código de char de la celda C
superior derecha. Entonces, la célula resultante es el personaje cuyo charCode es (A XOR B) OR C
, es decir, (A^B)|C
. (Si un valor resultante es mayor que 126, entonces se establece en (CHARCODE % 127) + 32
. No se hace nada si un valor es menor que 32.) Aquí hay un ejemplo de la semilla Hello, World!
:
S: Hello, World!
0: mmmo/c_ z}~)e
m = ( )^(H)|(e) = (32^72)|101 = 104|101 = 109 (m)
m = (H)^(e)|(l) = (72^101)|108 = 45|108 = 109 (m)
etc.
1: mmo/c_< +wl
2: mo/c_<c< + |;
3: o/c_<c ?+ g
4: oc_<c c??4+gg
5: 0_<c c 4+ o
6: _<c ccc4??ooo
7: c ccc4 ?o o
8: ccccc4w? pooo
9: cccc4w h o
A: ccc4wc hh ooo
B: cc4wc4kh ooo
C: c4wc4 #ooo o
D: wwc4w4#ooo oo
E: wc4wwc oo oo
F: w4wwc4oo oo o
G: wwwc4 oo oo
H: wwc4w4 oo oo
I: w4wwc4oooo oo
J: wwwc4 oo oo
K: wwc4w4oo oo o
L: wc4wwo oo oo
M: w4wwo8ooo oo
N: wwwo8 o oo o
O: wwo8w8oooo oo
Y podemos continuar por un tiempo más adelante. Esta modificación de la cadena se llama secuencia XOROR.
Objetivo Debe escribir un programa o función que realice una de las siguientes tareas:
- Dada una cadena
s
y un númeron >= 0
,n
genera la th cadena en la secuencia XOROR con semillas
,n = 0
siendo la primera transformación de la cadena. - Dada una cadena
s
, genera (para programas) o genera (para funciones / generadores) un flujo infinito de la secuencia XOROR con semillas
. Puede optar por detenerse si la secuencia se repite, pero esto no es necesario.
s
siempre consistirá en caracteres ASCII imprimibles, desde espacio hasta tilde más pestañas (sin líneas nuevas).
Este es un código de golf , por lo que gana el programa más corto en bytes.
fuente
o
s hacen que parezca una fiebre zerg .127%127+32==32
.n=0
no es la cadena original?(d^!)|(space)
. En cuanto a su segunda pregunta, se realiza(CHAR%127)+32
después de que se realiza el XOROR.Respuestas:
MATL ,
3331 bytesEsto funciona en la versión 13.1.0 del lenguaje / compilador, que es anterior al desafío.
La primera entrada es el número, la segunda es la cadena.
Pruébalo en línea!
fuente
Mathematica, 133 bytes
Sería bueno hacer que una
CellularAutomaton[]
solución funcionara, pero me quedé corto. ¿Nadie?Editar: algunas fotos bonitas (haga clic para ampliar)
plotCA["Hello, World!", 60]
:plotCA[bXORnotb, 100]
:plotCA[raven, 100]
:fuente
CellularAutomaton
tu función de actualización? (El número real de la regla con 127 estados válidos sería una locura)Java,
193185bytesPorque Java
-8 bytes cambiando al bucle en lugar de recurrir para convertirlo en una función anónima
Devuelve la enésima iteración de XOROR en s.
Versión legible:
Prácticamente una implementación literal de la especificación, con un bucle recursivo para aplicar la operación n veces. Sin embargo, algunos bytes se guardaron con mi observación de que la cláusula CHARCODE> 126 solo sucederá con CHARCODE == 127, lo que resulta en guardar en
SPACE
lugar deDEL
.Ejecuté mi código en algunas cadenas elegidas arbitrariamente y encontré este maravilloso ciclo:
fuente
ok
!CJam, 38 bytes
Pruébalo aquí.
Explicación
fuente
lri){2S*\*3ew{)\:^|}%127c' er}*
porque la operación previa al módulo de caracteres nunca excede 127Haskell, 123 bytes
Esto devuelve un flujo infinito de la secuencia XOROR. Ejemplo de uso (imprima los primeros 5 elementos de la semilla
"Hello, World!"
):Cómo funciona:
fuente
PHP, 186 bytes (con n) | 177 bytes (infinito)
Resultó que la impresión infinita es más corta ...
Ungolfed con n:
Infinito sin golf:
fuente
function i($s){for(;;$i=0,print$s=$r)for($r='';$i<strlen($s);$r.=chr($t>126?32:$t))$t=((ord($s[$i-1])?:32)^ord($s[$i]))|(ord($s[++$i])?:32);}
tiene 141 bytes de longitud (-36 bytes).C ++
Enésima secuencia (212)
Sin golf
Enésima secuencia usando la sintaxis del puntero en lugar de la sintaxis de la matriz para hacer esto aún más confuso: (231)
Sin golf
Función de depuración (por diversión)
fuente
JAVA 240/280 Bytes
La versión popular de Java en el momento en que escribí esto afirmaba tener 185 bytes, pero hay dos puntos importantes de fraude. Primero, la medición es presumiblemente solo para la función, no para la fuente de trabajo completa. Tal vez no sea un problema. En segundo lugar, utiliza BiFunction sin importar ni un nombre completo. Agregar los bits necesarios para ejecutarlo tal como está (luego minimizarlo de manera justa) lo llevó a 348 bytes. Agregar solo el nombre completo de la clase BiFunction lo lleva a 248 bytes.
Por el contrario, creo que el mío es de 240 bytes cuando se juega con las mismas reglas (sin clase, sin salida real, solo la carne). La clase ejecutable completa es de 280 bytes, y se ve así (sin minificar):
O, minificado:
fuente
Perl, 47 bytes
Incluye +2 para
-lp
Ejecutar con la entrada en STDIN, p. Ej.
perl -lp xoror.pl <<< "Hello, World!" | head -26
xoror.pl
:Esto funciona como está, pero reemplaza el
\x7f
por el valor binario correspondiente para obtener la puntuación dadafuente
Swift: 273 personajes
¡Vaya, Swift es peor que Java! (¡Todas esas API con nombres largos!: P)
Sin golf:
Gracias a @ CAD97 por mencionar que (A ^ B) | C solo puede ser mayor que 126 cuando es 127.
También me di cuenta de que no necesitas paréntesis alrededor de A ^ B | C porque XORing se realiza antes de ORing, por lo que me ahorró algunos bytes.
fuente