Dada uma sequência de entrada S
, imprima S
seguida por um separador não vazio da seguinte maneira:
Etapa 1:
S
tem a1/2
chance de ser impressa e a1/2
chance de o programa terminar.Etapa 2:
S
tem uma2/3
chance de ser impressa e uma1/3
chance de o programa terminar.Etapa 3:
S
tem a3/4
chance de ser impressa e a1/4
chance de o programa terminar....
Etapa
n
:S
tem an/(n+1)
chance de ser impressa e a1/(n+1)
chance de o programa terminar.
Notas
A sequência de entrada será composta apenas por caracteres aceitáveis no tipo de sequência do seu idioma.
Qualquer separador não vazio pode ser usado, desde que seja sempre o mesmo. Espera-se que o separador seja impresso após a última impressão
S
antes de o programa terminar.O programa pode
1/2
terminar antes de imprimir qualquer coisa.Uma nova linha à direita é aceitável.
Sua resposta deve fazer uma tentativa genuína de respeitar as probabilidades descritas. Obviamente, quando
n
for grande, isso será cada vez menos verdadeiro. Uma explicação adequada de como as probabilidades são computadas em sua resposta (e por que elas respeitam as especificações, desconsiderando problemas de pseudo-aleatoriedade e grandes números) é suficiente.
Pontuação
Isso é código-golfe , então a resposta mais curta em bytes vence.
Respostas:
Pitão , 7 bytes
Experimente online!
Como funciona
Pseudo-código:
fonte
C #,
9485 bytesMinha primeira resposta!
Tentativa anterior (gostei disso
goto
):Ungolfed:
Nota: em C # o
Random.Next(N)
método retorna um número inteiro não negativo no intervalo [0, N-1], para que possamos apenas verificar se o número retornado é maior que 0.fonte
using System;
na sua contagem de bytes. Você pode declararr
em linha, sem necessidade de defini-lo como uma variável:new Random().Next(i++)
. Você não precisa do ponto e vírgula à direita na função do golfe.new Random().Next(i++)
mas quando tentei executar isso, o resultado sempre foi: o programa para sem imprimir nada ou o programa nunca para. Quando declaror=new Random()
e uso ar
variável, o programa para de forma mais aleatória conforme o OP pede.R,
474643 bytes43 bytes devido a Robin Ryder nos comentários.
Experimente online!
Explicação
fonte
function(s)
é mais curto ques=scan(,'');
pryr::f(while(runif(1)<T/(T<-T+1))print(s))
é ainda mais curto.T
eF
com funções anônimas, pois modifica uma variável global e significa que a função pode ser chamada apenas uma vez. Veja aqui : "a função solução executa de maneira consistente, independentemente de quantas vezes foi chamada anteriormente".05AB1E , 8 bytes
Experimente online!
Explicação
fonte
Javascript,
605854 bytesProduzirá a string
s
. O separador que é impresso se o programa terminar éNaN
ou0
.Math.random()
retorna um valor entre 0 e 1. Se esse valor estiver abaixon/(n+1)
,s
será premido.4 bytes salvos graças a @Neil
fonte
n/++n
?alert
em vez deconsole.log
salvar 6 bytes - o trecho poderia definiralert = console.log
para mostrar produção não intrusivos se desejado (se for permitido - não salva bytes, apenas ajuda a manter um sã)Java 8,
726261 bytes-10 bytes graças a @cliffroot .
-1 byte graças a @JollyJoker .
Delimitador é uma nova linha.
Explicação:
Experimente aqui.
fonte
if
condição dentro dofor
bloco de condições?for
circuito.for
loop deve terminar para que ele não precise explícitoreturn
. A segunda expressão dentro de for statement.int n=2
e1f/n++
funcionaria?Mathematica, 43 bytes
JungHwan Min salvou 1 byte (acima) e sugeriu algo melhor (abaixo)
Mathematica, 37 bytes
fonte
RandomInteger@n!=0
é o mesmo queRandomInteger@n<1
neste caso en++
pode ser mesclado comRandomInteger@n
. Além disso,For
é (quase sempre) mais curto do queWhile
: -5 bytesFor[n=1,RandomInteger@n++>0,Print@#]&
For[n=1,!n∣Hash[# n++],Print@#]&
também funcionaria com 34 bytes, assumindo que o hash seja bastante aleatório. A aleatoriedade depende da entrada, no entanto. Por exemplo, tente% /@ Alphabet[]
Clojure,
6156 bytesOh, por que eu não fui com um
for
em primeiro lugar? Mas, na verdade, ser pedantedoseq
deve ser usado comofor
é avaliado preguiçosamente.Original:
fonte
(>(+(rand-int n)2)0)
sempre é verdade?n
!> <> ,
124112 bytesExperimente online! (Você também pode assisti-lo no playground de peixes , mas devido a alguns erros, é necessário adicionar um
}
depois dol
na quarta linha e adicionar várias linhas novas após o código para fazê-lo funcionar corretamente.)A aleatoriedade é complicada em> <>. A única instrução aleatória é
x
, que escolhe a direção do peixe aleatoriamente entre quatro opções (esquerda, direita, para cima e para baixo), de modo que transformar isso em algo com probabilidade 1 / n não é simples.Da maneira que esse código faz, é usando os recursos de autod modificação de> <> para criar uma Torre de Aleatoriedade abaixo do código; portanto, no quarto estágio, por exemplo, o código se parece com:
O peixe começa na parte inferior da torre. Em cada nível da torre, a
x
armadilha fica presa entre dois espelhos, de modo que o peixe só pode escapar indo para a esquerda ou direita. Qualquer uma dessas direções envia o peixe para o próximo nível da torre, mas ir para a esquerda também empurra um0
para a pilha. Quando o peixe chega ao topo da torre, a pilha contém algum número de se0
esse número segue uma distribuição binomial com n tentativas ep = 1/2.Se o comprimento da pilha for 0 (com probabilidade 1/2 n ), o programa será interrompido. Se o comprimento for 1 (com probabilidade n / 2 n ), o peixe imprime a entrada e uma nova linha e constrói outro nível da torre. Se o comprimento for qualquer outra coisa, o peixe descarta a pilha e volta para o fundo da torre. De fato, dentre as possibilidades que realmente fazem algo, n delas imprimem a sequência de entrada e uma delas interrompe o programa, fornecendo as probabilidades necessárias.
fonte
Python 3 ,
726966 bytesExperimente online!
fonte
random()<1/i
.randint
é inclusivo. Você pode então encurtar a linha parawhile randint(0,i):print(s);i+=1
QBIC ,
1917 bytesDescartados
=1
, condicionais comutados, salvos 2 bytesExplicação
fonte
Braingolf , 23 bytes
Experimente online!
Gera um número aleatório em
x
que0 <= x < n+1
, termina sex
for 0, caso contrário, incrementosn
e loops. Separador é|
Explicação:
fonte
Alice , 18 bytes
Experimente online!
Explicação
fonte
PHP , 31 bytes
Experimente online!
fonte
Perl, 26 bytes
Código de 24 bytes + 2 para
-nl
.Experimente online!
fonte
Carvão , 14 bytes
Experimente online! Link é a versão detalhada do código. Usa
_
como separador. Nota: o cache de saída está desativado; portanto, não martele o servidor de Dennis!fonte
MATL , 9 bytes
Experimente online!
Explicação
fonte
Perl 6 ,
50 41 38 3626 bytesTente
Tente
Tente
Tente
(com
-n
argumento da linha de comando)Tente
fonte
Python 3 , 55 bytes
Explicação
Para evitar a importação aleatória, explorei o fato de que o hash interno é aleatoriamente propagado toda vez que um processo python é iniciado (pelo menos no MacOS). Cada hash do último hash deve gerar uma série de números inteiros pseudo-aleatórios.
Se o hash é pseudo-aleatório o suficiente, o módulo com
i
é zero com probabilidade1/i
.Notas
Estou um pouco incomodado com o hash redundante, mas sem uma atribuição de tempo de permanência ou condição no Python, estou um pouco preso.
fonte
I'm a little bothered...
recursão?C #
Este é o mesmo tamanho da resposta C # principal, mas:
Só queria salientar que alguma matemática pode produzir a probabilidade correta.
É equivalente a
E a função f (x) = 1 / x-1 é:
f (1) = 0
f (1/2) = 1
f (1/3) = 2
f (1/4) = 3
Portanto, 1/2 chance de ser arredondado para 0, 1/6 de chance de ser arredondado para 1 e 1 / (n + 1) (n + 2) uma chance de ser arredondado para n.
Talvez alguma outra linguagem possa tirar proveito disso.
EDIT: Corrigido meu erro
Pensei em algo para torná-lo menor.
Editar edição: eu estou apenas todos os tipos de errado. Puxou o Random para fora do loop, porque se ele for avaliado várias vezes, não funcionará.
Editar edição editar: me livrei da variável i. Vou parar de tentar diminuir agora. Não, menti. Livre-se de outro byte.
fonte
Carvão , 17 bytes
Experimente online! Código detalhado incluído. Respeita as especificações porque usa um intervalo aleatório de
0
atén
.fonte
C, 41 bytes
Assume que
rand
é semeado. Experimente online!fonte
rand
é semeado." - Isso é uma suposição válida a ser feita?rand
é exigido pelo padrão para ter um valor fixo inicial de 1 por padrão e todas as implementações que conheço fazem exatamente isso. Se essa função fizer apenas o que o desafio pede quando combinado com outro código, acho que outro código precisa ser incluído na resposta e na contagem de bytes.braingasm , 22 bytes
editar: Contagem de mesmos bytes, mas percebi que podia me infiltrar no novo
L
recurso de imitação de fita .Usa
0
como separador. Funciona assim:fonte
Python , 54 bytes
Experimente online!
Gerado o número de cópias como
floor(1/p)-1
comp
uniformemente escolhido a partir do intervalo de unidade. O número de cópias én
quando1/p-1
cai entren
en+1
, o que acontece quando1/(n+2) < p < 1/(n+1)
. Isso acontece com probabilidade1/(n+1)-1/(n+2)
ou1/((n+1)*(n+2)
. Esta é a probabilidade desejada de produzirn
cópias:1/2
prob de 0,1/6
prob de 1,1/12
prob de 2, ...fonte
form random import*
no fundo?f=
e colocando-o no cabeçalho TIOC ++,
979657 bytesAqui minha primeira tentativa no codegolf :)
Salvei um byte usando
for
Economizou 39 bytes, já que ninguém parece contar as inclusões
destroçado
fonte
F #, 161 bytes
Definitivamente não é o melhor idioma para o golfe, mas decidi tentar (além disso, não sei nada sobre F #, portanto, qualquer dica sobre como melhorar minha resposta será bem-vinda).
Executar com:
Grava uma nova linha como separador.
fonte
Ruby , 29 + 1 = 30 bytes
Usa a
-n
bandeira.Experimente online!
fonte
puts$_
por,print
mas não está claro as regras suportam isso.JS (ES6), 47 bytes
Diferentemente da outra resposta do ES6, ele usa bombas for loop e alert em vez de recursão. O separador que é impresso quando o programa para é indefinido.
fonte
PowerShell, 31 bytes
Get-Random $i
gera umn
onde0 <= n < $i
, separador é uma nova linha implícita.fonte
Python, 75 bytes
A outra resposta do Python é mais curta, mas eu queria tentar de uma maneira diferente:
fonte