Hilf mir, die Kiste zu schließen


12

Die Inspiration für diese Herausforderung sollte zum Zeitpunkt der Veröffentlichung auf lächerliche Weise offensichtlich sein.

Die Aufgabe

Sie müssen ein Shut the Box-Stilprogramm erstellen (nicht Funktion, Programm). Die Grundlagen von shut the box sind:

Die Spieler versuchen, die Kiste durch Drehen eines Hebels mit der Bezeichnung 1-9 zu schließen. Sie müssen dazu die Hebel umlegen. Die Reihenfolge der Ereignisse in jeder Runde ist wie folgt:

  1. Die aktuelle Position der Hebel wird angezeigt.
    • Bei einem neuen Spiel sollte die Position der Hebel als angezeigt werden 123456789.
    • Bei einem Spiel mit geschlossenen Hebeln werden alle geschlossenen Hebel als angezeigt -. Bei einem Spiel mit 1, 5 und 9 ist die Ausgabe beispielsweise gleich -234-678-.
  2. Das Di (c) e (is | are) wird gewalzt.
    • Wenn die Hebel 7, 8 und 9 ausgeschaltet sind, wird nur ein sechsseitiger Würfel geworfen. Andernfalls werden zwei sechsseitige Würfel geworfen.
  3. Der Spieler wird aufgefordert zu wählen, wie viele Hebel er drehen möchte.
    • Wenn der Spieler eine Zahl> 9 oder <0 wählt, endet das Spiel.
    • Wenn der Spieler einen bereits geschlossenen Hebel wählt, endet das Spiel.
  4. Der Spieler wählt so viele Hebel.
    • Wenn die Summe der Hebel nicht dem Wert des geworfenen Würfels entspricht, endet das Spiel.
  5. Wenn alle Hebel geschlossen sind, Glückwunsch, gewinnen Sie. Fahren Sie andernfalls mit Schritt 1 fort.

Regeln für das Programm

  • In jeder Runde sollten Sie die aktuellen Positionen der Hebel ausgeben.
  • Sie müssen den Wert der Rolle mit der Phrase ausgeben You rolled:(Leerzeichen beachten).
  • Sie müssen nach der Anzahl der Hebel fragen (und warten), bis diese mit der Phrase gewechselt wurden How many levers to flip:(Leerzeichen beachten).
  • Sie müssen nach so vielen Hebeln fragen (und warten), wie der Spieler mit der Phrase angegeben hat Which lever to flip:(beachten Sie das Leerzeichen).
  • Sie müssen die angegebenen Hebel umlegen.
  • Wenn das Spiel zu irgendeinem Zeitpunkt endet, müssen Sie ausgeben Game Over.
  • Wenn der Spieler eine Runde ohne geöffnete Hebel beendet, müssen Sie ausgeben You win!

Beispielspiele

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!

Oh. Ich hatte es auf meiner Liste, eine Herausforderung mit Shut the Box zu schaffen. Nett!
mbomb007

Antworten:


3

Python 3, 348

5 Bytes gespart dank Mathias Ettinger.
7 Bytes gespart dank DSM.

Dummkopf, das ist lang. Ich hasse es auch, dass es keinen guten Weg gibt, Testfälle zu machen.

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!')

2

C 405 403 398 392 390 387 Bytes

#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!");}

Ungolfed

/* 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!");
}

Bearbeiten: D'oh! Habe eine unbenutzte Variable in meiner Antwort hinterlassen. Ich hatte es entfernt, aber die falsche Version eingefügt.


2

PowerShell v2 +, 330 322 Byte

$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}}

Zeilenumbrüche zur Verdeutlichung:

$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}
}

(Benötigt Version 2 oder höher, da Get-Randomin PowerShell v1 nicht vorhanden ...)

Erläuterung:

Beginnen Sie mit dem Festlegen der $aReihe von Hebeln, indem Sie den Bereich verwenden 1..9, und setzen Sie sie $rgleich einem Skriptblock , den wir später ausführen (im Folgenden mit beschrieben $b). Der Game OverWortlaut wird zu $gBeginn einer Endlosschleife gesetzt for(){...}. Bei jeder Iteration setzen wir unsere Ausgabe $ound geben sie (dank der (...)Kapselung) sofort aus, indem wir -joindas Array zusammensetzen und jeweils 0durch a ersetzen -. (Das 0wird weiter unten erklärt). Wenn die Ausgabe gleich 9 Bindestrichen ist, geben Sie You win!und aus exit.

Als nächstes setzen wir unsere Würfel auf, $bindem wir das gespeicherte $r(via &) mit einigen zusätzlichen Parametern aufrufen . Der Get-RandomBefehl mit einem -Maximumvon 6(das -Maximumist impliziert) erzeugt eine ganze Zahl von 0 bis einschließlich 5. Wir fügen 1das auf einen sechsseitigen Würfel zu erhalten, und fügen hinzu , dass auf einem anderen zufälligen Würfelwurf , multipliziert mit (($a|sort)[8]-ge7)der überprüft , ob der höchsten Wert auf den Hebeln links eines ist 7,8,9durch erste Sortieranlage $aund dann das letzte Element zu nehmen und zu prüfen , ob er größer -als-oder-gleich 7. Wir verwenden implizite Typumwandlung, um den Booleschen Wert für die Multiplikation entweder auf 0 (False) oder 1 (True) zu setzen, sodass der zusätzliche "Die" entweder die*0oder ist die*1. Wir geben dann das Ergebnis des Würfels aus.

Als nächstes ist der Read-Hostin $lfür wie viele Hebel. Beachten Sie, dass PowerShell nach einer Aufforderung automatisch das Doppelpunkt-Leerzeichen hinzufügt , sodass wir dieses zumindest kostenlos erhalten. Wir prüfen dann, ob die Anzahl der Hebel, die der Benutzer betätigen möchte, zwischen 1 und 9 liegt .:Read-Hostexit

Nun betreten wir eine whileSchleife. Jede Iteration dieser Schleife, die wir Read-Hosthebeln, speichern $iund diesen Wert subtrahieren $b. Wir subtrahieren dann auch den entsprechenden Hebel im Array und subtrahieren, wie oft der Benutzer zusätzlich abgefragt werden soll.

Die letzte Zeile (mit Ausnahme der schließenden Klammer) testet zwei Boolesche Konstruktionen. Die erste $bMöglichkeit besteht nur dann, $Truewenn der Benutzer nicht alle Zahlen ordnungsgemäß vom Würfelwurf subtrahiert hat (in PowerShell ist jede Zahl ungleich Null die Wahrheit). Die andere Bedingung sortiert $aund nimmt den Minimalwert an. Wenn wir denselben Hebel zweimal subtrahieren, ist der Minimalwert negativ (oder Truthy), andernfalls ist der Minimalwert 0(oder Falsey).

Beispiellauf:

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!

Hervorragende Erklärung! +1
Addison Crump
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.