Biraz masa oyunu oynayalım!


11

Giriş

Boardgames çocuklar arasında klasik bir oyundur, ancak adım adım bir boardgame oynamaktan sıkılan bazı çocuklar vardır. Şimdi sonucun ellerini tahtaya koymadan önce gösterilmesini istiyorlar.

Meydan okuma

Diyelim ki bu masa oyunu: >---#<---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

Giriş Boardgame en yukarıda açıklanan yönleri ve (bazı değerlerle iki diziyle bir dizi oluşur 1için 6her iki oyuncunun (çocuk o sırayla) Ave çocuk Bbir küp çalarken) var vardı.

Her iki dizi de daima aynı => 1 uzunluğa sahip olacaktır.

Çocuk Aher zaman oyuna başlar.

Önce sonu veya sonuna yaklaşan çocuğu çıkarmalısınız.

0Hiçbiri sona ermediyse ve her iki çocuk da aynı pozisyonda ya da başka bir sahte değerde kalırsa.

Bir dizi diğer zar atışlarındayken biterse (bir oyuncunun X'lerde birkaç tur eksik olması nedeniyle), kalan zar atışları kullanılmalıdır.

Bu görev için, stdin'den girişi okuyan bir program / işlev oluşturabilir veya parametreleri / bağımsız değişkenleri alabilir ve kazanan çocuğu çıktı / dönüş / yazdırabilirsiniz.

Bu , baytlarda en kısa cevap kazanır!

Örnek Giriş ve Çıkış

Farklı giriş biçimlerini de kullanabilirsiniz, ancak yalnızca boardgame, kid-A ve kid-B değerlerini almalısınız.

Örnek 1:

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

output: A

İzahı:

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

Örnek 2:

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

output: 0

Örnek 3:

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

output: B

İzahı:

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

İki dizinin (A ve B için) her zaman aynı uzunlukta olacağını varsayabilir miyiz?
trichoplax

Bir dizi diğer zar atışlarındayken tükenirse (belki bir oyuncunun X'lerde birkaç tur eksik olması nedeniyle), çıkışı belirlemek için geçerli konum kullanılmalı mı yoksa ilk önce kalan zar atışları kullanılmalı mıdır?
trichoplax

1
@trichoplax. Evet, her zaman aynı uzunlukta olacaklar. Soruda açıklığa kavuşacağım
kaldırıldı

1
@trichoplax. Kalan zar ruloları önce kullanılmalıdır
kaldırıldı

Örnek 3 doğru mu? Kafamda bu bir çalıştırmak ve A uzayda 4. alırken B asla geçmiş alan 2 alır
Draco18s artık SE güvenir

Yanıtlar:


2

Perl, 188180 + 2 = 182 bayt

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

Gerekli -ave -E| -M5.010:

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

Biraz çözülmemiş versiyon:

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

Kullanımı:

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

Çıktı:

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

Düzenleme:
Jikes, ben ölümüne golf; son örnek için başarısız olur. Kısa süre sonra yeniden canlandıracağım.


1
Biz genellikle için byte importde s ve ben sizin için bazı gerekir düşünüyorum fixve <|>onlar Prelude olmadıkları için, (ya bunları içeren bir sürümü var?).
nimi

Haklısınız, Prelude'da değiller, budauut Eğer tercüman olarak lambdabot kullanırsanız varsayılan olarak içe aktarılırlar (sayım ithalatı adil olur; bunu düzelttiğimde yapacağım)
BlackCap

1
Tercüman dili tanımlar , böylece dili lambdabot-Haskellveya benzerini arayabilir ve içe aktarma için bayt sayısını hariç tutabilirsiniz.
nimi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.