Lass uns ein Brettspiel spielen!

11

Einführung

Brettspiele sind ein klassisches Spiel zwischen Kindern, aber es gibt einige Kinder, denen es langweilig ist, Schritt für Schritt ein Brettspiel zu spielen. Jetzt möchten sie, dass das Ergebnis angezeigt wird, bevor sie ihre Hände auf das Brett legen.

Herausforderung

Angenommen, dieses Brettspiel: >---#<---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

Die Eingabe besteht aus einer Zeichenfolge mit den oben beschriebenen Aspekten des Brettspiels und zwei Arrays mit einigen Werten (von 1bis 6), die beide Spieler (Kind Aund Kind B) beim Spielen eines Würfels erhalten haben.

Beide Arrays haben immer die gleiche Länge> = 1.

Das Kind Astartet immer das Spiel.

Sie müssen zuerst das Kind ausgeben, das das Ende oder näher am Ende hat.

Wenn keiner das Ende erreicht hat und beide Kinder an der gleichen Position bleiben, drucken Sie 0oder einen anderen falschen Wert.

Wenn ein Array ausgeht, während das andere verbleibende Würfelwürfe hat (da ein Spieler mehrere Runden auf Xs verpasst), sollten die verbleibenden Würfelwürfe aufgebraucht sein.

Für diese Aufgabe können Sie ein Programm / eine Funktion erstellen, das die Eingabe von stdin liest, oder Parameter / Argumente verwenden und das Gewinnerkind ausgeben / zurückgeben / drucken.

Da dies , gewinnt die kürzeste Antwort in Bytes!

Beispiel für Ein- und Ausgabe

Sie können auch verschiedene Eingabeformate verwenden, aber Sie sollten nur die Werte für Brettspiel, Kid-A und Kid-B verwenden.

Beispiel 1:

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

output: A

Erklären:

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

Beispiel 2:

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

output: 0

Beispiel 3:

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

output: B

Erklären:

>-<-<#<-<-<-$     # 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
entfernt
quelle
Können wir davon ausgehen, dass die beiden Arrays (für A und B) immer gleich lang sind?
Trichoplax
Wenn ein Array ausgeht, während das andere noch Würfelwürfe hat (möglicherweise weil ein Spieler mehrere Runden auf Xs verpasst hat), sollte die aktuelle Position zur Bestimmung der Ausgabe verwendet werden oder sollten die verbleibenden Würfelwürfe zuerst aufgebraucht werden?
Trichoplax
1
@ Trichoplax. Ja, sie werden immer gleich lang sein. Ich werde in der Frage klären
entfernt
1
@ Trichoplax. Die restlichen Würfel sollten zuerst aufgebraucht sein
entfernt
Ist Beispiel 3 richtig? Ich lasse diesen in meinem Kopf laufen und B kommt nie an Raum 2 vorbei, während A an Raum 4 kommt.
Draco18s vertraut SE nicht mehr

Antworten:

2

Perl, 188 180 + 2 = 182 Bytes

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

Benötigt -aund -E| -M5.010::

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

Etwas ungolfed Version:

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

Verwendung:

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

Ausgabe:

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

Edit:
Jikes, ich habe es zu Tode gespielt; es schlägt für das letzte Beispiel fehl. Ich werde es in Kürze wiederbeleben.

BlackCap
quelle
1
Normalerweise zählen wir die Bytes auch für imports und ich denke, Sie brauchen einige für fixund <|>, weil sie nicht im Prelude sind (oder gibt es eine Version, die sie enthält?).
Nimi
Sie haben Recht, sie befinden sich nicht im Prelude, aber sie werden standardmäßig importiert, wenn Sie Lambdabot als Interpreter verwenden (ich nehme an, dass das Zählen von Importen fair ist; ich werde das tun, wenn ich das
behebe
1
Der Interpreter definiert die Sprache , sodass Sie die Sprache lambdabot-Haskelloder ähnliches aufrufen und die Anzahl der Bytes für die Importe ausschließen können.
Nimi