Zip, Zap, Zop 재생


22

서클에 자신을 배치하고 사람을 가리키고 순서에서 다음 단어를 말함으로써 지퍼, ps 및 zops를 주변에 보내는 약간의 즉석 워밍업 게임이 있습니다. 그러면 모두 따뜻해질 때까지 똑같이 행동합니다. 도대체 무엇이.

당신의 임무는 입력 단어가 주어진 다음 단어를 순서대로 제공하는 프로그램을 만드는 것입니다. (Zip-> Zap-> Zop-> Zip) 추가 할 수있는이 세 단어와 감각을 표현하는 방법은 많이 있기 때문에 프로그램은 대소 문자와 문자 복제를 모방하고 접미사를 가지고 있어야합니다.

자세히 설명하기 위해 입력은 하나 이상의 Zs, 하나 이상의 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 문자를 지원하고이 챌린지 이전에 작성된 경우 편리한 입 / 출력에 편리한 문자 인코딩을 사용할 수 있습니다.
  • 입력 단어가 Zip, Zap 또는 Zop의 변형이라고 가정 할 수 있습니다. 다른 모든 입력은 정의되지 않은 동작을 초래합니다.
    • 유효한 입력은 정규식과 완전히 일치합니다 Z+(I+|A+|O+)P+.*(대소 문자 혼합).

행복한 골프!


2
ziop->이 작업은 무엇입니까?
여호수아

2
@Joshua 이는 설명에 따라 유효하지 않습니다 ( "모든 동일한 문자"참조 ).
Arnauld

1
@Arnauld : 그리고 zoopzaap의 테스트 사례는 설명에 동의하지 않습니다.
여호수아

4
@Joshua 왜? 이것은 행간 z과 첫 번째 사이의 모음에만 적용됩니다 p. 접미사는 무엇이든 포함 할 수 있습니다.
Arnauld

답변:


9

자바 스크립트 (Node.js) ,  69 63 57  54 bytes

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 코드의 배수 사실 사용 와 문자열의 시작 부분에 다른 문자의 ASCII 코드 ( , 하지 않으며 모음).4"z""Z"

ASCII 코드와 모음을 설정하려면 그것의 대조로하여 남기면서 및 변경, 우리는 다음과 같은 기능을 사용할 수 :cnzZ

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 무차별 검색 기능으로 발견되었습니다. 첫 번째 단계 (곱하기 + 첫 번째 모듈로)는 매개 변수가 소문자와 대문자 모두에 대해 동일한 결과를 제공하는지 확인합니다. 두 번째 단계 (다음 2 개의 모듈로와 빼기)는 올바른 델타 값을 얻을 수 있는지 확인합니다.
Arnauld

6

C (gcc) ,  81 ... 61 48  46 바이트

@Grimy 덕분에 2 바이트 절약

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 Nice catch, 감사합니다! ( *++s%4어느 시점에서 시도 했지만 결과 최적화를 간과했습니다 ...)
Arnauld

1
추가 -3 바이트 . 이것은 JS 답변에도 적용 가능해야합니다.
그리미

@Grimy 그것은 저와 충분히 다르므로 이것을 별도의 답변으로 게시 할 수 있습니다.
Arnauld


5

레티 나 0.8.2 , 21 바이트

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

온라인으로 사용해보십시오! 에 대한 첫 번째를 포함하여 최대로 변환합니다 문자 p는 있지만 zp음역 섹션에없는 때문에 영향을받지 않습니다. 첫 번째 O는 일반적으로 확장 되기 때문에 인용 13567되고 두 번째 o는 마술이기 때문에 인용됩니다. 음역의 첫 번째 부분에서는 다른 문자열로 확장됩니다. 그 결과 음역에서 그러므로 IAOIiaoiAOIiaoi다음에 중복 소스 문자 결과를 제거 IAOiao하는 AOIaoi.




3

R , 110 76 바이트

크릴 덕분에 -36 바이트

이 함수는 하나의 문자열을 입력합니다.

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

온라인으로 사용해보십시오!


1
R의 조각에서 문자열을 수집하는 것은 매우 긴 경향이 있지만 ... 먼저 s번역 할 하위 문자열 을 추출한 다음 번역 된 사본으로 바꾸면 많은 바이트를 절약 할 수 있습니다. 76 바이트
Kirill L.

@ KirillL., 아, 내가 찾은 영리한 속임수입니다.
CT 홀







1

C # (Visual C # Interactive Compiler) , 60 바이트

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

Grimy의 C 답변을 기반으로합니다.

온라인으로 사용해보십시오!


1
안타깝게도 접미사 모음을 대체하므로 작동하지 않습니다.
Emigna

@Emigna가 위에서 말했듯이 이것은 aoi첫 번째 p/ 앞의 모음 대신 모든 모음을 대체합니다 P. 그러나 골프를 ("iao".IndexOf((char)(c|32))+1)%4-~"iao".IndexOf((char)(c|32))%4
타러 가야

1

C / C ++ (VC ++ 컴파일러) 192 바이트

이것은 다소 순진한 시도이지만 어쨌든

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 : tio.run/…
der

tio golfed : tio.run/…
der


0

05AB1E (레거시) , 22 바이트

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

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

확실히 조금 더 골프를 칠 수 있습니다 ..

+필드를 동일한 길이의 목록으로 병합 하는 대신 새 버전에는 pair-zip-join‚øJ 이 필요 하기 때문에 Elixir 재 작성 대신 기존 버전의 05AB1E를 사용 합니다.

설명:

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그것은하지 않는 이유는 무엇입니까?
케빈 크루이 센
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.