Problema
A partir dos n=2
dados:
- Jogue
n
dados, com cada número 1 a 6 igualmente provável em cada dado. - Verifique se a soma deles é igual à soma mais provável dos
n
dados, ou seja3.5*n
.- Se forem iguais, termine.
- Caso contrário, imprima
n
e repita desde o início comn+2
dados
Seu código não precisa executar esse procedimento exatamente, mas deve fornecer uma saída aleatória probabilisticamente equivalente a ela, com base em nossa definição de aleatoriedade .
Seu programa deve gerar todos os números em sua própria linha; por exemplo, se o programa tivesse até 8 dados e rolasse o número mais provável com 8 dados, a saída seria:
2
4
6
Exemplo de execução
Em 2 dados, 7
é a soma mais provável. Digamos que os números rolados foram 2
e 3
. Então, você imprimiria 2
.
Em 4 dados, 14
é a soma mais provável. Digamos que os números laminados foram 3
, 4
, 2
, e 5
. Então, a soma é 14
, então o programa terminaria aqui.
A saída final neste caso é "2"
.
Regras
- code-golf solução mais curta em bytes ganha
- As brechas padrão se aplicam
- A meta-definição de aleatoriedade se aplica
- Você pode usar funções e programas
2, 4, 6, 8, ...
um rolo que muitos dados a cada vez até atingir o número mais provável para essa iteração?Respostas:
Python 2 , 70 bytes
Experimente online!
O truque é calcular a soma
eval
inserindo uma string com a aparênciacom
n
cópias da expressão concatenadas. Asrandrange(6)
saídas de um número aleatório de[0,1,2,3,4,5]
, que é deslocado para baixo por2.5
ter média de0
. Quando a soma se0
, awhile
condição falha e o loop termina.Um uso alternativo
map
era de 4 bytes a mais:Encontrei um monte de expressões de mesmo tamanho para um dado que mudou para zero, mas nenhum menor
fonte
MATL , 13 bytes
Experimente online!
Explicação
fonte
Geléia ,
1914 bytes-5 bytes com a ajuda da Leaky Nun (passando da contagem até a recursão)
Um programa completo que imprime os resultados separados por novas linhas (um espaço extra e uma nova linha também são impressos e os erros do programa no final).
Experimente online! - a qualquer momento em que 6 dados são ultrapassados, o TIO mata isso devido ao uso da memória, mas funciona em princípio - também leva aproximadamente 40s para fazê-lo.
Uma versão mais amigável de 15 bytes, que não leva muito tempo ou requer muita memória, está disponível aqui .
Quão?
Recursivamente rola mais 2 dados até que a soma das faces cada uma reduzida em 3,5 seja zero, imprimindo o número de dados à medida que for atingindo, quando o zero é atingido, ele tenta usar um caractere de espaço causando um erro de tipo.
fonte
n
s, OK, talvez seja recuperável. Achei que você queria dizer as somas :)TI-BASIC, 28 bytes
Explicação
randInt(1,6,N)
gera uma lista de N números aleatórios de 1 a 6mean(randInt(1,6,N)-3.5
reduz a média dos rolos em 3,5While
continua até que a expressão média seja igual a zero (a soma mais provável)fonte
R , 49 bytes
sample(6,n,T)
geran
(pseudo) amostras aleatórias do intervalo1:6
com substituição. Subtrair 3,5 de cada elemento gera um resultadosum
igual a 0 (falsey) se e somente se for o valor mais comum.Experimente online!
Ignora os lançamentos de dados ímpares.
fonte
Java 8,
123149113108 bytesOu 107 bytes, se usarmos um
Object null
parâmetro como não utilizado .+26 bytes para uma correção de erro, apontada corretamente por @Jules nos comentários.
-41 bytes graças ao ótimo pensamento de @ OliverGrégoire !
Explicação:
Experimente aqui.
fonte
r
igual3.5*n
ao programa deve terminar diretamente. Mas, se eu entender a função corretamente, ela será impressan
uma última vez antes de terminar.n
por 2. Portanto, ele continha dois bugs (1-12 em vez de 2-12; e rolando dados como 2 -> 2 -> 4 -> 6 -> ..., em vez de 2 -> 4 -> 6 -> ...). No entanto, estava imprimindo corretamente, porque não teria idoSystem.out.println(n),n+=2
ser
fosse realmente igual a3.5*n
.()->{for(int n=2,s=0,e=7,i;s!=e;n+=2,e+=7){for(i=n,s=n;i-->0;)s+=Math.random()*6;if(s!=e)System.out.println(n);}}
. Além disso, corrija em relação ao comentário de Jules e minha explicação.n
é dado,s
é soma,e
é esperado,i
é índice. Finalmente, a soma começa comn
para evitar a+1
,n
times es!=e
é repetida porque simplesmente não sei como evitar esse caso.()->{for(int i=0,s=1,j;s!=i*7;){for(j=s=++i*2;j-->0;)s+=Math.random()*6;if(s!=i*7)System.out.println(i*2);}}
05AB1E ,
2220 bytes-2 bytes graças a Emigna
Experimente online!
Explicação
fonte
O
depois de.R
remover)
es
.R,
484442 bytesUma melhoria de 5 bytes no resposta de Giuseppe .
Este (ab) usa o fato de que
F
é uma variável atribuída por padrão àFALSE
qual coage0
e pode ser incrementada, economizando a necessidade de inicializar uma variável de contador.fonte
sample(6)
em vez desample(1:6)
, mas riscou 44 ainda é de 44 .... codegolf.stackexchange.com/a/82343/67312PHP , 75 bytes
Experimente online!
fonte
5^2/++$i*$d+=rand()%6
é uma condição um pouco mais curta para o loop. Também acho que o loop atual sai incorretamente se o primeiro "dado" rolado for um "1" (ele gera um 0 para o inicial$d
).GolfScript , 41 bytes
Experimente online!
fonte
Mathematica, 47 bytes
-5 bytes de LLlAMnYP
fonte
05AB1E , 17 bytes
Experimente online!
Explicação
fonte
Batch, 109 bytes
Rather annoyingly,
random
is a magic environment variable, so it only gets replaced with a random value during environment expansion, which normally happens before the for loop starts.call
makes it happen each time through the loop, but then you need to double the%
signs to prevent the expansion from happening before the loop. The fun starts because we want to modulo the result by 6, which requires a real%
sign, which now has to be doubled twice. The result is six consecutive%
s.fonte
JavaScript (ES2015),
7578 bytesOutputs a string of results separated by newlines
Edit: saved a byte thanks to Shaggy, added 4 bytes to start function at 2
Explanation
fonte
'\n'
.n=2
, instead you have to specify the starting number of dice when the function is called.php - 89 Characters
fonte
$r=0;
useecho
instead ofprint
$n."
can be write as"$n
and for loops instead of while allows do to something in the after loop or before to save some bytesC (gcc),
8480797775807876 bytesTry it online!
fonte
Haskell
133132 bytesCredit to @Laikoni for the suggestions in the comments below.
fonte
return()
can be shortened topure()
andputStrLn$show
can be shortened toprint
.div k 2 then
can bediv k 2then
anddo print k;s(k+2)
isprint k>>s(k+2)
.Octave 55 bytes
Inspired by Andrewarchi's answer. If someone has any pointers to even shorten it, they are welcome.
fonte
Pyth, 20 bytes
Try it online!
fonte
QBIC, 40 bytes
Thispretty much literally does what the challenge asks for; seems the shortest way to get the distribution right.
Explanation
fonte
Rexx (Regina), 78 bytes
Try it online!
fonte
JavaScript (ES6) - 69 Characters
Explanation:
and:
fonte
Calc2 0.7,
119118111 bytesungolfed:
I could do without the Math.Int() but unfortunately in 0.7 the Random().Next() functions have a bug where they all return doubles instead of ints. It has been fixed but only after this question was posted. I'm not gonna win anything, but hey, nice proof of concept.
Edit:
Edit2:
removed var r and create a new Random where it's needed (-4 byte)
changed i=0,d=0 to i=d=0 (-2 byte)
incremented i after check (-1 byte)
fonte
Ruby, 52 bytes
Explanation
Try it online!
fonte
s=0
at the front of the loop and the use ofx.times
. This means the sum is reset every time and thenx
dice are rolled, which should be the correct distribution. I'll write up an explanation of my code.Javascript, 87 chars
Test with
console.log
instead ofalert
:fonte
lua, 102 bytes
Or the more readable version
A more cheaty version for 96 bytes
This pretty much works the same as the first but reuses the rolls from earlier calls. Because of this I can remove the for loop. Both are tested in lua 5.2
fonte
Perl 6, 48 bytes
fonte
PHP, 51 bytes
fonte