O jogo de tabuleiro Terra Mystica tem algumas mecânicas muito interessantes para um dos principais recursos, o poder. Em vez de ganhar e gastar unidades de poder de um banco, cada jogador inicia o jogo com exatamente 12 unidades de poder, distribuídas por três "tigelas", rotuladas como I, II e III. Ganhar e gastar poder simplesmente muda o poder entre essas tigelas:
- Para gastar uma unidade de energia, mova-a da tigela III para a tigela I (desde que você tenha uma unidade na tigela III).
- Quando você ganhar uma unidade de energia, se houver uma unidade na tigela I, mova-a para a tigela II. Se não houver unidades na tigela I, mas houver uma unidade na tigela II, mova-a para a tigela III. Se todas as unidades já estiverem na tigela III, nada acontece.
- Quando você ganha ou gasta várias unidades de uma vez, elas são processadas uma unidade de cada vez.
Aqui está um exemplo. Digamos, um jogador começa com a seguinte distribuição de energia (fornecida em ordem I | II | III
):
5 | 7 | 0
O poder deles muda da seguinte maneira se eles ganham e gastam poder algumas vezes:
5 | 7 | 0
Gain 3 ==> 2 | 10 | 0
Gain 6 ==> 0 | 8 | 4 (move 2 power from I to II,
then the remaining 4 from II to III)
Gain 7 ==> 0 | 1 | 11
Spend 4 ==> 4 | 1 | 7
Gain 1 ==> 3 | 2 | 7
Spend 7 ==> 10 | 2 | 0
Gain 12 ==> 0 | 10 | 2 (move 10 power from I to II,
then the remaining 2 from II to III)
Gain 12 ==> 0 | 0 | 12 (the two excess units go to waste)
Sua tarefa é calcular o resultado de um desses eventos de ganho ou gasto.
O desafio
Você recebe quatro números inteiros como entrada. Os três primeiros, I
, II
, III
, representam a quantidade de energia em cada uma das três taças. Eles serão não negativos e somarão 12. O quarto número, P
é a quantidade de energia adquirida ou gasta e estará no intervalo inclusivo [-III, 24]
(portanto, você pode assumir que o jogador nunca tentará gastar mais poder do que atualmente, mas podem estar ganhando mais poder do que precisam para mover todo o poder para a tigela III).
Você pode levar esses números em qualquer ordem consistente, como argumentos separados, como uma lista de números inteiros ou como uma sequência contendo esses números inteiros. Você também pode tomar P
como um argumento, como I
, II
, III
como um argumento lista separada.
Você deve saída três inteiros I'
, II'
, III'
que representam a quantidade de energia em cada tigela depois P
unidades foram ganho ou gasto, seguindo as regras explicadas acima.
Você pode escrever um programa ou uma função e usar qualquer um dos nossos métodos padrão de recebimento de entrada e saída.
Você pode usar qualquer linguagem de programação , mas observe que essas brechas são proibidas por padrão.
Isso é código-golfe , então a resposta mais curta e válida - medida em bytes - vence.
Casos de teste
I II III P => I' II' III'
5 7 0 3 => 2 10 0
2 10 0 6 => 0 8 4
0 8 4 7 => 0 1 11
0 1 11 -4 => 4 1 7
4 1 7 0 => 4 1 7
4 1 7 1 => 3 2 7
3 2 7 -7 => 10 2 0
10 2 0 12 => 0 10 2
0 10 2 12 => 0 0 12
fonte
Respostas:
Mathematica, 52 bytes
Esta é uma função sem nome que recebe uma lista
{I, II, III, P}
como entrada e retorna uma lista{I', II', III'}
.Uma solução de forma fechada. Ainda não parece realmente ótimo ...
fonte
{##,12-+##}&[#-#4~Min~#,Max[#2+#-Abs[#4~Max~0-#],0]]&
é um byte mais longo. Eu gosto do12-+##
embora.C,
9794 bytesNa forma não-gasta:
fonte
Python 2, 104 bytes
Experimente online
Ungolfed:
fonte
Haskell, 58 bytes
O valor intermediário
m
indica a quantidade de energia que vai (ou se for negativa) à primeira tigela,z
indica a quantidade de energia na terceira tigela após a ação. Uma otimização de um byte de última hora mudou a expressão antiga do segundo bowl de12-a+m-z
usar a identidadea+b+c=12
.O tipo de resultado natural é um triplo para as taças; portanto, a entrada também leva as taças como um triplo e o poder muda como um segundo argumento. Isso permite lidar com todos os casos de teste com um aplicativo de
scanl
:fonte
Röda ,
10094 bytesUngolfed:
fonte
++
e--
?JavaScript,
6159 bytesExperimente online!
fonte
GNU sed , 66 bytes
Inclui +1 para
-r
Usa unário (veja este consenso ).
Experimente online!
fonte
Retina ,
46413938 bytesAgradecemos a Martin Ender por várias sugestões úteis!
Recebe entrada em unário. A primeira linha contém as quantidades de energia nas três tigelas, separadas por vírgula; a segunda linha, a quantidade de energia a ser percorrida.
Conjunto de teste - Aceita todas as entradas em uma única linha e converte de decimal em unário e vice-versa para facilitar o uso.
Explicação
Caso positivo: removemos repetidamente a guia
1
da segunda linha e movemos a1
da primeira tigela não vazia para a seguinte, contanto que essa operação seja possível (ou seja, o número de energia para ciclo é diferente de zero e nem todos o poder está na terceira tigela). Os
modificador significasingle-line
, permitindo.
combinar também a nova linha.Caso negativo: feito tudo em uma única etapa, movendo a quantidade de energia indicada pela última entrada da terceira para a primeira tigela. Isso também removerá a linha que contém a quantidade negativa de energia a ser movida.
Mantenha (grep) apenas linhas contendo uma vírgula. Isso vai livrar-se dos eventuais restos da primeira linha.
fonte
Python 2, 91 bytes
Com base nesta resposta
Experimente online
Ungolfed:
fonte
Lote, 87 bytes
Use as seguintes fórmulas:
Como o Lote não tem um operador menor que, eu calculo
i = min(-i, 0)
usandoi*=i>>5
.fonte
Perl 6 , 99 bytes
Seja
a
,b
ec
seja o número de fichas iniciais nas tigelas I, II e III, respectivamente. Em seguida, para o caso de adição de poder, é criada uma lista que contéma
cópias do trigêmeo(-1, 1, 0)
, seguidas dea + b
cópias do trigêmeo(0, -1, 1)
, seguidas de cópias infinitas de0
. Os primeirosd
elementos desta lista,d
sendo a quantidade de energia a ser adicionada, são adicionados elemento a elemento à distribuição de energia inicial.Para poder subtraindo (negativo
d
), uma forma fechada simples é utilizada:(a - d, b, c + d)
.fonte
tinylisp , 134 bytes
Define uma função
f
que recebe quatro argumentos, as três taças (x y z
) e a quantidade de energia transacionada (p
) e retorna uma lista das três taças após a transação. Aqui está uma versão espaçada corretamente com todos os casos de teste: Experimente online!fonte