Código Golf: Misture as nozes para que nenhuma do mesmo tipo toque

16

Entrada:

Input é uma matriz aleatória de nozes (no seu idioma), as seguintes nozes possíveis. Seu programa deve ter uma maneira de representar cada tipo de porca, como um código inteiro. O programa deve ser capaz de lidar com qualquer matriz de tamanho de qualquer configuração de porcas.

Porcas possíveis:

Kola nut
Macadamia
Mamoncillo
Maya nut
Mongongo
Oak acorns
Ogbono nut
Paradise nut
Pili nut
Pistachio
Walnut

Resultado:

A saída deve ser a matriz classificada de tal maneira que não haja porcas adjacentes do mesmo tipo. Se isso for impossível, a saída deve ser uma matriz vazia.

Exemplo de entrada (simplificado):

["walnut", "walnut", "pistachio"]

Saída de exemplo:

["walnut", "pistachio", "walnut"]

As soluções não podem simplesmente embaralhar a matriz até que ela se torne única por acaso. O tipo empregado deve ser determinístico

Nozes mistas?  Eu vejo duas amêndoas se tocando!

Thomas Dignan
fonte
4
"Seu programa deve ter uma maneira de representar cada tipo de porca, como um código inteiro" por que isso? - "não pode simplesmente embaralhar a matriz até que ela se torne única por acaso. O tipo empregado deve ser determinístico", uma embaralhamento ainda pode ser determinística. Você apenas pretende impor um limite à complexidade de tempo do programa?
deixou de girar contra-
11
Eu tenho que concordar com @leftaroundabout proibir que um algoritmo específico seja bobo sem uma boa razão. Uma das coisas mais gratificantes sobre jogos de código como esse é exatamente a variedade de métodos empregados.
dmckee
@ dmckee, acho que o requisito de que o algoritmo seja determinístico é razoável - se o RNG estiver com defeito ou a entrada for razoavelmente longa, uma solução não determinística pode não terminar.
Boothby
@boothby. Meh. Sou físico de partículas. Monte Carlo é uma ferramenta importante por si só. Além disso, se eu escolher um PRNG fixo e uma semente fixa, é determinístico.
dmckee
11
Acho que encontrei um exemplo que tem várias soluções, mas pode causar algumas respostas que não conseguem encontrar nenhuma delas. Posso adicionar? (5,4,4,3,3,2) perl6 -e 'my @a="aaaaabbbbccccdddee".comb;my @b = @a.pick(*) while @b.squish !== @a;say [~] @b' baedcbdacdecbabaca(3,3,2) também podem causar falhas.
Brad Gilbert b2gills

Respostas:

8

GolfScript, 42 41 37 38 caracteres

~.`{\`{=}+%1-,}+$.,)2//zip[]*.2<..&=*p

O código espera entrada em STDIN e imprime o resultado em STDOUT, por exemplo:

> ["walnut" "walnut" "walnut" "macadamia" "pistachio"]
["walnut" "macadamia" "walnut" "pistachio" "walnut"]

> ["walnut" "walnut" "walnut" "macadamia" "walnut"]
[]

O script ficou mais longo do que o esperado, mas suponho que haja espaço para melhorias.

Edit: O caso de uma lista com um único item me custa 1 caractere (a melhor comparação que eu poderia fazer é a mesma de Peter).

Howard
fonte
11
Eu ainda não havia me sentado para implementar isso, mas $.,)2//zipé exatamente o que eu tinha em mente. Minha interpretação da especificação era que ela podia receber informações da pilha e deixá-las na pilha, então talvez devêssemos pedir esclarecimentos.
Peter Taylor
@PeterTaylor, legal. Funciona para mim.
Boothby
Isso trava na entrada ["walnut"]na seção compare os dois primeiros.
Peter Taylor
@ PeterTaylor Você está certo. Vou ter que trabalhar naquele caso de esquina.
Howard
6

GolfScript, 32 caracteres

~:x{]x\-,}$.,)2//zip[]*.2<..&=*`

O mesmo formato de entrada e saída da solução de Howard.

Peter Taylor
fonte
Eu tive a mesma ideia na parte de classificação, mas ainda não a codifiquei :-) Bom trabalho!
Howard
6

Brachylog v2, 10 bytes

p.¬{s₂=}∨Ė

Experimente online!

Solução de força bruta. (Essa é uma função, permitida porque o desafio não diz "programa completo".) Também é principalmente uma tradução direta da especificação (a única sutileza real é que eu consegui organizar as coisas para que todas as restrições implícitas chegassem exatamente ao lugares certos, não necessitando de caracteres extras para desambigüá-los).

Observe que este é um algoritmo genérico para reorganizar qualquer tipo de lista para que ele não tenha dois elementos tocantes; ele pode lidar com representações de string dos elementos e também com códigos inteiros. Portanto, não importa realmente como "Seu programa deve ter uma maneira de representar cada tipo de porca, como um código inteiro". requisito da pergunta é interpretado.

Explicação

p.¬{s₂=}∨Ė
p            Find a permutation of {the input}
  ¬{   }     which does not have the following property:
    s₂         it contains a pair of adjacent elements
      =        that are equal
        ∨    {no constraint on what value the equal elements can have}
 .           If you find such a permutation, output it.
        ∨    If no permutation is found, ignore the input and
         Ė     {output} an empty list
ais523
fonte
1

J, 80 caracteres

]`_:@.(0<2&([:+/=/\))({.~-:@#),((],.|.)~>.@-:@#)<"1;(\:#&.>)(</.])[;.1' ',1!:1[1

Na verdade, não está na mesma liga que o Golfscript. Suspeito que haja ganhos a serem feitos, mas os 14 caracteres necessários apenas para inserir a lista no programa [;.1' ',1!:1[1são um grande obstáculo.

Basicamente, o programa inclui a lista, agrupa itens semelhantes, classifica pelo número de itens em cada grupo decrescente e alterna a saída entre a primeira metade e a segunda metade da lista. O restante, se o código se livrar de itens estranhos e decidir se a lista é saída válida (saída infinita, _se não for).

Exemplo:

macadamia walnut walnut pistachio walnut

grupo (</.]):

macadamia walnut walnut walnut pistachio

classificar (\:#&.>):

walnut walnut walnut macadamia pistachio

viagem ((],.|.)~>.@-:@#):

walnut macadamia walnut pistachio walnut
Gareth
fonte
0

Gelatina , 14 bytes

Ġz0UẎḟ0ịµẋ⁻ƝẠ$

Experimente online!

Os últimos 6 bytes podem ser removidos se pudermos ter um comportamento indefinido para entradas inválidas.

Erik, o Outgolfer
fonte
0

Stax , 10 bytes

│éÿ∞å[zàL⌂

Execute e depure

Aqui está o mesmo programa descompactado, não destruído e comentado.

|T      get all permutations
{       block to filter by
  :g_=  after dropping repeated elements, it's still equal
f       execute filter
|c      terminate and pop if falsy (no match)
hJ      take the first permutation, and join with spaces

Execute este

recursivo
fonte