Dominionで2倍および3倍のアクションを解決する


14

ひらめき

この質問は、人気のあるデッキ構築カードゲームDominionの玉座の間と王宮に触発されています。

謁見室 キングズコート

ターンの一部として、一連のアクションを実行します。これら2つの特定のアクションにより、次に再生されるアクションが2、3回繰り返されます*。他の「一般的な」アクションは特定のゲーム効果を引き起こしますが、詳細には興味がなく、単に文字でラベル付けするだけです。

興味深いのは、玉座の間または王宮が別の王宮の玉座に影響を及ぼし、倍増または三倍効果自体が倍または三重になる場合です。玉座の間の長いチェーン、キングコート、および複数のアクションは、経験豊富なDominionプレイヤーでさえ混乱させる可能性があります。

あなたの目標は、可能な限り少ないバイトを使用して、これらのチェーンを正しく解決するコードを書くことです。Dominionルールでチェーンがどのように解決されるかを説明する前に、プログラムの要件について説明します。

*技術的には、玉座の部屋または王の裁判所の解決の一環として影響を受けるアクションを選択しますが、このビューはこの課題に対してよりクリーンです。

プログラム要件

プログラムまたは名前付き関数を作成します。再生された一連のアクション(STDINまたは関数入力)を取り込み、2倍および3倍の効果から得られた一連のアクションを出力または印刷する必要があります。少ないバイトが勝ちます。

入力

再生されたアクションのシーケンスを表す文字列。一般的なアクションは大文字で表されAZ。特別なダブリングアクションの玉座の間は、キャラクター2で表され、トリプルアクションのキングズコートは3

文字(アクション)の数は、1〜30の間です。必要に応じて、改行で入力を終了することができます。

入力例: WA23G3GA

出力

大文字の文字列AZ。これは、2倍効果と3倍効果を、発生する順序で解決した結果生じる一連の一般的なアクションである必要があります。

必要に応じて、出力を改行で終わらせることができます。それ以外の場合、追加の文字はありません。

出力例:WAGGGGGGAAA

Dominionでの2倍および3倍の仕組み

ここでは、ドミニオンのルールに従って、玉座の間(2)と王宮()のチェーンがどのように機能するかを説明し3ます。

をプレイした後2、解決すべき次のアクションが2回発生します。したがって、最初にを再生した場合2、次にAが発生しますA

2A -> AA

同様に、

A2BC -> ABBC
3DE -> DDDE
3N2BC3XY2 -> NNNBBCXXXY

最後の例では、決勝戦2に倍増するものは何もなかったため、効果がないことに注意してください。

興味深いのは、2倍または3倍の効果自体が2倍または3倍になった場合です。例えば、

22AB -> AABB

まず、あなたがプレイし2ます。次に、別のを再生します。2これは、前のから2倍になり2ます。その結果、次の2つのアクションが2倍になります。まず、A解決の2つのコピー。次に、B解決のコピー。

A4倍ではないことに注意してください。最初のコピーが最初に2動作したA後、次のコピーは次の未解決の動作に作用しBます。なしではB

22A -> AA

の2番目のコピーは2次のアクションが2倍になるのを待っていますが、アクションは発生しません。

最後に、複雑な例を見てみましょう。

223BCDE -> BBBCCCDDE

前と同じように、最初のもの2は2番目のもの2を2倍にします。したがって、次の2つのアクションは2倍になります。の最初のコピーは2次のアクションを2倍にします。次のアクションは3、の次のコピーを解決する前に完全に解決する必要があります23トリプルの最初のコピーB、および2番目のコピートリプルC。現在、まだ待機中の2番目のコピーは2、次の未解決のアクションを2倍にしDます。この後、2倍または3倍の効果は残りませんE。最終的なアクションが発生します。

テストケース

これらはとして与えられます(input,output)

(FY, FY)
(A2BC, ABBC)
(3DE, DDDE)
(3N2BC3XY2, NNNBBCXXXY)
(WA23G3GA, WAGGGGGGAAA)
(32, )
(33RST, RRRSSSTTT)
(2A32B2CDEFG, AABBCCDDEEFG)
(A2A323AB2CD2D2E3ABC, AAAAAABBBCCDDDDEEAAABBBC)
(P22LL3Q2Q22T, PLLLLQQQQQTT)
(322322ABCDEFGHIJKLMN, AABBCCDDEEEFFGGHHIJKLMN)

回答:


5

GolfScript(29 26バイト)

](1/{\1+(3&@*.23-\1$-@+}/;

オンラインデモ

解剖

これは、GolfScriptの緩いタイピングをわずかに乱用します。後続のアクションを繰り返す回数のスタックは配列として始まり、後で文字列に変わりますが1+、1を追加し(3&て最初の値をポップし、型の変更03関係なく範囲に正しく入れます。

](         # Push an empty array under the input string to serve as rep stack
1/{        # Loop over the input string as a series of 1-char strings
           #   Stack is ... reps ch
           #   where the ... covers zero or more strings which will be output
  \        #   Bring the rep stack to the top
  1+(      #   Push a `1` on the bottom of it to avoid underflow and then pop
  3&       #   Coerce to correct range, because if rep stack is a string then
           #   we just got an ASCII value
  @*       #   Apply repetition to the 1-char string: it's now an n-char string
  .23-     #   Duplicate it and remove chars '2' and '3': this becomes output
  \1$-     #   Get the original copy and remove the output string's chars
           #   So the stack is now ... reps output non-output
           #   where non-output is either an empty string or a string of '2's
           #   or '3's
  @+       #   Push non-output onto the repetition stack
}/         # Loop
;          # Pop whatever's left of the repetition stack

1スタックの下にをプッシュして、乗算されていないアクションを乗算されたアクションと同じように扱うトリックが好きです。さまざまなスタックをジャグリングする方法について詳しく説明していただけますか?特に、「担当者スタックを一番上に持ってくる」ために何をしますか?
xnor 14年

@xnor、ここに組み込みリファレンスがあります。\は、スタックの上の2つのアイテムを交換します。
ピーターテイラー14年

おかげで、各スタック要素が独自のスタックであることを理解できませんでした。単一の連結スタックを想像していました。
xnor 14年

@xnor、それは各スタック項目がそれ自身のスタックではないということです。繰り返しスタックは、配列または文字列(まだ配列ですが、一部の組み込み関数では異なる方法で処理されます)として保存されます。メインループの終了直前にGSスタックの内容を出力するデバッグデモ
ピーターテイラー14年

4

Javascript- 162 152バイト

縮小:

F=I=>{L=c=>S.length;p=c=>L()?S.shift():d=>{};S=[(x=>/\d/.test(x)?(c,b)=>{for(c=p(),b=x;b--;)c();}:c=>s+=x)(m)for(m of I)];for(s='';L();)p()();return s;}

拡張:

F = I => {
    L = c => S.length;
    p = c => L() ? S.shift() : d => {};
    S = [ (x => /\d/.test( x ) ?
        (c,b) => {
            for( c = p(), b = x; b--; )
                c();
        } : c =>
            s += x
        )(m) for( m of I ) ];

    for( s = ''; L(); )
        p()();

    return s;
}

スタックベースのゴルフ言語は、これを基本的に機能スタッキングの練習であるため、これを殺すと推測しています。:P

サンプル出力

F('3N2BC3XY2')
"NNNBBCXXXY"

F('WA23G3GA')
"WAGGGGGGAAA"

F('A2A323AB2CD2D2E3ABC')
"AAAAAABBBCCDDDDEEAAABBBC"

F('322322ABCDEFGHIJKLMN')
"AABBCCDDEEEFFGGHHIJKLMN"

F('FY')
"FY"

F('')
""

1
機能としてのカードの解釈がどれほど正確であるかに驚いています。私はスタックを期待していましたが、関数のリテラル呼び出しスタックではありませんでした!関数を複数回呼び出すより簡潔な方法はありませんか?いっそのこと、2/3ケースを一緒に処理する可変回数?
xnor 14年

@xnor:賢いと思った。;)あなたの提案に関しては、あなたの直感は正しかったです。2つのケースを組み合わせて、10バイト節約しました。理想的には18になりますが、Firefoxのバグだと私は信じています。x最初にb内部ラムダにスコープされた変数にコピーせずに直接操作できるはずですが、Firefoxはループ条件を適切に評価しません。具体的にxは、否定的になり、ブラウザがハングします。で置き換え, b = x; b--;; x--;、入力を実行してくださいA2A323AB2CD2D2E3ABC。これを読んで誰もが、なぜ、...把握することができた場合
COTO

...知りたいと思っています。たぶん私はクロージャーがどのように機能するのかについて何かを見逃しています。
COTO 14年

3

C、115 111バイト

標準入出力を使用します。

memsetスタックを使用し、スタックを他の方向に移動することで4を節約しました。

char*i,X[222],*s=X+99;main(){for(gets(i=X);*i;i++)*i<55?s=memset(s-*s,*i-49,*s+1):putchar(*i)**s?--*s,--i:++s;}

非ゴルフ

#include <stdio.h>
#include <stdlib.h>
char I[99], S[99], *i = I, *s = S+66;
int n;
int main()
{
    gets(I);
    for(;*i;)
    {
        if(*i < '5') {
            n = *s;
            s[0] = s[1] = s[2] = *i - '1';
            s += n;
            i++;
        } else {
            putchar(*i);
            if(*s)
                --*s;
            else
                --s, ++i;
        }
    }
    return 0;
}

0

パイソン(84)

S='1'*99
R=''
for c in input():q=int(S[0])*c;S=q*(c<'A')+S[1:];R+=q*(c>'3')
print(R)

S乗数のスタックです(前面の場合は上部)。1乗算されていないアクションを処理するのに十分なで初期化されます。

現在のアクションcがジェネリックであるかどうかに応じて、乗算結果を出力Rまたは乗算器のスタックに追加しますS

すべてが文字のリストではなく文字列として表されます。文字列は不変であるため、残念ながら文字列を使用しpopたり、要素に要素を割り当てたりすることはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.