Aiutami a chiudere la scatola


12

L'ispirazione per questa sfida dovrebbe essere ridicolmente ovvia al momento della pubblicazione.

L'obiettivo

È necessario creare un programma in stile Shut the Box (non funzione, programma). Le basi per chiudere la scatola sono:

I giocatori tentano di chiudere la scatola ruotando un set di leve etichettati 1-9. Devono farlo lanciando le leve. La sequenza degli eventi di ogni turno è la seguente:

  1. Viene mostrata la posizione corrente delle leve.
    • In un nuovo gioco, la posizione delle leve deve essere visualizzata come 123456789.
    • In un gioco con le leve chiuse, tutte le leve chiuse vengono visualizzate come -. Ad esempio, in un gioco con 1, 5 e 9 chiusi, l'output sarebbe -234-678-.
  2. Il di (c) e (is | are) arrotolato.
    • Se le leve 7, 8 e 9 sono tutte spente, viene lanciato un solo dado a sei facce. Altrimenti, vengono lanciati 2 dadi a sei facce.
  3. Al giocatore viene richiesto di scegliere quante leve vogliono girare.
    • Se il giocatore sceglie un numero> 9 o <0, il gioco termina.
    • Se il giocatore sceglie una leva già chiusa, il gioco termina.
  4. Il giocatore seleziona molte leve.
    • Se la somma delle leve non è uguale al valore del di (c) e lanciato, il gioco termina.
  5. Se tutte le leve sono chiuse, congratulazioni, hai vinto. Altrimenti, tornare al passaggio 1.

Regole per il programma

  • Ad ogni turno, dovresti emettere le posizioni correnti delle leve.
  • È necessario emettere il valore del rotolo con la frase You rolled:(notare lo spazio).
  • È necessario richiedere (e attendere) che il numero di leve cambi con la frase How many levers to flip:(notare lo spazio).
  • È necessario richiedere (e attendere) tutte le leve specificate dal giocatore con la frase Which lever to flip:(notare lo spazio).
  • È necessario capovolgere le leve specificate.
  • Se in qualsiasi momento il gioco termina, devi effettuare l'output Game Over.
  • Se il giocatore termina un turno senza le leve aperte, devi effettuare l'uscita You win!

Giochi di esempio

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. L'ho inserito nel mio elenco per creare una sfida che coinvolge Shut the Box. Bello!
mbomb007

Risposte:


3

Python 3, 348

5 byte salvati grazie a Mathias Ettinger.
Salvataggio di 7 byte grazie a DSM.

Ooof, questo è lungo. Odio anche che non ci sia un buon modo per fare casi di 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!')

2

C, 405 403 398 392 390 387 byte

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

Modifica: D'oh! Ho lasciato una variabile inutilizzata nella mia risposta golf. L'avevo rimosso ma avevo incollato la versione sbagliata.


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

Newline per chiarezza:

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

(Richiede la versione 2 o successive poiché Get-Randomnon esisteva in PowerShell v1 ...)

Spiegazione:

Inizia con l'impostazione della $aserie di leve prendendo l'intervallo 1..9e impostando anche $ruguale a un blocco di script che eseguiremo in seguito (descritto di seguito con $b). La Game Overformulazione viene impostata $gall'inizio di un ciclo infinito for(){...}. Ogni iterazione, impostiamo il nostro output $oe lo emettiamo immediatamente (grazie (...)all'incapsulamento) -joinunendo insieme l'array e sostituendo ciascuno 0con un -. (Il 0è spiegato di seguito). Se l'output è uguale a 9 trattini, output You win!e exit.

Successivamente, impostiamo i nostri tiri di dado $bchiamando il memorizzato $r(via &) con alcuni parametri aggiuntivi. Il Get-Randomcomando con un -Maximumdi 6( -Maximumè implicito) produrrà un numero intero compreso tra 0 e 5, incluso. Aggiungiamo 1a quello per ottenere un dado a sei facce, e lo aggiungiamo a un altro tiro di dado casuale moltiplicato per il (($a|sort)[8]-ge7)quale controlla se il valore più alto rimasto sulle leve è uno di 7,8,9prima ordinando $ae poi prendendo l'ultimo elemento e controllando se è maggiore -hanno o uguale a 7. Usiamo la tipizzazione implicita per trasformare il valore booleano in 0 (Falso) o 1 (Vero) per la moltiplicazione, quindi il "dado" aggiuntivo è die*0o die*1. Abbiamo quindi prodotto il risultato del tiro di dado.

Il prossimo è Read-Hostin $lper quante leve. Nota che PowerShell aggiunge automaticamente lo spazio dei due punti :dopo un Read-Hostprompt, quindi lo otteniamo almeno gratuitamente. Verifichiamo quindi che il numero di leve che l'utente desidera ruotare sia compreso tra 1 e 9, altrimenti exit.

Ora entriamo in un whileciclo. Ogni iterazione di questo ciclo, da Read-Hostquale leva, archiviamo $ie sottraiamo quel valore $b. Quindi sottraggiamo anche la leva corrispondente nell'array e sottraggiamo quante volte aggiuntive per interrogare l'utente.

L'ultima riga (tranne la parentesi graffa di chiusura) verifica due costruzioni booleane. Il primo, giusto $b, sarà solo $Truese l'utente non ha sottratto correttamente tutti i numeri dal tiro di dado (in PowerShell, qualsiasi numero diverso da zero è Truthy). L'altra condizione ordina $ae assume il valore minimo. Se abbiamo sottratto la stessa leva due volte, il valore minimo sarà negativo (o Verità), altrimenti il ​​valore minimo sarà 0(o Falsey).

Esempio di esecuzione:

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!

Spiegazione eccellente! +1
Addison Crump
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.