Dominion의 배가 및 삼중 동작 해결


14

영감

이 질문은 유명한 데크 빌딩 카드 게임 Dominion 의 Throne Room과 King 's Court 카드에서 영감을 얻었습니다 .

왕좌 룸 왕의 법원

차례의 일환으로 일련의 행동을 취합니다. 이 두 가지 특정 동작으로 인해 다음에 수행 할 동작이 두세 번 반복됩니다 *. 다른 "일반적인"행동은 특정 게임 효과를 유발하지만, 우리는 특정 내용에 관심이 없으며 단순히 글자로 레이블을 붙입니다.

흥미로운 사례는 왕좌 또는 왕의 법원이 다른 왕좌의 왕실의 방에 영향을 주어 배가 또는 삼중 효과가 두 배 또는 세 배가되는 경우입니다. 왕좌의 긴 사슬, 왕궁, 여러 번의 행동으로 숙련 된 도미니언 플레이어들조차 혼란을 줄 수 있습니다.

목표는 가능한 적은 바이트를 사용하여 이러한 체인을 올바르게 해결하는 코드를 작성하는 것입니다. 체인이 Dominion 규칙에서 어떻게 해결되는지 설명하기 전에 프로그램 요구 사항에 대해 설명하겠습니다.

* 기술적으로, 당신은 왕좌 또는 왕궁 해결의 일부로 영향을받는 행동을 선택하지만,이 견해는이 도전에 더 깨끗합니다.

프로그램 요구 사항

쓰기 프로그램 이나 라는 이름의 기능을 . 재생되는 동작 체인 (STDIN 또는 기능 입력)을 가져 와서 이중 및 삼중 효과에서 결과 동작 체인을 출력하거나 인쇄해야합니다. 가장 적은 바이트가 이깁니다.

입력

재생되는 일련의 동작을 나타내는 문자열입니다. 일반 작업은을 A통해 대문자로 표시됩니다 Z. 왕좌 방은 문자로 표현되는 특수 배가 액션 2, 그리고 배로 작용에 의해 왕의 법원 3,

문자 수 (동작)는 1에서 30 (포함) 사이입니다. 원하는 경우 입력 줄 바꿈을 줄 바꿈 할 수 있습니다.

입력 예 : WA23G3GA

산출

대문자의 문자열 AZ. 두 배의 효과와 트리플 효과를 발생하는 순서대로 해결하는 일련의 일반적인 동작이어야합니다.

원하는 경우 출력을 줄 바꿈으로 끝낼 수 있습니다. 그렇지 않으면 추가 문자가 없어야합니다.

출력 예 : WAGGGGGGAAA.

Dominion에서 더블링 및 트리플 링 작동 방식

자, 내가 통해 어떻게 왕좌 방 체인 (갈거야 2'들)과 왕의 법원 ( 3도미 규칙에 따라의) 작동합니다.

을 재생하면 2해결해야 할 다음 동작이 두 번 발생합니다. 처음 플레이한다면, 2다음 A, 당신은 얻을 A두 번 일어나고.

2A -> AA

비슷하게,

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

마지막 예에서 결승 2은 두 배가 될 것이 없으므로 아무런 영향을 미치지 않습니다.

두 배 또는 세 배의 효과가 두 배 또는 세 배가되면 흥미로운 일이 발생합니다. 예를 들어

22AB -> AABB

먼저을 재생 2합니다. 그런 다음 다른을 재생 2하면 이전보다 두 배가됩니다 2. 결과적으로 다음 동작이 두 배가됩니다. 먼저, 두 개의 사본이 A해결됩니다. 그런 다음 확인 사본 B.

참고 A의 첫 번째 복사 한 후 : 배로되지 않은 2최초의 행위 A, 다음 카피는 다음 해결되지 않은 조치에 작용한다 B. 포함하지 않는 B, 우리는 거라고

22A -> AA

여기서 두 번째 사본은 2다음 동작이 두 배가되기를 기다리는 중이지만 동작이 없습니다.

마지막으로 복잡한 예를 살펴 보겠습니다.

223BCDE -> BBBCCCDDE

이전과 마찬가지로 첫 번째 2는 두 번째 2를 두 배로 만듭니다. 따라서 다음 두 동작이 두 배가됩니다. 첫 번째 사본은 2다음 조치 를 두 배로 늘리며 다음 조치를 3해결하기 전에 완전히 해결해야합니다 2. 3트리플 의 첫 번째 사본과 트리플 의 세 B번째 사본 C. 이제 여전히 대기중인 두 번째 사본은 2다음으로 해결되지 않은 다음 조치 인 2 배가됩니다 D. 그 후에도 배가되거나 배가되는 효과가 없으며 최종 조치 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곱하지 않은 동작을 곱한 동작과 동일하게 처리하기 위해 스택 아래 에를 밀어 넣는 트릭이 마음에 듭니다. 다양한 스택을 저글링하는 방법에 대해 더 자세히 설명해 주시겠습니까? 특히 "rep 스택을 맨 위로 가져 오려면"어떻게해야합니까?
xnor

@ xnor 여기에 내장 참조가 있습니다. \는 스택에서 상위 두 항목을 바꿉니다.
피터 테일러

감사합니다. 각 스택 요소가 자체 스택이라는 것을 이해하지 못했습니다. 하나의 연결된 스택을 상상하고있었습니다.
xnor

@xnor, 각 스택 항목이 자체 스택은 아닙니다. 반복 스택은 배열 또는 문자열 (여전히 배열이지만 일부 내장에서는 다르게 처리됨)로 저장됩니다. 메인 루프가 끝나기 직전에 GS 스택 내용을 인쇄하는 디버그 데모 .
피터 테일러

4

자바 스크립트 - 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;
}

나는 스택 기반 골프 언어가 기본적으로 함수 스태킹의 연습이기 때문에이 언어를 죽일 것이라고 추측합니다. :피

샘플 출력

F('3N2BC3XY2')
"NNNBBCXXXY"

F('WA23G3GA')
"WAGGGGGGAAA"

F('A2A323AB2CD2D2E3ABC')
"AAAAAABBBCCDDDDEEAAABBBC"

F('322322ABCDEFGHIJKLMN')
"AABBCCDDEEEFFGGHHIJKLMN"

F('FY')
"FY"

F('')
""

1
함수에 대한 카드의 해석이 얼마나 정확한지에 놀랐습니다. 스택을 기대했지만 함수의 리터럴 호출 스택은 아닙니다! 함수를 여러 번 호출하는 더 간결한 방법이 없습니까? 더 나은 방법은 여러 번 2/3사례를 함께 처리하는 것입니까?
xnor

@ xnor : 나는 그것이 영리하다고 생각했다. ;) 당신의 제안에 관해서는, 직감이 정확했습니다. 10 바이트를 절약하기 위해 두 가지 경우를 결합했습니다. 이상적으로는 18이지만 Firefox의 버그라고 생각하는 것을 우연히 발견했습니다. 내부 람다 범위 x의 변수에 변수를 먼저 복사하지 않고 직접 조작 할 수 있어야 b하지만 Firefox는 루프 조건을 올바르게 평가하지 않습니다. 특히 x음수가되고 브라우저가 중단됩니다. 교체 시도 , b = x; b--;; x--;하고 입력을 실행합니다 A2A323AB2CD2D2E3ABC. 이것을 읽는 사람이 이유를 알아낼 수 있다면, ...
COTO

알고 싶습니다. 어쩌면 클로저가 작동하는 방식에 대해 뭔가 빠졌을 수도 있습니다.
COTO

3

C, 115111 바이트

표준 입 / 출력을 사용합니다.

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.