Terra Mystica:サイクリングパワー


28

ボードゲームTerra Mysticaには、主要なリソースの1つであるパワーに関する非常に興味深いメカニズムがあります。銀行から力の単位を獲得して消費する代わりに、各プレイヤーは、I、II、IIIとラベル付けされた3つの「ボウル」に分配された正確に12の力の単位でゲームを開始します。電力を獲得して消費すると、これらのボウル間で電力が移動します。

  • ユニットを消費するには、ボウルIIIからボウルIに移動します(ボウルIIIにユニットがある場合)。
  • パワーのユニットを獲得したときに、ボウルIにユニットがある場合、それをボウルIIに移動します。ボウルIにユニットがなく、ボウルIIにユニットがある場合は、ボウルIIIに移動します。すべてのユニットがすでにボウルIIIにある場合、何も起こりません。
  • 一度に複数のユニットを獲得または使用すると、それらは一度に1ユニット処理されます。

以下に例を示します。たとえば、プレーヤーは次の電力配分で開始されます(順番に与えられますI | II | III)。

5 | 7 | 0

彼らが数回力を得て費やすと、彼らの力は次のように変わります。

               5 |  7 |  0
Gain  3  ==>   2 | 10 |  0
Gain  6  ==>   0 |  8 |  4   (move 2 power from I to II, 
                              then the remaining 4 from II to III)
Gain  7  ==>   0 |  1 | 11
Spend 4  ==>   4 |  1 |  7
Gain  1  ==>   3 |  2 |  7
Spend 7  ==>  10 |  2 |  0
Gain 12  ==>   0 | 10 |  2   (move 10 power from I to II,
                              then the remaining 2 from II to III)
Gain 12  ==>   0 |  0 | 12   (the two excess units go to waste)

あなたのタスクは、そのような獲得または支出イベントの結果を計算することです。

チャレンジ

入力として4つの整数が与えられます。最初の3つは、IIIIII、3つのボウルのそれぞれの電力の量を表します。それらは負ではなく、合計は12になります。4番目の数値、Pは獲得または消費されるパワーの量であり、包括的範囲になります[-III, 24](したがって、プレーヤーはこれ以上パワーを消費しようとしないと仮定できます)現在できるよりも、すべての力をボウルIIIに移動するために必要な力よりも多くの力を獲得している可能性があります。

これらの数値は、一貫した順序で、個別の引数として、整数のリストとして、またはこれらの整数を含む文字列として使用できます。あなたも取ることができますPように、一つの引数としてIIIIII別のリストを引数として。

あなたは、出力3つの整数でなければならないI'II'III'各ボウルに電力量を表す後に Pユニットが獲得やルールは上記で説明し、以下、費やされました。

プログラムまたは関数を記述し、入力を受け取り、出力を提供する当社の標準的な方法のいずれかを使用できます。

任意のプログラミング言語を使用できますが、これらの抜け穴はデフォルトでは禁止されています。

これはであるため、バイト単位で測定される最短の有効な回答が勝ちます。

テストケース

I II III P => I' II' III'
5 7 0 3    => 2 10 0
2 10 0 6   => 0 8 4
0 8 4 7    => 0 1 11
0 1 11 -4  => 4 1 7
4 1 7 0    => 4 1 7
4 1 7 1    => 3 2 7
3 2 7 -7   => 10 2 0
10 2 0 12  => 0 10 2
0 10 2 12  => 0 0 12

1
性別固有の代名詞を削除し、性別に依存しない代名詞に置き換える(または文章を再構築する)ことをお勧めします。ゲーマーは男性である必要はありません。
グレッグマーティン

1
@GregMartinもちろん。私はそれらをすべて捕らえましたか?
マーティンエンダー

2
それのように見えます。それについて考えてくれてありがとう!また、Terra Mysticaは私が聞いたほど素晴らしいですか?
グレッグマーティン

4
@GregMartinはい。:)
マーティンエンダー

5
ボウル2から電力が焼けませんか?これはとても不完全だと感じています。
詳細

回答:


6

Mathematica、52バイト

{x=#-#4~Min~#,y=Max[#2+#-Abs[#4~Max~0-#],0],12-x-y}&

これは名前のない関数で、リスト{I, II, III, P}を入力として受け取り、リストを返します{I', II', III'}

閉じた形式のソリューション。まだ最適に感じられません...


私は短くすることができると思った{##,12-+##}&[#-#4~Min~#,Max[#2+#-Abs[#4~Max~0-#],0]]&が、バイト長です。私も好き12-+##です。
グレッグマーティン

1
@GregMartin私は同じことを試してみました:)
マーティン・エンダー

6

C、97 94バイト

f(i,j,k,n){for(;n;n-=n/abs(n))n<0?k?++i+--k:0:i?++j+--i:j?++k+--j:0;printf("%d %d %d",i,j,k);}

未使用の形式では:

f(i, j, k, n) {
    while (n) {
        if (n < 0) {
            if (k) {
                ++i; --k;
            }
            ++n;
        } else {
            if (i) {
                ++j; --i;
            }
            else if (j) {
                ++k; --j;
            }
            --n;
        }
    }
    printf("%d %d %d", i, j, k);
}

5

Python 2、104バイト

def f(i,d,t,g):
 x=min(i,g);i-=x;q=g>0;g-=x
 if q:d+=x;x=min(d,g);g-=x;d-=x;t+=x
 else:t+=x
 print i,d,t

オンラインで試す

ゴルフをしていない:

def f(i,d,t,g):
 if g>0:
    x=min(i,g)
    g-=x
    i-=x
    d+=x    
    x=min(d,g)
    g-=x
    d-=x
    t+=x
 else:
    x=min(i,g)
    g-=x
    i-=x
    t+=x
 print(i,d,t)

5

Haskell、58バイト

f(a,b,c)d|m<-min a d,z<-min(c+d-max 0 m)12=(a-m,b+c+m-z,z)

中間値mは、最初のボウルから(または負の場合は)行くパワーの量をz示し、アクション後の3番目のボウルのパワーの量を示します。直前の1バイトの最適化により、2番目のボウルの古い表現12-a+m-zがIDの使用から変更されましたa+b+c=12

自然な結果タイプはボウルのトリプルであるため、入力もボウルをトリプルとして、パワーの変更を2番目の引数として受け取ります。これにより、次の1つのアプリケーションですべてのテストケースを処理できますscanl

*Main> scanl f (5,7,0) [3,6,7,-4,0,1,-7,12,12]
[(5,7,0),(2,10,0),(0,8,4),(0,1,11),(4,1,7),(4,1,7),(3,2,7),(10,2,0),(0,10,2),(0,0,12)]

5

ローダ100 94バイト

f a,b,c,p{{c+=p;a-=p}if[p<0]else{{a--;b++;p--}while[p*a>0];{b--;c++;p--}while[p*b>0]};[a,b,c]}

ゴルフをしていない:

f a,b,c,p {
    if [ p < 0 ] do
        c += p
        a -= p
    else
        { a-=1; b+=1; p-=1 } while [ p > 0 and a > 0 ]
        { b-=1; c+=1; p-=1 } while [ p > 0 and b > 0 ]
    done
    return a, b, c
}

ローダには++and --演算子がありませんか?
クリチキシリトス

@KritixiLithosありがとう!はい、そうです。
fergusq


3

GNU sed、66バイト

+1を含む -r

/-/!{:
s/1,(.* )1/,1\1/
t}
s/(.*)(1+) -\2/\2\1/
s/(,,1{12}).*/\1/

単項を使用します(このコンセンサスを参照)。

オンラインでお試しください!

/-/!{                  # If there is not a '-'
  :                    # start loop
  s/1,(.* )1/,1\1/     # move a 1 from before a ',' to after the ',' for every 1 after the space
                       # sed reads left to right, so this takes everything from the first bowl before starting on the second
  t                    # loop if something changed
}                      # end if
s/(.*)(1+) -\2/\2\1/   # take all of the 1s from after a '-' and move them to the begining.
                       # at the same time, remove that many 1s from the 3rd bowl
s/(,,1{12}).*/\1/      # remove everything after 12 1s in the third bowl

3

網膜 46  41 39 38バイト

複数の役立つ提案をしてくれたMartin Enderに 感謝します!

+`1,(.*¶)1
,1$1
(.*)(1+)¶-\2$
$2$1
G`,

入力を単項で取ります。最初の行にはコンマで区切られた3つのボウルの電力量が含まれ、2行目にはサイクルする電力量が含まれます。

テストスイート -すべての入力を1行で受け取り、使用の便宜のために10進数から単項へ、またはその逆に変換します。

説明

+`1,(.*¶)1
,1$1

肯定的な場合:この操作が可能な限り1、2行目の先頭を繰り返し削除1し、最初の空でないボウルから次のボウルにaを移動します(つまり、サイクルする電力の数がゼロではなく、すべてではありません)電源は3番目のボウルにあります)。s修飾子手段はsingle-line、許可.も改行にマッチします。

(.*)(1+)¶-\2$
$2$1

負の場合:最後の入力で示された電力量を3番目のボウルから最初のボウルに移動し、すべてを1ステップで行います。これにより、移動する負の電力量を含むラインも削除されます。

G`,

コンマを含む行のみを保持(grep)します。これにより、最初の行の最終的な残りが削除されます。



2

バッチ、87バイト

@set/a"i=%4-%1,j=%4*(-%4>>5)-%2-2*i*(-i>>5),i*=i>>5,j*=j>>5,k=12-i-j
@echo %i% %j% %k%

次の式を使用します。

I' = min(I - P, 0)
II' = min(II + min(P, 0) - 2 * min(P - I, 0), 0)
III' = 12 - I' - II'

Batchには小なり演算子がないため、をi = min(-i, 0)使用して計算しi*=i>>5ます。


2

Perl 6、99バイト

->\a,\b,\c,\d{d>0??[»+»] (a,b,c),|(|((-1,1,0)xx a),|((0,-1,1)xx a+b),|(0 xx*))[^d]!!(a- d,b,c+d)}

ましょうabcそれぞれボウルI、II、およびIIIのトークンを開始する数です。次に、パワーを追加するためaに、トリプレットのコピーを含むリストが作成され(-1, 1, 0)、その後にトリプレットのa + bコピーが(0, -1, 1)続き、の無限コピーが続き0ます。追加する電力量でdあるこのリストの最初の要素はd、開始電力配分に要素ごとに追加されます。

電力の減算(負d)には、単純な閉じた形式が使用されます(a - d, b, c + d)


2

tinylisp、134バイト

(d f(q((x y z p)(i p(i(l p 0)(f(s x p)y(a z p)0)(i x(f(s x 1)(a y 1)z(s p 1))(i y(f x(s y 1)(a z 1)(s p 1))(f x y z 0))))(c x(c y(c z(

f4つの引数、3つのボウル(x y z)および処理された電力量()を受け取る関数を定義しp、トランザクション後に3つのボウルのリストを返します。すべてのテストケースを含む適切な間隔のバージョンを次に示します。オンラインで試してみてください!

(d f                         Define f to be
 (q(                          a quoted two-item list (which acts as a function):
  (x y z p)                    Arglist: the three bowls x y z and power p
  (i p                         If p is nonzero
   (i (l p 0)                   then if p is negative (spending power)
    (f(s x p)y(a z p)0)          then take -p from z, add -p to x, and recurse with p=0
    (i x                         else (gaining power), if x is nonzero
     (f(s x 1)(a y 1)z(s p 1))    then take 1 from x, add to y, decrement p and recurse
     (i y                         else if y is nonzero
      (f x(s y 1)(a z 1)(s p 1))   then take 1 from y, add to z, decrement p and recurse
      (f x y z 0))))               else no moves possible; recurse with p=0
   (c x(c y(c z())))))))        else (p=0), cons x y z into a list and return it
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.