Dominion'daki ikiye katlama ve üçleme eylemlerini çözme


14

İlham

Bu soru, popüler güverte binası kart oyunu Dominion'dan Throne Room ve King's Court kartlarından esinlenmiştir .

Taht odası Kral Mahkemesi

Sırasının bir parçası olarak, kişi bir dizi eylem oynar. Bu iki özel eylem, bir sonraki oynatılan eylemin iki veya üç kez tekrarlanmasını sağlar *. Diğer "genel" eylemler belirli oyun efektlerine neden olur, ancak ayrıntılarla ilgilenmeyeceğiz, sadece harflerle etiketleyeceğiz.

İlginç durum, bir Taht Odası veya Kral Mahkemesi'nin, Kral Mahkemesi'nin başka bir Taht Odası'nı etkilemesi ve bunun iki katına veya üç katına çıkmasının etkisinin iki katına veya üç katına çıkmasıdır. Taht Odaları, Kral Mahkemeleri ve çoğaltılmış eylemlerin uzun zincirleri, deneyimli Dominion oyuncularını bile karıştırabilir.

Amacınız, mümkün olduğunca az bayt kullanarak bu zincirleri doğru bir şekilde çözen kod yazmaktır. Zincirlerin Dominion kurallarında nasıl çözüldüğünü açıklamadan önce program gereksinimlerini açıklayacağım.

* Teknik olarak, Taht Odası veya Kral Mahkemesi'nin çözümünün bir parçası olarak etkilenen eylemi seçersiniz, ancak bu görüş bu meydan okuma için daha temizdir.

Program Gereksinimleri

Bir program veya adlandırılmış işlev yazın . Oynanan eylemler zincirini (STDIN veya fonksiyon girişi) almalı ve ortaya çıkan eylem zincirini ikiye katlama ve üçleme etkilerinden çıktı almalı veya yazdırmalıdır. En az bayt kazanır.

Giriş

Oynanan eylemlerin sırasını temsil eden bir dize. Genel eylemler Aaracılığıyla büyük harfler ile temsil edilir Z. Taht Odası karakteri ile temsil edilir özel katlama eylem 2ve üç kat eylem tarafından Kral Mahkemesi 3,

Karakter sayısı (eylemler) 1 ile 30 arasında (dahil) olacaktır. İsterseniz giriş satırını yeni satırda görebilirsiniz.

Örnek girdi: WA23G3GA

Çıktı

Büyük harflerle ve bir dizi Aiçin Z. Bu, ikiye katlama ve üçe katlama etkilerinin gerçekleştiklerinden sırayla çözülmesinden kaynaklanan genel eylem dizisi olmalıdır.

İsterseniz çıktının yeni satırda bitmesini sağlayabilirsiniz. Aksi takdirde ek karakter olmamalıdır.

Örnek çıkışı: WAGGGGGGAAA.

Dominion'da iki kat ve üç kat nasıl çalışır

Burada, Taht Odaları 2ve Kral Mahkemelerinin zincirlerinin 3Dominion kurallarına göre nasıl çalışacağını inceleyeceğim.

A oynadıktan sonra 2, çözülecek bir sonraki eylem iki kez gerçekleşir. İlk oynamak Yani, eğer 2, o zaman A, sen olsun Aiki kez oluyor.

2A -> AA

Benzer şekilde,

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

Son örnekte, finalin 2iki katına çıkacak bir şey olmadığını, bu yüzden bir etkisi olmadığını unutmayın.

İlginç olan şey, ikiye katlama veya üçe katlama etkileri kendileri iki veya üçe katlandığında olur. Örneğin,

22AB -> AABB

İlk önce siz oynuyorsunuz 2. Sonra, bir 2öncekinden iki katına çıkan bir tane oynarsınız 2. Sonuç olarak, sonraki iki eylem iki katına çıkar. İlk olarak, çözümün iki kopyası A. Sonra, Bçözüm kopyaları .

Not Ailk kopyasını sonra: dört katına değildir 2ilk on eylemleri A, sonraki kopyasıdır sonraki çözülmemiş eylem, hareket eden B. Olmadan B, biz olurdu

22A -> AA

Burada ikinci kopyası bir 2sonraki işlemin iki katına çıkmasını bekliyor, ancak herhangi bir işlem yapılmıyor.

Son olarak, karmaşık bir örneğe bakalım.

223BCDE -> BBBCCCDDE

Daha önce olduğu gibi, birincisi 2ikincisinin 2ikiye katlanmasına neden olur . Böylece, sonraki iki eylem ikiye katlanacak. İlk kopyası , sonraki kopyasını çözmeden önce tamamen çözülmesi gereken bir 2sonraki işlemi iki katına çıkarır . İlk kopya üçe , ikinci kopya üçe . Şimdi, hala bekleyen ikinci kopyası , bir sonraki hala çözülmemiş eylemi ikiye katlıyor . Bundan sonra iki katına çıkma veya üçe katlama etkisi kalmaz ve son eylem basitçe gerçekleşir.323BC2DE

Test senaryoları

Bunlar olarak verilmiştir (input,output).

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

Yanıtlar:


5

GolfScript ( 29 26 bayt)

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

Çevrimiçi demo

teşrih

Bu, GolfScript'in gevşek yazımını biraz kötüye kullanır. Sonraki eylemleri tekrarlamak kaç kez yığını bir dizeye bir dizi ve sonraki dönüşler olarak başlar - ama 1+bir 1 ekler ve (3&ilk değer ve aralıkta doğru koyar o çıkar 0için 3bakılmaksızın tip değişikliği.

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

1Çoğaltılmamış eylemleri çoğaltılmış eylemlerle aynı şekilde işlemek için yığının altına itme hilenizi seviyorum . Çeşitli yığınları nasıl dengeleyeceğiniz hakkında daha fazla bilgi verebilir misiniz? Özellikle, \ "rep yığınını en üste getirmek" ne yapar?
xnor

@xnor, işte yerleşik referans . \ yığındaki ilk iki öğeyi değiştirir.
Peter Taylor

Teşekkürler, her yığın öğesinin kendi yığını olduğunu anlamamıştım; Tek bir birleştirilmiş yığın hayal ediyordum.
xnor

@xnor, her yığın öğesinin kendi yığını olmadığı anlamına gelmez; yineleme yığınının bir dizi veya dize olarak saklanmasıdır (bu hala bir dizidir, ancak bazı yerleşikler tarafından farklı şekilde işlenir). GS yığın içeriğini ana döngünün bitiminden hemen önce yazdıran demoda hata ayıklama .
Peter Taylor

4

Javascript - 162152 bayt

minified:

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

Expanded:

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

Yığın tabanlı golf dillerinin bu konuda öldüreceğini tahmin ediyorum, çünkü temelde fonksiyon istiflemede bir egzersiz. : P

Örnek Çıktılar

F('3N2BC3XY2')
"NNNBBCXXXY"

F('WA23G3GA')
"WAGGGGGGAAA"

F('A2A323AB2CD2D2E3ABC')
"AAAAAABBBCCDDDDEEAAABBBC"

F('322322ABCDEFGHIJKLMN')
"AABBCCDDEEEFFGGHHIJKLMN"

F('FY')
"FY"

F('')
""

1
Kartların fonksiyon olarak yorumlanmasının ne kadar paralel olduğuna şaşırıyorum. Bir yığın bekliyordum, ancak işlevlerin tam bir çağrı yığını değil! Bir işlevi birden çok kez çağırmanın daha kısa bir yolu yok mu? Daha da iyisi, 2/3vakaları birlikte ele almak için değişken sayıda ?
xnor

@xnor: Akıllı olduğunu düşündüm. ;) Öneriye gelince, sezginiz doğruydu. İki kasayı 10 bayt tasarruf için birleştirdim. İdeal olarak 18 olurdu ama Firefox'ta bir hata olduğuna inandığım şey üzerinde tökezledim. xİlk önce biç lambda için bir değişkene kopyalanmadan doğrudan manipüle edebilmeliyim , ancak Firefox döngü durumunu doğru bir şekilde değerlendirmiyor. Özellikle, xnegatif gider ve tarayıcı kilitlenir. Değiştirmeyi deneyin , b = x; b--;ile ; x--;ve giriş çalıştırın A2A323AB2CD2D2E3ABC. Bunu okuyan herkes nedenini anlayabilir, ...
COTO

... bilmek isterim. Belki de kapakların nasıl çalışması gerektiği konusunda bir şey eksik.
COTO

3

Cı, 115 111 bayt

Standart giriş / çıkış kullanır.

memsetYığını kullanarak ve diğer yöne çevirerek 4 kaydedildi .

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

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)

Sçarpan yığınıdır (önden üstte). 1Çarpılmamış eylemleri yerine getirmek için yeterli 'ler ile başlatıldı .

Geçerli eylemin cgenel olup olmamasına bağlı olarak , çarpılan sonucunu çıktıya Rveya çarpan yığınına ekleriz S.

Her şey bir karakter listesi yerine bir dize olarak temsil edilir. Dizeler değişmez olduğundan, maalesef popüzerinde atama yapamayız ya da öğe ataması yapamayız .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.