Um modelo simples de Markov será usado nesta pergunta. Para mais informações sobre cadeias de Markov, consulte http://setosa.io/ev/markov-chains/ .
Pegue uma corda. Neste exemplo, usaremos a palavra:
reader
Agora, para cada caractere, pegue os caracteres que aparecem após cada ocorrência do caractere na sequência. ( `^`
representa o início da string e `$`
o fim)
`^` -> {'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'}
Agora, começando do início da string, escolha aleatoriamente um dos caracteres no próximo conjunto. Anexe esse personagem e, em seguida, escolha entre os caracteres em seu próximo conjunto e assim sucessivamente até chegar ao final. Aqui estão alguns exemplos de palavras:
r
rereader
rer
readereader
Se um personagem aparecer após outro personagem várias vezes, é mais provável que ele seja escolhido. Por exemplo, em cocoa can
, após a c
, há dois terços de uma chance de obter uma o
e um terço de uma chance de obter uma a
.
'c' -> {'o', 'o', 'a'}
Desafio
Crie um programa que não aceite nenhuma entrada e produza uma sequência aleatória gerada usando uma cadeia de Markov, como acima, em que a entrada na cadeia é a fonte do programa.
- O programa deve ter pelo menos dois caracteres, dois dos quais devem ser iguais (para evitar cadeias "chatas" que possuem apenas uma saída)
- Você pode modificar o modelo para usar bytes em vez de caracteres, se desejar, mas altere "caracteres" para "bytes" na regra 1
- O programa deve gerar seqüências de caracteres aleatoriamente com a frequência esperada em teoria
Isso é código-golfe , então o programa mais curto vence!
fonte
^
e$
entre aspas? pode ficar mais claro tirar aspas ou colocá-las em aspas.Respostas:
Pip , 64 bytes
Isso foi divertido.
<tab>
representa um caractere de tabulação literal (0x09
). Experimente online!Quão?
TL; DR: sintaxe, repr e eval da cadeia de caracteres de escape.
Para cadeias que precisam conter
"
caracteres literais , o Pip escapou das cadeias , usando\"
como delimitador. Um quine padrão usando cadeias de escape ficaria assim:Isto é:
Y
ank (armazenando comoy
) uma string que contém"V Y".RPy
e e aV
ela.RPy
leva o repr dey
, ao qual precedemos a string literalV Y
. Finalmente, produza o resultado da avaliação.A estrutura do quine de Markov é semelhante, exceto que queremos salvar o código em vez de produzi-lo e depois fazer algumas coisas com ele depois.
t:V Y\"...\"
atribui o resultado da avaliação at
. Dentro do código avaliado,m:"..."
atribui uma cadeia de código am
qual avaliaremos no finalVm
.ST["t:V Y"RPy";Vm"C9]
cria uma lista contendoe converte-o em uma string, que por padrão concatena todos os itens. Esta seção é equivalente ao
"V Y".RPy
quine original. Como é a última expressão na cadeia de caracteres grande de avaliação, seu valor é o que oV
operador retorna e, portanto, o que é atribuídot
.Assim, após a avaliação e atribuição,
t
é igual ao código completo em
contémAgora
Vm
avalia isso como código. Vamos detalhar o que acontece.Algumas notas:
xxy
retornaria apenasxx
e nãoxy
nas correspondências. Felizmente, no entanto, não há caracteres duplicados neste código, portanto isso não importa.fonte
JavaScript,
217215 bytesObserve que isso usa
uneval
, que é suportado apenas pelo Firefox. Amostras de execuções:Como você pode ver, a maioria é sem sentido, mas isso é de se esperar;) O OP criou um JSFiddle que demonstra que a chance de uma saída ser JS sintaticamente válida é de cerca de 6,3%.
Se funções de leitura automática fossem permitidas, este poderia ser 78 bytes do ES6:
Muito, muito raramente, isso gera JS sintaticamente válido:
Meu favorito dos nomes de funções criados é
.splendom()
(split
+length
+random
)fonte
a.splerength.r()
, o que poderia ser válido;)Perl, 103 bytes
Com base no quine padrão e na minha resposta a esta pergunta :
Saída de exemplo
Da mesma forma que a outra questão, alguns resultados geram Perl válido:
mas as chances são um pouco menores, em ~ 2%.
fonte
q{
é o início de uma string literal e não há}
como fechá-la. O Perl é realmente ruim em executar seqüências aleatórias de bytes (e quando o faz, normalmente é devido a um comentário ou literal de string inicial).Código de máquina do MS-DOS (arquivo .COM), 63 bytes - não concorrente
Não concorrente porque um quine não deve acessar seu próprio código-fonte.
Uma variante de 126 bytes atenderia ao requisito "não acessar seu próprio código-fonte"!
A variante de 63 bytes é assim:
Também não tenho certeza sobre a distribuição de probabilidade do gerador aleatório:
O programa usa o fato de que os contadores de relógio e outras informações modificadas por interrupções são armazenadas no segmento 0 para gerar números aleatórios.
Exemplos de saídas geradas são:
Convertido em código de montagem, o programa fica assim:
fonte
C, 306
328585611615623673707bytesCódigo fonte:
Com novas linhas e espaços em branco adicionados para legibilidade / explicação:
Explicação
Line 01
:p[][]
mantém a contagem de um caractere após o outro.Line 02
:X
contém a fonte do programa, com escape%c%s%c
.Line 03
:Y
conterá a fonte literal do programa.c
,j
,*a
São variáveis de contagem.Line 05
: DefinaY
para conter o quine.Line 06
: Conte ocorrências de letras emp[][]
.Line 07
: Imprime o estado atual.Line 08
: Encontre o próximo caractere aleatoriamente, proporcional à contagem emp[][]
.Saída de amostra:
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}
fonte
Ruby, 152 bytes
Saída de amostra:
ou
Faz o Quines usando a formatação de string via
"s%s"
, e executa o encadeamento de Markov, pegando todas as fatias de dois caracteres, embaralhando-as e transformando-as em um dicionário Hash, onde, para chaves duplicadas, a última aparência define o valor. Para evitar adicionar lógica extra para o início, rastreio o caractere de saída mais recente usando$/
, que é inicializado automaticamente em uma nova linha, e asseguro que as novas linhas sempre sejam seguidas no código pelo0
mesmo caractere com o qual o código começa. No final, eu manipulo o código-fonte para que haja apenas um,!
para que sempre terminemos após o estrondo, usando-o<<33
para adicioná-lo sem o literal. Isso poderia ser aprimorado usando um caractere de um dígito não imprimível em vez do ASCII 33, mas isso parecia muito irritante.fonte
p<<<<<33
O operador super-super-super-concat? ;-)Has(s).ears(2)
me faz rir!Ferrugem, 564 bytes (não competitivo)
Como eu já havia escrito um artigo sobre Rust bem arrumado para outra pergunta, pensei em adaptá-lo para isso, pois parecia bastante simples. Embora o original fosse pequeno, para isso, fiz muito pouca tentativa de minimizar o tamanho. Aqui está uma versão expandida para explicar o que está acontecendo:
Saída de amostra 1:
Saída de amostra 2:
fonte
Python 2, 211 bytes
Emite o resultado para
stderr
.Experimente online
Saída de amostra:
Breve explicação:
s='s=%r;print s%%s';print s%s
formato quine. Eu crio uma strings
, que conterá o programa inteiro.X
contém o procedimento para executar recursivamente.o
, que será impressa parastderr
atingir o final da cadeia de Markov.$$
, usando dois caracteres para que o programa funcione para todas as cadeias. Eu poderia ter usado um personagem que não está no meu programachr(0)
, mas acho que é mais.c
, que (junto como
) é inicializado no primeiro caractere do programa.c
na sequênciat
(a variável que contém o quine do código fonte) é aq
qual será escolhida para a próxima seleção dec
.fonte
PHP,
144135130120272220212 bytesOu formatado para facilitar a leitura:
Saída de amostra:
e:
e:
e:
Trapaça do PHP, 117
Para os curiosos, se enganarmos lendo nossa própria fonte, podemos fazer 117:
fonte