Le jeu de société Terra Mystica possède des mécanismes très intéressants pour l'une des principales ressources, le pouvoir. Au lieu de gagner et de dépenser des unités de pouvoir d'une banque, chaque joueur commence le jeu avec exactement 12 unités de pouvoir réparties sur trois "bols", qui sont étiquetés I, II et III. Gagner et dépenser du pouvoir déplace alors simplement le pouvoir entre ces bols:
- Pour dépenser une unité de puissance, déplacez-la du bol III au bol I (à condition que vous ayez une unité dans le bol III).
- Lorsque vous gagnez une unité de puissance, s'il y a une unité dans le bol I, déplacez-la dans le bol II. S'il n'y a pas d'unités dans le bol I, mais qu'il y en a une dans le bol II, déplacez-la dans le bol III. Si toutes les unités sont déjà dans le bol III, rien ne se passe.
- Lorsque vous gagnez ou dépensez plusieurs unités à la fois, elles sont traitées une unité à la fois.
Voici un exemple. Disons qu'un joueur commence avec la distribution de puissance suivante (donnée dans l'ordre I | II | III
):
5 | 7 | 0
Leur puissance change comme suit s'ils gagnent et dépensent de la puissance plusieurs fois:
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)
Votre tâche consiste à calculer le résultat d'un tel événement de gain ou de dépenses.
Le défi
Vous disposez de quatre entiers en entrée. Les trois premiers, I
, II
, III
, représentent la quantité de puissance dans chacune des trois bols. Ils seront non négatifs, et ils totaliseront 12. Le quatrième nombre,, P
est la quantité de puissance gagnée ou dépensée, et sera dans la plage incluse [-III, 24]
(vous pouvez donc supposer que le joueur n'essaiera jamais de dépenser plus de puissance qu'ils ne le peuvent actuellement, mais ils pourraient gagner plus de puissance que nécessaire pour déplacer toute la puissance dans le bol III).
Vous pouvez prendre ces nombres dans n'importe quel ordre cohérent, en tant qu'arguments séparés, en tant que liste d'entiers ou en tant que chaîne contenant ces entiers. Vous pouvez également prendre P
comme un argument, comme I
, II
, III
comme argument de liste séparée.
Vous devez sortie trois entiers I'
, II'
, III'
qui représentent la quantité d'énergie dans chaque bol après P
unités ont été acquises ou passé, suivant les règles exposées ci - dessus.
Vous pouvez écrire un programme ou une fonction et utiliser l'une de nos méthodes standard de réception d'entrée et de sortie.
Vous pouvez utiliser n'importe quel langage de programmation , mais notez que ces failles sont interdites par défaut.
Il s'agit de code-golf , donc la réponse valide la plus courte - mesurée en octets - l'emporte.
Cas de test
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
la source
Réponses:
Mathematica, 52 octets
Il s'agit d'une fonction sans nom qui prend une liste
{I, II, III, P}
en entrée et renvoie une liste{I', II', III'}
.Une solution sous forme fermée. Il ne semble pas encore vraiment optimal ...
la source
{##,12-+##}&[#-#4~Min~#,Max[#2+#-Abs[#4~Max~0-#],0]]&
c'est un octet plus long. J'aime12-+##
bien.C,
9794 octetsSous forme non golfée:
la source
Python 2, 104 octets
Essayez-le en ligne
Non golfé:
la source
Haskell, 58 octets
La valeur intermédiaire
m
indique la quantité de puissance allant de (ou vers, si elle est négative) le premier bol,z
indique la quantité de puissance dans le troisième bol après l'action. Une optimisation d'un octet de dernière minute a changé l'ancienne expression du deuxième bol de l'12-a+m-z
utilisation de l'identitéa+b+c=12
.Le type de résultat naturel est un triple pour les bols, donc l'entrée prend également les bols comme un triple et le changement de puissance comme deuxième argument. Cela permet de gérer tous les cas de test avec une seule application de
scanl
:la source
Röda ,
10094 octetsNon golfé:
la source
++
et--
?JavaScript,
6159 octetsEssayez-le en ligne!
la source
GNU sed , 66 octets
Comprend +1 pour
-r
Utilise unaire (voir ce consensus ).
Essayez-le en ligne!
la source
Rétine ,
46413938 octetsMerci à Martin Ender pour ses multiples suggestions utiles!
Prend entrée en unaire. La première ligne contient les quantités d'énergie dans les trois bols, séparés par des virgules, la deuxième ligne la quantité d'énergie à parcourir.
Suite de tests - Prend toutes les entrées sur une seule ligne et convertit de la décimale en unaire et vice-versa pour plus de commodité d'utilisation.
Explication
Cas positif: nous supprimons à plusieurs reprises le début
1
de la deuxième ligne et déplaçons un1
du premier bol non vide au suivant, aussi longtemps que cette opération est possible (c'est-à-dire que le nombre de puissance à parcourir est non nul et pas tout la puissance est dans le troisième bol). Les
modificateur signifiesingle-line
, permettant de.
faire correspondre également la nouvelle ligne.Cas négatif: fait tout en une seule étape, en déplaçant la quantité de puissance indiquée par la dernière entrée du troisième au premier bol. Cela supprimera également la ligne contenant la quantité négative de puissance à déplacer.
Conservez (grep) uniquement les lignes contenant une virgule. Cela permettra de se débarrasser des restes éventuels de la première ligne.
la source
Python 2, 91 octets
Basé sur cette réponse
Essayez-le en ligne
Non golfé:
la source
Lot, 87 octets
Utilisez les formules suivantes:
Puisque Batch n'a pas d'opérateur inférieur à, je calcule en
i = min(-i, 0)
utilisanti*=i>>5
.la source
Perl 6 , 99 octets
Soit
a
,b
etc
le nombre de jetons de départ dans les bols I, II et III respectivement. Ensuite, pour le cas de puissance ajoutée, une liste est créée qui contient desa
copies du triplet(-1, 1, 0)
, suivies par desa + b
copies du triplet(0, -1, 1)
, suivies par des copies infinies de0
. Les premiersd
éléments de cette liste,d
étant la quantité de puissance à ajouter, sont ajoutés élément par élément à la distribution de puissance de départ.Pour soustraire la puissance (négatif
d
), on utilise une forme fermée simple:(a - d, b, c + d)
.la source
tinylisp , 134 octets
Définit une fonction
f
qui prend quatre arguments, les trois bols (x y z
) et la quantité de puissance traitée (p
), et retourne une liste des trois bols après la transaction. Voici une version correctement espacée avec tous les cas de test: Essayez-le en ligne!la source