Schwartzman 교수의 Acme Canine Decoder 2000


31

소개

우리는 특히 팬인 경향이있는 괴짜들 모두이 오래된 파 사이드 만화를 기억합니다 .

이봐!  이봐!  이봐!

Schwartzman 교수는 자신의 발명품을 사용하기 전에 프로그래밍 기술을 좀 더 자세히 알아볼 수있었습니다. 그러나 가능한 적은 바이트를 사용하여 직접 복제 할 수 있습니까?

입력 사양

개 소리를 적절하게 발음 된 "헤이"로 변환하는 스크립트를 작성해야합니다. 이것은 순수한 코드 골프입니다. 가장 적은 바이트 수가 이깁니다.

입력 한 내용은 다음 토큰의 조합으로 구성됩니다.

  • Bark, Baark, Baaark, Baaaark, (즉, B*rk 적어도 1과 a별표 교체)
  • Woof, Wooof, Woooof, ... ( W*f이상과 2 개 o 의 별표 교체)
  • Grr, Grrr, Grrrr, ..., ( G적어도 다음 r S)
  • 임의의 수 .(기간), !(느낌표) 및 / 또는 ?입력 어디에서나 발생할 수있다 (물음표) 문자,

다시 말하지만, 기반 토큰 WoofGrr기반 토큰은 항상 적어도 두 개의 o s 및 rs를 필요로합니다 . Wof하고 Gr있습니다 하지 유효한 토큰.

토큰이 얼마나 오래있을 수 있는지에 대한 제한은 없습니다 (예를 들어, 토큰에 몇 개의 반복 a이있을 수 있는지 Bark). 그러나, 귀하의 디코더에서만 입력 토큰 제대로 작동 할 필요가 최대 10 개까지a,의 oS 또는 r이 문제를 통과이야.

출력 사양

Schwartzman의 설계에 충실한 개 디코더 프로그램은 다음과 같이 출력 텍스트로 처리해야합니다.

  • Bark, Woof그리고 Grr되고 Hey;
  • Baark, Wooof그리고 Grrr되고 Heyy;
  • Baaark, Woooof그리고 Grrrr되고 Heyyy; 기타
  • 모든 Bark기반 토큰 y의 경우 출력 Hey기반 토큰의 as 수는 s 수와 같아야합니다 .
  • 모든 Woof기반 토큰 y의 경우 출력 Hey기반 토큰 의 s 수는 s 수 보다 1이 작아야 합니다 o.
  • 모든 Grr기반 토큰 y의 경우 출력 Hey기반 토큰 의 s 수는 s 수 보다 1이 작아야 합니다 r.
  • 모든 구두점 ( ., !?)은 변경되지 않습니다.

s 및 s에 대해서만 y출력에서 하나를 삭제하십시오 ! 8 s 의 입력 값은 8 s의 일치하는 세트가 됩니다. 그러나 단지이된다 7 개, 의.WoofGrrBaaaaaaaark?aHeyyyyyyyy?yWoooooooof?Heyyyyyyy?y

다시 말하지만, 프로그램이 무제한 크기의 입력 토큰에 대해 작동하도록 할 수 있다면 훌륭하지만이 과제의 목적을 위해 10 자 이하의 반복되는 문자가없는 입력 토큰에 대해서만 프로그램이 제대로 작동하는지 확인합니다. .

입력 한 모든 Bark-, Woof-및 Grr-기반 토큰은 대문자로 시작하는 것으로 가정합니다. 따라서이 없습니다 필요 핸들의 회전에 Bark grrrHey heyy또는 유사한 아무것도.

입력 및 출력 예

    • 입력: Bark. Bark! Bark!!
    • 산출: Hey. Hey! Hey!!
    • 입력 : Baaaaaark?(6 a초)
    • 출력 : Heyyyyyy?(6 y초)
    • 입력 : Grrrrrrrr...(8 r초)
    • 출력 : Heyyyyyyy...( 7 y 초)
    • 입력: ?...!
    • 산출: ?...!
    • 입력: Wooof Woof? Grrrr. Baaaark Grr!
    • 산출: Heyy Hey? Heyyy. Heyyyy Hey!

10
안녕하세요, 사이트에 오신 것을 환영합니다! 아시다시피이 사이트에서는 가장 짧은 답변을 수락하기 전에 잠시 기다려야합니다. 수락 한 답변을 수락하지 말고이 질문에 대한 활동이 종료 될 때까지 기다렸다가 가장 짧은 답변을 수락하십시오. 이것은 또한 더 많은 답변을 장려 할 것입니다.
DJMcMayhem


수락 절차에 대한 팁을 주셔서 감사합니다. 실제로 몇 시간마다 답변 목록을 확인하려고했는데 더 나은 답변이 나오면 수락하십시오. 내가 여기서 평판을 부인했을 수도있어 미안하다.
A. Mirabeau 2016 년

5
@ A.Mirabeau 그것은 훌륭하고 그것이 이상적으로 작동하는 방법이지만, 일부 사람들은 그다지주의를 기울이지 않기 때문에 대부분의 답변자들은 이미 승자가 선택되었다고 가정 할 것입니다. 당첨자를 업데이트 할 계획이라면 당첨자를 선택하는 데 아무런 문제 가 없지만 , 일부 불만 사항과 함께 당첨자 수는 줄어들 것이므로 대개 일주일 이상 기다리는 것이 좋습니다.
Martin Ender 2016 년

답변:


16

망막 , 24 18 17 16 바이트

MT0의 아이디어에 따라 1 바이트가 저장되었습니다.

\wf?k?
y
\byy
He

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

설명

\wf?k?
y

이것은 단순히 모든 문자를로 바꿉니다 y. 그러나 그 뒤에 f또는 문자 가 오면 k즉시 그 문자도 바꿉니다 . 우리는 단어의 길이 를 제거 f하고 k"정규화"하여 이제 y필요한 것보다 두 개 더 많은 단어를 갖습니다 .

\byy
He

이렇게하면 y모든 단어 의 처음 두 개가 로 바뀌고 He변환이 완료됩니다.


지금까지 가장 효율적인 답변입니다. 아직은받지 않겠지 만 CAT FUD를받을 자격이 있다고 말할 수 있습니다.
A. Mirabeau

10

펄, 51 41 39 바이트

s/(G.|[BW]..)(\w+)/He."y"x length$2/ge

용법

perl -pE 's/(G.|[BW]..)(\w+)/He."y"x length$2/ge'

입력

Bark. Bark! Bark!!
Baaaaaark?
Grrrrrrrr...
?...!
Wooof Woof? Grrrr. Baaaark Grr!

산출

Hey. Hey! Hey!!
Heyyyyyy?
Heyyyyyyy...
?...!
Heyy Hey? Heyyy. Heyyyy Hey!

작동 원리

-p카운트에 1 바이트를 더하는 자동 인쇄를 사용한 간단한 정규식 대체 . /ge모든 패턴에 대한 대체를 실행하고 대체를 코드로 실행합니다.


이전 버전은 3 방향 탐지를 사용했지만 Martin Ender 는 내가 공격적이지 않아 10 바이트를 절약 할 수 있음을 알게되었습니다.

msh210 은 문자열 주위에 따옴표가 필요 없으며 He2 바이트를 절약 한다고 알려줍니다 .


2
축하합니다.
A. Mirabeau

1
@ A.Mirabeau 감사합니다. 방금 몇 분 전에 여기에 등록한 것을 고려하면 상당히 칭찬입니다!
파이프

몇 시간 전에 방금 등록한 것을 고려하면 세 가지 해결 방법이 동기 부여됩니다.
A. Mirabeau 2016 년

1
주위에 따옴표가 필요하지 않습니다 He.
msh210

@ msh210 흥미롭고, 거기에서 그것들을 생략 할 수 있는지 몰랐습니다!
파이프

5

파이썬, 106 바이트

f=lambda s,a="B,He,Gr,He,Wo,He,a,y,r,y,o,y,f,,yk,".split(","):s if a==[]else f(s.replace(a[0],a[1]),a[2:])

데모

https://repl.it/C6Rr


허용되는 답변은 아니지만이 세 가지 필수 개 언어 키워드 변경하는 가장 바이트 효율적인 솔루션이라는 훌륭한 언급이 필요합니다.
A. Mirabeau

4

JavaScript (ES6) -57 55 52 51 바이트

f=s=>s.replace(/\wk?f?/g,'y').replace(/\byy/g,'He')

테스트:

f=s=>s.replace(/\wk?f?/g,'y').replace(/\byy/g,'He');

[
  'Bark. Bark! Bark!!',
  'Baaaaaark?',
  'Grrrrrrrr...',
  '?...!',
  'Wooof Woof? Grrrr. Baaaark Grr!'
].forEach( s=>{console.log( f(s) );} );

바이트 56 및 51에 대한 @MartinEnder와 다른 부스러기에 대한 영감에 감사드립니다.


4

Vimscript, 51 39 37 33 32 29 28 바이트,

%s/\hk\?f\?/y/g|%s/\<yy/He/g

MT0, Martin Ender, msh210 : 9 바이트 더 면도에 대한 정규식 크레딧

아스키 캐스트 데모

설명:

                               1. Normalize words to same length & replace letters with ys 

%s                             Regex search and replace 
  /                            Regex search begin
   \hk\?f\?                    Find any letter (\h) optionally followed by k or f
           /                   Regex search end and replace start
            y                  Replace with y
             /                 Replace end
              g                Replace globally

               |               New command

                               2. Overwrite first two y of every word with He

                %s             Regex search and replace
                  /            Regex search begin
                   \<yy        Find yy at a word's beginning
                        /      Regex search end and replace start
                         He    replace with He
                           /   Replace end
                            g  Replace globally

1
Vimscript를 모르지만 \<yy대신 사용할 수 \<\hy있습니까?
msh210 2016 년

@ msh210 예 가능합니다. 솔루션을 업데이트했습니다.
starcorder


2

자바 스크립트, 72 66 64 바이트

f=
t=>t.replace(/k|f/g,'').replace(/\w/g,'y').replace(/\byy/g,'He')

편집 : 분리 f=및 기능 + 감소 된 바이트 수


1
f=기본적으로 PPCG 가 필요하지 않으므로 64 바이트가 작동합니다.
Rɪᴋᴇʀ

@ EᴀsᴛᴇʀʟʏIʀᴋ 대단한, 나는 이것을 몰랐다
starcorder


1

파이썬 3 140 135 134 바이트

from re import*
f=lambda s:''.join('He'+'y'*len(x)+y for x,y in[(a+b+c,d)for a,b,c,d in findall('(?:Wo(o+)f|Gr(r+)|B(a+)rk)(\W+)',s)])

정규식을 사용하여 대체 가능한 문자의 발생을 찾으십시오.

편집 : findall 결과에서 값을 가져올 때 1 바이트 공백과 4 바이트를 골퍼했습니다.

Edit2 : Golfed 1 byte (Bark의 "a"가 제대로 계산되지 않았습니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.