Давайте играть в настольную игру!

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или любое другое ложное значение.

Если один массив заканчивается, а у другого остаются оставшиеся броски костей (из-за того, что один игрок пропустил несколько ходов по X), оставшиеся броски костей следует использовать.

Для этой задачи вы можете создать программу / функцию, которая будет читать ввод из 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) всегда будут одинаковой длины?
Трихоплакс
Если один массив заканчивается, а у другого остаются оставшиеся броски костей (возможно, из-за того, что один игрок пропустил несколько ходов по иксам), следует ли использовать текущую позицию для определения результата или сначала следует использовать оставшиеся броски костей?
Трихоплакс
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
andlrc
источник
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 в качестве интерпретатора (я полагаю, что подсчет импорта справедливый; я сделаю это всякий раз, когда исправлю это)
BlackCap
1
Интерпретатор определяет язык , поэтому вы можете назвать язык lambdabot-Haskellили аналогичный и исключить количество байтов для импорта.
Ними