Giải quyết các hành động nhân đôi và nhân ba trong Dominion


14

Cảm hứng

Câu hỏi này được lấy cảm hứng từ các lá bài Throne Room và King Court từ trò chơi bài xây dựng bài nổi tiếng Dominion .

Phòng ngai vàng Tòa án của vua

Là một phần của lượt chơi, một người chơi một chuỗi các hành động. Hai hành động cụ thể này khiến hành động được phát tiếp theo lặp lại hai hoặc ba lần *. Các hành động "chung chung" khác gây ra hiệu ứng trò chơi cụ thể, nhưng chúng tôi sẽ không quan tâm đến các chi tiết, chỉ cần gắn nhãn chúng bằng các chữ cái.

Trường hợp thú vị là khi một Phòng ngai vàng hoặc Tòa án của nhà vua ảnh hưởng đến một Phòng ngai vàng khác của Tòa án Vua, khiến cho hiệu ứng nhân đôi hoặc tăng gấp ba lần tự nó tăng gấp đôi hoặc gấp ba. Những chuỗi dài của Throne Rooms, King Court và nhiều hành động có thể gây nhầm lẫn ngay cả những người chơi Dominion có kinh nghiệm.

Mục tiêu của bạn là viết mã giải quyết chính xác các chuỗi này, sử dụng càng ít byte càng tốt. Tôi sẽ mô tả các yêu cầu của chương trình trước khi giải thích cách các chuỗi giải quyết trong các quy tắc Thống trị.

* Về mặt kỹ thuật, bạn chọn hành động bị ảnh hưởng như là một phần của việc giải quyết Throne Room hoặc King Court, nhưng quan điểm này rõ ràng hơn cho thử thách này.

Yêu cầu chương trình

Viết chương trình hoặc hàm được đặt tên . Nó sẽ nhận chuỗi hành động đã chơi (STDIN hoặc chức năng nhập) và xuất hoặc in chuỗi hành động kết quả từ hiệu ứng nhân đôi và nhân ba. Ít byte nhất sẽ thắng.

Đầu vào

Một chuỗi đại diện cho chuỗi các hành động được chơi. Hành động chung được thể hiện bằng chữ in hoa Athông qua Z. Phòng hành động nhân đôi đặc biệt được đại diện bởi nhân vật 2, và Tòa án hành động tăng gấp ba lần bởi 3,

Số lượng ký tự (hành động) sẽ nằm trong khoảng từ 1 đến 30. Bạn có thể có kết thúc đầu vào trong một dòng mới nếu bạn muốn.

Ví dụ đầu vào: WA23G3GA

Đầu ra

Một chuỗi các chữ in hoa Ađể Z. Đây phải là chuỗi các hành động chung dẫn đến việc giải quyết các hiệu ứng nhân đôi và nhân ba, theo thứ tự hơn là chúng xảy ra.

Bạn có thể có đầu ra kết thúc trong một dòng mới nếu bạn muốn. Không nên có thêm nhân vật khác.

Ví dụ đầu ra : WAGGGGGGAAA.

Cách thức nhân đôi và nhân ba trong Dominion

Ở đây, tôi sẽ xem xét cách các chuỗi phòng Throne ( 2và) Tòa án của nhà vua 3hoạt động theo các quy tắc thống trị.

Sau khi bạn chơi a 2, hành động tiếp theo được giải quyết xảy ra hai lần. Vì vậy, nếu bạn lần đầu tiên chơi 2, sau đó A, bạn sẽ Axảy ra hai lần.

2A -> AA

Tương tự

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

Lưu ý trong ví dụ cuối cùng rằng trận chung kết 2không có gì để nhân đôi, vì vậy nó không có hiệu lực.

Điều thú vị xảy ra khi hiệu ứng nhân đôi hoặc nhân ba tăng gấp đôi hoặc gấp ba. Ví dụ,

22AB -> AABB

Đầu tiên, bạn chơi 2. Sau đó, bạn chơi một cái khác 2, được nhân đôi so với trước 2. Kết quả là hai hành động tiếp theo được nhân đôi. Đầu tiên, hai bản sao Agiải quyết. Sau đó, các bản sao Bgiải quyết.

Lưu ý rằng Akhông được tăng gấp bốn lần: sau bản sao đầu tiên của 2hành vi trên bản đầu tiên A, bản sao tiếp theo tác động lên hành động chưa được giải quyết tiếp theo, đó là B. Không có B, chúng ta sẽ có

22A -> AA

trong đó bản sao thứ hai 2đang chờ hành động tiếp theo tăng gấp đôi, nhưng không có hành động nào xuất hiện.

Cuối cùng, hãy xem xét một ví dụ phức tạp.

223BCDE -> BBBCCCDDE

Như trước đây, lần thứ nhất 2khiến lần thứ hai 2được nhân đôi. Vì vậy, hai hành động tiếp theo sẽ được nhân đôi. Bản sao đầu tiên nhân 2đôi hành động tiếp theo 3, phải được giải quyết hoàn toàn trước khi giải quyết bản sao tiếp theo 2. Bản sao đầu tiên của 3bộ ba B, và bản sao thứ ba C. Bây giờ, bản sao thứ hai vẫn đang chờ đợi nhân 2đôi hành động vẫn chưa được giải quyết tiếp theo, đó là D. Sau này, không còn hiệu ứng nhân đôi hoặc nhân ba, và hành động cuối cùng Echỉ đơn giản là xảy ra.

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

Chúng được đưa ra như (input,output).

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

Câu trả lời:


5

GolfScript ( 29 26 byte)

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

Bản demo trực tuyến

Mổ xẻ

Điều này hơi lạm dụng việc gõ lỏng GolfScript. Chồng bao nhiêu lần để lặp lại những hành động tiếp theo bắt đầu ra như là một mảng và lần lượt sau đó thành một chuỗi - nhưng 1+gắn thêm một 1 và (3&bật giá trị đầu tiên và chính xác đặt nó trong phạm vi 0để 3không phụ thuộc vào sự thay đổi kiểu.

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

Tôi thích mánh khóe của bạn trong việc đẩy 1các ngăn xếp để xử lý các hành động không nhân giống như các hành động nhân lên. Bạn có thể vui lòng giải thích thêm về cách bạn sắp xếp các ngăn xếp khác nhau? Cụ thể, \ làm gì để "đưa ngăn xếp rep lên đầu"?
xnor

@xnor, đây là tài liệu tham khảo nội dung . \ hoán đổi hai mục trên cùng trên ngăn xếp.
Peter Taylor

Cảm ơn, tôi đã không hiểu rằng mỗi phần tử ngăn xếp là ngăn xếp riêng của nó; Tôi đã tưởng tượng ra một chồng ghép đơn.
xnor

@xnor, không phải mỗi mục stack là ngăn xếp riêng của nó; đó là ngăn xếp lặp lại được lưu trữ dưới dạng một mảng hoặc một chuỗi (vẫn là một mảng, nhưng được xử lý khác nhau bởi một số nội trang). Bản demo gỡ lỗi in nội dung ngăn xếp GS ngay trước khi kết thúc vòng lặp chính.
Peter Taylor

4

Javascript - 162 152 byte

Giảm thiểu:

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

Mở rộng:

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

Tôi đoán các ngôn ngữ golf dựa trên ngăn xếp sẽ giết chết ngôn ngữ này, vì về cơ bản, đây là một bài tập về xếp chồng chức năng. : P

Đầu ra mẫu

F('3N2BC3XY2')
"NNNBBCXXXY"

F('WA23G3GA')
"WAGGGGGGAAA"

F('A2A323AB2CD2D2E3ABC')
"AAAAAABBBCCDDDDEEAAABBBC"

F('322322ABCDEFGHIJKLMN')
"AABBCCDDEEEFFGGHHIJKLMN"

F('FY')
"FY"

F('')
""

1
Tôi ngạc nhiên về cách chính xác sự diễn giải của bạn về các thẻ như các chức năng. Tôi mong đợi một ngăn xếp, nhưng không phải là một ngăn xếp cuộc gọi theo nghĩa đen! Có cách nào ngắn gọn hơn để gọi một hàm nhiều lần không? Tốt hơn nữa, một số lần thay đổi để xử lý các 2/3trường hợp với nhau?
xnor

@xnor: Tôi nghĩ nó thật thông minh. ;) Đối với đề xuất của bạn, trực giác của bạn là chính xác. Tôi đã kết hợp hai trường hợp để tiết kiệm 10 byte. Nó lý tưởng sẽ là 18 nhưng tôi đã vấp phải những gì tôi tin là một lỗi trong Firefox. Tôi có thể thao tác xtrực tiếp mà không cần sao chép nó vào một biến trong bphạm vi lambda bên trong, nhưng Firefox không đánh giá đúng điều kiện vòng lặp. Cụ thể, xđi tiêu cực và trình duyệt bị treo. Hãy thử thay thế , b = x; b--;bằng ; x--;và chạy đầu vào A2A323AB2CD2D2E3ABC. Nếu bất cứ ai đọc điều này có thể hiểu tại sao, ...
COTO

... Tôi rất muốn biết. Có lẽ tôi đang thiếu một cái gì đó về cách đóng cửa được cho là hoạt động.
COTO

3

C, 115 111 byte

Sử dụng đầu vào / đầu ra tiêu chuẩn.

Lưu 4 bằng cách sử dụng memsetvà làm cho ngăn xếp đi theo hướng khác.

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

Ung dung

#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

Con trăn (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)

Slà chồng số nhân (trên cùng nếu ở phía trước). Nó được khởi tạo với đủ 1để xử lý các hành động thiếu kỷ luật.

Tùy thuộc vào việc hành động hiện tại ccó chung chung hay không, chúng tôi thêm kết quả nhân của nó vào đầu ra Rhoặc vào ngăn xếp bội số S.

Tất cả mọi thứ được thể hiện dưới dạng một chuỗi chứ không phải là một danh sách các ký tự. Vì các chuỗi là bất biến, rất tiếc, chúng tôi không thể sử dụng pophoặc gán phần tử cho chúng.

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.