Tarefa
A tarefa é escrever um programa que produza um número inteiro positivo consistente, mas arbitrário, (tão estritamente maior que 0). Aqui está o problema: quando a fonte é repetida vezes (o código é anexado / concatenado a si mesmo), o programa deve ter Probabilidade de N de emitire a probabilidade restante de de saídainalterado.
Exemplo
Vamos supor que sua fonte inicial seja XYZ
e produz o número inteiro 3
. Então:
Para :
XYZXYZ
deve produzir com uma probabilidade de (50% do tempo) e com uma probabilidade de também (50% do tempo).Para :
XYZXYZXYZ
deve produzir com uma probabilidade de (66,666% do tempo) ecom uma probabilidade de (33,333% do tempo)Para :
XYZXYZXYZXYZ
deve produzir com uma probabilidade de (75% do tempo) e com uma probabilidade de (25% do tempo)
e assim por diante....
Regras
Você deve criar um programa completo . A saída deve ser impressa em STDOUT.
Seu programa, em teoria, deve gerar cada valor possível com as probabilidades indicadas acima, mas um pequeno desvio em relação a isso devido à implementação aleatória é bom ( desde que a implementação não seja de uma distribuição diferente - você não pode usar um distribuição normal para salvar bytes ) .
O programa deve (novamente, em teoria) trabalhar com um valor arbitrariamente grande de , mas as limitações técnicas devido à precisão são boas para grande .
A saída deve estar na base 10 (é proibida a saída em qualquer outra base ou com notação científica). Espaços à direita / à direita e zeros à esquerda são permitidos.
A fonte inicial deve (é claro) ter pelo menos 1 byte de comprimento. Você pode não assumir uma nova linha entre cópias da sua fonte. O programa não deve receber entrada (ou ter uma entrada vazia não utilizada).
Isso é código-golfe , a pontuação de uma resposta é o tamanho da fonte (original) em bytes, com uma pontuação menor sendo melhor.
Nota: Este desafio é uma versão (muito) mais difícil deste .
fonte
Respostas:
R ,
66bytes 35-29 bytes graças a digEmAll .
-2 bytes graças a Giuseppe .
Experimente online!
Verifique a distribuição para N = 4.
A chave é a atribuição à direitaN vezes, as primeiras chamadas N−1
->
. Quando o código é multiplicadosample
serão atribuídas aA
e apenas a última chamada será impressa.Solução original e mais complicada:
R , 66 bytes
Experimente online!
Experimente online (repetido 3 vezes)!
Utiliza dois truques: 1) chama a função principal de interesse
?
, para que possamos chamá-la sem terminar o programa com colchetes; e 2) usa variáveisT
eTT
, com o código que começa comT
e termina com?T
.F
é o contador de iterações.?
é redefinido como uma função que recebe um argumento booleano: se a entrada de?
éTRUE
(ouT
), faz a amostragem aleatória necessária; se a entrada forFALSE
(ou0
), não fará nada. O valor deTT
é definido como0
, para que?T
faça a amostragem, mas?TT
não faça nada.Quando a fonte é repetida, fica assim:
portanto, a chamada do meio
?TT
não gera nada, mas a chamada final?T
gera o resultado aleatório.fonte
->
código usado em uma situação em<-
que não podia estar; isso é tão legal !!Python 3 ,
8179 bytesExperimente online!
-1 byte graças a @Nishioka
Esta é uma solução Python 3 que não acessa diretamente a fonte do programa. Fazer isso no Python 3 é mais desafiador do que o Python 2 porque as instruções de impressão normais terminam com um parêntese de fechamento, portanto não há muitas opções para alterar seu comportamento no próximo bloco da fonte inicial. Seria interessante ver soluções mais criativas no Python 3.
fonte
+0 if[]else 1
Bash , 31 bytes
Experimente online!
trap ... 0
executará o código contido na saída.trap
S repetidos sobrescreverão os antigos. O não citado$[arithmetic expansion]
é executado toda vez que uma nova armadilha é definida.O Zsh pode salvar um byte com
<<<
:fonte
Geléia , 7 bytes
Experimente online!
fonte
05AB1E , 7 bytes
Experimente online!
fonte
Python 3 ,
787675 bytesUsando o mesmo truque do link postado, aqui está o Python (com x = 1).
Experimente online!
-2 bytes graças ao Sr. Xcoder por sua
(n-1)
fórmula com a~-n
qual tem maior precedência que*
-1 byte graças a Nishioka
fonte
import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#
deve funcionar para -2 bytesrandom()<1/n
;-)Dyalog APL,
2524232221 bytesExperimente online!
fonte
Gaia ,
17151413 bytesExperimente online!
Notei aleatoriamente o comportamento de
Øg
ontem ao examinar os documentos, o que ajudou imensamente.fonte
Perl 5,
2826 bytes-2 bytes graças a @Grimy
TIO
fonte
1 if!++$x;say 1<rand$x||$x
Ruby , 40 bytes
Experimente online!
Experimente online (copiado 3 vezes)!
Uma porta ruby desta resposta Python .
Ruby , 38 bytes
2 bytes salvos lendo o arquivo:
Experimente online!
fonte
Encantos Rúnicos , 31 bytes
Experimente online!
Usa a mesma estrutura que esta resposta para contar quantas vezes a fonte foi duplicada:
Em vez de emitir o enésimo número em uma lista, usamos esse valor para gerar um número aleatoriamente, se o resultado não for 0, imprima 1, ou imprima esse número.
fonte
Japonês ,
98 bytesTestá-lo | Dobrado | Triplicado
Verifique a distribuição de 10.000 execuções após 10 repetições
Original,
1311109 bytesObserve o espaço à direita.
Testá-lo | Dobrado | Triplicado
Verifique a distribuição de 10.000 execuções após 10 repetições
fonte
JavaScript ( shell 71 do JavaScript ), 78 bytes
Nenhum link tio, spidermonkey no tio é muito antigo ...
O Firefox (Spidermonkey) considera o comentário como parte da função
f
. Como resultado,(''+f).length
seráb+79n
onde b <78 e (n + 1) são os tempos do código fonte repetidos.Esse comportamento do buggy (? Não tenho certeza. Prefiro que seja um erro de especificação do JavaScript do que qualquer intérprete ) foi enviado ao BMO por outra pessoa logo após a resposta: https://bugzilla.mozilla.org/ show_bug.cgi? id = 1579792 . (Nem o tópico bmo nem o tweet são publicados por mim.)
fonte
(async x=>x)()
? Por que é assíncrono?async
hronous. Portanto, o retorno de chamadax=>f(...)
será chamado após a funçãof
ser definida.C # (Compilador interativo do Visual C #) ,
133114112 bytesEsta é a primeira (e espero que última) vez que eu usei diretivas de pré-processador C #.
Experimente online!
fonte
Carvão , 12 bytes
Experimente online! Com base na minha resposta à pergunta vinculada. Saídas
n
com probabilidade¹/ₙ
, caso contrário1
. Explicação:fonte