Paciência búlgaro é um jogo single-player popularizado por Martin Gardner em sua coluna matemática na Scientific American .
Você tem N
cartões idênticos, divididos em pilhas. Você pega uma carta de cada pilha e forma uma nova pilha com as cartas removidas. Você repete esse processo até chegar a um estado que já viu e, assim, continuar repetindo o loop.
Por exemplo, digamos que você tenha 8
cartas, divida em uma pilha de 5
e uma pilha de 3
. Nós escrevemos os tamanhos pilha em ordem decrescente: 5 3
. Aqui está uma transcrição do jogo:
5 3
4 2 2
3 3 1 1
4 2 2
Você primeiro remove um cartão de cada uma das duas pilhas, deixando pilhas de 4
e 2
, e uma pilha recém-criada de 2
doações 4 2 2
. Na próxima etapa, elas diminuem para 3 1 1
seguidas com uma nova pilha de 3
. Finalmente, o último passo esvazia as pilhas de tamanho 1
e produz o 4 2 2
que já apareceu, então paramos.
Observe que a soma dos tamanhos das pilhas permanece a mesma.
Seu objetivo é imprimir uma transcrição do jogo a partir de uma determinada configuração inicial. Isso é código de golfe, e o menor número de bytes vence.
Entrada
Uma lista de números positivos em ordem decrescente que representa os tamanhos de pilha iniciais. Receber entrada via STDIN ou entrada de função. Você pode usar qualquer estrutura de lista que desejar.
Você não recebe o número total de cartões N
como entrada.
Resultado
Imprima a sequência de tamanhos de pilha que o jogo de Paciência Búlgaro passa. Observe que a impressão é necessária, não retornando. Cada etapa deve ter sua própria linha.
Cada linha deve ter uma sequência de números positivos em ordem decrescente, sem números 0
. Você pode ter separadores e tokens de início e de término (por exemplo [3, 3, 1, 1]
). Os números podem ter vários dígitos, portanto devem ser separados de alguma forma.
Imprima as divisões de tamanho de pilha que você vê até incluir uma repetição. Portanto, a primeira linha deve ser a entrada e a última linha deve ser uma repetição de uma linha anterior. Não deve haver outras repetições.
Casos de teste
>> [1]
1
1
>> [2]
2
1 1
2
>> [1, 1, 1, 1, 1, 1, 1]
1 1 1 1 1 1 1
7
6 1
5 2
4 2 1
3 3 1
3 2 2
3 2 1 1
4 2 1
>> [5, 3]
5 3
4 2 2
3 3 1 1
4 2 2
>> [3, 2, 1]
3 2 1
3 2 1
>> [4, 4, 3, 2, 1]
4 4 3 2 1
5 3 3 2 1
5 4 2 2 1
5 4 3 1 1
5 4 3 2
4 4 3 2 1
v$input()$
porQ
. 2. Se você armazena a lista em ordem decrescente, não precisaN
:W!}QYQ~Y]Q=Q_S+fTmtdQ]lQ;Q
QW!}QY~Y]Q=Q_S+]lQfTmtdQQ
. É exatamente o mesmo, personagem por personagem, até a comutatividade.CJam, 26 bytes
Experimente online.
Exemplo de execução
fonte
:p
trabalhou, eu poderia ...:p
Ruby, 98
Explicação
Array
.Hash
g
.Array#map
para diminuir cada elemento em 1, adicione o comprimento deArray
como elemento, classifique-o em ordem decrescente e exclua o elemento0
.g
basta verificar se há uma chave para o novo estado do jogo.fonte
sort_by
coisa é certamente inteligente,sort.reverse
é na verdade um personagem mais curto ^^ #CJam,
35 3433 bytes(Droga, esse corte de energia que eu não fui o primeiro a postar no CJam)
Entrada:
Resultado:
Experimente online aqui
fonte
Python 2- 103
Semelhante à resposta do Quincunx, mas substitui os anexos pela adição e remove as duas últimas linhas.
Saída de amostra:
fonte
GolfScript,
5046Quase certamente pode ser jogado ainda mais. Experimente aqui.
fonte
Haskell, 99
fonte
CJam,
403634 bytesTeste aqui. Digite a entrada como uma matriz no estilo CJam, como
[5 3]
, no campo STDIN. O formato de saída é semelhante, portanto, colchetes e espaços como delimitadores.Mesmo se eu jogar mais longe (o que é definitivamente possível), não há como vencer Pyth com isso. Talvez seja a hora de aprender J. Explicação mais tarde.
fonte
JavaScript (E6) 113
Pior entrada até agora :(
Teste no console do FireFox / FireBug
Resultado
fonte
Python 2,
148130101Isso simplesmente lembra todas as iterações anteriores e verifica se a nova está nessa lista. Em seguida, imprime.
Exemplo de execução:
Entrada:
Resultado:
Editar: reli as especificações para o golfe, além de aplicar muito golfe.
fonte
[4,2,2]
. Há uma solução fácil, porém.Caracteres Python 3: 89
Muito parecido com as soluções Python já postadas, mas com chamadas de função recursivas ao invés de loops. A lista
s
armazena as divisões já vistas e provoca um curto-circuito na recursão em caso de repetição.A função
print()
(este é Python 3) só precisa ser chamada de alguma forma em cada loop. O difícil é quelambda
apenas permite uma expressão única, então não podemos fazerprint(l);...
. Além disso, produz resultadosNone
difíceis de trabalhar. Acabo colocandoprint(l)
de um lado uma desigualdade;==
não funciona por algum motivo que eu não entendo.Uma abordagem alternativa de colocá-lo em uma lista usa igualmente muitos caracteres.
Usar
print(*l)
formataria as saídas como4 2 2
e não[4,2,2]
.fonte