Aidez-moi à fermer la boîte

12

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:

  1. 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-.
  2. 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.
  3. 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.
  4. 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.
  5. 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!
Addison Crump
la source
Oh. Je l'avais sur ma liste pour créer un défi impliquant Shut the Box. Agréable!
mbomb007

Réponses:

3

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.

from random import*
*l,='123456789'
q=['-']*9
r=randint
p=print
f=' to flip: '
while l!=q:
 p(*l,sep='');t=r(1,6)+r(1,6)*(l[6:]!=q[6:]);p('You rolled: %s'%t);d={int(input('Which lever'+f))for _ in' '*int(input('How many levers'+f))}
 if len(set(d))-len(d)+1-all(str(x)in l for x in d)+t-sum(d):exit('Game Over')
 for x in d:l[x-1]='-'
p('You win!')
Morgan Thrapp
la source
2

C, 405 403 398 392 390 387 octets

#define R 1+rand()/(2147483647/6+1)
#define G return puts("Game Over");
#define I(s,w)printf(s);scanf("%d",&w);
w,s;main(r,l){char b[]="123456789";for(srand(time(0));w^9;w=strspn(b,"-")){puts(b);printf("You rolled: %d\n",r=R+(strspn(b+6,"-")<3?R:0));I("How many levers to flip: ",l)for(;l--;s+=w,b[w-1]=45){I("Which lever to flip: ",w);if(w>9|w<0|b[w-1]<48)G}if(s^=r)G}puts("You win!");}

Non golfé

/* Macro to get random integer in range [1,6] */
#define R 1+rand()/(2147483647/6+1)

i; /* Index variable */
main(r,l,w,s)
{
    /* Running game board */
    char b[]="123456789";

    /* Run while still levers not pulled */
    for(srand(time(0));i^9;i=strspn(b,"-"))
    {
        puts(b); /* Print game board */
        r=R+(b[6]^45||b[7]^45||b[8]^45?R:0); /* Get dice roll */
        printf("You rolled: %d\n",r); /* Print dice roll */
        printf("How many levers to flip: ");
        scanf("%d",&l); /* Get # of levers */
        for(i=s=0;i++<l;s+=w)
        {
            printf("Which lever to flip: ");
            scanf("%d",&w); /* Get lever # */
            if(w>9||w<0||b[w-1]==45) /* If invalid lever or lever already pulled, game over man */
                return puts("Game Over");
            b[w-1]=45; /* flip the lever */
        }
        if(s^r) /* If sum does not equal roll, game over */
            return puts("Game Over");
    }
    puts("You win!");
}

Edit: D'oh! Laissé une variable inutilisée dans ma réponse golfée. Je l'avais retiré mais collé la mauvaise version.

Cole Cameron
la source
2

PowerShell v2 +, 330 322 octets

$a=1..9;$r={1+(Random 6)};for($g="Game Over"){($o=-join$a-replace0,'-');if($o-eq'-'*9){"You win!";exit}"You rolled: "+($b=(&$r)+(&$r)*(($a|sort)[8]-ge7));$l=Read-Host "How many levers to flip";if(9-lt$l-or1-gt$l){$g;exit}while($l){$b-=($i=Read-Host "Which lever to flip");$a[$i-1]-=$I;$l-=1}if($b-or($a|sort)[0]){$g;exit}}

De nouvelles lignes pour plus de clarté:

$a=1..9
$r={1+(Random 6)}
for($g="Game Over"){
  ($o=-join$a-replace0,'-')
  if($o-eq'-'*9){"You win!";exit}
  "You rolled: "+($b=(&$r)+(&$r)*(($a|sort)[8]-ge7))
  $l=Read-Host "How many levers to flip"
  if(9-lt$l-or1-gt$l){$g;exit}
  while($l){
    $b-=($i=Read-Host "Which lever to flip")
    $a[$i-1]-=$i
    $l-=1
  }
  if($b-or($a|sort)[0]){$g;exit}
}

(Nécessite la version 2 ou ultérieure car Get-Randomn'existait pas dans PowerShell v1 ...)

Explication:

Commencez par définir la $agamme de leviers en prenant la plage 1..9, et définissez également $régal à un bloc de script que nous exécuterons plus tard (décrit ci-dessous avec $b). Le Game Overlibellé est défini $gau début d'une boucle infinie for(){...}. À chaque itération, nous définissons notre sortie $oet la sortons immédiatement (grâce à l' (...)encapsulation) en -joincombinant le tableau et en remplaçant chacun 0par un -. (Le 0est expliqué ci-dessous). Si la sortie est égale à 9 tirets, affichez You win!et exit.

Ensuite, nous définissons nos jets de dés $ben appelant le stocké $r(via &) avec quelques paramètres supplémentaires. La Get-Randomcommande avec un -Maximumde 6(le -Maximumest implicite) produira un entier de 0 à 5 inclus. Nous ajoutons 1à 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 des 7,8,9premières en triant $apuis 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 soit die*0ou die*1. Nous sortons ensuite le résultat du jet de dé.

Est le suivant Read-Hostdans $lcombien de leviers. Notez que PowerShell ajoute automatiquement l'espace deux-points :après une Read-Hostinvite, 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, sinon exit.

Nous entrons maintenant dans une whileboucle. À chaque itération de cette boucle, nous Read-Hostqui exploitons, stockons cela $iet 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 $Truesi 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 $aet 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 sera 0(ou Falsey).

Exemple d'exécution:

PS C:\Tools\Scripts\golfing> .\shut-the-box.ps1
123456789
You rolled: 6
How many levers to flip: 1
Which lever to flip: 6
12345-789
You rolled: 6
How many levers to flip: 2
Which lever to flip: 2
Which lever to flip: 4
1-3-5-789
You rolled: 6
How many levers to flip: 2
Which lever to flip: 1
Which lever to flip: 5
--3---789
You rolled: 10
How many levers to flip: 2
Which lever to flip: 3
Which lever to flip: 7
-------89
You rolled: 9
How many levers to flip: 1
Which lever to flip: 9
-------8-
You rolled: 8
How many levers to flip: 1
Which lever to flip: 8
---------
You win!
AdmBorkBork
la source
Excellente explication! +1
Addison Crump