Terra Mystica : 사이클링 파워


28

보드 게임 Terra Mystica 는 주요 자원 중 하나 인 힘에 대한 매우 흥미로운 메커니즘을 가지고 있습니다. 각 플레이어는 은행에서 전력을 얻고 소비하는 대신, I, II 및 III으로 표시된 3 개의 "볼 (bowl)"에 분산 된 정확히 12 개의 전력으로 게임을 시작합니다. 그런 다음 전력을 얻고 소비하면 단순히 다음 그릇 사이에서 전력이 이동합니다.

  • 전력을 소비하려면 용기 III에서 용기 I로 옮깁니다 (볼 III에 장치가있는 경우).
  • 힘의 단위를 얻을 때, 그릇 I에 장치가 있으면, 그릇 II로 옮깁니다. 그릇 I에 장치가 없지만 그릇 II에 장치가 있으면 그릇 III으로 옮깁니다. 모든 유닛이 이미 보울 III에 있다면 아무 일도 일어나지 않습니다.
  • 한 번에 여러 유닛을 얻거나 소비하면 한 번에 한 유닛 씩 처리됩니다.

다음은 예입니다. 예를 들어, 플레이어는 다음과 같은 배전 (순서대로 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 개의 정수가 제공됩니다. 처음 세, I, II, III, 세 그릇에 각각 전력의 양을 나타낸다. 네거티브 숫자는 음수가 아니고 12에 합산됩니다. 네 번째 숫자 P는 얻거나 소비 한 전력의 양이며 포함 범위에 있습니다 [-III, 24](따라서 플레이어가 더 많은 힘을 쓰려고하지 않을 것이라고 가정 할 수 있음) 그들은 현재 할 수있는 것보다 더 많은 힘을 얻고있을 것입니다.

이 숫자는 일관된 순서로 별도의 인수, 정수 목록 또는 이러한 정수를 포함하는 문자열로 사용할 수 있습니다. 또한 취할 수 P로, 하나 개의 인수로 I, II, III별도의리스트 인수로.

당신은 출력 세 정수는해야한다 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
성별에 따른 대명사를 삭제하고 성별에 중립적 인 대명사로 바꾸는 것이 좋습니다. 게이머는 남성 일 필요는 없습니다.
Greg Martin

1
@GregMartin 물론입니다. 내가 그들을 모두 잡았습니까?
마틴 엔더

2
그 것처럼 보인다; 생각해 주셔서 감사합니다! 또한, Terra Mystica는 내가들은 것만 큼 훌륭합니까?
Greg Martin

4
@GregMartin 예. :)
Martin Ender

5
보울 2에서 전원 화상이 없습니까? 이것은 단지 불완전한 느낌입니다.
moreON

답변:


6

매스 매 티카, 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-+##.
Greg Martin

1
@GregMartin 나는 같은 것을 시도했다 :)
Martin Ender

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

파이썬 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

하스켈, 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힘의 양을 나타내며, 동작 후 세 번째 보울의 힘을 나타냅니다. 마지막 1 바이트 최적화로 두 번째 보울의 이전 표현식 12-a+m-z이 ID 사용 을 변경했습니다 a+b+c=12.

자연적인 결과 유형은 보울의 3 배이므로 입력도 보울을 3 배로하고 전력 변화를 두 번째 인수로 사용합니다. 이를 통해 하나의 응용 프로그램으로 모든 테스트 사례를 처리 할 수 ​​있습니다 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
}

Röda에는 ++--연산자가 없습니까?
Kritixi Lithos

@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`,

단항으로 입력합니다. 첫 번째 줄에는 세 개의 보울에있는 전력량 (쉼표로 구분)이 있고 두 번째 줄에는 순환 할 전력량이 포함됩니다.

테스트 스위트 -모든 입력을 한 줄로 가져오고 사용 편의성을 위해 10 진수에서 1 진수로 또는 그 반대로 변환합니다.

설명

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

긍정적 인 경우 : 우리 1는 두 번째 라인에서 리딩 을 반복적으로 제거 1하고이 작업이 가능한 한 비어 있지 않은 첫 번째 보울에서 다음 보울로 이동 합니다 (즉, 사이클링하는 전력의 수가 0이 아니고 전부는 아닙니다) 힘은 세 번째 그릇에 있습니다). s수정 수단은 single-line, 허용 .도 줄 바꿈에 맞게.

(.*)(1+)¶-\2$
$2$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

펄 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)}

하자 a, bcI, 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(

f네 개의 인수, 세 개의 보울 ( x y z) 및 처리 된 전력량 ( ) 을 취하는 함수 를 정의하고 트랜잭션 p후 세 개의 보울 목록을 반환합니다. 다음은 모든 테스트 사례와 함께 올바르게 배치 된 버전입니다. 온라인으로 사용해보십시오!

(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.