Você é obrigado a gerar um campo de golfe aleatório de 18 buracos.
Exemplo de saída:
[3 4 3 5 5 4 4 4 5 3 3 4 4 3 4 5 5 4]
Regras:
- Seu programa deve gerar uma lista de comprimentos de orifícios para exatamente 18 orifícios
- Cada orifício deve ter um comprimento de 3, 4 ou 5
- Os comprimentos dos furos devem somar 72 em todo o percurso
- Seu programa deve ser capaz de produzir todas as configurações de furos possíveis com uma probabilidade diferente de zero (as probabilidades de cada configuração não precisam ser iguais, mas fique à vontade para pedir elogios extras, se for o caso)
4
, e as únicas possibilidades são3
,4
ou5
, a possível solução aulas são {no 3's or 5's
,one 3 and one 5
,two 3's and two 5's
, ...,nine 3's and nine 5's
}. Isso pode ser calculado pornCr(18,0)*nCr(18,0) + nCr(18,1)*nCr(17,1) + nCr(18,2)*nCr(16,2) + ... + nCr(18,9)*nCr(9,9) = 44,152,809
. Isso significa que aproximadamente11.4%
todas as combinações possíveis são soluções válidas(44,152,809 / 3^18)
.sum(factorial(18)/factorial(x)/factorial(y)/factorial(z) for x in range(25) for y in range(25) for z in range(25) if 3*x+4*y+5*z == 72 and x+y+z == 18)
dá44152809L
Respostas:
k (
18 1716 caracteres)De volta à abordagem original, credite à CS a melhoria.
Outra abordagem (17 caracteres), mesmo método da solução J, H / T para CS
Versão antiga:Não é suscetível ao estouro de pilha e é executado em uma quantidade fixa de espaço.
fonte
K, 28
fonte
J,
201817 caracteresIsso funciona da mesma maneira que a resposta anterior, exceto que os 9 dígitos aleatórios são 0 ou 1 e são negados antes de serem anexados. Isso significa que existem tantos
-1
s quanto existem1
s. Adicionando 4 me dá uma lista de3
s,4
s e5
s que somam 72 cada vez.Resposta anterior:
Gera os 9 primeiros buracos aleatoriamente
?9#3
, depois os copia e os inverte(,2-])
(transforma um 3 em um 5 e um 5 em um 3) para gerar o 9. final. Isso garante que o total será 72 (já que a cada 3 terá um 5 correspondente). o total médio por furo será 4 e 4x18 = 72). Em seguida, embaralha aleatoriamente o resultado({~?~@#)
para garantir que todas as combinações sejam possíveis.fonte
Código de máquina x86 de 16 bits no MS-DOS - 45 bytes
Hexdump:
Binário codificado em Base64:
Código fonte real com alguns comentários:
Compile
nasm 18h.asm -o 18h.com
e execute no MS-DOS (ou Dosbox) ou NTVDM a partir de uma versão do Windows de 32 bits.Saída de amostra:
fonte
Mathematica
71 68 6660Com 6 caracteres salvos por sugestão de Tally.
Todos os resultados possíveis são possíveis, mas não são igualmente prováveis.
Análise
produz todas as 10 partições possíveis (combinações, não permutações) de 72 em 18 elementos que consistem em 3, 4 e 5.
RandomChoice
seleciona um deles.RandomSample
retorna uma permutação dessa escolha.fonte
R - 41
O algoritmo é semelhante ao @ sgrieve.
fonte
GolfScript (26 caracteres)
Existem algumas semelhanças óbvias com a solução de Ilmari, mas também algumas diferenças óbvias. Em particular, estou explorando o fato de que o par médio é 4.
fonte
{;0{3.rand+.@+}18*])72-}do
comigo mesmo, mas não consegui descobrir como reduzi-lo a partir daí. +1.Python 77
Código
Resultado
A importação realmente mata essa solução. Ele usa numpy para gerar 18 números entre 3 e 5 e continua gerando listas até que a soma da lista seja 72.
fonte
GolfScript, 27 caracteres
Usa o mesmo método de amostragem de rejeição da solução Python do sgrieve. Portanto, toda saída válida é realmente igualmente provável.
fonte
Q (25 caracteres)
Original (27)
Saída de amostra
Um pouco mais curto (25)
fonte
JavaScript,
666461 caracteresFortemente inspirado em TwoScoopsofPig (PHP) e Joe Tuskan (JS).
fonte
s!=72
pode sers-72
para salvar um caractere. E o último ponto e vírgula;a
também não é necessário para outro caractere.for(i=x;i;i--)
antes, ele salva 2 caracteresfor(i=0;i<x;i++)
, obrigado cara!Python 2, 70 bytes
editar:Aqui está outro, semelhante à solução do sgrieve:
Python 2, 73 bytes + probabilidade igual
fonte
JavaScript,
1169965 bytesfor(i=0,h=[];i<18;)h[i++]=5;while(h.reduce(function(a,b){return a+b})!=72){i=Math.random()*18|0;h[i]=[3,4,4][i%3]}h;
h=[0];while(h.reduce(function(a,b){return a+b})-72)for(i=0;i<18;h[i++]=[3,4,5][Math.random()*3|0])h
fonte
i is not defined
.Python,
128120116 caracteresimport
instruções ainda são extintas (23 caracteres apenas para importar 2 funções no espaço para nome)espero que você não precise do resultado em um futuro próximo, pois esse código avalia primeiro todas as soluções possíveis antes de escolher uma aleatoriamente. talvez a solução mais lenta para esse problema.
Eu reivindico elogios extras pela mesma probabilidade de cada configuração ...
fonte
import random,itertools
import random as r,itertools as i
user
e emi
vez derandom
eitertools
. Use18*[0]
em vez derange(18)
, e[3,4,5,6]
em vez derange(3,6)
:)choice()
função Isso também é o que torna este código tão lento ...PHP - 77 caracteres
Assim como a solução da sgrieve, ela cria uma lista de 18 buracos, verifica o valor total do par e imprime ou rejeita e tenta novamente. Curiosamente, nossas duas soluções têm o mesmo comprimento.
De maneira irritante, o PHP não oferece funções de matriz com nenhuma brevidade de nome. Array_sum e print_r estão me matando. Sugestões são bem-vindas.
fonte
+=
.<?while($s!=72)for($s=$i=0;18>$i;$s+=$a[++$i]=rand(3,5));print_r($a);
while(array_sum($a)!=72)for($i=0;18>$i;)$a[++$i]=rand(3,5);
{}
(porque a sintaxe do PHP permite explicitamente isso).Ruby 1.9 (62 caracteres)
Trilhos (55 caracteres)
No
$ rails c
REPL (em qualquer pasta Rails):Nota: Funciona com o Ruby 1.8 se você usar em
shuffle[0]
vez desample
.fonte
(1..18).map{rand(3)+3}
para obter a matriz aleatória;)Lisp (
7869 caracteres)(do (c () (mapcar (lambda (x) (+ 3 (aleatório 3))) (lista de composição 18)))) ((= (aplicar '+ c) 72) c))É bastante semelhante à solução Python do sgrieve.
Comece com c como NIL, verifique uma soma de 72, a
do
"função de incremento" para c gera uma lista de 18 números entre 3 e 5, verifique 72 novamente, ensaboar, enxaguar, repetir.É refrescante ver
do
eloop
jogar golfe juntos.fonte
C (123 caracteres) - esforço de eficiência
Conduza através do wc e gerará todas as soluções 44152809 em 10 segundos ...
Oh, bem - não li a pergunta corretamente - mas, como estamos gerando todas as soluções, escolher uma aleatória com igual probabilidade é um exercício de script: P
fonte
Clojure - 55
Um truque bastante divertido .... explora a estrutura matemática do problema de que deve haver exatamente 3 buracos de par e 5 buracos de par.
fonte
Python 83
Como a solução de sgrieve, mas sem entorpecente
Solução de golfe Adrien Plisson: 120-> 108 caracteres
MATLAB 53
Saída :
fonte
randi([3,5],1,18)
vez de3+floor(rand(1,18)*3)
Java (61 caracteres)
Saída de amostra:
fonte
C (94 caracteres)
o
s=0
linha 1 pode não ser necessária, porque quais são as chances de um int não inicializado ser igual a 72? Eu simplesmente não gosto de ler valores não inicializados na reta C. Além disso, isso provavelmente requer a propagação dorand()
função.resultado
fonte
Script shell Bash (65 caracteres)
( shuf vem do pacote GNU coreutils. Além disso, obrigado Gareth.)
fonte
C # (143 sem espaço em branco):
fonte
new Guid()
cria um GUID vazio. Para realmente gerar um GUID exclusivo, você precisa chamar um método estáticoGuid.NewGuid
.Math.Random
, éSystem.Random
.var r=new Random();for(;;){var e=Enumerable.Range(1,18).Select(i=>r.Next(3,6)).ToList();if(e.Sum()==72){e.ForEach(i=>Console.Write(i));break;}}
Haskell,
10410298 caracteres.fonte
[1..n]>>[r]
é um pouco menor quereplicate n$r
.sequence
paramapM
.Perl, 74
Solução alternativa:
fonte
TXR (99 caracteres)
Essa expressão gera uma lista lenta e infinita de números aleatórios de 3 a 5:
O restante da lógica é um loop simples que verifica se os 18 primeiros elementos desta lista somam 72. Caso contrário, ele exibe um elemento e tenta novamente. o
for
loop contém um bloco implícito chamadonil
e, portanto,(return ...)
pode ser usado para finalizar o loop e retornar o valor.Observe que o comprimento de 99 caracteres inclui uma nova linha final, necessária.
fonte
APL 12
Observe que eu tenho a origem do índice definida como 0, o que significa que as matrizes começam em 0. Você pode definir isso com
⎕IO←0
.fonte
R, 42 bytes
sample
, por padrão, desenha igualmente entre os valores possíveis (aqui3 4 5
).r=T
representareplace=TRUE
e permite a amostra com substituição.fonte
CJam,
1714 bytesO CJam é mais novo que esse desafio, mas essa não é a resposta mais curta, então isso realmente não importa.
Teste aqui.
Para manter o total de 72, cada um
3
deve estar emparelhado5
. Então, aqui está como isso funciona:fonte