Допоможи мені закрити коробку


12

Натхнення для цього виклику повинно бути смішно очевидним під час публікації.

Завдання

Потрібно створити програму "Стик коробки" (не функцію, а програму). Основами закриття коробки є:

Гравці намагаються закрити коробку, повернувши набір важелів із позначкою 1-9. Вони повинні це зробити, перевертаючи важелі. Послідовність подій кожного повороту така:

  1. Показано поточне положення важелів.
    • У новій грі положення важелів має відображатися як 123456789.
    • У грі із закритими важелями всі закриті важелі відображаються як -. Наприклад, для гри, яка має 1, 5 та 9 закритих, вихід буде -234-678-.
  2. Ді (c) e (є | є) згорнуті.
    • Якщо важелі 7, 8 і 9 зняті, кидається лише одна шестигранна штамп. Інакше кидають 2 шестигранні кістки.
  3. Гравець запропонує вибрати, скільки важелів вони хочуть перевернути.
    • Якщо гравець вибере число> 9 або <0, гра закінчується.
    • Якщо гравець вибере вже закритий важіль, гра закінчується.
  4. Гравець вибирає стільки важелів.
    • Якщо сума важелів не дорівнює величині кинутого di (c) e, гра закінчується.
  5. Якщо всі важелі закриті, вітаю, ви виграєте. В іншому випадку поверніться до кроку 1.

Правила програми

  • На кожному ході слід виводити поточні положення важелів.
  • Ви повинні вивести значення рулону фразою You rolled:(відзначте пробіл).
  • Потрібно запропонувати (і зачекати), щоб кількість важелів переключилася фразою How many levers to flip:(відзначте пробіл).
  • Ви повинні підказати (і чекати) стільки важелів, скільки гравця вказано фразою Which lever to flip:(відмітьте пробіл).
  • Ви повинні перевернути вказані важелі.
  • Якщо в будь-який момент гра закінчується, ви повинні вийти Game Over.
  • Якщо гравець закінчує поворот, не відкриваючи важелів, ви повинні вийти You win!

Приклад Ігор

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!

Ой. Я мав це у своєму списку, щоб створити виклик із участю Shut the Box. Приємно!
mbomb007

Відповіді:


3

Пітон 3, 348

Збережено 5 байт завдяки Mathias Ettinger.
Збережено 7 байт завдяки DSM.

На жаль, це довгий. Я також ненавиджу, що не існує хорошого способу робити тестові справи.

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 байт

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

Безумовно

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

Редагувати: D'oh! Залишив невикористовувану змінну у моїй відповіді на гольф. Я її видалив, але вставив неправильну версію.


2

PowerShell v2 +, 330 322 байт

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

Нові рядки для наочності:

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

(Потрібна версія 2 або новіша версія, оскільки Get-Randomвона не існувала в PowerShell v1 ...)

Пояснення:

Почніть з встановлення $aмасиву важелів, взявши діапазон 1..9, а також встановіть $rрівний блоку скриптів, який ми виконуємо пізніше (описано нижче з $b). Game OverФормулювання отримує значення $gна початку нескінченного циклу for(){...}. Кожну ітерацію ми встановлюємо наш вихід $oі негайно виводимо його (завдяки (...)інкапсуляції), -joinоб'єднуючи масив і замінюючи кожен 0на a -. ( 0Роз'яснено нижче). Якщо вихід дорівнює 9 дефісів, виведіть You win!і exit.

Далі ми встановлюємо рулетики з кістки $b, викликаючи збережені $r(через &) деякі додаткові параметри. Get-RandomКоманда з -Maximumз 6( -Maximumмаються на увазі) буде виробляти ціле число від 0 до 5 включно. Ми додаємо 1до цього, щоб отримати шестигранну матрицю, і додамо її до іншого випадкового штампу, помноженого на (($a|sort)[8]-ge7)який перевіряє, чи є найвище значення, залишене на важелях, 7,8,9на перше сортування, $aа потім взяття останнього елемента та перевірку, чи більше воно -так-або-рівний-до 7. Ми використовуємо неявну клавішну передачу, щоб перетворити булеве значення на 0 (хибне) або 1 (істинне) для множення, тож додатковим "die" є die*0або die*1. Потім виводимо результат рулону штампу.

Далі йде Read-Hostна $lте, скільки важелів. Зауважте, що PowerShell автоматично додає пробіл товстої кишки :після Read-Hostпідказки, тому ми отримуємо це безкоштовно принаймні. Потім ми перевіряємо, що кількість важелів, які користувач бажає перевернути, становить від 1 до 9, інакше exit.

Тепер вводимо whileцикл. Кожну ітерацію цієї петлі, яку ми Read-Hostзапускаємо, зберігаємо в неї $iта віднімаємо це значення $b. Потім ми також віднімаємо відповідний важіль у масиві і віднімаємо скільки додаткових разів запитувати користувача.

Останній рядок (за винятком закриваючої дужки) тестує дві булеві конструкції. Перше, справедливе $b, буде лише в тому $Trueвипадку, якщо користувач не відніс належним чином всі числа з рулону матриці (в PowerShell будь-яке ненульове число - Truthy). Інша умова сортує $aта приймає мінімальне значення. Якщо ми відняли один і той же важіль двічі, то мінімальне значення буде від'ємним (або Truthy), інакше мінімальне значення буде 0(або Falsey).

Приклад виконання:

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!

Відмінне пояснення! +1
Addison Crump
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.