Ayo main boardgame!

11

pengantar

Boardgames adalah permainan klasik antara anak-anak, tetapi ada beberapa anak yang merasa bosan memainkan boardgame langkah demi langkah. Sekarang mereka ingin hasilnya ditampilkan sebelum mereka meletakkan tangan mereka di papan tulis.

Tantangan

Misalkan boardgame ini: >---#<---X---<X<--#-$

>   means the start of the game
-   means a position without danger
<   means the player should return one step back
X   means the player won't move next round
#   means a portal where the player returns to the start position
$   the first player to get there or after there wins the game

Input terdiri dari string dengan aspek boardgame yang dijelaskan di atas dan dua array dengan beberapa nilai (dari 1hingga 6) agar didapatkan kedua pemain (anak Adan anak B) ketika memainkan satu kubus.

Kedua array akan selalu memiliki panjang yang sama> = 1.

Anak itu Aselalu memulai permainan.

Anda harus menampilkan anak yang mendapatkan akhir atau mendekati akhir terlebih dahulu.

Jika tidak ada yang mendapatkan akhirnya dan kedua anak tetap pada posisi cetak yang sama 0atau nilai kepalsuan lainnya.

Jika satu larik habis sementara yang lain memiliki sisa dadu roll (karena satu pemain kehilangan beberapa putaran pada Xs), sisa dadu roll harus digunakan.

Untuk tugas ini, Anda dapat membuat program / fungsi, yang membaca input dari stdin, atau mengambil parameter / argumen dan menghasilkan / mengembalikan / mencetak anak pemenang.

Karena ini adalah , jawaban tersingkat dalam byte menang!

Contoh Input dan Output

Anda juga dapat menggunakan format input yang berbeda, tetapi Anda hanya harus mengambil nilai boardgame, kid-A dan kid-B.

Contoh 1:

board:  >---#<---X---<X<--#-$
kid-A:  [3,6,6,5,2,1]
kid-B:  [4,5,3,5,5,5]

output: A

Menjelaskan:

>---#<---X---<X<--#-$     # both kids in position
B--A#<---X---<X<--#-$     # kid-A moved 3 to -
B--A#<---X---<X<--#-$     # kid-B moved 4 to # and returned home
B---#<---A---<X<--#-$     # kid-A moved 6 to X and will wait one round
B---#<---A---<X<--#-$     # kid-B moved 5 to < returned one to # and returned home
>--B#<---A---<X<--#-$     # kid-B moved 3 to -
>--B#<---X---<A<--#-$     # kid-A moved 6 to < returned one to X and will wait again
>---#<--BX---<A<--#-$     # kid-B moved 5 to -
>---#<---X--B<A<--#-$     # kid-B moved 5 to < returned one to -
>---#<---X--B<X<--#A$     # kid-A moved 5 to -
>---#<---X---<X<-B#A$     # kid-B moved 5 to -
>---#<---X---<X<-B#-$A    # kid-A moved 2 and won the game!

Contoh 2:

board:  >-<<<<<$
kid-A:  [1,2,3]
kid-B:  [5,5,4]

output: 0

Contoh 3:

board:  >-<-<#<-<-<-$
kid-A:  [5,4,2]
kid-B:  [1,1,1]

output: B

Menjelaskan:

>-<-<#<-<-<-$     # both kids in position
>-<-<#<-<-<-$     # kid-A moved 5 to # returned home
AB<-<#<-<-<-$     # kid-B moved 1 to -
>B<A<#<-<-<-$     # kid-A moved 4 to < returned one to -
>B<A<#<-<-<-$     # kid-B moved 1 to < returned one to -
AB<-<#<-<-<-$     # kid-A moved 2 to # returned home
AB<-<#<-<-<-$     # kid-B moved 1 to < returned one to -

Current position: (A:0, B:1) output: B
dihapus
sumber
Bisakah kita berasumsi bahwa dua array (untuk A dan B) akan selalu sama panjangnya?
trichoplax
Jika satu array habis sementara yang lain memiliki sisa dadu roll (mungkin karena satu pemain kehilangan beberapa putaran pada Xs), haruskah posisi saat ini digunakan untuk menentukan output, atau haruskah gulungan dadu yang tersisa digunakan pertama kali?
trichoplax
1
@trichoplax. Ya, mereka akan selalu sama panjangnya. Saya akan mengklarifikasi dalam pertanyaan
dihapus
1
@trichoplax. Gulungan dadu yang tersisa harus digunakan terlebih dahulu
dihapus
Apakah contoh 3 benar? Saya menjalankan ini di kepala saya dan B tidak pernah melewati ruang 2, sementara A sampai ke ruang 4.
Draco18 tidak lagi mempercayai SE

Jawaban:

2

Perl, 188 180 + 2 = 182 byte

Wuhuu, harus digunakan goto.

@q=/.(?!$)/g,next if$w=$e=!@q;for(@F){a:$w+=$_;$_=$q[$w];/</?($_=-1,goto a):/X/?$e++:/#/?$w=0:!$_&&last;$e++}$r+=$"lt$r?-$w:$w;$t+=$"lt$t?-$e:$e-1}{say$w>@q?$t<0?B:A:!$r?0:$r<0?B:A

Membutuhkan -adan -E| -M5.010:

$ echo $'>-<-<#<-<-<-<-$\n5 4 2\n1 1 1' | perl -M5.010 boardgame.pl
B

Versi agak janggal:

#!/usr/bin/perl -a

# Read all but last char from the board into an array
@board = /.(?!$)/g,next if $pos = $turns = !@board;
for (@F) {
    a:
    $pos+=$_;
    $_=$board[$pos];
    /</?($_=-1,goto a):
    /X/?$turns++:
    /#/?$pos=0:
    # End of Game (Victory!)
    !$_&&last;

    $turns++
}
# Make sure '$pos_diff' and '$turns_diff' are not zero by checking against [:space:]
# ' ' is less than 0 on the ascii table
$pos_diff += $"lt$pos_diff ? -$pos : $pos;
$turns_diff += $"lt$turns_diff ? -$turns : $turns-1;
}{
    say $pos>@board?
            $turns_diff<0?B
            :A
        :
        !$pos_diff?0:
        $pos_diff<0?B:
        A
andlrc
sumber
1

Haskell, 142

_![]=fail;g!(x:y)|x>length g=Just|1<2=g!fix(\f x->case(g!!x)of;'<'->f$x-1;'X'->(0:);'#'->map$(-)(-x);_->map(+x))x y;(g?a)b=(g!)a"A"<|>(g!)b"B"

Pemakaian:

(?) "GAME" [kidA moves] [kidB moves]

Keluaran:

(?) ">---#<---X---<X<--#-$" [3,6,6,5,2,1] [4,5,3,5,5,5]
Just "A"

Sunting:
Astaga, saya main golf sampai mati; gagal untuk contoh terakhir. Saya akan menghidupkannya kembali segera.

BlackCap
sumber
1
Kami biasanya menghitung byte untuk imports juga, dan saya pikir Anda akan memerlukan beberapa untuk fixdan <|>, karena mereka tidak ada di Prelude (atau apakah ada versi yang menyertakannya?).
nimi
Anda benar, mereka tidak di Prelude, tetapi mereka diimpor secara default jika Anda menggunakan lambdabot sebagai penerjemah (saya kira menghitung impor adil; saya akan melakukannya setiap kali saya memperbaikinya)
BlackCap
1
Penerjemah mendefinisikan bahasa , sehingga Anda dapat memanggil bahasa lambdabot-Haskellatau sejenisnya dan mengecualikan jumlah byte untuk impor.
nimi