Terra Mystica: Sức mạnh đi xe đạp


28

Boardgame Terra Mystica có một số cơ chế rất thú vị cho một trong những tài nguyên chính, sức mạnh. Thay vì giành và tiêu tốn đơn vị sức mạnh từ ngân hàng, mỗi người chơi bắt đầu trò chơi với chính xác 12 đơn vị sức mạnh được phân bổ trên ba "bát", được gắn nhãn I, II và III. Đạt được và chi tiêu sức mạnh sau đó chỉ đơn giản là chuyển sức mạnh giữa các bát:

  • Để tiêu tốn một đơn vị năng lượng, hãy chuyển nó từ bát III sang bát I (miễn là bạn có một đơn vị trong bát III).
  • Khi bạn đạt được một đơn vị năng lượng, nếu có một đơn vị trong bát I, hãy chuyển nó sang bát II. Nếu không có đơn vị nào trong bát I, nhưng có một đơn vị trong bát II, hãy chuyển nó sang bát III. Nếu tất cả các đơn vị đã ở trong bát III, không có gì xảy ra.
  • Khi bạn đạt được hoặc chi tiêu nhiều đơn vị cùng một lúc, chúng được xử lý một đơn vị cùng một lúc.

Đây là một ví dụ. Giả sử, một người chơi bắt đầu với phân phối sức mạnh sau (được đưa ra theo thứ tự I | II | III):

5 | 7 | 0

Sức mạnh của họ thay đổi như sau nếu họ có được và tiêu tốn sức mạnh một vài lần:

               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)

Nhiệm vụ của bạn là tính toán kết quả của một sự kiện đạt được hoặc chi tiêu như vậy.

Các thách thức

Bạn được cung cấp bốn số nguyên làm đầu vào. Ba đầu tiên, I, II, III, đại diện cho lượng điện năng trong mỗi trong ba bát. Chúng sẽ không âm, và chúng sẽ có tổng bằng 12. Số thứ tư P, là lượng sức mạnh có được hoặc chi tiêu, và sẽ nằm trong phạm vi bao gồm [-III, 24](vì vậy bạn có thể cho rằng người chơi sẽ không bao giờ cố gắng tiêu tốn nhiều năng lượng hơn hơn hiện tại họ có thể, nhưng họ có thể đạt được nhiều sức mạnh hơn mức cần thiết để chuyển tất cả sức mạnh vào bát III).

Bạn có thể lấy các số này theo bất kỳ thứ tự nhất quán nào, làm đối số riêng biệt, làm danh sách các số nguyên hoặc dưới dạng chuỗi chứa các số nguyên này. Bạn cũng có thể Pnhư một đối số, như I, II, IIInhư một đối số danh mục riêng.

Bạn nên đầu ra ba số nguyên I', II', III'mà đại diện cho lượng điện năng trong mỗi bát sau khi P đơn vị được thu hoặc chi tiêu, theo các quy tắc giải thích ở trên.

Bạn có thể viết chương trình hoặc chức năng và sử dụng bất kỳ phương pháp tiêu chuẩn nào để nhận đầu vào và cung cấp đầu ra.

Bạn có thể sử dụng bất kỳ ngôn ngữ lập trình nào , nhưng lưu ý rằng các lỗ hổng này bị cấm theo mặc định.

Đây là , vì vậy câu trả lời hợp lệ ngắn nhất - được đo bằng byte - thắng.

Các trường hợp thử nghiệm

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
Tôi khuyên bạn nên loại bỏ các đại từ chỉ định giới tính và thay thế chúng bằng các đại từ trung tính giới tính (hoặc câu tái cấu trúc): các game thủ không phải là nam giới.
Greg Martin

1
@GregMartin Tất nhiên rồi. Tôi đã bắt được tất cả?
Martin Ender

2
Trông giống như nó; cảm ơn bạn đã suy nghĩ về nó Ngoài ra, liệu Terra Mystica có tuyệt vời như tôi từng nghe không?
Greg Martin

4
@GregMartin có. :)
Martin Ender

5
Không có bỏng điện từ bát 2? Điều này chỉ cảm thấy không đầy đủ.
thêm vào

Câu trả lời:


6

Toán học, 52 byte

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

Đây là một chức năng chưa được đặt tên, lấy danh sách {I, II, III, P}làm đầu vào và trả về danh sách {I', II', III'}.

Một giải pháp dạng kín. Nó không thực sự cảm thấy tối ưu ...


Nghĩ rằng tôi có thể rút ngắn, nhưng {##,12-+##}&[#-#4~Min~#,Max[#2+#-Abs[#4~Max~0-#],0]]&là một byte dài hơn. Tôi thích 12-+##mặc dù.
Greg Martin

1
@GregMartin Tôi đã thử điều tương tự :)
Martin Ender

6

C, 97 94 byte

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

Ở dạng vô thức:

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 byte

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

Dùng thử trực tuyến

Ung dung:

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 byte

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

Giá trị trung gian mbiểu thị lượng điện năng đi từ (hoặc đến, nếu âm) bát thứ nhất, zbiểu thị lượng điện năng trong bát thứ ba sau hành động. Tối ưu hóa một byte vào phút cuối đã thay đổi biểu thức cũ cho bát thứ hai từ 12-a+m-zviệc sử dụng danh tính a+b+c=12.

Loại kết quả tự nhiên là một bộ ba cho các bát, do đó, đầu vào cũng lấy các bát làm bộ ba và thay đổi công suất làm đối số thứ hai. Điều này cho phép xử lý tất cả các trường hợp thử nghiệm với một ứng dụng 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

Röda , 100 94 byte

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]}

Ung dung:

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 không có ++và các --nhà khai thác?
Kritixi Lithos

@KritixiLithos Cảm ơn! Có nó làm.
fergusq


3

GNU sed , 66 byte

Bao gồm +1 cho -r

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

Sử dụng unary (xem sự đồng thuận này ).

Hãy thử trực tuyến!

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

Võng mạc ,  46  41 39 38 byte

Cảm ơn Martin Ender cho nhiều gợi ý hữu ích!

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

Đưa đầu vào trong unary. Dòng đầu tiên chứa lượng năng lượng trong ba bát, được phân tách bằng dấu phẩy, dòng thứ hai lượng năng lượng cần chu kỳ.

Bộ kiểm tra - Đưa tất cả các đầu vào trên một dòng và chuyển đổi từ số thập phân sang đơn và ngược lại để thuận tiện cho việc sử dụng.

Giải trình

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

Trường hợp tích cực: chúng tôi liên tục loại bỏ đầu dẫn 1từ dòng thứ hai và chuyển a 1từ bát không rỗng đầu tiên sang bát tiếp theo, miễn là thao tác này có thể thực hiện được (tức là số công suất cho chu kỳ là khác không và không phải tất cả sức mạnh là trong bát thứ ba). Công cụ ssửa đổi có nghĩa là single-line, cho phép .khớp với dòng mới.

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

Trường hợp tiêu cực: thực hiện tất cả trong một bước, di chuyển lượng điện năng được chỉ định bởi đầu vào cuối cùng từ bát thứ ba sang bát thứ nhất. Điều này cũng sẽ loại bỏ dòng chứa lượng năng lượng âm để di chuyển.

G`,

Giữ (grep) chỉ các dòng có dấu phẩy. Điều này sẽ thoát khỏi phần còn lại cuối cùng của dòng đầu tiên.



2

Mẻ, 87 byte

@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%

Sử dụng các công thức sau:

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

Vì Batch không có toán tử nhỏ hơn toán tử, tôi tính toán i = min(-i, 0)bằng cách sử dụng i*=i>>5.


2

Perl 6 , 99 byte

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

Gọi a, bclà số lượng mã thông báo bắt đầu trong các bát I, II và III tương ứng. Sau đó, đối với trường hợp thêm sức mạnh, một danh sách được tạo có chứa các abản sao của bộ ba (-1, 1, 0), tiếp theo là các a + bbản sao của bộ ba (0, -1, 1), tiếp theo là các bản sao vô hạn của 0. Các dyếu tố đầu tiên của danh sách này, dlà lượng năng lượng cần thêm, được thêm vào từng phần cho phân phối công suất bắt đầu.

Để trừ công suất (âm d), một dạng đóng đơn giản được sử dụng : (a - d, b, c + d).


2

tinylisp , 134 byte

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

Xác định hàm fcó bốn đối số, ba bát ( x y z) và lượng điện năng được giao dịch ( p) và trả về danh sách ba bát sau giao dịch. Đây là một phiên bản đúng cách với tất cả các trường hợp thử nghiệm: Hãy thử trực tuyến!

(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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.