Outro problema do nosso golfe interno ... esse nos feriados do ano passado.
PROBLEMA
Andy, Barb, Carl, Didi, Earl e Fran estão comprando presentes um para o outro. Desenhe nomes para uma troca de presentes.
- Cada pessoa compra um presente e recebe um presente.
- Ninguém compra seu próprio presente.
- A execução da solução várias vezes deve produzir resultados diferentes (o par doador-receptor não deve ser previsível ou idêntico de uma corrida para outra).
ENTRADA
Nenhum.
RESULTADO
Formatado como neste exemplo:
Andy compra Barb
Barb compra Carl
Carl compra Didi
Didi compra Earl
Earl compra Fran
Fran compra Andy
Respostas:
J, 57
por exemplo
fonte
c99 - 252 caracteres
Ligeira melhoria, aproveitando a natureza circular da permutação. Essa versão sempre cria uma estratégia de compra semelhante a um loop, por isso é menos aleatória que a versão anterior (271 caracteres), mas acredito que ainda atende às especificações.
Requer uma plataforma que funcione
/dev/random
. Eu deveria ser capaz de eliminar cerca de 8 omitindo os\0
s na string grande, mas minha libc não parece lidar com%4s
especificadores de impressão da maneira que a página de manual diz.O embaralhamento é ruim, mas fazê-lo dessa maneira me impede de verificar as condições "Foo compra para Foo" .
Legível:
fonte
Windows PowerShell, 83
História:
$i
ele será recriado todas as vezes.$_
na corda para salvar o+
.fonte
Haskell,
241189 caracteresSaída totalmente aleatória (que ainda satisfaz as especificações).
Isso gera todas as permutações da lista de nomes, escolhe uma aleatoriamente ( acho que essa é a maneira mais curta de Haskell de embaralhar uma lista - se alguém tiver algo menor, eu apreciaria) e, em seguida, cada pessoa comprará um presente para a próxima pessoa na lista.
fonte
permutations$words"Andy Barb Carl Didi Earl Fran"
e alguns outros truques que tentei na minha versão melhorada. Esqueci que issopermutations
não está incluído no 98List
, então você também deve usar o nome longo. Dê uma olhada nisso.r=tail.cycle
. e que inline.main=randomRIO(0,719)>>=mapM_ putStrLn.f
Golfscript:
72 6457 caracteresTestes
"AndyBarbCarlDidiEarlFran"4/
, atualizado e tem 7 caracteres a menos;9rand
é mais aleatória do que a minha6rand*
fonte
"AndyBarbCarlDidiEarlFran"4/
6rand*
-0=rand
ou talvez;9rand
seja preferível. Para o circuito,{.n+\' buys for '}%(
é mais curto ..6rand*
porque eu pensei que vai igualmente embaralhar a matriz 6 itens (eu acho que eu estava errado, já que;9rand
parece realmente aleatório do que a minha)Japt -R, 41 bytes
-2 bytes graças a @Oliver!
Tente!
Esta é a abordagem que adotei em alto nível:
Tenho um pouco de história com esse problema, pois criei um programa "segredo santa" para o meu trabalho anos atrás. Acabamos pedindo a alguns candidatos que trabalhem com isso também :)
fonte
ã
não está retornando um par que vincula o primeiro ao último elemento. Estou trabalhando em uma maneira de fazer isso funcionar, mas pensei em avisar. Mais uma vez obrigado! ethproductions.github.io/japt/…"q"
no.ö("q")
fazerPython - 118 caracteres
Python - 120 caracteres
fonte
R - 85 caracteres
fonte
Python - 154 caracteres
fonte
map
chamastr.__eq__
cada par de valores correspondentes em L e M, e o loop continua até que nenhum deles seja verdadeiro.D: 233 caracteres
Mais legivelmente:
fonte
Python (175)
fonte
Esquema, 173
Oferece uma das duas soluções.
fonte
C #,
210183 caracteresMontes de clichê :(
Essa solução não é totalmente aleatória - sempre há um ou mais "loops" de pessoas, por exemplo, A-> C-> E-> A, e as compensações são sempre as mesmas nos loops. No entanto, não é possível prever a saída de uma execução específica, a menos que você tenha parte dessa saída.
fonte
var n="Andy Barb Carl Didi Earl Fran".Split()
? Salva 16 bytes. Você pode deixar de fora o argumento paraMain()
, que salva outros 9 bytes. E você pode combinar a declaração dec
ei
:int c,i=...;for(c=0;...
que salva outros dois.Ruby - 89 caracteres
Resultado:
fonte
map
vez deeach
.MathGolf , 41 bytes
Experimente online!
Explicação
Não é garantido que produza cada caso com igual probabilidade, mas produz resultados diferentes a cada execução. Um byte poderia ser removido se eu tivesse um operador de reprodução aleatória, mas isso é para outro dia.
fonte