让我们玩一些桌游吧!


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

输入内容包括一个具有上述棋盘游戏方面内容的字符串和两个数组,每个数组具有一些值(从16),以便两个玩家(kid A和kid 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)将始终具有相同的长度?
trichoplax

如果一个数组用完而另一个数组剩余骰子掷骰(可能是由于一个玩家在Xs上丢失了几回合),那么应该使用当前位置来确定输出,还是应该先用完剩余的骰子掷骰?
trichoplax

1
@trichoplax。是的,它们的长度将始终相同。.我将在问题中阐明
删除

1
@trichoplax。剩余的骰子卷应先用尽

示例3正确吗?我跑在我的脑海这一个和B永远不会越过空间2,而到达空间4
Draco18s不再信任SE

Answers:


2

Perl,188180 + 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"

编辑:
笑话,我把它打死了;最后一个例子失败了。我会尽快恢复。


1
我们通常也为imports 计数字节,我认为您需要for fix<|>,因为它们不在Prelude中(或者是否有包含它们的版本?)。
nimi

没错,它们不在Prelude中,但是如果您使用lambdabot作为解释器,则默认情况下会导入它们(我想计数导入是公平的;只要我解决这个问题,我都会这样做)
BlackCap

1
解释器定义了语言,因此您可以调用该语言lambdabot-Haskell或类似语言,并排除导入的字节数。
nimi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.