Ayudame a cerrar la caja

12

La inspiración para este desafío debe ser ridículamente obvia al momento de la publicación.

La tarea

Debe crear un programa de estilo Shut the Box (no función, programa). Los conceptos básicos de cerrar la caja son:

Los jugadores intentan cerrar la caja girando un conjunto de palancas con la etiqueta 1-9. Deben hacerlo moviendo las palancas. La secuencia de eventos de cada turno es la siguiente:

  1. Se muestra la posición actual de las palancas.
    • En un juego nuevo, la posición de las palancas debe mostrarse como 123456789.
    • En un juego con palancas cerradas, todas las palancas cerradas se muestran como -. Por ejemplo, en un juego que tiene 1, 5 y 9 cerrados, la salida sería -234-678-.
  2. El di (c) e (es | son) enrollado.
    • Si las palancas 7, 8 y 9 están apagadas, solo se lanza un dado de seis caras. De lo contrario, se lanzan 2 dados de seis caras.
  3. Se le pide al jugador que elija cuántas palancas desea voltear.
    • Si el jugador elige un número> 9 o <0, el juego termina.
    • Si el jugador elige una palanca ya cerrada, el juego termina.
  4. El jugador selecciona esa cantidad de palancas.
    • Si la suma de las palancas no es igual al valor del di (c) e lanzado, el juego termina.
  5. Si todas las palancas están cerradas, felicidades, usted gana. De lo contrario, regrese al paso 1.

Reglas para el programa

  • En cada turno, debe mostrar las posiciones actuales de las palancas.
  • Debe generar el valor del rollo con la frase You rolled:(observe el espacio).
  • Debe solicitar (y esperar) el número de palancas para cambiar con la frase How many levers to flip:(observe el espacio).
  • Debe solicitar (y esperar) tantas palancas como el jugador especificado con la frase Which lever to flip:(observe el espacio).
  • Debe voltear las palancas especificadas.
  • Si en algún momento el juego termina, debes dar salida Game Over.
  • Si el jugador termina un turno sin palancas abiertas, debes sacar You win!

Juegos de ejemplo

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
fuente
Oh. Lo tenía en mi lista para crear un desafío relacionado con Shut the Box. ¡Agradable!
mbomb007

Respuestas:

3

Pitón 3, 348

Guardado 5 bytes gracias a Mathias Ettinger.
Guardado 7 bytes gracias a DSM.

Ooof, esta es larga. También odio que no haya una buena manera de hacer casos de prueba.

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

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

Editar: D'oh! Dejé una variable no utilizada en mi respuesta de golf. Lo había eliminado pero pegué la versión incorrecta.

Cole Cameron
fuente
2

PowerShell v2 +, 330 322 bytes

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

Nuevas líneas para mayor claridad:

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

(Requiere la versión 2 o posterior ya Get-Randomque no existía en PowerShell v1 ...)

Explicación:

Comience con la configuración de la $amatriz de palancas tomando el rango 1..9, y también establezca $rigual a un bloque de script que ejecutaremos más adelante (descrito a continuación con $b). La Game Overredacción se establece al $gcomienzo de un bucle infinito for(){...}. En cada iteración, configuramos nuestra salida $oy la enviamos inmediatamente (gracias a la (...)encapsulación) -joinjuntando la matriz y reemplazando cada 0una con a -. (El 0se explica a continuación). Si la salida es igual a 9 guiones, salida You win!y exit.

A continuación, establecemos nuestras tiradas de dados $bllamando a los almacenados $r(vía &) con algunos parámetros adicionales. El Get-Randomcomando con un -Maximumde 6( -Maximumestá implícito) producirá un número entero de 0 a 5, inclusive. Agregamos 1a eso para obtener un dado de seis lados, y lo agregamos a otra tirada de dado aleatoria multiplicada por la (($a|sort)[8]-ge7)cual verifica si el valor más alto que queda en las palancas es uno 7,8,9primero clasificando $ay luego tomando el último elemento y verificando si es mayor -que-o-igual-a 7. Utilizamos la conversión de texto implícita para convertir el valor booleano en 0 (Falso) o 1 (Verdadero) para la multiplicación, por lo que el "dado" adicional es die*0o die*1. Luego sacamos el resultado de la tirada del dado.

El siguiente es el Read-Hosten $lpor cuántos palancas. Tenga en cuenta que PowerShell agrega automáticamente el espacio de dos puntos :después de una Read-Hostsolicitud, por lo que al menos lo obtenemos gratis. Luego verificamos que el número de palancas que el usuario desea voltear está entre 1 y 9, de lo contrario exit.

Ahora entramos en un whilebucle. En cada iteración de este ciclo, determinamos Read-Hostqué palanca, almacenamos $iy restamos ese valor $b. Luego también restamos la palanca correspondiente en la matriz y restamos cuántas veces más para consultar al usuario.

La última línea (excepto la llave de cierre) prueba dos construcciones booleanas. El primero, solo $b, será solo $Truesi el usuario no resta correctamente todos los números de la tirada del dado (en PowerShell, cualquier número que no sea cero es Verdad). La otra condición ordena $ay toma el valor mínimo. Si restamos la misma palanca dos veces, entonces el valor mínimo será negativo (o Verdad); de lo contrario, el valor mínimo será 0(o Falsey).

Ejemplo de ejecución:

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
fuente
Excelente explicación! +1
Addison Crump