Codegolf - Помоги Мне Закрыть Коробку

  • Автор темы Юргис
  • Обновлено
  • 19, Oct 2024
  • #1

Вдохновение для этой задачи должно быть до смешного очевидным на момент публикации.

Задача

Вы должны создать программу в стиле «Закрой коробку» (не функцию, программу). Основы закрывания коробки таковы:

Игроки пытаются закрыть ящик, повернув набор рычагов с обозначениями 1–9. Они должны сделать это, щелкая рычагами. Последовательность событий каждого хода следующая:

  1. Отображается текущее положение рычагов.
    • В новой игре положение рычагов должно отображаться как
       
       
       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! 
      .
    • В игре с рычагами закрытия все рычаги закрытия отображаются как 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 . For example, on a game that has 1, 5, and 9 shut, the output would be 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 .
  2. Di(c)e (is|are) выброшено.
    • Если все рычаги 7, 8 и 9 выключены, бросается только один шестигранный кубик. В противном случае бросаются 2 шестигранных кубика.
  3. Игроку предлагается выбрать, сколько рычагов он хочет перевернуть.
    • Если игрок выбирает число >9 или <0, игра заканчивается.
    • Если игрок выбирает уже закрытый рычаг, игра заканчивается.
  4. Игрок выбирает такое количество рычагов.
    • Если сумма рычагов не равна значению брошенной кости (c)e, игра заканчивается.
  5. Если все рычаги закрыты, поздравляем, вы выиграли. В противном случае вернитесь к шагу 1.

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

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

Примеры игр

-234-678- - 123456789

#код-гольф #игра #случайный

Юргис


Рег
22 Aug, 2006

Тем
78

Постов
218

Баллов
618
  • 26, Oct 2024
  • #2

Питон 3, 348

Сэкономлено 5 байт благодаря Матиасу Эттингеру.
Сэкономлено 7 байт благодаря DSM.

Ох, это долго. Я также ненавижу то, что нет хорошего способа проводить тестовые случаи.

 
 
 
 
 
 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!
 
||answer||

С, 405 403 398 392 390 387 байт

0

без гольфа

$a

Редактировать: Ох! В моем ответе на гольф осталась неиспользованная переменная. Я удалил его, но вставил не ту версию.

 

UtteveUsefe18


Рег
20 Sep, 2011

Тем
94

Постов
195

Баллов
675
  • 26, Oct 2024
  • #3

PowerShell v2+, 330 322 байта

$True

Новые строки для ясности:

$b

(Требуется версия 2 или более поздняя, ​​поскольку $b didn't exist in PowerShell v1...)

Объяснение:

Начните с настройки $i rray of levers by taking the range Read-Host , а также установить while equal to a script block that we execute later (described below with exit ). Read-Host wording gets set to : в начале бесконечного цикла $l . Each iteration, we set our output Read-Host и немедленно вывести его (благодаря die*1 encapsulation) by die*0 собрать массив и заменить каждый 7 with a $a . ( 7,8,9 is explained below). If the output is equal to 9 hyphens, output (($a|sort)[8]-ge7) и 1 .

Далее мы устанавливаем броски кубиков на -Maximum by calling the stored 6 (с помощью -Maximum ) with some additional parameters. The Get-Random команда с помощью & of $r ( $b is implied) will produce an integer from 0 to 5, inclusive. We add exit к этому, чтобы получить шестигранный кубик, и добавьте это к другому случайному броску кубика, умноженному на You win! which checks whether the highest value left on the levers is one of 0 путем первой сортировки - and then taking the last element and checking whether it's greater-than-or-equal-to 0 . Мы используем неявное приведение типов, чтобы превратить логическое значение либо в 0 (False), либо в 1 (True) для умножения, поэтому дополнительный «кубик» либо -join or (...) . Затем мы выводим результат броска кубика.

Далее идет $o into for(){...} на сколько рычагов. Обратите внимание, что PowerShell автоматически добавляет пространство толстой кишки $g after a Game Over подскажите, так что мы получим это хотя бы бесплатно. Затем мы проверяем, что количество рычагов, которые пользователь хочет перевернуть, составляет от 1 до 9, иначе $b .

Теперь мы вводим $r loop. Each iteration of this loop, we 1..9 какой рычаг, сохраните это в $a , and subtract that value from Get-Random . Затем мы также вычитаем соответствующий рычаг из массива и вычитаем количество дополнительных запросов к пользователю.

Последняя строка (за исключением закрывающей скобки) проверяет две логические конструкции. Первый, просто $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} } , will only be $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}} если пользователь неправильно вычел все числа из броска кубика (в PowerShell любое ненулевое число является истиной). Другое условие сортирует /* 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!"); } and takes the minimal value. If we subtracted the same lever twice, then the minimal value will be negative (or Truthy), otherwise the minimal value will be #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!");} (или Фэлси).

Пример запуска:

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

Juras


Рег
22 Aug, 2006

Тем
79

Постов
207

Баллов
602
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно