มาเล่นเกมกระดานกัน!


11

บทนำ

Boardgames เป็นการเล่นแบบคลาสสิคระหว่างเด็ก ๆ แต่มีเด็กบางคนที่รู้สึกเบื่อการเล่นเกมกระดานเป็นขั้นเป็นตอน ตอนนี้พวกเขาต้องการให้แสดงผลลัพธ์ก่อนที่พวกเขาจะวางมือบนกระดาน

ท้าทาย

สมมติบอร์ดนี้เป็นเกม: >---#<---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

อินพุตประกอบด้วยสตริงที่มีลักษณะของบอร์ดเกมที่อธิบายไว้ข้างต้นและสองอาร์เรย์ที่มีค่าบางค่า (จาก1ถึง6 ) เพื่อให้ผู้เล่นทั้งสอง (เด็กAและเด็กB) ได้รับเมื่อเล่นหนึ่งคิวบ์

ทั้งสองอาร์เรย์จะมีความยาวเท่ากัน> = 1

เด็ก Aเริ่มเกมเสมอ

คุณต้องเอาท์พุทเด็กที่มีจุดสิ้นสุดหรือใกล้ถึงจุดสิ้นสุดก่อน

ถ้าไม่มีใครจบและเด็กทั้งคู่อยู่ในตำแหน่งเดียวกัน 0หรือค่าผิดพลาดอื่น ๆ

หากหนึ่งอาร์เรย์วิ่งออกไปในขณะที่อีกคนหนึ่งมีลูกเต๋าเหลืออยู่ (เนื่องจากผู้เล่นคนหนึ่งหายไปหลายรอบใน Xs) ควรใช้ลูกเต๋ากลิ้งที่เหลืออยู่

สำหรับงานนี้คุณสามารถสร้างโปรแกรม / ฟังก์ชั่นที่อ่านอินพุตจาก stdin หรือรับพารามิเตอร์ / ข้อโต้แย้งและเอาท์พุท / ผลตอบแทน / พิมพ์เด็กผู้ชนะ

ตั้งแต่นี้เป็นคำตอบสั้นที่สุดในไบต์ชนะ!

ตัวอย่างอินพุตและเอาต์พุต

นอกจากนี้คุณยังสามารถใช้รูปแบบการป้อนข้อมูลที่แตกต่างกันได้ แต่คุณควรรับค่า boardgame, kid-A และ kid-B เท่านั้น

ตัวอย่างที่ 1:

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

output: A

อธิบายว่า:

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

ตัวอย่างที่ 2:

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

output: 0

ตัวอย่างที่ 3:

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

output: B

อธิบายว่า:

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

เราสามารถสมมติได้ว่าสองอาร์เรย์ (สำหรับ A และ B) จะมีความยาวเท่ากันหรือไม่?
trichoplax

หากหนึ่งอาร์เรย์วิ่งออกไปในขณะที่อีกคนหนึ่งมีลูกเต๋าเหลืออยู่ (อาจเป็นเพราะผู้เล่นคนหนึ่งหายไปหลายรอบใน Xs) ควรใช้ตำแหน่งปัจจุบันเพื่อกำหนดผลลัพธ์หรือควรใช้ลูกเต๋าที่เหลืออยู่ก่อน?
trichoplax

1
@trichoplax ใช่พวกเขาจะมีความยาวเท่ากันเสมอ .. ฉันจะชี้แจงในคำถาม
ลบ

1
@trichoplax ควรใช้ลูกเต๋าโรลที่เหลือก่อน
นำออก

ตัวอย่างที่ 3 ถูกต้องหรือไม่ ฉันเรียกใช้สิ่งนี้ในหัวของฉันและ B ไม่เคยผ่านช่องว่างที่ผ่านมา 2 ในขณะที่ A เข้าสู่พื้นที่ 4
Draco18s ไม่ไว้วางใจ SE

คำตอบ:


2

Perl, 188 180 + 2 = 182 ไบต์

Wuhuu, 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

ต้องการ-aและ-E| -M5.010:

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

รุ่นที่ค่อนข้างไม่ได้รับการปรับแต่ง:

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

การใช้งาน:

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

เอาท์พุท:

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

แก้ไข:
Jikes ฉันเล่นกอล์ฟจนตาย มันล้มเหลวสำหรับตัวอย่างสุดท้าย ฉันจะชุบชีวิตอีกไม่นาน


1
เรามักจะนับไบต์สำหรับimports ด้วยและฉันคิดว่าคุณจะต้องใช้fixและ<|>เพราะพวกเขาไม่ได้อยู่ในโหมโรง (หรือมีรุ่นที่มีพวกเขา?)
nimi

คุณพูดถูกพวกเขาไม่ได้อยู่ใน Prelude แต่พวกเขาจะถูกนำเข้าโดยค่าเริ่มต้นหากคุณใช้ lambdabot เป็นล่าม (ฉันคิดว่าการนับการนำเข้ามีความยุติธรรมฉันจะทำเช่นนี้เมื่อใดก็ตามที่ฉันแก้ไขปัญหานี้)
BlackCap

1
ล่ามจะกำหนดภาษาดังนั้นคุณสามารถโทรหาภาษาlambdabot-Haskellหรือสิ่งที่คล้ายกันและไม่รวมจำนวนไบต์สำหรับการนำเข้า
nimi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.