Oynat Zip, Zap, Zop


22

Kendinizi bir daireye yerleştirip, sırayla bir sonraki kelimeyi söyleyerek ve sırayla bir sonraki kelimeyi söyleyerek fermuar, zap ve zop gönderdiğiniz küçük bir ısınma oyunu var, o zaman hepiniz ısınana veya her neyse.

Göreviniz, bir sonraki sözcüğü bir giriş sözcüğü verilen sırada veren bir program oluşturmaktır. (Zip -> Zap -> Zop -> Zip) Kendilerine eklenebilecek bu üç kelimeyi ve heceyi söylemenin birçok farklı yolu olduğundan, programınız harf ve harf çoğaltmasını taklit etmeli ve sonekleri taşımalıdır.

Ayrıntılı olarak, girişiniz bir veya daha fazla Zs, sonra bir veya daha fazla Is, As veya Os (tümü aynı harf), sonra bir veya daha fazla Ps, (bu noktaya kadar olan tüm harfler karışık durumda olabilir) ve ardından bazı keyfi sonekler (boş olabilir). Sen silsileleri bırakmalısınız Zs ve Palınan tam olarak s yanı sıra son eki, ancak daha sonra değiştirmek Iiçin s A, s Aiçin s Os veya Ohiç sI her adımda durumda koruyarak, s.

Örnek Test Durumları

zip         ==> zap
zAp         ==> zOp
ZOP         ==> ZIP
ZiiP        ==> ZaaP
ZZaapp      ==> ZZoopp
zzzzOoOPppP ==> zzzzIiIPppP
Zipperoni   ==> Zapperoni
ZAPsky      ==> ZOPsky
ZoPtOn      ==> ZiPtOn
zipzip      ==> zapzip
zapzopzip   ==> zopzopzip
zoopzaap    ==> ziipzaap

Kurallar ve Notlar

  • Tüm ASCII harflerini desteklemesi ve bu mücadeleden önce oluşturulmuş olması kaydıyla, giriş ve çıkış için uygun herhangi bir karakter kodlamasını kullanabilirsiniz.
  • Giriş sözcüğünün bir miktar Zip, Zap veya Zop türevi olduğunu varsayabilirsiniz. Diğer tüm girdiler tanımsız davranışa neden olur.
    • Geçerli girdiler regex ile tam eşleşir Z+(I+|A+|O+)P+.*(karışık durumda)

Mutlu Golf!


2
ziop -> bu ne işe yarıyor?
Joshua,

2
@Joshua Bu, açıklamaya göre geçersiz (bkz. "Tüm aynı harf" ).
Arnauld

1
@Arnauld: Ve zoopzaap için test durum açıklaması ile aynı fikirde değil.
Joshua,

4
@Joshua Neden? Bu yalnızca lider arasındaki sesli harflerin için de geçerlidir z's ve ilk p. Sonek herhangi bir şey içerebilir.
Arnauld

Yanıtlar:


9

JavaScript (Node.js) ,  69 63 57  54 bayt

s=>Buffer(s).map(c=>s|c%4<1?s=c:c+c*90%320%34%24-8)+''

Çevrimiçi deneyin!

Nasıl?

S giriş dizisini s karakter karakter.

Biz yeniden s bayrak olarak: sayısal bir değer içinde saklanır kısa sürede, biz başka bir şey güncellemek gerektiğini biliyoruz.

"p"(112) ve "P"(80) 'i tanımlamak için , ASCII kodlarının 4 katları ve dize başında diğer harflerin ASCII kodları olduğu gerçeğini kullanırız ( "z","Z" ve ünlü harflerin) .

ASCII kodlu c harfini, ayrılırken ve değiştirmeden eşdeğerine n çevirmek için aşağıdaki işlevi kullanırız:zZ

n=c+((((90×c)mod320)mod34)mod24)8

 letter | ASCII code |  * 90 | % 320 | % 34 | % 24 | - 8 | new letter
--------+------------+-------+-------+------+------+-----+-----------------------
   'i'  |     105    |  9450 |  170  |   0  |   0  |  -8 | 105 -  8 =  97 -> 'a'
   'a'  |      97    |  8730 |   90  |  22  |  22  |  14 |  97 + 14 = 111 -> 'o'
   'o'  |     111    |  9990 |   70  |   2  |   2  |  -6 | 111 -  6 = 105 -> 'i'
   'z'  |     122    | 10980 |  100  |  32  |   8  |   0 | 122 +  0 = 122 -> 'z'
   'I'  |      73    |  6570 |  170  |   0  |   0  |  -8 |  73 -  8 =  65 -> 'A'
   'A'  |      65    |  5850 |   90  |  22  |  22  |  14 |  65 + 14 =  79 -> 'O'
   'O'  |      79    |  7110 |   70  |   2  |   2  |  -6 |  79 -  6 =  73 -> 'I'
   'Z'  |      90    |  8100 |  100  |  32  |   8  |   0 |  90 +  0 =  90 -> 'Z'

Yorumlananlar

s =>                  // s = input string
  Buffer(s)           // convert it to a Buffer of ASCII codes
  .map(c =>           // for each ASCII code c in s:
    s |               //   if s is numeric
    c % 4 < 1 ?       //   or c is either 'p' or 'P':
      s = c           //     turn s into a numeric value and yield c
    :                 //   else:
      c +             //     update c
        c * 90 % 320  //     by applying the transformation function
        % 34 % 24     //     (see above)
        - 8           //
  ) + ''              // end of map(); coerce the Buffer back to a string

Bu işleve nasıl ulaştınız?
Thomas Hirsch

2
@ThomasHirsch Bir kaba kuvvet arama fonksiyonu ile bulundu. İlk adım (çarpma + 1. modulo), parametrelerin hem küçük hem de büyük harf için aynı sonucu vermesini sağlar. 2. adım (sonraki 2 modül ve çıkarma), doğru delta değerlerinin oradan elde edilip edilmeyeceğini kontrol eder.
Arnauld,

6

C (gcc) ,  81 ... 61 48  46 bayt

@Grimy sayesinde 2 bayt kaydedildi

JS cevabımın limanı . Giriş dizesini değiştirerek çıktılar.

f(char*s){for(;*++s%4;*s+=*s*90%320%34%24-8);}

Çevrimiçi deneyin!

Yorumlananlar

f(char * s) {       // f = function taking the input string s
  for(;             //   for each character *s in s:
    *++s % 4;       //     advance the pointer; exit if *s is either 'p' or 'P' (it's safe 
                    //     to skip the 1st character, as it's guaranteed to be 'z' or 'Z')
    *s +=           //     update the current character:
      *s * 90 % 320 //       apply a transformation formula that turns
      % 34 % 24     //       a vowel into the next vowel in the sequence
      - 8           //       while leaving 'z' and 'Z' unchanged
  );                //   end of for()
}                   // end of function


@Grimy Güzel yakalamak, teşekkürler! (Bir *++s%4noktada denedim ama ortaya çıkan optimizasyonu göz ardı ettim ...)
Arnauld

1
Daha fazla -3 bayt . Bu, JS cevabınıza da uygulanabilir olmalıdır.
Grimmy

@Grimy Benimkinden yeterince farklı, bu yüzden ayrı bir cevap olarak göndermek isteyebilirsiniz.
Arnauld


5

Retina 0.8.2 , 21 bayt

iT`Io`A\OIia\oi`^.+?p

Çevrimiçi deneyin! Ve ilk dahil olmak üzere çevirisi şu harfler p, her ne kadar zve pçevirisi bölümünde değildir bu yüzden etkilenmez. Birincisi O, normalde genişlediğinden 13567ve ikincisi ode büyü olduğu için alıntı yapılır; Harf çevirisinin ilk bölümünde diğer dizgiye genişler. Ortaya çıkan çevirisi dan nedenle IAOIiaoiiçin AOIiaoio yinelenen kaynak harfleri Sonuçlar kaldırılırken IAOiaoiçin AOIaoi.




3

R , 110 76 bayt

Krill sayesinde -36 bayt

Bu fonksiyon bir dize girdi alır.

function(a)sub(s<-sub('z+(.+?)p.*','\\1',a,T),chartr('aioAIO','oaiOAI',s),a)

Çevrimiçi deneyin!


1
Dizgiyi R'deki parçalardan toplamak çok uzun olma eğiliminde ... Ancak s, önce çevireceğimiz bir alt dizgeyi çıkarıp sonra onu çevrilmiş bir kopya ile değiştirerek çok fazla bayt kurtarıyorsunuz : 76 bayt
Kirill L.

@Killill, Ah, bulmaya çalıştığım akıllıca bir numara.
CT Hall







1

C # (Visual C # Etkileşimli Derleyici) , 60 bayt

n=>{for(int i=0;n[i]%4>0;)n[i]^=(char)(n[i++]%16*36%98%22);}

Grimy'nin C cevabından alınmıştır.

Çevrimiçi deneyin!


1
Bu ne yazık ki, son ekindeki ünlülerin yerini aldığından işe yaramıyor.
Emigna

@Emigna Yukarıda belirttiği gibi, bu her yerini aoiyerine ilk önce sadece olanlar, -vowels p/ ' P. Ancak golf için bir şey: ("iao".IndexOf((char)(c|32))+1)%4olabilir-~"iao".IndexOf((char)(c|32))%4
Kevin Cruijssen

1

C / C ++ (VC ++ derleyicisi) 192 bayt

Bu oldukça saf bir deneme ama yine de

void f(char*I){int c[]={-8,14,6},B=1,v[]={105,97,111},j=0;for(*I;*I>0&B;I++){if(*I==80|*I==112){B=0;break;}if(*I==90|*I==122){}else{for(j;j<3;j++){if(*I==v[j]|*I==v[j]-32){*I+=c[j];break;}}}}}

biraz daha okunabilir sürüm bu

#include "stdafx.h"

void f(char * theString)
{
    signed int change[] = {'a'-'i','o'-'a','o'-'i'}; // add this to the vowel to get the next one
    char theVowels[] = {'i','a','o'};
    int breaker = 1;
    printf("Input %s\n",theString);
    for (int i = 0;(theString[i] != '\0') && breaker; i++)
    {
        switch (theString[i])
        {
            case 'Z': /*fall through*/
            case 'z': break;
            case 'P': /*fall through*/
            case 'p': breaker = 0;
                      break; 
            default: 
            {
                for (int j = 0; j < 3; j++)
                {
                    if ((theString[i] == theVowels[j]) || (theString[i]==(theVowels[j]-'a'+'A')))
                    {
                        theString[i] += change[j];
                        break;
                    }
                }
            }
            break;
        }

    }
    printf("Output %s\n",theString);
}
int main()
{
    char theString[]= "zzzzIIIIp0815-4711"; // a test string
    f(theString);
    return 0;
}


tio golf oynadı: tio.run/…
der bender


0

05AB1E (eski) , 22 bayt

l'pkIg‚£ć…iaoDÀ‚Du+`‡ì

Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .

Kesinlikle biraz daha golf oynayabilir miyim?

Elixir yeniden yazmak yerine 05AB1E'nin eski sürümünü kullanır, çünkü +aynı uzunluktaki listelerdeki alanları birleştirir, oysa yeni sürüm bir çift-zip- join'ya ihtiyaç duyar‚øJ bunun yerine .

Açıklama:

l                       # Lowercase the (implicit) input-string
                        #  i.e. "ZipPeroni" → "zipperoni"
 'pk                   '# Get the index of the first "p"
                        #  i.e. "zipperoni" → 2
    Ig                 # Pair it with the length of the entire input-string
                        #  i.e. 2 and "zipperoni" → [2,9]
       £                # Split the (implicit) input-string into parts of that size
                        #  i.e. "ZipPeroni" and [2,9] → ["Zi","pPeroni"]
        ć               # Extract head: push the head and remainder separately to the stack
                        #  i.e. ["Zi","pPeroni"] → ["pPeroni"] and "Zi"
         iao           # Push string "iao"
             DÀ         # Duplicate, and rotate it once towards the left: "aoi"
                       # Pair them up: ["iao","aoi"]
                Du      # Duplicate and transform it to uppercase: ["IAO","AOI"]
                  +     # Python-style merge them together: ["iaoIAO","aoiAOI"]
                   `    # Push both strings to the stack
                       # Transliterate; replacing all characters at the same indices
                        #  i.e. "Zi", "iaoIAO" and "aoiAOI" → "Za"
                     ì  # Prepend it to the remainder (and output implicitly)
                        #  i.e. ["pPeroni"] and "Za" → ["ZapPeroni"]

0

PHP, 30 bayt

Bir TiO için çok basit:

<?=strtr($argn,oiaOIA,iaoIAO);

İle boru olarak çalıştırın -nF. PHP 7.2 için, dize değişmezlerini tırnak içine alın.


Bu hepsini çevirir oia ilk önce sesli harfleri yerine sadece olanlardan p/ Po, değil mi?
Kevin Cruijssen
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.