Rolling Quine Dice

19

Crie um programa que produza a si próprio.

No entanto, se o código-fonte for repetido n vezes (o que significa concatenar uma cópia do código-fonte até o final n-1 vezes) , deve haver 1 / n de probabilidade de saída do código-fonte original, 1 / n de probabilidade de saída o código-fonte repetido duas vezes, uma probabilidade de 1 / n de saída do código-fonte repetido três vezes, ... e uma probabilidade de 1 / n de saída do código-fonte n vezes.

Por exemplo, se o seu programa for foobar, ele sempre deve ser exibido exatamente foobar. No entanto, se você executar foobarfoobarfoobarfoobar, então deve haver um ¼ chance de cada um de saída foobar, foobarfoobar, foobarfoobarfoobare foobarfoobarfoobarfoobar.

  • A distribuição de cada saída possível deve ser igual
  • Além dos métodos de E / S padrão aplicáveis ​​e brechas padrão proibidas, aplicam-se regras de quine padrão (não é possível acessar sua própria fonte, etc.)
  • Este é o código de golfe, então a resposta mais curta em bytes ganha
JMigst
fonte
O pseudo-aleatório é bom o suficiente?
Wastl
1
@wastl Sim, isso é certo
JMigst
2
Sua definição está um pouco desativada. Se você repeti-lo 1 vez (ou seja foobarfoobar), então ele só tinha imprimirfoobar
Veskah
1
@Veskah foobarfoobaré foobarrepetido duas vezes, nem uma vez.
Nit
@Nit Você começa com a fonte. Se você usá-lo novamente, você o repetiu apenas uma vez, mas possui duas instâncias.
Veskah 23/05

Respostas:

9

Geléia , 24 22 bytes

“Ṿ;ẋŻɼLX¤¤µ”Ṿ;ẋŻɼLX¤¤µ

Experimente online!

Experimente x4!

“Ṿ;ẋŻɼLX¤¤µ”Ṿ;ẋŻɼLX¤¤µ
“Ṿ;ẋŻɼLX¤¤µ”              String literal: Ṿ;ẋŻɼLX¤¤µ
            Ṿ             Uneval. Return “Ṿ;ẋŻɼLX¤¤µ” (with quotes)
             ;            Append the initial string. Yields the source code. 
                ɼ         Apply the preceding link to the register and store the 
                          result in the register.
               Ż          Prepend 0. 
                          Each time Żɼ is used when the source code is repeated
                          the register's length increases by one. 
                          We can't use ‘ because it closes string literals.
                 L        Length. Returns the number of times the source code has
                          been repeated up till now.
                  X       Random element. If ɼ results in n, X returns a random 
                          integer between 1 and n.
                   ¤      Combines ŻɼLX as a nilad. 
              ẋ           Repeat the source code a random number of times between
                          1 and n.
                    ¤     Close everything from the initial string literal as a
                          nilad. 
                     µ    Start a new monadic chain. The register gets updated
                          once for time the code is repeated but only the final
                          repetition will result in output.
dylnan
fonte
5

05AB1E , 32 bytes

"34çìDJ¼32ôн¾L×Ω"34çìDJ¼32ôн¾L×Ω

Experimente online!

Explicação

"34çìDJ¼32ôн¾L×Ω"                   # push this string
                 34ç                # push a "-character
                    ì               # prepend it to the string
                     DJ             # duplicate and join the copy to the string
                       ¼            # increment the counter
                        32ô         # split the string into pieces of size 32
                           н        # take the first one
                            ¾L×     # repeat it for each in [1 ... counter]
                               Ω    # pick one at random
Emigna
fonte
Você poderia adicionar uma explicação quando tiver uma chance?
Shaggy
@Shaggy: Obrigado por me lembrar :)
Emigna
2

Gol> <> , 21 bytes

:QoaonC|P\Sx*F2ssS"
0

Experimente online!

Explicação:

:Q     |     If the top of stack is 0, skip to next |
             Top of stack is implicitly 0
        P    Increment top of stack
         \   Redirect pointer down]
0:QoaonC|P\Sx*F2ssS"  Increment for each copy of the source code
0:QoaonC|P\Sx*F2ssS"


         \   Redirect back to the right
          Sx*  Multiply the number of copies of the source code by a random number between 0 and 1
             F      Repeat that many times
              2ss   Push a double quote
                 S" Print the source code minus the quote, newline and 0
 :Q       If top of stack is not 0
   oaonC  Print the quote, a newline and a 0 to complete the source code and continue the loop
        \Sx*   Error on the * for some reason
Brincadeira
fonte
1

Alice , 35 bytes

"d3a*h-&;adddd12h&}Uh*t&w.odt,k@
 !

Experimente online!

Explicação

"

Como em muitos quines nas linguagens 2D, isso começa com um "que se envolve e empurra toda a primeira linha, exceto a "própria.

d3a*h-&;

A adição de uma ou mais cópias adicionais do código-fonte colocará alguns espaços implícitos no final da string literal. Para tornar isso realmente adequado, truncamos a pilha com 31 caracteres.

addd

Empurre uma nova linha e, em seguida, a altura da pilha três vezes. Os valores pressionados como a altura da pilha são 32 (o espaço na segunda linha), 33 (o !na segunda linha) e 34 (a inicial ").

d

Empurre a altura da pilha novamente, desta vez como o comprimento do código fonte original (35).

1

Inicialize um contador em 1. Contará o número de vezes que o código fonte é repetido.

2h&}

Vire à direita três vezes no lugar (ou seja, vire à esquerda). Cada repetição adicional do código-fonte contribuirá hcom a mesma coluna }, incrementando o contador. Quando o IP retornar ao }, vire à direita novamente para continuar na mesma direção.

Uh

Pegue um número aleatório uniforme de 0 a n-1 e adicione 1 para obter o número de vezes que a fonte original será impressa.

*t&w

Multiplique pela altura da pilha enviada anteriormente (comprimento do código) e repita o seguinte várias vezes, pressionando um endereço de retorno tantas vezes menos um.

.o

Produza a parte superior da pilha sem destruí-la.

dt,

Mova a entrada da pilha inferior para o topo.

k@

Repita e termine depois que o loop terminar.

Nitrodon
fonte
1

JavaScript (Node.js) , 62 bytes

(f=a=>b=>b?f(a+.5):`(f=${f})(1)`.repeat(1+Math.random()*a))(1)

Experimente online!

l4m2
fonte
1
Ou sou muito azarado, ou isso não pode imprimir mais de duas cópias do código fonte original.
Nitrodon
@Nitrodon Obrigado, corrigido
l4m2
1

Carvão , 58 bytes

≔´θ´⎚´×´⊕´‽´L´⊞´O´υ´ω´⁺´⪫´⁺´´´≔´θ´´´´´θθ⎚×⊕‽L⊞Oυω⁺⪫⁺´≔θ´´θ

Experimente online! Nenhuma versão detalhada porque o deverbosifier atualmente engasga "´". Principalmente com base no carvão mineral da Golf você um mineral para o bem! . Explicação:

≔´θ´⎚´×´⊕´‽´L´⊞´O´υ´ω´⁺´⪫´⁺´´´≔´θ´´´´´θθ

Atribua a sequência literal θ⎚×⊕‽L⊞Oυω⁺⪫⁺´≔θ´´θa θ.

Limpe qualquer saída anterior, para que somente a última saída entre em vigor.

×⊕‽L⊞Oυω

Empurre a sequência vazia para a matriz predefinida. Isso faz com que o comprimento da matriz seja igual ao número de repetições processadas até o momento;

⁺⪫⁺´≔θ´´θ

Anexe o texto literal a θ, insira ´s literais entre cada caractere e, em seguida, coloque outra cópia de θ.

Neil
fonte