เล่น Zip, Zap, Zop


22

มีเกมอุ่นเครื่องอิมโพรฟเล็ก ๆ น้อย ๆ ที่คุณจัดเรียงตัวเองเป็นวงกลมและส่งรหัสไปรษณีย์, zaps และ zops ไปรอบ ๆ โดยชี้ไปที่บุคคลและพูดคำต่อไปในลำดับจากนั้นพวกเขาทำเช่นเดียวกันจนกว่าคุณจะอบอุ่นขึ้นหรือ อะไรก็ตาม

งานของคุณคือการสร้างโปรแกรมที่ให้คำถัดไปตามลำดับที่ได้รับการป้อนคำ (Zip -> Zap -> Zop -> Zip) เนื่องจากมีหลายวิธีในการพูดสามคำและ flair ที่สามารถเพิ่มลงในคำเหล่านี้ได้โปรแกรมของคุณควรเลียนแบบตัวพิมพ์และตัวอักษร

ในการทำอย่างละเอียดข้อมูลของคุณจะเป็นหนึ่งหรือมากกว่าZนั้นแล้วอย่างน้อยหนึ่งIs, As หรือOs (ตัวอักษรเดียวกันทั้งหมด) จากนั้นหนึ่งหรือมากกว่าPs (ตัวอักษรทั้งหมดถึงจุดนี้อาจจะเป็นกรณีผสม) ตามด้วย บางคำต่อท้ายโดยพลการ (ซึ่งอาจว่างเปล่า) คุณควรออกจากการวิ่งของZs และPs รวมถึงคำต่อท้ายตรงตามที่ได้รับ แต่จากนั้นเปลี่ยนIs เป็นAs, As เป็นOs หรือOs เป็นIs, รักษากรณีในแต่ละขั้นตอน

ตัวอย่างกรณีทดสอบ

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

กฎและหมายเหตุ

  • คุณสามารถใช้การเข้ารหัสตัวอักษรที่สะดวกสำหรับการป้อนข้อมูลและเอาท์พุทโดยที่มันรองรับตัวอักษร ASCII ทั้งหมดและมันถูกสร้างขึ้นก่อนการท้าทายนี้
  • คุณอาจจะถือว่าคำว่า input เป็นตัวแปรบางอย่างของ Zip, Zap หรือ Zop อินพุตอื่นทั้งหมดส่งผลให้เกิดพฤติกรรมที่ไม่ได้กำหนด
    • อินพุตที่ถูกต้องจะจับคู่ regex Z+(I+|A+|O+)P+.*(ในกรณีผสม)

มีความสุขในการเล่นกอล์ฟ!


2
ziop -> สิ่งนี้ทำอะไร
Joshua

2
@Joshua สิ่งนี้ไม่ถูกต้องตามคำอธิบาย (ดู"ตัวอักษรเดียวกันทั้งหมด" )
Arnauld

1
@ Arnauld: และกรณีทดสอบสำหรับ zoopzaap ไม่เห็นด้วยกับคำอธิบาย
Joshua

4
@Joshua ทำไม สิ่งนี้ใช้ได้กับสระระหว่างผู้นำzของและสระแรกpเท่านั้น คำต่อท้ายอาจมีอะไรก็ได้
Arnauld

คำตอบ:


9

JavaScript (Node.js) ,  69 63 57  54 ไบต์

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

ลองออนไลน์!

อย่างไร?

เราประมวลผลสตริงอินพุตsตัวอักษรโดยตัวละคร

เรานำมาใช้ใหม่sอีกครั้ง: ทันทีที่มีการเก็บค่าตัวเลขเราทราบว่าเราจะต้องไม่อัปเดตสิ่งอื่นใด

ในการระบุ"p"(112) และ"P"(80) เราใช้ความจริงที่ว่ารหัส ASCII ของพวกเขาคือทวีคูณของ4และรหัส ASCII ของตัวอักษรอื่น ๆ ที่จุดเริ่มต้นของสตริง ( "z","Z"และสระ) ไม่ได้

ในการเปลี่ยนเสียงสระด้วยรหัส ASCII cให้เป็นเสียงคู่nในขณะที่ออกzและZไม่เปลี่ยนแปลงเราใช้ฟังก์ชันต่อไปนี้:

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'

แสดงความคิดเห็น

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

คุณคิดอย่างไรกับฟังก์ชั่นนั้น?
โทมัสอีร์สช

2
@ThomasHirsch พบกับฟังก์ชันการค้นหาแบบ brute-force ขั้นตอนแรก (การคูณ + โมดูโลครั้งที่ 1) ตรวจสอบให้แน่ใจว่าพารามิเตอร์ให้ผลลัพธ์ที่เหมือนกันสำหรับทั้งตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ขั้นตอนที่ 2 (มอดุลัส 2 ครั้งถัดไปและการลบ) ตรวจสอบว่าสามารถหาค่าของเดลต้าที่ถูกต้องได้หรือไม่
Arnauld

6

C (gcc) ,  81 ... 61 48  46 ไบต์

บันทึก 2 ไบต์ขอบคุณ@Grimy

ท่าเรือของฉันคำตอบ JS เอาต์พุตโดยการแก้ไขสตริงอินพุต

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

ลองออนไลน์!

แสดงความคิดเห็น

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 จับได้ดีขอบคุณ! (ฉันได้ลอง*++s%4ในบางจุด แต่มองข้ามการเพิ่มประสิทธิภาพที่เกิดขึ้น ... )
Arnauld

1
นอกจาก-3 ไบต์ อันนี้ควรใช้กับคำตอบ JS ของคุณ
Grimmy

@Grimy มันแตกต่างจากของฉันมากดังนั้นคุณอาจต้องการโพสต์นี้เป็นคำตอบแยกต่างหาก
Arnauld


5

เรติน่า 0.8.2 , 21 ไบต์

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

ลองออนไลน์! แปลตัวอักษรจนถึงและรวมถึงตัวแรกpถึงแม้ว่าzและpไม่อยู่ในส่วนการถอดเสียงดังนั้นจะไม่ได้รับผลกระทบ คำแรกที่Oยกมาเพราะปกติแล้วมันจะขยาย13567และoยกมาเป็นเพราะมันเป็นเวทมนตร์; ในส่วนแรกของการทับศัพท์จะขยายไปยังสตริงอื่น ดังนั้นการถอดเสียงที่เกิดขึ้นจึงเป็นจากIAOIiaoiไปที่AOIiaoiแล้วลบผลลัพธ์ตัวอักษรต้นฉบับที่ซ้ำกันIAOiaoไปAOIaoiเป็น


4

C, 43 ไบต์

f(char*s){for(;*++s%4;*s^=*s%16*36%98%22);}

ลองออนไลน์!

ขึ้นอยู่กับคำตอบของ Arnauld ฉันทำการค้นหาแบบ brute-force เพื่อค้นหาสูตรที่สั้นที่สุดซึ่งเปลี่ยนเป็น => o, o => i, i => a, z => z



3

R , 110 76 ไบต์

-36 ไบต์ขอบคุณ Krill

ฟังก์ชันนี้รับอินพุตของหนึ่งสตริง

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

ลองออนไลน์!


1
การรวบรวมสตริงจากชิ้นส่วนใน R มีแนวโน้มที่จะยาวมาก ... แต่คุณบันทึกจำนวนมากของไบต์โดยแยกสตริงย่อยsที่เราจะแปลก่อนแล้วแทนที่ด้วยสำเนาที่แปลแล้ว: 76 ไบต์
Kirill L.

@ KirillL., อานั่นเป็นเคล็ดลับที่ชาญฉลาดที่ฉันพยายามหา
CT Hall







1

C # (Visual C # Interactive คอมไพเลอร์) , 60 ไบต์

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

จากคำตอบ C ของ Grimy

ลองออนไลน์!


1
น่าเสียดายที่มันไม่ได้ผลเพราะมันจะแทนที่เสียงสระในคำต่อท้ายเช่นกัน
Emigna

ในฐานะที่เป็น @Emigna กล่าวข้างต้นนี้แทนที่aoi-vowels แทนเพียงคนก่อนที่แรก/p Pสิ่งหนึ่งในการเล่นกอล์ฟ: ("iao".IndexOf((char)(c|32))+1)%4สามารถ-~"iao".IndexOf((char)(c|32))%4
Kevin Cruijssen

1

C / C ++ (คอมไพเลอร์ VC ++) 192bytes

นี่เป็นความพยายามที่ไร้เดียงสา แต่ต่อไป

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

เวอร์ชันที่อ่านได้มากกว่านี้เล็กน้อย

#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 golfed
der


0

05AB1E (ดั้งเดิม) 22 ไบต์

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

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

สามารถตีกอล์ฟได้มากกว่านี้อย่างแน่นอน ..

ใช้เวอร์ชันดั้งเดิมของ 05AB1E แทนที่จะเป็น Elixir rewrite เนื่องจาก+ผสานฟิลด์ในรายการที่มีความยาวเท่ากันในขณะที่เวอร์ชันใหม่จะต้องใช้การจับคู่ซิปคู่‚øJแทน

คำอธิบาย:

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 ไบต์

ง่ายเกินไปสำหรับ TiO:

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

-nFทำงานเป็นท่อด้วย สำหรับ PHP 7.2 ให้ใส่ตัวอักษรสตริงในเครื่องหมายคำพูด


นักแปลนี้จะoiaออกเสียงเสียงสระทั้งหมดแทนที่จะเป็นเสียงสระก่อนหน้าแรกp/ Pใช่ไหม?
Kevin Cruijssen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.