Se utilizará un modelo de Markov simple en esta pregunta. Para obtener más información sobre las cadenas de Markov, consulte http://setosa.io/ev/markov-chains/ .
Toma una cuerda. Para este ejemplo, usaremos la palabra:
reader
Ahora, para cada carácter, tome los caracteres que aparecen después de cada aparición del carácter en la cadena. ( `^`
representa el inicio de la cadena y `$`
representa el final)
`^` -> {'r'} # After the start of the string, there is an `r`.
'r' -> {'e', `$`} # After the first `r` (*r*eader), there is an `e`
# after the second (reade*r*), there is the end of the string.
'e' -> {'a', 'r'}
'a' -> {'d'}
'd' -> {'e'}
Ahora, comenzando desde el comienzo de la cadena, elija aleatoriamente uno de los personajes del siguiente conjunto. Agregue este personaje y luego elija entre los personajes en su próximo conjunto, y así sucesivamente hasta llegar al final. Aquí hay algunas palabras de ejemplo:
r
rereader
rer
readereader
Si un personaje aparece después de otro personaje varias veces, es más probable que sea elegido. Por ejemplo, en cocoa can
, después de un c
, hay dos tercios de posibilidades de obtener un o
y un tercio de posibilidades de obtener un a
.
'c' -> {'o', 'o', 'a'}
Desafío
Cree un programa que no tome entrada y genere una cadena aleatoria generada usando una Cadena de Markov, como arriba, donde la entrada a la cadena es la fuente del programa.
- El programa debe tener al menos dos caracteres, dos de los cuales deben ser iguales (para evitar cadenas "aburridas" que solo tienen una salida)
- Puede modificar el modelo para usar bytes en lugar de caracteres si lo desea, pero cambie "caracteres" a "bytes" en la regla 1
- El programa debería generar cadenas al azar con la frecuencia esperada en teoría
Este es el código de golf , por lo que gana el programa más corto.
fuente
^
y$
entre comillas? puede que sea más claro eliminarlo de las comillas o ponerlas entre comillas.Respuestas:
Pip , 64 bytes
Esto fue divertido.
<tab>
representa un carácter de tabulación literal (0x09
). Pruébalo en línea!¿Cómo?
TL; DR: sintaxis de cadenas de escape, repr y eval.
Para las cadenas que necesitan contener
"
caracteres literales , Pip ha escapado de cadenas , utilizando\"
como delimitador. Una quine estándar que usa cadenas escapadas se vería así:Es decir:
Y
ank (almacenando comoy
) una cadena que contiene"V Y".RPy
y eV
al.RPy
toma la repr dey
, a la que anteponemos la cadena literalV Y
. Finalmente, muestre el resultado de la evaluación.La estructura de la línea de Markov es similar, excepto que queremos guardar el código en lugar de generarlo y luego hacer algunas cosas con él.
t:V Y\"...\"
asigna el resultado eval at
. Dentro del código evaluado,m:"..."
asigna una cadena de código a lam
cual evaluaremos al finalVm
.ST["t:V Y"RPy";Vm"C9]
construye una lista que contieney lo convierte en una cadena, que por defecto concatena todos los elementos. Esta sección es equivalente a
"V Y".RPy
la quine original. Como es la última expresión en la cadena de evaluación grande, su valor es loV
que devuelve el operador y, por lo tanto, lo que se le asignat
.Por lo tanto, después de la evaluación y la asignación,
t
es igual al código completo ym
contieneAhora
Vm
evalúa eso como código. Analicemos lo que sucede.Un par de notas:
xxy
solo devolveríaxx
y noxy
en los partidos. Afortunadamente, sin embargo, no hay caracteres duplicados en este código, por lo que no importa.fuente
JavaScript,
217215 bytesTenga en cuenta que esto utiliza
uneval
, que solo es compatible con Firefox. Ejecuciones de muestra:Como puede ver, es principalmente galimatías, pero eso es de esperarse;) El OP ha creado un JSFiddle que demuestra que la posibilidad de que una salida sea JS sintácticamente válida es aproximadamente 6.3%.
Si se permitieran funciones de lectura automática, esto podría ser 78 bytes de ES6:
Muy, muy raramente, esto genera JS sintácticamente válido:
Mi favorito de los nombres de funciones que se crea es
.splendom()
(split
+length
+random
)fuente
a.splerength.r()
, lo que podría ser válido;)Perl, 103 bytes
Basado en el quine estándar y mi respuesta a esta pregunta :
Salida de ejemplo
De manera similar a la otra pregunta, algunos resultados generan Perl válido:
pero las posibilidades son ligeramente inferiores, a ~ 2%.
fuente
q{
es el comienzo de un literal de cadena y no hay}
que cerrarlo. Perl en realidad es bastante malo para ejecutar secuencias aleatorias de bytes (y cuando lo hace, normalmente se debe a un literal de cadena o comentario temprano).Código de máquina MS-DOS (archivo .COM), 63 bytes - no competidor
No compite porque una quine no debe acceder a su propio código fuente.
¡Una variante de 126 bytes cumpliría el requisito de "no acceder a su propio código fuente"!
La variante de 63 bytes se ve así:
Tampoco estoy seguro acerca de la distribución de probabilidad del generador aleatorio:
El programa utiliza el hecho de que los contadores de reloj y otra información modificada por interrupciones se almacenan en el segmento 0 para generar números aleatorios.
Ejemplos de salidas generadas son:
Convertido a código de ensamblaje, el programa se ve así:
fuente
C, 306
328585611615623673707bytesCódigo fuente:
Con nuevas líneas y espacios en blanco agregados para legibilidad / explicación:
Explicación
Line 01
:p[][]
contiene los recuentos de un personaje que sigue a otro.Line 02
:X
contiene la fuente del programa, escapado con%c%s%c
.Line 03
:Y
contendrá la fuente literal del programa.c
,j
,*a
Son las variables de recuento.Line 05
: ConfiguradoY
para contener la quine.Line 06
: Cuenta las apariciones de letras enp[][]
.Line 07
: Imprime el estado actual.Line 08
: Encuentra el siguiente personaje al azar, proporcional a los recuentos enp[][]
.Salida de muestra:
p[++);p[99]=Y;putfor(aind(a++j,*a+j=j,c][c,*an(arile(pr*Y,Y[256]<<1);)][*Y,Y;)wha+++j=*aintfor*Y;prin(a+j]=j][256<1)pr(a;a;f(p[char(Y;for());};a;ma;ma=%s%chain(Y;ar(j][256<<<1)p[256<<raile(cha][9]<rin(j,34,34,Y[256]+j,Y,34,Y,c=Y,*a;*a;for(){0}
fuente
Ruby, 152 bytes
Salida de muestra:
o
Quines usa el formato de cadena a través de
"s%s"
, y hace el encadenamiento de Markov al tomar todas las rebanadas de dos caracteres, mezclarlas y convertirlas en un diccionario Hash, donde para las claves duplicadas la última aparición define el valor. Para evitar agregar lógica adicional para el comienzo, sigo el último carácter de salida usando$/
, que se inicializa automáticamente en una nueva línea, y me aseguro de que las nuevas líneas siempre estén seguidas en el código por0
el mismo carácter con el que comienza el código. Para el final, manipulo el código fuente para que solo haya uno, de!
modo que siempre terminemos después de la explosión, usando<<33
para agregarlo sin el literal. Esto podría desarrollarse aún más utilizando un carácter de un solo dígito no imprimible en lugar de ASCII 33, pero eso parecía demasiado molesto.fuente
p<<<<<33
¿El operador super-super-super-concat? ;-)Has(s).ears(2)
me hace reír!Óxido, 564 bytes (no competitivo)
Como ya había escrito un quine de Rust bastante limpio para otra pregunta, pensé en adaptarlo para esto, ya que parecía bastante simple. Aunque el original era pequeño, sin embargo, para esto he hecho muy pocos intentos de minimizar el tamaño. Aquí hay una versión ampliada para explicar lo que está sucediendo:
Salida de muestra 1:
Salida de muestra 2:
fuente
Python 2, 211 bytes
Emite el resultado a
stderr
.Pruébalo en línea
Salida de muestra:
Breve explicacion:
s='s=%r;print s%%s';print s%s
formato quine. Creo una cadenas
que contendrá todo el programa.X
contiene el procedimiento para ejecutar recursivamente.o
, que se imprimirá enstderr
al llegar al final de la cadena de Markov.$$
, usando dos caracteres para que el programa funcione para todas las cadenas. Podría haber usado un personaje que no está en mi programa comochr(0)
, pero creo que es más largo.c
, que (junto cono
) se inicializa en el primer carácter del programa.c
en la cadenat
(la variable que contiene la quine del código fuente) esq
, que se elegirá para la próxima selección dec
.fuente
PHP,
144135130120272220212 bytesO, formateado para facilitar la lectura:
Salida de muestra:
y:
y:
y:
PHP trampa, 117
Para los curiosos, si hacemos trampa leyendo nuestra propia fuente, podemos hacer 117:
fuente