Há um rio e há lobos e galinhas de um lado do rio. Eles têm uma balsa e todos precisam chegar ao outro lado. No entanto, a balsa não pode viajar por conta própria. A jangada afundará se houver mais de dois animais. Nenhum dos animais quer se molhar porque o rio está frio e sujo. Nenhum dos animais pode pular ou voar sobre o rio. Além disso, se houver galinhas de um lado, não poderá haver mais lobos naquele lado do que galinhas desse lado - os lobos decidirão comer as galinhas. Isso significa que você não pode levar dois lobos na balsa para um lado com uma galinha.
Sua tarefa é criar um programa / função que leve um número de lobos e um número de galinhas (maior ou igual ao número de lobos) como entrada e encontre o menor número de vezes que a jangada precisa se mover através do rio. Se a tarefa não for possível, o programa / função deve gerar / retornar uma string vazia. Em seguida, ele imprimirá / retornará um método de como isso é feito da seguinte maneira:
W if a wolf crosses the river on its own
C if a chicken crosses the river on its own
CW if a chicken and a wolf cross the river -- WC is also fine
CC if two chickens cross the river
WW if two wolves cross the river
Como você pode deduzir, a balsa se moverá automaticamente em direções alternadas (esquerda e direita, começando da esquerda para a direita quando o primeiro ou dois animais cruzarem o rio). Isso não precisa ser gerado / retornado. 'W', 'C', 'CW', 'CC' ou 'WW' na saída podem ser separados por pelo menos um dos seguintes:
spaces (' ')
commas (',')
newlines
Como alternativa, você pode armazenar as instruções como itens em uma lista (uma lista vazia significa que não há solução).
Casos de teste (saída separada por vírgulas - a entrada assume o formato wolves,chickens
):
1,1 -> CW
2,2 -> CW,C,CC,C,CW
1,2 -> CW,W,CW
0,10 -> CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC,C,CC
3,2 -> no solution
Tente tornar seu código o mais curto possível em bytes.
fonte
Respostas:
Perl,
179165164163157156 bytesInclui +4 para
-p
Dê lobos seguidos por galinhas em STDIN
Emite o conteúdo do barco por linha. Para este exemplo, ele fornece:
river.pl
:Funciona como mostrado, mas substitua
\xhh
e\n
por suas versões literais para obter a pontuação reivindicada.Isso provavelmente será derrotado por um programa que resolve o caso geral (C> W> 0)
Acrescente a isso as soluções triviais para apenas lobos e apenas galinhas e um caso especial codificado para
2 2
e3 3
(4 4
e superior não tem solução). Mas isso seria um programa chato.Explicação
O estado atual do campo é armazenado como uma única sequência que consiste em:
w
para um lobo na margem com o barcoc
para uma galinha na margem com o barco\x88
(pouco invertidow
) para um lobo na outra margem\x9c
(pouco invertidoc
) para uma galinha na outra margemP
margem direita,\xaf
(pouco invertidoP
) na margem esquerda (lado inicial)\n
WC\nW\nWC\nC\n
(note oW
s eC
estão em maiúsculas aqui)A matriz
@F
conterá todos os estados alcançáveis. É inicializado pela string inicialwolves times "w", chickens times "c", \xaf \n
O programa faz um loop sobre o
@F
qual será estendido durante o loop para que novos estados sejam processados também. Para cada elemento, ele faz:\n
que representa a posição atual dos animais e do barco. Se isso já foi visto antes, pule$a{$`x/\n/}++
grep(y/c//<y/w//&/c/,$_,~$_)
$\
e guarde isso, pois a primeira solução encontrada é a mais curta$\||=$' x/^\w*\n/
c
ew
. (Os animais do outro lado não combinam\w
)/(\w?)(.*)(c|w)(.+)\n(?{code})^/
. Em seguida, inverta a cadeia inteira antes dos,\n
exceto os animais que foram selecionados para o barcopush@F,$1.$3.~"$`$2$4\xf5"
. Adicione os animais selecionados aos movimentos, colocando-os em maiúsculas:uc"$'$1$3\n"
O processo de seleção de animais embaralha efetivamente a parte da corda que os representa de várias maneiras. Então, por exemplo,
wcwc
ewwcc
ambos podem representar 2 lobos e 2 galinhas. A verificação do estado$a{$`x/\n/}++
distingue unicamente esses dois, pois mais estados do que o necessário serão gerados e verificados. Portanto, o programa ficará sem memória e tempo assim que o número de animais diferentes aumentar. Isso é atenuado apenas um pouco pelo fato de que a versão atual deixará de adicionar novos estados assim que uma solução for encontradafonte
WC,C,WC
existem 2 lobos e 1 frango na margem direita.JavaScript (ES6),
251264...244240 bytesPega o número de lobos e galinhas
(w, c)
e retorna uma das soluções ideais, ouundefined
se não houver solução.Formatado e comentado
Função Wrapper:
Função recursiva principal:
Casos de teste
Mostrar snippet de código
fonte
and finds the smallest number of times the raft has to move across the river.
. então eu não acho que esta é uma solução válidaCJam, 133
Experimente online
Explicação:
Basicamente, o programa faz um BFS e se lembra de todos os estados que alcançou para evitar ciclos infinitos. Os estados de trabalho são representados como [[Wl Cl] [Wr Cr] M1 M2… Mn] onde W = lobos, C = galinhas, l = lado esquerdo, r = lado direito, M = movimentos feitos até agora (inicialmente nenhum), e os movimentos são como "C", "WC" ou "WW" etc. (praticamente mais como ["" C "], [" W "" C "], [" WW "" "], mas é o mesmo ao imprimir). Os estados lembrados são representados como [[Wl Cl] [Wr Cr] S] onde S é o lado do barco (0 = esquerda, 1 = direita).
fonte
Perl 6 , 268 bytes
Gera cadeias de
(wolf count, chicken count)
estados cada vez mais longas para a margem esquerda e retorna o primeiro que corresponde a todas as regras.Acontece que essa abordagem não é eficiente nem muito concisa, mas pelo menos foi divertido escrever.
Eu não acho que eu nunca empilhados do
Z
(zip) eX
(cruz) meta-operadores antes, como oZZ-
eZX*
aqui - surpreendeu meio que realmente funcionou.(As novas linhas são adicionadas apenas para fins de exibição e não fazem parte da contagem de bytes.)
fonte
JavaScript (ES6),
227237Basicamente, ele faz um BFS e se lembra de todos os estados que alcançou para evitar ciclos infinitos.
Ao contrário do @ aditsu, não acho que haja espaço para jogar golfeMenos golfe
Teste
fonte