Alice dan Bob bertengkar

24
  • Alice (A) dan Bob (B) memutuskan untuk bertempur.
  • Setiap kombatan memiliki 10 kesehatan.
  • Mereka bergiliran menggulung dadu 6 sisi untuk kerusakan.
  • Kerusakan itu dihapus dari kesehatan lawan mereka.
  • Pada akhirnya Alice atau Bob, akan mengalahkan musuh mereka.

Tunjukkan padaku bagaimana pertempuran berlangsung. Mengeluarkan kode-kode ini untuk tindakan yang telah terjadi.

Menyerang

B a A    
^ Combatant
  ^ Action (attack)
    ^ Target

Gulungan

B r 4
^ Combatant
  ^ Action (roll)
    ^ Value

Perubahan kesehatan

A h 6
^ Combatant
  ^ Attribute (health)
    ^ Value   

Menang

A w 
^ Combatant
  ^ Action (win)

Contoh output:

A a B
A r 4
B h 6
B a A
B r 6
A h 4
A a B
A r 6
B h 0        
A w

Berikut aturannya:

  • Tulis dalam bahasa apa pun.
  • Gulungan tunggal dadu harus memiliki peluang yang sama untuk menghasilkan salah satu dari angka 1, 2, 3, 4, 5, atau 6.
  • Alice selalu dimulai (Bob sopan, dengan cara kuno).
  • Keluarkan tindakan untuk setiap belokan.
  • Anda harus melaporkan serangan, gulungan, kerusakan, dan menangkan tindakan.
  • Kombatan adalah huruf besar, tindakan adalah huruf kecil.
  • Itu tidak harus secara konsisten menghasilkan hasil yang sama.
  • Harus ada setidaknya satu karakter spasi putih antara kombatan output, aksi dan nilai.
  • Tindakan menang terjadi ketika lawan memiliki kesehatan nol atau kurang.
  • Semua bagian dari suatu tindakan harus berada pada baris yang sama.
  • Seharusnya ada satu tindakan per baris.
  • Bytes paling sedikit menang.

Miliki itu!

AJFaraday
sumber
9
Nama Alice (A) dan Bob (B) memberi saya kilas balik ke kelas keamanan jaringan. Aktor Alice (A) mengirimkan paket ke Bob (B) dengan kunci ... dll ...
Magic Octopus Urn
21
@ MagicOctopusUrn itu mereka. Mereka biasanya berusaha berkomunikasi. Sayangnya, konflik sering terjadi ketika komunikasi terputus.
AJFaraday
7
Saya merindukan hari-hari ketika kami mencoba mencari cara untuk menyembunyikan rahasia kami dari Mallory ... itu adalah masa-masa yang lebih sederhana ...
Bob
4
@ Bob Mallory adalah sesuatu yang mengganggu, sungguh. Ini Hawa yang harus diwaspadai.
AJFaraday
3
@ msh210 yah, detail penting dalam golf kode adalah bahwa semua orang mengambil tantangan yang sama, tapi inilah logikanya: - jika Anda bermain Dungeons and Dragons, Anda akan mengatakan "Aku akan menendang goblin", maka Anda ' d roll untuk efektivitas, lalu terapkan hasil roll. Gulungan tidak ada artinya jika tidak ada yang tahu untuk apa Anda bergulir.
AJFaraday

Jawaban:

5

05AB1E , 49 byte

"BaABr0Aha"S3ô»D„AB‡[6LΩ©Tǝ¤H®-©16ǝ=®0‹#s]н…ÿ w?

Cobalah online!

Penjelasan

"BaABr0Aha"                                        # push the initial state of B
           S                                       # split to list of characters
            3ô                                     # divide into 3 parts
              »                                    # join each part on space and all on nl
               D„AB‡                              # make a copy with A and B inverted
                     [                             # start a loop
                      6LΩ©                         # pick a random number in [1 ... 6]
                          Tǝ                       # insert at position 10 of the string
                            ¤H                     # get the last char of the string and
                                                   # convert from hex
                              ®-©                  # subtract the random number
                                 16ǝ=              # insert at position 16 and print
                                     ®0‹#          # if the hp is less than 0, break
                                         s         # swap the other string to the stack top
                                          ]        # end loop
                                           н…ÿ w?  # print the winner
Emigna
sumber
13

Python 3 , 131 byte

x,y="AB"
from random import*
X=Y=10
p=print
while X>0:p(x,"a",y);d=randint(1,6);p(x,"r",d);Y-=d;p(y,"h",Y);x,y,X,Y=y,x,Y,X
p(y,"w")

Cobalah online!

-8 Bytes berkat officialaimm
-2 Bytes berkat ChooJeremy

HyperNeutrino
sumber
5
predefining p=printakan menghemat sekitar 8 byte.
officialaimm
Karena Anda selalu menang pada titik ini (Dan hanya serangan X dalam loop, yang kemudian ditukar ke Y), Anda tidak perlu memeriksa apakah Anda telah kalah. - ChooJeremy - Dari Ulasan
NoOneIsHere
@NoOneIsHere terima kasih telah menyampaikan pesan kepada saya: D
HyperNeutrino
randint(1,6)dapat diganti dengan id(X+Y)//3%6+1, meskipun distribusinya tidak cukup seragam.
Vincent
@Vincent Saya tidak melihat gunanya menekuk aturan jika itu bahkan tidak membantu membuatnya lebih pendek ...
HyperNeutrino
7

C (gcc) , 146 141 byte

f(A,B,r,t,a,b){for(A=B=10;r=1+clock()%6,A*B>0;t=!t)printf("%c a %c\n%c r %u\n%c h %i\n",a=65+t,b=66-t,a,r,b,t?A-=r:(B-=r));printf("%c w",a);}

Cobalah online!

De-golf:

f(A,B,r,t,a,b){
    for(A=B=10; //Initialize HP
        r=1+clock()%6, // Get the number of processor cycles the program has consumed. This is relatively random, so I call it good enough.
        A*B>0;t=!t) // Flip t for change of turns
        printf("%c a %c\n%c r %u\n%c h %i\n", // Print the turn
            a=65+t,b=65+!t,a,r,b, // 65 is ASCII for 'A', 66 for 'B'
            t?A-=r:(B-=r)); // Deduct the damage.
    printf("%c w",a); // Print the winner
}

sumber
2
Bisakah Anda menyimpan byte dengan menggunakan a=65+t,b=66-t?
moopet
A*B>0akan menghemat beberapa byte.
Olivier Grégoire
A*Bakan menghemat lebih banyak, tapi aku agak terburu-buru atm. Saya akan memperbarui di malam hari
Menemukan bug di dadu seq {6,4,3,1,5}. b menang dengan kesehatan -4. Lihat TIO I mengubah kalkulator dadu Anda untuk mendemokan bug ini.
GPS
@ GPS Terima kasih, saya akan menambalnya sekarang.
7

Python 3 , 127 byte

Ini merupakan peningkatan pada jawaban @HyperNeutrino yang tidak cocok dengan komentar. Lihat penjelasan di bawah ini.

x,y="AB"
s=id(0)
X=Y=10
p=print
while X>0:p(x,"a",y);s=s**7%~-2**67;d=s%6+1;p(x,"r",d);Y-=d;p(y,"h",Y);x,y,X,Y=y,x,Y,X
p(y,"w")

Cobalah online!


Sebuah pencarian epik untuk roll dadu python yang lebih pendek

TL; DR: Dimungkinkan untuk memotong 4 byte dari roll dadu python standar dengan menggunakan enkripsi RSA.

Saya ingin melihat apakah roll dadu python standar ( 32 byte ) dapat dipersingkat sedikit:

from random import*;randint(1,6)

Secara khusus, id(x)cukup nyaman untuk membawa beberapa nilai non-deterministik ke dalam program. Ide saya kemudian adalah untuk hash nilai ini untuk menciptakan keacakan yang sebenarnya. Saya mencoba beberapa pendekatan, dan salah satunya terbayar: enkripsi RSA .

Enkripsi RSA, karena kesederhanaan, hanya membutuhkan beberapa byte: m**e%n. Nilai acak berikutnya kemudian dapat dibuat dengan mengenkripsi yang sebelumnya. Dengan asumsi(e,n) kunci tersedia, gulungan dadu dapat ditulis dengan 22 byte :

s=id(0);s=s**e%n;s%6+1

Itu berarti kita memiliki sekitar 10 byte untuk mendefinisikan kunci RSA yang valid. Di sini saya beruntung. Selama percobaan saya, saya mulai menggunakan Mersenne prime M67 hanya untuk kemudian menyadari bahwa Mersenne membuat kesalahan termasuk M67 dalam daftar. Ternyata menjadi produk p=193707721dan q=761838257287. Saya telah menemukan modulus saya:

n=~-2**67

Sekarang, eksponen dan orang yang pantas menerima Charmichael(p-1)*(q-1) harus menjadi koprime. Untungnya lagi, bilangan prima pertama yang tidak membagi jumlah n hanya panjang satu digit: 7. Rol dadu kemudian dapat ditulis menggunakan 28 byte (4 byte kurang dari pendekatan standar):

s=id(0);s=s**7%~-2**67;s%6+1

Satu hal yang baik dengan M67 adalah bahwa nilai acak yang dihasilkan memiliki 66 bit, yang lebih dari RNG 64 bit yang biasa. Juga, penggunaan RSA memungkinkan untuk kembali ke waktu dengan mendekripsi nilai saat ini beberapa kali. Berikut adalah kunci enkripsi dan dekripsi:

Encryption: (7,                    147573952589676412927)
Decryption: (42163986236469842263, 147573952589676412927)

Saya jelas bukan ahli dalam statistik atau kriptografi, jadi saya tidak bisa memastikan apakah RNG ini memeriksa kriteria untuk "keacakan yang baik". Saya memang menulis patokan kecil yang membandingkan standar deviasi kemunculan gulungan dadu 1 hingga 6 menggunakan RNG yang berbeda. Sepertinya solusi yang diusulkan berfungsi seperti yang lainnya.

Vincent
sumber
3
Pekerjaan yang mengesankan! :)
HyperNeutrino
4

JavaScript (ES6), 122 byte

f=(h=[10,10,p=0])=>`${x='AB'[p]} a ${y='BA'[p]}
${x} r ${d=Math.random()*6+1|0}
${y} h ${H=h[p^=1]-=d}
${H<1?x+' w':f(h)}`

Cobalah online!

Arnauld
sumber
4

Java (JDK 10) , 180 byte

v->{var r="";int p=0,H[]={10,10},h=0;for(;H[0]*H[1]>0;)r+=r.format("%3$c a %4$c%n%3$c r %d%n%4$c h %d%n",h+=Math.random()*6-h+1,H[p]-=h,p+65,(p^=1)+65);return r+(char)(66-p)+" w";}

Cobalah online!

Kredit

Olivier Grégoire
sumber
1
Java 10 sudah var? o.Ô Saya benar-benar perlu untuk menyelidiki beberapa spesifikasi baru segera .. Bagaimanapun, Anda dapat golf 4 byte dengan mengubah char-array ke int-array:v->{var r="";int P[]={65,66},p=0,H[]={10,10},h=0;for(;H[0]*H[1]>0;)r+=r.format("%3$c a %4$c%n%3$c r %d%n%4$c h %d%n",h+=Math.random()*6-h+1,H[p]-=h,P[p],P[p^=1]);return r+=P[p^1]+" w";}
Kevin Cruijssen
1
@KevinCruijssen Yap, Java 10 memiliki var. Tidak perlu membaca lebih lanjut, itu pada dasarnya satu-satunya perubahan yang dapat digunakan untuk pegolf kami. Dan tidak, saya tidak bisa melakukan apa yang Anda sarankan: periksa baris terakhir hasilnya: itu menjadi 65 wbukan A w. Itu sebabnya saya mengekstraknya dari int ...pernyataan: untuk bermain golf beberapa byte ;-)
Olivier Grégoire
1
@KevinCruijssen Saya memenuhi beberapa contoh di sini: codegolf.stackexchange.com/a/159922/16236
Olivier Grégoire
4

Perl 5 , 93 88 87 byte

$A=$B=10;$_=B;${$_^=v3}-=$%=1+rand 6,say"$_ a $'
$_ r $%
$' h $$_"until//>$$_;say"$_ w"

Cobalah online!

Ton Hospel
sumber
3

Ruby , 122 120 96 92 91 byte

f=->x=?A,y=?B,m=10,n=m{p [x,?a,y],[x,?r,r=1+rand(6)],[y,?h,t=n-r]
t<1?p([x,?w]):f[y,x,t,m]}

Disimpan 1 byte berkat Asone Tuhid .

Cobalah online!

Cristian Lupascu
sumber
1
Sepertinya saya bahkan tidak tahu lagi bagaimana cara Ruby;)
AJFaraday
Saya khawatir alternatif Anda tidak bekerja, "Semua bagian dari suatu tindakan harus berada di jalur yang sama." Meskipun, mungkinkah membuat optimasi yang sama dengan karakter tab?
AJFaraday
@AJFaraday Apakah bisa diterima untuk jalur output dalam format ["A", "a", "B"]? Jika demikian, saya punya ini solusi 96-byte.
Cristian Lupascu
Jika mereka menghasilkan satu per baris. Itu harus dilakukan.
AJFaraday
-1 byte jika Anda ganti ?(p [x,?w]):dengan?p([x,?w]):
Asone Tuhid
3

Java 8, 230 byte

v->{for(int h=104,a=h,x=0,y=1,A=10,B=A,r=0,t=0,T;a<119;)System.out.printf("%c %3$c %c%n",(x=a>h|A*B<1?x^1:x)+65,y=(a<98?t=r+=Math.random()*6-r+1:a>h?(T=x<1?A-=t:(B-=t))<0?0:T:A*B<1?-16:(x^1)+17)+48,a=a<98?114:a>h?104:A*B<1?119:97);}

Catatan: sudah ada jawaban Java yang jauh lebih pendek, jadi pastikan untuk membatalkannya ! Saya menggunakan pendekatan yang sama sekali berbeda, jadi saya pikir itu layak untuk diposkan juga.

Penjelasan:

Cobalah online.

v->{                     // Method with empty unused parameter and no return-type
  for(int h=104,         //  Temp integer with unicode for 'h' to save bytes
          a=h,           //  Second part (Action)
          x=0,           //  First part
          y=1,           //  Third part
          A=10,          //  Score player A, starting at 10
          B=A,           //  Score player B, starting at 10
          r=0,           //  Random dice-roll
          t=0,           //  Previous dice-roll
          T;             //  Temp integer
      a<119;)            //  Loop until there is a winner
     System.out.printf(  //   Print
      "%c %3$c %c,%n",   //    The three parts with spaces, and a new-line
      (x=                //    First part:
         a>h             //     If the previous action is 'r',
         |A*B<1?         //     or there is a winner:
           x^1           //      Change A→B or B→A
         :               //     Else:
          x)             //      A/B remains unchanged
       +65,              //     Add 65 to convert 0/1 to 65/66 (unicode values of A/B)
      (y=                //    Third part:
         (a<98?          //     If the previous action was 'a'
           t=r+=Math.random()*6-r+1
                         //      Roll the dice, and save it in `t`
          :a>h?          //     Else-if the previous action was 'r':
           (T=x<1?       //      If the first part changed to player A:
            A-=t         //       Subtract the previous dice-roll from A
           :             //      Else:
            (B-=t))      //       Subtract the previous dice-roll from B
           <0?           //      If this score is below 0:
            0            //       Use 0
           :             //      Else:
            T            //       Use this score
         :               //     Else (the previous action was 'h'):
          A*B<1?         //      Is there a winner:
           -16           //       Change the third part to a space
          :              //      Else:
           (x^1)+17)     //       Change the third part to the other player
       +48,              //     Add 48 to convert it to unicode
       a=                //    Second part:
         a<98?           //     If the previous action was 'a': 
          114            //      Change it to 'r'
         :a>h?           //     Else-if the previous action was 'r':
          h              //      Change it to 'h'
         :               //     Else (the previous action was 'h'):
          A*B<1?         //      If either score is 0:
           119           //       Use 'w'
          :              //      Else:
           97);}         //       Use 'a'
Kevin Cruijssen
sumber
3

C (gcc) , 142 byte

#define R(c,t)r=rand()%6+1,c&&printf(#c" a "#t"\n"#c" r %d\n"#t" h %d\n",r,t-=t<r?t:r),t||puts(#c" w")
f(A,B,r){for(A=B=10;A*B;R(B,A))R(A,B);}

Cobalah online!

nwellnhof
sumber
Hanya satu masalah, ini tidak berakhir dengan kemenangan.
AJFaraday
@AJFaraday Oh ya, sudah diperbaiki.
nwellnhof
2

Batch, 174 byte

@set/aA=B=10
@set c=A
@set d=B
:g
@set/ar=%random%%%6+1,h=%d%-=r
@echo %c% a %d%
@echo %c% r %r%
@echo %d% h %h%
@if %h% gtr 0 set c=%d%&set d=%c%&goto g
@echo %c% w

Penjelasan: %referensi variabel diganti pada waktu parse. Ini memiliki dua manfaat bermanfaat:

  • %d%-=rkurangi rdari variabel yang dinamai oleh d(yaitu referensi tidak langsung)
  • set c=%d%&set d=%c% hanyalah swap lurus.
Neil
sumber
2

PHP 7.1: 159 byte

<?php $A=$B=10;$t='AB';while($A>0&&$B>0){$a=$t[0];$b=$t[1];$d=rand(1,6);$$b-=$d;echo"$a a $b\n$a r $d\n$b h {$$b}\n";$t=strrev($t);}echo($A>0?'A':'B')." w\n";

Jalankan di browser di sini!

PHP 5.6: 156 byte

<?php $A=$B=10;$t='AB';while($A>0&&$B>0){list($a,$b)=$t;$d=rand(1,6);$$b-=$d;echo"$a a $b\n$a r $d\n$b h {$$b}\n";$t=strrev($t);}echo($A>0?'A':'B')." w\n";

Jalankan di browser di sini!

Inilah yang tampak seperti solusi PHP 5.6 dengan pemformatan dan komentar:

<?php
// Initialize both HP counters
$A = $B = 10;

// Set the turn order as a string (which 5.6 allows to be unpacked into a list)
$t = 'AB';

// Run this loop as long as both players have HP
while ($A > 0 && $B > 0) {
    // Unpack the turn string into $a and $b variables; on the first run, $a = 'A'
    // and $b = 'B'. This is no longer possible in PHP 7.0, so the PHP 7.0
    // solution needed to use an array instead.
    list($a, $b) = $t;

    // Set damage to a random number between 1 and 6
    $d = rand(1, 6);

    // Subtract the damage from the referenced value $b. On the first turn, this
    // is 'B', so this ends up subtracting $d from $B. Next turn, $b will be 'A',
    // so it'll subtract $d from $A
    $$b -= $d;

    // Echo the string (interpolated values)
    echo "$a a $b\n$a r $d\n$b h {$$b}\n";

    // Reverse the turn order string ('AB' becomes 'BA', which will affect the
    // call to list in the first line of the while-loop)
    $t = strrev($t);
}

// Someone's run out of HP; figure out whom by figuring out who still has HP
echo ($A > 0 ? 'A' : 'B') . " w\n";
Chris Forrence
sumber
1

Bash, 178 byte

A=10 B=10 e=echo
a(){ $e $1 a $2;d=$((RANDOM%6+1));$e $1 r $d;eval $2=$((${!2}-$d));$e $2 h ${!2};[ ${!2} -gt 0 ];}
while a A B && a B A;do cd;done;[ $A -gt 0 ]&&$e A w||$e B w
crystalgecko
sumber
1

F #, 238 235 byte

Saya pikir saya baik-baik saja, tetapi Anda semua jauh melebihi saya!

let p=printfn
let mutable A=10
let mutable B=A
let x h a d=
 p"%s a %s"a d
 let i=(new System.Random()).Next(1,7)
 let j=h-i
 p"%s r %i"a i
 p"%s h %i"d j
 if j<=0 then p"%s w"a
 j
while A*B>0 do
 B<-x B"A""B"
 if B>0 then A<-x A"B""A"

Cobalah online!

Terima kasih kepada Rogem atas sarannya yang brilian untuk menggunakan A * B> 0 daripada A> 0 && B> 0 (lepas landas 3 byte).

Terima kasih juga kepada officialaimm, yang petunjuk tentang mendefinisikan printf dalam jawaban Python membantu saya mencukur beberapa byte juga.

Ciaran_McCarthy
sumber
1
Sebuah saran yang saya dapatkan dari @OlivierGregoire: A*B>0akan menyelamatkan Anda lebih banyak.
Itu benar-benar brilian. Suka. Terima kasih banyak!
Ciaran_McCarthy
1

Haskell , 204 byte

Upaya saya dengan Haskell, sayangnya saya tidak bisa membuatnya lebih kompetitif

import System.Random
main=getStdGen>>= \g->putStr$q(randomRs(1,6)g)10(10::Int)"A ""B "
(!)=(++)
l="\n"
q(x:z)a b p o=p!"a "!o!l!p!"r "!show x!l!o!"h "!show n!l!if n<1then p!"w"else q z n a o p where n=b-x

Cobalah online!

Penjelasan:

import System.Random  --import random module
main=                        --main function, program entry point
 getStdGen                   -- get the global random number generator
   >>= \g->                  --using the random generator g
       putStr $ q            --print the result of function q, passing in ..
          (randomRs (1,6) g) --an infinite list of random numbers, 1 to 6 generated by g
           10 (10::Int)      --the starting health of both players, 
                             --type annotation sadly seems to be required
           "A " "B "         --The names of the players,
                             --with an extra space for formatting
(!)=(++) --define the operator ! for list (String) concatenation, 
         -- we do this a lot so we save a bit by having a one byte operator
l="\n"   -- define l as the newline character

q      --define function q                         
 (x:z) --our list of random numbers, split into the next number (x) and the rest (z)
 a     -- the health of the active player
 b     -- the health of the player getting attacked
 p     -- the name of the active player
 o     -- the name of the player getting attacked
=
  p!"a "!o!l --create the attack action string with a newline
 !p!"r "!show x!l -- append the roll action
 !o!"h "!show n!l -- append the health remaining
 !           -- append the result of the following if
  if n<1     -- if the player being attacked has been defeated
  then p!"w" -- append the win string for the active player
  else q z n a o p  --otherwise append the result of calling q again with 
                    --rest of the random numbers, and the active players swapped
  where n=b-x -- define the attacked player's new health n
              -- their current health b - the random roll x
puhlen
sumber
Anda bisa melihat Tips kami untuk bermain golf di Haskell . Misalnya where m=b-xdapat dimasukkan ke penjaga: |m<-b-x=.
Laikoni
Anda dapat kehilangan lambda dan satu set tanda kurung dengan menata ulang beberapa parameter: main=putStr=<<q"A "10"B "10.randomRs(1,6::Int)<$>getStdGen. Anda juga dapat menggunakan daftar dan menggabungkannya untuk menghilangkan mendefinisikan ulang (++). Yang terakhir di mana tampaknya tidak bermanfaat hanya dengan menggunakan di b-xmana - mana.
Angs
1

Julia 0,6 , 175 byte

p=println()
f(l="AB",h=[10,10],a=1)=(while min(h...)>0;d=3-a;p(l[a]," a ",l[d]);r=rand(1:6);h[d]-=r;p(l[a]," r ",r);p(l[d]," h ",max(h[d],0));a=d;end;p(l[findmax(h)[2]]," w"))

Cobalah online!

Versi panjang dan tidak diserami:

function status(player, health)
    println("$player h $(max(0,health))")
end

function roll(player)
    x = rand(1:6)
    println("$player r $x")
    x
end

function play()
    players = ["A","B"]
    healths = [10, 10]
    attacker = 1

    while min(healths...) > 0
        println("$(players[attacker]) a $(players[3-attacker])")
        healths[3-attacker]-=roll(players[attacker])
        status(players[3-attacker], healths[3-attacker])

        attacker = 3 - attacker
    end

    winner = findmax(healths)[2]
    println("$(players[winner]) w")
end
niczky12
sumber
Tampaknya tidak ada output apa pun di tautan TIO Anda.
AJFaraday
Ya saya tidak tahu mengapa tio tidak menyukainya. Ini bekerja dengan baik pada mesin saya. Saya akan memeriksanya jika saya punya waktu.
niczky12
1

VBA, 222 185 179 Bytes

Solusi rekursif ini melibatkan 3 subs

  1. g adalah game start yang memulai giliran pertama
  2. t dipanggil untuk setiap belokan . Ini menggunakan rekursi.
  3. p lebih pendek dari Debug.Cetak bila digunakan lebih dari 3 kali (hanya 4 dalam solusi ini) Sunting: Sekarang saya tahu bahwa itu Debug.?adalah alternatif yang dapat diterima Debug.Print, Debug.?xlebih pendek daripada memanggil Sub untuk dicetak.
Sub g()
t "A",10,"B",10
End Sub
Sub t(i,j,x,h)
d=Int(Rnd()*6)+1
Debug.?i &" a "&x
Debug.?i &" r "&d
h=h-d
If h<1Then
Debug.?i &" w"
Else
Debug.?x &" h "&h
t x,h,i,j
End If
End Sub

Ini adalah tantangan yang menyenangkan. Jika Anda mengetahui juru bahasa online seperti TIO untuk VB6 / VBScript / VBA, silakan tinggalkan komentar. Kemudian saya dapat memposting tautan ke solusi yang berfungsi.

Jika Anda ingin menguji kode ini dan menginstal Microsoft Excel, Word, Access, atau Outlook (hanya Windows), tekan Alt + F11 untuk membuka VBA IDE. Masukkan modul kode baru (Alt + I, M) dan kosongkan Option Explicit. Kemudian rekatkan kode dan tekan F5 untuk menjalankannya. Hasilnya akan muncul di Jendela Segera (tekan Ctrl + G jika Anda tidak melihatnya).

Sunting 1: Menghapus spasi putih yang editor VBA akan secara otomatis menambahkan kembali. Dikurangi oleh 37 byte
Edit 2: Dihapus Sub p () * untuk menyimpan 6 byte setelah belajar Debug.?adalah alternatif yang dapat diterima Debug.Print. Memanggil Sub untuk menangani Debug.?hanya menghemat byte setelah lebih dari enam panggilan.

Ben
sumber