Давайте пограємо в якусь настільну гру!


11

Вступ

Настільні ігри - це класична гра між дітьми, але є деякі діти, яким нудно грати в настільну гру крок за кроком. Тепер вони хочуть показати результат, перш ніж покласти руки на дошку.

Виклик

Припустимо, це настільна гра: >---#<---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, або приймати параметри / аргументи та виводити / повертати / друкувати дитину-переможця.

Оскільки це , найкоротша відповідь у байтах виграє!

Приклад введення та виводу

Ви також можете використовувати різні формати введення, але слід приймати лише настільні ігри, значення 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) завжди будуть однакової довжини?
трихоплакс

Якщо один масив закінчується, а в іншому залишилися кістки кісток (можливо, через те, що одному гравцеві не вистачає декількох поворотів на Xs), чи слід використовувати поточну позицію для визначення результату, чи слід спочатку використати решту рулонів кісток?
трихоплакс

1
@trichoplax. Так, вони завжди будуть однакової довжини .. Я уточню в запитанні
видалено

1
@trichoplax. Решту рулонів з кістки слід використати спочатку
вилучено

Чи правильний приклад 3? Я запускаю цю в голові, і B ніколи не проходить пробіл 2, тоді як A потрапляє в космос 4.
Draco18s більше не довіряє SE

Відповіді:


2

Perl, 188 180 + 2 = 182 байт

Вуху, користувався 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

Хаскелл, 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і для <|>, оскільки їх немає в Prelude (чи є версія, яка включає їх?).
німі

Ви маєте рацію, вони не в Prelude, але вони імпортуються за замовчуванням, якщо ви використовуєте lambdabot в якості інтерпретатора (я вважаю, що підрахунок імпорту є справедливим; я буду робити це, коли я це
виправлю

1
Інтерпретатор визначає мову , тому ви можете зателефонувати на мову lambdabot-Haskellчи подібну та виключити кількість байтів для імпорту.
німі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.