Hãy chơi vài ván cờ!


11

Giới thiệu

Boardgame là một trò chơi kinh điển giữa những đứa trẻ, nhưng có một số đứa trẻ cảm thấy nhàm chán khi chơi một ván cờ từng bước. Bây giờ họ muốn kết quả được hiển thị trước khi họ đặt tay lên bảng.

Thử thách

Giả sử boardgame này: >---#<---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

Đầu vào bao gồm một chuỗi với các khía cạnh của boardgame được mô tả ở trên và hai mảng với một số giá trị (từ 1đến 6) để cả người chơi (trẻ em Avà trẻ em B) có được khi chơi một khối.

Cả hai mảng sẽ luôn có cùng độ dài> = 1.

Đứa trẻ Aluôn bắt đầu trò chơi.

Bạn phải xuất ra đứa trẻ có kết thúc hoặc gần cuối cùng trước.

Nếu không ai có được kết thúc và cả hai đứa trẻ ở cùng một vị trí in 0hoặc bất kỳ giá trị giả nào khác.

Nếu một mảng hết trong khi mảng kia có các cuộn xúc xắc còn lại (do một người chơi bị mất vài lượt trên Xs), các cuộn xúc xắc còn lại sẽ được sử dụng hết.

Đối với tác vụ này, bạn có thể tạo một chương trình / hàm, đọc đầu vào từ stdin hoặc lấy tham số / đối số và đầu ra / trả về / in ra đứa trẻ chiến thắng.

Vì đây là , câu trả lời ngắn nhất tính bằng byte sẽ thắng!

Ví dụ đầu vào và đầu ra

Bạn cũng có thể sử dụng các định dạng đầu vào khác nhau, nhưng bạn chỉ nên lấy các giá trị boardgame, kid-A và kid-B.

Ví dụ 1:

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

output: A

Giải thích:

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

Ví dụ 2:

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

output: 0

Ví dụ 3:

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

output: B

Giải thích:

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

Chúng ta có thể giả sử rằng hai mảng (cho A và B) sẽ luôn có cùng độ dài không?
trichoplax

Nếu một mảng hết trong khi mảng kia có các cuộn xúc xắc còn lại (có lẽ do một người chơi bị mất vài lượt trên Xs), thì nên sử dụng vị trí hiện tại để xác định đầu ra, hay các cuộn xúc xắc còn lại nên được sử dụng trước?
trichoplax

1
@trichoplax. Vâng, chúng sẽ luôn có cùng độ dài .. Tôi sẽ làm rõ trong câu hỏi
đã xóa

1
@trichoplax. Các cuộn xúc xắc còn lại nên được sử dụng hết trước
loại bỏ

Là ví dụ 3 đúng? Tôi chạy cái này trong đầu và B không bao giờ vượt qua không gian 2, trong khi A đến không gian 4.
Draco18 không còn tin tưởng vào SE

Câu trả lời:


2

Perl, 188 180 + 2 = 182 byte

Wuhuu, đã sử dụng 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

Yêu cầu -a-E| -M5.010:

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

Một số phiên bản không linh hoạt:

#!/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

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"

Sử dụng:

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

Đầu ra:

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

Chỉnh sửa:
Jike, tôi đã đánh nó đến chết; nó không thành công cho ví dụ cuối cùng Tôi sẽ hồi sinh nó trong thời gian ngắn.


1
Chúng tôi cũng thường đếm byte cho imports và tôi nghĩ bạn sẽ cần một số cho fix<|>vì chúng không có trong Prelude (hoặc có phiên bản bao gồm chúng không?).
nimi

Bạn nói đúng, họ không ở Prelude, buuuut họ được nhập khẩu theo mặc định nếu bạn sử dụng lambdabot như một thông dịch viên (Tôi cho rằng đếm nhập khẩu là công bằng, tôi sẽ làm điều đó bất cứ khi nào tôi sửa lỗi này)
chim bông lau

1
Trình thông dịch xác định ngôn ngữ , vì vậy bạn có thể gọi ngôn ngữ lambdabot-Haskellhoặc tương tự và loại trừ số byte cho nhập khẩu.
nimi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.