L'inspiration pour ce défi devrait être ridiculement évidente au moment de la publication.
La tâche
Vous devez créer un programme de style Shut the Box (pas une fonction, un programme). Les bases de la fermeture de la boîte sont:
Les joueurs tentent de fermer la boîte en tournant un ensemble de leviers étiquetés 1-9. Ils doivent le faire en actionnant les leviers. La séquence des événements de chaque tour est la suivante:
- La position actuelle des leviers est indiquée.
- Sur un nouveau jeu, la position des leviers doit être affichée comme
123456789
. - Dans un jeu avec des leviers de fermeture, tous les leviers de fermeture sont affichés comme
-
. Par exemple, sur un jeu qui a 1, 5 et 9 fermés, la sortie serait-234-678-
.
- Sur un nouveau jeu, la position des leviers doit être affichée comme
- Le di (c) e (est | sont) roulé.
- Si les leviers 7, 8 et 9 sont tous désactivés, un seul dé à six faces est lancé. Sinon, 2 dés à six faces sont lancés.
- Le joueur est invité à choisir le nombre de leviers qu'il souhaite actionner.
- Si le joueur choisit un nombre> 9 ou <0, la partie se termine.
- Si le joueur choisit un levier déjà fermé, la partie se termine.
- Le joueur sélectionne autant de leviers.
- Si la somme des leviers n'est pas égale à la valeur du di (c) e lancé, la partie se termine.
- Si tous les leviers sont fermés, félicitations, vous gagnez. Sinon, revenez à l'étape 1.
Règlement du programme
- À chaque tour, vous devez afficher les positions actuelles des leviers.
- Vous devez sortir la valeur du rouleau avec la phrase
You rolled:
(notez l'espace). - Vous devez demander (et attendre) que le nombre de leviers change avec la phrase
How many levers to flip:
(notez l'espace). - Vous devez demander (et attendre) autant de leviers que le joueur spécifié avec la phrase
Which lever to flip:
(notez l'espace). - Vous devez inverser les leviers spécifiés.
- Si à tout moment le jeu se termine, vous devez sortir
Game Over
. - Si le joueur termine un tour sans leviers ouverts, vous devez sortir
You win!
Exemples de jeux
123456789
You rolled: 5
How many levers to flip: 5
Which lever to flip: 1
Which lever to flip: 2
Which lever to flip: 3
Which lever to flip: 4
Which lever to flip: 5
Game Over
123456789
You rolled: 5
How many levers to flip: 3
Which lever to flip: 2
Which lever to flip: 2
Which lever to flip: 1
Game Over
123456789
You rolled: 12
How many levers to flip: 2
Which lever to flip: 3
Which lever to flip: 9
12-45678-
You rolled: 6
How many levers to flip: 2
Which lever to flip: 2
Which lever to flip: 4
1---5678-
You rolled: 11
How many levers to flip: 2
Which lever to flip: 5
Which lever to flip: 6
1-----78-
You rolled: 8
How many levers to flip: 1
Which lever to flip: 8
1-----7--
You rolled: 8
How many levers to flip: 2
Which lever to flip: 1
Which lever to flip: 7
---------
You win!
Réponses:
Python 3, 348
5 octets enregistrés grâce à Mathias Ettinger.
7 octets enregistrés grâce à DSM.
Ooof, c'est long. Je déteste aussi qu'il n'y ait pas de bonne façon de faire des cas de test.
la source
C,
405403398392390387 octetsNon golfé
Edit: D'oh! Laissé une variable inutilisée dans ma réponse golfée. Je l'avais retiré mais collé la mauvaise version.
la source
PowerShell v2 +,
330322 octetsDe nouvelles lignes pour plus de clarté:
(Nécessite la version 2 ou ultérieure car
Get-Random
n'existait pas dans PowerShell v1 ...)Explication:
Commencez par définir la
$a
gamme de leviers en prenant la plage1..9
, et définissez également$r
égal à un bloc de script que nous exécuterons plus tard (décrit ci-dessous avec$b
). LeGame Over
libellé est défini$g
au début d'une boucle infiniefor(){...}
. À chaque itération, nous définissons notre sortie$o
et la sortons immédiatement (grâce à l'(...)
encapsulation) en-join
combinant le tableau et en remplaçant chacun0
par un-
. (Le0
est expliqué ci-dessous). Si la sortie est égale à 9 tirets, affichezYou win!
etexit
.Ensuite, nous définissons nos jets de dés
$b
en appelant le stocké$r
(via&
) avec quelques paramètres supplémentaires. LaGet-Random
commande avec un-Maximum
de6
(le-Maximum
est implicite) produira un entier de 0 à 5 inclus. Nous ajoutons1
à cela pour obtenir un dé à six faces et l'ajoutons à un autre jet de dé aléatoire multiplié par(($a|sort)[8]-ge7)
lequel vérifie si la valeur la plus élevée restante sur les leviers est l'une des7,8,9
premières en triant$a
puis en prenant le dernier élément et en vérifiant s'il est supérieur -qui-ou-égal-à7
. Nous utilisons le transtypage implicite pour transformer la valeur booléenne en 0 (Faux) ou 1 (Vrai) pour la multiplication, donc le "dé" supplémentaire est soitdie*0
oudie*1
. Nous sortons ensuite le résultat du jet de dé.Est le suivant
Read-Host
dans$l
combien de leviers. Notez que PowerShell ajoute automatiquement l'espace deux-points:
après uneRead-Host
invite, nous l'obtenons donc gratuitement au moins. On vérifie ensuite que le nombre de leviers que l'utilisateur souhaite actionner est compris entre 1 et 9, sinonexit
.Nous entrons maintenant dans une
while
boucle. À chaque itération de cette boucle, nousRead-Host
qui exploitons, stockons cela$i
et soustrayons cette valeur$b
. Nous soustrayons ensuite également le levier correspondant dans le tableau et soustrayons le nombre de fois supplémentaires pour interroger l'utilisateur.La dernière ligne (à l'exception de l'accolade fermante) teste deux constructions booléennes. Le premier, juste
$b
, ne le sera que$True
si l'utilisateur n'a pas correctement soustrait tous les nombres du jet de dé (dans PowerShell, tout nombre non nul est Truthy). L'autre condition trie$a
et prend la valeur minimale. Si nous soustrayons le même levier deux fois, la valeur minimale sera négative (ou Truthy), sinon la valeur minimale sera0
(ou Falsey).Exemple d'exécution:
la source