Löse Verdopplungs- und Verdreifachungsaktionen in Dominion

14

Inspiration

Diese Frage ist von den Karten Throne Room und King's Court aus dem beliebten Kartenspiel Dominion inspiriert .

Thronsaal Königshof

Als Teil des Zuges spielt man eine Abfolge von Aktionen. Diese beiden Aktionen bewirken, dass die nächste Aktion zwei- oder dreimal wiederholt wird *. Andere "generische" Aktionen verursachen bestimmte Spieleffekte, aber wir sind nicht an den Details interessiert, sondern kennzeichnen sie einfach mit Buchstaben.

Der interessante Fall ist, wenn ein Thronsaal oder ein Königshof einen anderen Thronsaal des Königshofs betrifft, wodurch sich der Verdopplungs- oder Verdreifachungseffekt verdoppelt oder verdreifacht. Lange Ketten von Thronsälen, Königshöfen und multiplizierten Aktionen können selbst erfahrene Dominion-Spieler verwirren.

Ihr Ziel ist es, Code zu schreiben, der diese Ketten korrekt auflöst, und dabei so wenig Bytes wie möglich zu verwenden. Ich werde die Programmanforderungen beschreiben, bevor ich erkläre, wie die Ketten in den Dominion-Regeln aufgelöst werden.

* Technisch gesehen wählen Sie die betroffene Aktion als Teil der Lösung von Thronsaal oder Königshof aus, aber diese Ansicht ist für diese Herausforderung besser geeignet.

Programmanforderungen

Schreiben Sie ein Programm oder eine benannte Funktion . Es sollte die gespielte Aktionskette (STDIN oder Funktionseingabe) einbeziehen und die resultierende Aktionskette aus den Auswirkungen der Verdopplung und Verdreifachung ausgeben oder ausdrucken. Wenigste Bytes gewinnt.

Eingang

Eine Zeichenfolge, die die Abfolge der ausgeführten Aktionen darstellt. Generisches Aktionen werden durch Großbuchstaben dargestellt Adurch Z. Die besondere Verdoppelungsaktion Thronsaal wird durch die Figur dargestellt 2, und die Verdreifachungsaktion Königshof durch 3:

Die Anzahl der Zeichen (Aktionen) liegt zwischen 1 und 30 einschließlich. Wenn Sie möchten, können Sie das Eingabeende in einer neuen Zeile einfügen.

Beispiel Eingabe: WA23G3GA

Ausgabe

Eine Folge von Großbuchstaben Aan Z. Dies sollte die Folge von generischen Aktionen sein, die sich aus der Beseitigung der Verdopplungs- und Verdreifachungseffekte in der Reihenfolge ergeben, in der sie auftreten.

Wenn Sie möchten, können Sie die Ausgabe in einer neuen Zeile beenden. Ansonsten sollten keine zusätzlichen Zeichen vorhanden sein.

Beispiel Ausgabe: WAGGGGGGAAA.

Wie das Verdoppeln und Verdreifachen im Dominion funktioniert

Hier gehe ich durch , wie Ketten des Thron Zimmer ( 2s) und den Königs Courts ( 3's) Arbeit gemäß den Dominion - Regeln.

Nachdem Sie eine gespielt haben 2, wird die nächste auszuführende Aktion zweimal ausgeführt. Also, wenn Sie zum ersten Mal spielen 2, dann A, Sie bekommen Ageschieht zweimal.

2A -> AA

Ähnlich,

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

Beachten Sie im letzten Beispiel, dass das Finale 2nichts zu verdoppeln hatte, so dass es keine Wirkung hatte.

Das Interessante passiert, wenn Doppel- oder Verdreifachungseffekte selbst verdoppelt oder verdreifacht werden. Beispielsweise,

22AB -> AABB

Zuerst spielst du 2. Dann spielen Sie einen anderen 2, der gegenüber dem vorherigen verdoppelt ist 2. Infolgedessen werden die nächsten beiden Aktionen verdoppelt. Erstens, die beiden Kopien der AAuflösung. Dann werden die Kopien aufgelöst B.

Beachten Sie, dass dies Anicht vervierfacht wird: Nach der ersten Kopie von 2Aktionen auf der ersten Awirkt die nächste Kopie auf die nächste nicht aufgelöste Aktion, nämlich B. Ohne die hätten Bwir

22A -> AA

Wobei die zweite Kopie von darauf 2wartet, dass sich die nächste Aktion verdoppelt, aber es kommt keine Aktion.

Schauen wir uns zum Schluss ein komplexes Beispiel an.

223BCDE -> BBBCCCDDE

Nach wie vor 2bewirkt der erste, dass der zweite 2verdoppelt wird. Die nächsten beiden Aktionen werden also verdoppelt. Die erste Kopie von 2verdoppelt die nächste Aktion3 , die vollständig aufgelöst werden muss, bevor die nächste Kopie von aufgelöst wird 2. Das erste Exemplar 3verdreifacht Bsich und das zweite Exemplar verdreifacht sich C. Jetzt 2verdoppelt die noch wartende zweite Kopie von die nächste noch ungelöste Aktion, nämlich D. Danach bleiben keine Verdopplungs- oder Verdreifachungseffekte mehr übrig, und die endgültige Aktion findet Eeinfach statt.

Testfälle

Diese sind gegeben als (input,output) .

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

Antworten:

5

GolfScript ( 29 26 Bytes)

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

Online-Demo

Präparation

Dies missbraucht leicht die lose Schreibweise von GolfScript. Der Stapel, wie oft nachfolgende Aktionen wiederholt werden sollen, beginnt als Array und verwandelt sich später in eine Zeichenfolge. Er 1+hängt jedoch eine 1 an und fügt (3&den ersten Wert ein und ordnet ihn unabhängig von der Typänderung korrekt in den Bereich 0to ein 3.

](         # 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
Peter Taylor
quelle
Ich mag deinen Trick, 1wenn du 's unter den Stapel drückst, um nicht multiplizierte Aktionen genauso zu behandeln wie multiplizierte. Könnten Sie bitte näher erläutern, wie Sie die verschiedenen Stapel unter einen Hut bringen? Was kann ich tun, um den Wiederholungsstapel nach oben zu bringen?
Xnor
@xnor, hier ist die eingebaute Referenz . \ tauscht die obersten zwei Elemente auf dem Stapel aus.
Peter Taylor
Vielen Dank, ich hatte nicht verstanden, dass jedes Stack-Element ein eigener Stack ist. Ich stellte mir einen einzelnen verketteten Stapel vor.
Xnor
@xnoder, es ist nicht so, dass jedes Stapelelement ein eigener Stapel ist. Es ist so, dass der Wiederholungsstapel als Array oder String gespeichert wird (was immer noch ein Array ist, aber von einigen Builtins anders behandelt wird). Debug-Demo, bei der der Inhalt des GS-Stacks kurz vor dem Ende der Hauptschleife gedruckt wird.
Peter Taylor
4

Javascript - 162 152 Bytes

Minimiert:

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

Erweitert:

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

Ich gehe davon aus, dass die Stack-basierten Golfsprachen in diesem Fall den Ausschlag geben werden, da es sich im Grunde um eine Übung im Function-Stacking handelt. : P

Beispielausgaben

F('3N2BC3XY2')
"NNNBBCXXXY"

F('WA23G3GA')
"WAGGGGGGAAA"

F('A2A323AB2CD2D2E3ABC')
"AAAAAABBBCCDDDDEEAAABBBC"

F('322322ABCDEFGHIJKLMN')
"AABBCCDDEEEFFGGHHIJKLMN"

F('FY')
"FY"

F('')
""
COTO
quelle
1
Ich bin überrascht, wie genau Ihre Interpretation von Karten als Funktionen übereinstimmt. Ich habe einen Stack erwartet, aber keinen wörtlichen Aufrufstack von Funktionen! Gibt es nicht eine präzisere Möglichkeit, eine Funktion mehrmals aufzurufen? Besser noch, eine variable Anzahl von Malen, um die 2/3Fälle gemeinsam zu behandeln?
Xnor
@xnor: Ich fand es klug. ;) Was deinen Vorschlag betrifft, war deine Intuition korrekt. Ich habe die beiden Fälle für eine Einsparung von 10 Bytes kombiniert. Es wäre idealerweise 18, aber ich bin über einen Fehler in Firefox gestolpert. Ich sollte in der Lage sein, xdirekt zu manipulieren, ohne es zuerst in eine Variable zu bkopieren, die für das innere Lambda bestimmt ist, aber Firefox wertet den Schleifenzustand nicht richtig aus. Insbesondere wird xnegativ und der Browser bleibt hängen. Versuchen Sie ersetzen , b = x; b--;mit ; x--;und den Eingang laufen A2A323AB2CD2D2E3ABC. Wenn jemand dies liest, kann er herausfinden, warum ...
COTO
Es würde mich sehr interessieren, es zu wissen. Vielleicht fehlt mir etwas darüber, wie die Verschlüsse funktionieren sollen.
COTO
3

C 115 111 Bytes

Verwendet Standardeingabe / -ausgabe.

4 gespeichert, memsetindem der Stapel mit und in die andere Richtung bewegt wird.

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

Ungolfed

#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;
}
Feersum
quelle
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)

Sist der Stapel von Multiplikatoren (oben wenn vorne). Es ist mit genug initialisiert1 , um nicht multiplizierte Aktionen zu verarbeiten.

Je nachdem, ob es sich bei der aktuellen Aktion cum eine allgemeine Aktion handelt oder nicht, wird das multiplizierte Ergebnis entweder zur Ausgabe Roder zum Multiplikatorstapel hinzugefügt S.

Alles wird als Zeichenfolge und nicht als Liste von Zeichen dargestellt. Da Strings unveränderlich sind, können wir sie leider nicht verwenden popoder ihnen Elemente zuweisen.

xnor
quelle