Kutuyu Kapatmama Yardım Et


12

Bu meydan okuma için ilham, gönderme sırasında gülünç bir şekilde açık olmalıdır.

Görev

Kutuyu Kapat tarzı bir program oluşturmanız gerekir (işlev değil, program). Kutuyu kapatma temelleri:

Oyuncular, 1-9 etiketli bir kol setini çevirerek kutuyu kapatmaya çalışır. Bunu kolları çevirerek yapmak zorundalar. Her dönüşün olay sırası aşağıdaki gibidir:

  1. Kolların mevcut konumu gösterilir.
    • Yeni bir oyunda, kolların konumu olarak gösterilmelidir 123456789.
    • Kapatma kolları olan bir oyunda, tüm kapama kolları olarak görüntülenir -. Örneğin, 1, 5 ve 9 kapalı olan bir oyunda, çıktı olur -234-678-.
  2. Di (c) e (is |) yuvarlanır.
    • 7, 8 ve 9 kollarının hepsi kapalıysa, sadece altı yüzlü bir kalıp atılır. Aksi takdirde, altı adet altı yüzlü zar atılır.
  3. Oyuncudan kaç tane kolu çevirmek istediklerini seçmesi istenir.
    • Oyuncu> 9 veya <0 sayı seçerse, oyun sona erer.
    • Oyuncu zaten kapalı bir kolu seçerse, oyun sona erer.
  4. Oyuncu birçok kolu seçer.
    • Kolların toplamı atılan di (c) e değerine eşit değilse, oyun sona erer.
  5. Tüm kollar kapalıysa, tebrikler, kazanırsınız. Aksi takdirde, 1. adıma geri dönün.

Program Kuralları

  • Her turda, kolların mevcut konumlarını çıkarmalısınız.
  • Rulonun değerini cümle ile vermelisiniz You rolled:(boşluğu not edin).
  • Kol sayısının cümle ile değişmesini istemeniz (ve beklemeniz) gerekir ( How many levers to flip:boşluğu not edin).
  • İfadeyle belirtilen oyuncu kadar komut istemi (ve beklemeniz) gerekir ( Which lever to flip:boşluğu not edin).
  • Belirtilen kolları çevirmelisiniz.
  • Herhangi bir noktada oyun biterse çıkış yapmalısınız Game Over.
  • Oynatıcı, kolları açık olmadan bir dönüşü bitirirse, You win!

Örnek Oyunlar

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!

Ah. Listemde Shut the Box'ı içeren bir meydan okuma oluşturdum. Güzel!
mbomb007

Yanıtlar:


3

Python 3, 348

Mathias Ettinger sayesinde 5 bayt tasarruf etti.
DSM sayesinde 7 bayt tasarruf etti.

Ooof, bu uzun bir tane. Ayrıca test senaryoları yapmanın iyi bir yolu olmadığından nefret ediyorum.

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 bayt

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

Düzenleme: D'oh! Golf cevabımda kullanılmayan bir değişken bıraktı. Kaldırdım ama yanlış sürümü yapıştırdım.


2

PowerShell V2 +, 330 322 bayt

$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çıklık için yeni satırlar:

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

( Get-RandomPowerShell v1'de bulunmadığından beri sürüm 2 veya daha sonrasını talep eder ...)

Açıklama:

$aAralık alarak aralıkların ayarlanmasıyla başlayın 1..9ve $rdaha sonra yürüttüğümüz bir komut dosyası bloğuna eşit olarak ayarlayın (aşağıda açıklanmıştır $b). Game OverÜslup olarak ayarlanmış olur $gsonsuz bir döngüye başında for(){...}. Her yinelemede, çıkışımızı ayarlıyoruz ve diziyi bir araya getirerek ve her birini a ile değiştirerek $ohemen ( (...)kapsülleme sayesinde) çıktı veriyoruz . ( Aşağıda açıklanmıştır). Çıktı 9 tireye eşitse, çıktı ve .-join0-0You win!exit

Ardından, $bsaklanan $r(üzerinden &) bazı ek parametrelerle çağırarak zar atışlarımızı ayarladık . Get-RandomBir komut -Maximumbir 6( -Maximumima) dahil, 0 ila 5 arasında bir tam sayı üretir. Bunu 1altı taraflı bir kalıp elde etmek için ekliyoruz ve bunu (($a|sort)[8]-ge7)kollarda kalan en yüksek değerin 7,8,9ilk sıralama $ave sonra son elemanı alarak ve daha büyük olup olmadığını kontrol ederek bir başka rastgele kalıp rulosuna çarpıyoruz. -şine veya eşittir 7. Boolean değerini çarpma için 0 (False) veya 1 (True) olarak çevirmek için örtük typecasting kullanıyoruz, bu nedenle ek "die" ya die*0da die*1. Daha sonra kalıp rulosunun sonucunu çıkarırız.

Sonra kaç kaldıraç için Read-Hostiçine $l. PowerShell'in bir komut isteminden sonra otomatik olarak iki nokta üst üste eklediğini unutmayın , bu yüzden en azından ücretsiz olarak alırız. Daha sonra, kullanıcının çevirmek istediği kol sayısının 1 ila 9 arasında olduğunu kontrol ederiz .:Read-Hostexit

Şimdi bir whiledöngüye giriyoruz . Bu döngünün her yinelemesinde, bunu Read-Hostkaldıracak, depolayacak $ive bu değeri çıkaracağız $b. Daha sonra dizideki ilgili kolu da çıkarırız ve kullanıcıyı sorgulamak için kaç kez daha çıkarırız.

Son satır (kapanış ayracı hariç) iki Boole yapısını test eder. Birincisi, sadece kullanıcı tüm sayıları kalıp rulosundan düzgün bir şekilde çıkarmamışsa $bolacaktır $True(PowerShell'de, sıfır olmayan herhangi bir sayı Gerçek'dir). Diğer koşul $aminimum değeri sıralar ve alır. Aynı kolu iki kez çıkarırsak, minimum değer negatif (veya Gerçek) olacaktır, aksi takdirde minimum değer 0(veya Falsey) olacaktır.

Örnek Çalışma:

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!

Mükemmel açıklama! +1
Addison Crump
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.