W grze Dominion rozwiązuj działania podwojenia i potrojenia


14

Inspiracja

To pytanie jest inspirowane kartami Sala Tronowa i King's Court z popularnej gry karcianej Dominion .

Sala tronowa Dwór Króla

W ramach swojej tury wykonuje się sekwencję akcji. Te dwie szczególne akcje powodują, że kolejna gra powtarza się dwa lub trzy razy *. Inne „ogólne” działania powodują określone efekty w grze, ale nie będziemy zainteresowani szczegółami, po prostu oznaczając je literami.

Interesujący jest przypadek, gdy Sala Tronowa lub Dwór Królewski wpływa na inną Salę Tronową Dworu Królewskiego, powodując podwojenie lub potrojenie efektu podwojenia lub potrojenia. Długie łańcuchy Sal Tronowych, Sądy Króla i zwielokrotnione akcje mogą dezorientować nawet doświadczonych graczy Dominium.

Twoim celem jest napisanie kodu, który poprawnie rozwiąże te łańcuchy, używając jak najmniej bajtów. Opiszę wymagania programu przed wyjaśnieniem, w jaki sposób łańcuchy rozwiązują reguły Dominium.

* Technicznie rzecz biorąc, wybierasz akcję, której dotyczy problem w ramach rozpatrywania sali tronowej lub królewskiego dworu, ale ten widok jest bardziej przejrzysty w przypadku tego wyzwania.

Wymagania programowe

Napisz program lub nazwaną funkcję . Powinien przyjmować łańcuch wykonanych akcji (STDIN lub wejście funkcji) i generować lub drukować wynikowy łańcuch działań na podstawie efektów podwojenia i potrojenia. Wygrywa najmniej bajtów.

Wejście

Ciąg reprezentujący sekwencję odtwarzanych akcji. Działania ogólne są reprezentowane przez wielkie litery Aza pomocą Z. Specjalna akcja podwajania Sala tronowa jest reprezentowana przez postać 2, a potrójna akcja Królewski Dwór przez 3,

Liczba znaków (akcji) będzie wynosić od 1 do 30 włącznie. Jeśli chcesz, możesz wprowadzić koniec w nowej linii.

Przykładowe dane wejściowe: WA23G3GA

Wynik

Ciąg wielkich liter Ado Z. Powinna to być sekwencja działań ogólnych, które wynikają z rozwiązania efektu podwojenia i potrojenia w kolejności, w jakiej występują.

Jeśli chcesz, możesz mieć koniec wyjściowy w nowej linii. W przeciwnym razie nie powinno być żadnych dodatkowych znaków.

Przykład Wydajność: WAGGGGGGAAA.

Jak działa podwojenie i potrojenie w Dominion

Tutaj omówię, jak działają sieci pokojów tronowych 2i sądy królewskie 3zgodnie z zasadami Dominium.

Po zagraniu a 2następna akcja, która ma zostać rozstrzygnięta, odbywa się dwa razy. Jeśli więc po raz pierwszy zagrasz 2, zdarzy Asię Ato dwa razy.

2A -> AA

Podobnie,

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

Zauważ w ostatnim przykładzie, że finał 2nie miał nic do podwojenia, więc nie miał żadnego efektu.

Interesująca rzecz dzieje się, gdy efekty podwojenia lub potrojenia same się podwoją lub potroją. Na przykład,

22AB -> AABB

Najpierw grasz 2. Następnie grasz w inną 2, która jest podwojona w stosunku do poprzedniej 2. W rezultacie kolejne dwa działania są podwojone. Po pierwsze, dwie kopie Apostanowienia. Następnie kopie Bpostanowienia.

Zauważ, że Anie jest czterokrotnie: po pierwszej kopii 2aktów pierwszego A, kolejna kopia działa na następną nierozwiązaną akcję, czyli B. Bez tego Bmielibyśmy

22A -> AA

gdzie druga kopia 2oczekuje na podwojenie następnej akcji, ale żadna akcja nie nadchodzi.

Na koniec spójrzmy na złożony przykład.

223BCDE -> BBBCCCDDE

Tak jak poprzednio, pierwszy 2powoduje 2podwojenie drugiego . Kolejne dwa działania zostaną podwojone. Pierwsza kopia 2podwaja kolejną akcję 3, którą należy rozwiązać całkowicie przed rozpatrzeniem kolejnej kopii 2. Pierwsza kopia 3trójek B, a druga kopia trójek C. Teraz, jeszcze czekająca druga kopia 2podwaja kolejną wciąż nierozwiązaną akcję, czyli D. Po tym nie zostają już żadne efekty podwojenia lub potrojenia, a ostateczna akcja Epo prostu się dzieje.

Przypadki testowe

Są one podane jako (input,output).

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

Odpowiedzi:


5

GolfScript ( 29 26 bajtów)

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

Demo online

Sekcja

To nieznacznie narusza luźne pisanie GolfScript. Stos ile razy powtórzyć kolejne czynności rozpoczyna się w postaci tablicy i później zamienia się w ciąg - ale 1+dołącza 1 i (3&wyskakuje pierwszą wartość i poprawnie umieszcza go w zakresie 0do 3niezależnie od zmiany typu.

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

Podoba mi się twoja sztuczka polegająca na pchaniu 1pod stos, aby traktować nieprzemnożone akcje tak samo jak pomnożone. Czy mógłbyś wyjaśnić więcej na temat żonglowania różnymi stosami? W szczególności, co \ robi, aby „przenieść stos powtórzeń na szczyt”?
xnor

@ xnor, oto odniesienie do poleceń wbudowanych . \ zamienia dwa górne elementy na stosie.
Peter Taylor

Dzięki, nie zrozumiałem, że każdy element stosu był własnym stosem; Wyobrażałem sobie jeden połączony stos.
xnor

@ xnor, nie jest tak, że każdy element stosu jest własnym stosem; polega na tym, że stos powtórzeń jest przechowywany jako tablica lub ciąg znaków (który wciąż jest tablicą, ale jest różnie traktowany przez niektóre funkcje wbudowane). Debuguj demo, które drukuje zawartość stosu GS tuż przed końcem głównej pętli.
Peter Taylor

4

JavaScript - 162 152 bajtów

Zminimalizowane:

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

Rozszerzony:

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

Domyślam się, że języki golfa oparte na stosie zabiją ten język, ponieważ jest to w zasadzie ćwiczenie układania funkcji. : P

Przykładowe dane wyjściowe

F('3N2BC3XY2')
"NNNBBCXXXY"

F('WA23G3GA')
"WAGGGGGGAAA"

F('A2A323AB2CD2D2E3ABC')
"AAAAAABBBCCDDDDEEAAABBBC"

F('322322ABCDEFGHIJKLMN')
"AABBCCDDEEEFFGGHHIJKLMN"

F('FY')
"FY"

F('')
""

1
Jestem zaskoczony, jak dokładna jest twoja interpretacja kart jako funkcji. Spodziewałem się stosu, ale nie dosłownego stosu funkcji! Czy nie ma bardziej zwięzłego sposobu wielokrotnego wywoływania funkcji? Jeszcze lepiej, różna liczba razy, aby 2/3wspólnie rozpatrywać sprawy?
xnor

@xnor: Myślałem, że to sprytne. ;) Jeśli chodzi o twoją sugestię, twoja intuicja była poprawna. Połączyłem oba przypadki, aby uzyskać oszczędność 10 bajtów. Idealnie byłoby 18, ale natknąłem się na coś, co uważam za błąd w Firefoksie. Powinienem być w stanie xbezpośrednio manipulować bez uprzedniego kopiowania go do zmiennej o bzasięgu do wewnętrznej lambda, ale Firefox nie ocenia poprawnie stanu pętli. W szczególności xjest ujemny i przeglądarka zawiesza się. Spróbuj wymienić , b = x; b--;z ; x--;i uruchomić wejście A2A323AB2CD2D2E3ABC. Jeśli ktoś to przeczyta, może dowiedzieć się, dlaczego ...
COTO

... bardzo chciałbym wiedzieć. Może brakuje mi czegoś na temat tego, jak powinny działać zamknięcia.
COTO

3

C, 115 111 bajtów

Wykorzystuje standardowe wejście / wyjście.

Zaoszczędzono 4, używając memseti sprawiając, że stos idzie w przeciwnym kierunku.

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

Nie golfił

#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

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

Sto stos mnożników (góra jeśli przód). Jest zainicjowany z wystarczającą liczbą 1, aby obsłużyć nieprzemnożone akcje.

W zależności od tego, czy bieżąca akcja cjest ogólna, czy nie, dodajemy jej zwielokrotniony wynik albo do wyniku, albo do Rstosu mnożników S.

Wszystko jest reprezentowane jako ciąg znaków, a nie lista znaków. Ponieważ ciągi są niezmienne, nie możemy niestety używać popani przypisywać do nich elementów.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.