Decipher Neurotic Frogs


28

Decipher Neurotic Frogs

Puzzling.SE가 마침내 양서류에 집착 한 암호 를 해독했습니다. 암호 해독을위한 프로그램이나 함수를 작성해 봅시다!

(퍼즐을 망치기 전에 퍼즐을 보려면 위의 링크를 클릭하십시오.)


암호의 작동 방식

신경 개구리에서 O ught으로 REL 에서 X M UD 온천 (줄여서 "신경 개구리가"), 모든 문자가 하나 개 또는 두 개의 단어로 암호화되어 있습니다 :

  • 이탈리아어가 아닌 단어의 길이는 문자를 나타냅니다.
    • neurotic => 8 글자 => H
    • frogs => 5 글자 => E
    • perpendicular => 13 글자 = M
  • 기울임 꼴이 포함 된 단어는 다음 단어를 수정하여 기울임 꼴 단어의 길이가 홀수 인 경우 10을, 기울임 꼴 단어의 길이가 짝수 인 경우 20을 더합니다. 단어의 일부 또는 전부가 이탤릭체로 표시 될 수 있습니다. 이탤릭체로 된 단어 뒤에는 항상 이탤릭체가없는 단어가옵니다.
    • *o*ught to => 홀수, 2 => 12 => L
    • lo*u*nging calms => 짝수, 5 => 25 => Y

평문의 모든 단어는 암호문의 문장에 해당하고, 평문의 모든 문장은 암호문의 단락에 해당합니다.

입력 형식

귀하의 프로그램 또는 기능은 마크로 형식의 메시지를 신경 개구리로 입력해야합니다. 입력은 인쇄 가능한 ASCII 및 줄 바꿈으로 만 구성됩니다.

  • 단어 는 정규식과 일치하는 문자의 연속입니다 [A-Za-z0-9'].
    • 숫자와 문자는 모두 단어 길이에 포함됩니다. QB64을 나타냅니다 D.
    • 참고 : 아포스트로피 단어 길이에 포함 되지 않습니다 . Isn't대표 D하지 E.
  • 기울임 꼴 문자 는 별표 ( *letters*) 로 묶습니다 .
    • 하나 이상의 연속 문자는 전체 단어 ( masseus*es*, *all*) 까지 이탤릭체로 표시 될 수 있습니다 . 단어에서 연속되지 않은 여러 문자는 이탤릭체로 표시 될 수도 있습니다 ( g*e*n*e*rates).
    • 기울임 꼴은 여러 단어에 해당하지 않으며 구두점도 포함하지 않으며 아포스트로피도 포함하지 않습니다.
    • 짝이없는 별표와 여러 개의 인접한 별표는 절대 발생하지 않습니다.
  • 문장 부호 는 다음 문자 중 하나 .,?!:;-()"입니다.
    • 문장 내의 단어는 하나 이상의 문장 부호 문자 및 / 또는 단일 공백으로 구분됩니다. 예 : *all* welcomed, toad*s*, newts, Ever*y*one--frogs, cap... bliss,they're (I
    • 문장은 하나 이상의 문장 부호 문자로 끝나고 이중 공백으로 구분됩니다. Th*e* Montgomery A*m*phibian Salon! Come luxuriate today!
    • 단락은 단일 줄 바꿈으로 구분됩니다. 단락의 마지막 문장에는 여전히 끝에 하나 이상의 문장 부호 문자가 있습니다.

다른 문자는 입력에 나타나지 않으며 처리 할 필요가 없습니다.

귀하의 재량에 따라 귀하의 코드는 입력에 단일 후행 줄 바꿈이있을 것으로 예상 할 수 있습니다.

출력 형식

입력을 해독 한 결과는 하나 이상의 문장이됩니다. 평문의 글자는 대문자와 소문자의 조합 일 수 있습니다. 문장 내 단어는 공백으로 구분해야합니다. 문장은 마침표 ( .)로 끝나야 하며 단일 공백으로 구분 해야합니다 . 마지막 문장 다음에 후행 공백을 출력 할 수 있습니다. 출력은 모두 한 줄에 있지만 후행 줄 바꿈을 출력 할 수 있습니다.

기타 세부 사항

코드는 표준 입력 및 출력 방법 중 하나를 사용할 수 있습니다. 목록이나 기타 데이터 구조가 아닌 여러 줄로 입력을 받아야하며 문자열을 출력해야합니다.

바이트 단위의 가장 짧은 코드가 이깁니다!

테스트 사례

-->
Neurotic Frogs *O*ught To Rel*a*x In *M*ud Baths!
<--
HELLO.

-->
Business standards all*o*w only *adult* amphibians.
<--
HINT.

-->
Rejoice, *a*ll frogs an*d* toads also!  Montgomery Sal*o*n opens up!  Ha*pp*y throng fill*s* street ecstatically!
<--
GOOD JOB PPL.

-->
I like 3.1415926535897.
IM*O*, it's a *b*la*st*, yeah!
<--
ADAM. MAN.

-->
*I*, happily, *th*anks 2 u *e*ditin*g* specific wor*ding*--clarifying a *bit*--betterment :D!
<--
QUARTATA.

-->
Perpendicular l*ou*nging calms.  *A* frog, a m*u*d cap... bliss!  Wallowing g*e*n*e*rates happiness.  Amphibian sp*a* isn't expensive--seventy d*o*llars--cheap!  That'*s* not *a* large e*x*pens*e* from an*y* discerning fr*o*g's money, unlik*e* Super 8.
Ever*y*one--frogs, toad*s*, newts, *a*nd salamanders!  G*e*t a wonderful shiat*s*u, or recei*v*e an other kind.  Masseus*es* are her*e* today!  Invite a fianc*e*e, supervisor, roommate, niece: *all* welcomed!
Y*o*u simply ne*v*er believed these p*o*ssibilitie*s*; they're (I *swear*) absolute truth!  Th*e* Montgomery A*m*phibian Salon!  Come luxuriate today!
<--
MY NAME IS INIGO MONTOYA. YOU KILLED MY FATHER. PREPARE TO DIE.

4
공주 신부 입력에 +1 아, 그리고 당신의 기술도 마찬가지입니다.
Magic Octopus Urn

이탤릭체가 포함 된 단어 뒤에 이탤릭체가 포함되지 않은 단어가 보장됩니까?
R. Kap

@ R.Kap 맞습니다. 명확히하기 위해 질문을 편집했습니다.
DLosc

답변:


5

펄, 72 바이트

#!perl -n
$x=/\*/?2-y/'//c%2:!print/ /?$':chr$x.0+y/'//c+64for/[\w*']+|  /g,' . '

shebang을 하나로 계산하여 입력을 stdin에서 가져옵니다.

샘플 사용법

$ more in.dat
Neurotic Frogs *O*ught To Rel*a*x In *M*ud Baths!
Perpendicular l*ou*nging calms.  *A* frog, a m*u*d cap... bliss!  Wallowing g*e*n*e*rates happiness.  Amphibian sp*a* isn't expensive--seventy d*o*llars--cheap!  That'*s* not *a* large e*x*pens*e* from an*y* discerning fr*o*g's money, unlik*e* Super 8.
Ever*y*one--frogs, toad*s*, newts, *a*nd salamanders!  G*e*t a wonderful shiat*s*u, or recei*v*e an other kind.  Masseus*es* are her*e* today!  Invite a fianc*e*e, supervisor, roommate, niece: *all* welcomed!
Y*o*u simply ne*v*er believed these p*o*ssibilitie*s*; they're (I *swear*) absolute truth!  Th*e* Montgomery A*m*phibian Salon!  Come luxuriate today!

$ perl neurotic-frogs.pl < in.dat
HELLO. MY NAME IS INIGO MONTOYA. YOU KILLED MY FATHER. PREPARE TO DIE.

1
나는이 답변에 현상금을 수여하고 있습니다. 바운티 기간이 끝날 때 내 자신 (실제로 어디에서나 온 유일한 것) 외에 가장 짧은 것입니다.
DLosc

4

자바 스크립트 (ES6) 172 169 157 150 바이트

@Neil 덕분에 10 바이트 절약

x=>x.match(/[\w'*]+|\s+/g).map(y=>y[0]==" "?y[1]:y==`
`?". ":/\*/.test(y,l+=y.match(/\w/g).length)?(l=l%2*10+19,""):l.toString(36,l=9),l=9).join``+"."

아마 더 향상 될 수 있습니다. 모든 소문자로 출력합니다.


를 이동하여 2 바이트를 저장 i=0toString.

관심이없는 나는 그 버그를 고치려고했고 이것을 생각 x=>x.replace(/([\w*']+)[^\w\n*' ]* ?( ?)/g,(_,y,z)=>/\*/.test(y,l=y.replace(/'/g ,"").length)?(i=l%2||2,""):l+i*10+9).toString(36,i=0)+z,i=0).replace(/\n|$/g,". ")
Neil

현재 양식으로 작동하는 것 같습니다.
primo

@ 닐 감사합니다. 12 바이트를 절약하지만 마지막 테스트 사례에서는 작동하지 않습니다. 3 바이트의 순 단축을 위해 9를 추가하는 수정.
ETHproductions

@Neil 제거 .replace하고 사용 .match하면 다른 12 바이트가 저장됩니다.
ETHproductions

3

파이썬 2 238 221 218 214 207 205 바이트

from re import*
def f(x):
 d='';m=0
 for w in split(r"[^\w\d*'~\n]+",sub('  ','~',x))[:-1]:l=len(sub("[*'~\n]",'',w));q='*'in w;d+='. '[w[0]>'}':]*(w[0]in'~\n')+chr(64+l+m)[q:];m=(2-l%2)*10*q
 print d+'.'

처리를 위해 많은 정규 표현식을 사용합니다. 우리는 이중 공간을 변환하고 ~그것을 처리하는 데 사용합니다. ~그리고 \n특별히 처리됩니다.

가장 큰 문자 이득은 for라인 에서 입력의 전처리에서 비롯됩니다 . 이것은 확실히 더 골프 수 있습니다.

무시 했어! (모든 테스트 사례)

DLosc 덕분에 7 바이트가 절약되었습니다!


3

, 65 64 바이트

점수는 -rs플래그에 대해 62 바이트의 코드 + 2입니다 .

Flg{O{{(zy*t+#a-1)X!Y'*Na&2-#a%2}MJa@`[\w*]+`}MlRM''^sX2O". "}

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

설명

-r플래그는 그들의 목록을 stdin을 저장의 모든 라인을 읽는다 g. 이 -s플래그는 목록의 출력 형식을 공백으로 구분하여 설정합니다.

이 코드를 읽는 가장 쉬운 방법은 다음과 같습니다.

Flg{...}                   For each line l in g, do:

O{...}MlRM''^sX2O". "      Translate a paragraph into a sentence of plaintext:
       lRM''               Remove apostrophe characters
            ^sX2           Split on "  " into sentences
 {...}M                    Map the below function to each sentence
O                          Output the result list, space-separated, without newline
                O". "      Output that string, without newline

{...}MJa@`[\w*]+`          Translate a sentence into a word of plaintext:
       a@`[\w*]+`          Find all matches of regex (runs of alphanumeric and *)
{...}MJ                    Map the below function to each word and join into string

(zy*t+#a-1)X!Y'*Na&2-#a%2  Translate a word into a letter of plaintext:
      #a-1                 Length of word minus 1
  y*t+                     Add 10 or 20 if y is set (see below)
(z        )                Use that number to index into lowercase alphabet
              '*Na&        Count * characters in word, logical AND with...
                   2-#a%2  2 if word is even length, 1 if odd
             Y             Yank that value into y, to modify the following word
           X!              String multiply the character by not(y)
                           If y is truthy, the word had italics, and we get ""
                           If y is falsy, the word had no italics, and we get a letter

타의 추종을 불허하는 것 같습니다.
primo

1

파이썬 2.7 390 342 341 339 335 바이트 :

from re import*
def F(i):
 W=X="";S,s=split,sub;D='[^\w\s*]';Q=lambda c,t:len(s(D,X,c.group()).split()[t])
 for m in S('\W\n',s(D+"*\w*\*\w+\*.*?(?=\s) \w+",lambda v:"a"*([20,10][Q(v,0)%2]+Q(v,1)),s("'",X,s("--"," ",i)))):
  for g in S('\W  ',m):
   for q in S('\W',g):
    W+=chr(64+len(q))
   W+=" "
  W=W[:-1]+". "
 print s("@",X,W)

다음 형식으로 입력을받습니다.

F('''Multi or Single-lined String''')

더 많이 골프를 치기 때문에 기회가 생길 때마다 할 것입니다.

모든 테스트 케이스와 함께 반복하십시오!

설명:

입력을 해독하기 위해 파이썬 정규 표현식 내장의 엄청난 힘을 사용합니다. 이것은 각 입력에 대해 기능이 수행하는 기본 프로세스입니다.

  1. 첫째, 모두 --단일 공간으로 대체되고 모든 아포스트로피가 제거됩니다. 그런 다음, 이탤릭체 구성 요소와는 모두 하나의 문자열에서 일치와로 대체 진행 단어가 포함 된 모든 단어를 10 + len(second word)연속 번호 a첫 번째 단어의 길이 인 경우의 odd, 그리고 20 + len(second word)연속 a그렇지 않으면들. 이것은 다음 정규식을 사용합니다.

    [^\w\s*]*\w*\*\w+\*.*?(?=\s) \w+

    우리는 문장이있는 경우 예를 들어 Perpendicular l*ou*nging calms., l*ou*nging calms로 대체됩니다 aaaaaaaaaaaaaaaaaaaaaaaaa(25 개), 또는 a이후의를 l*ou*nging문자 짝수을 가지고 있으며, calms5있다 20+5=25.

  2. 이제 새로 수정 된 입력은 각 문장 부호에서 분할되고 \n단락을 얻기 위해 줄 바꿈 ( )이 이어지고 , 각 단락은 문장 부호를 얻기 위해 각 문장 부호에서 2 개의 공백으로 분할되고, 마지막으로 각 문장은 단어로 나뉩니다. 공백을 포함한 구두점 그런 다음, (연속의 실행을 포함하여 각 단어 a들), 우리는 문자열에 추가 W하여 유니 코드 코드 포인트에 해당하는 편지 64(전에 문자의 유니 코드 코드 포인트 A입니다 @) 플러스 len(word). 그런 다음 W문장의 모든 단어가 소진되면 .단일 공백을 추가하고 단락의 모든 문장이 소진되면 단일 공백이 추가 됩니다.

  3. 마지막으로, 전체 입력이 완료된 후 해독 된 메시지로 W출력됩니다 stdout.


사소한 nitpick : spec에 따르면 출력 문장이 이중이 아닌 단일 공백으로 구분됩니다 (이 변경으로 인해 바이트도 절약 됨). 초기 골프 제안 :에서 모든 항목을 가져 오므로 대신을 ( 를 re) 사용하십시오 . 보다 일반적인 골프 제안 : 단어 나 구두점이 아닌 모든 것을 다루는 것이 더 효율적일 것입니다 . 큰 거대한 캐릭터 클래스를 저장합니다. substr.replace*
DLosc

@DLosc 오, 내 나쁜. 나는 스펙이 출력에서 ​​문장을 2 공백으로 분리하는 것이라고 생각했다. 내가 고칠 게 또한 골프 제안에 감사드립니다! 내가 그 일을 할 수 있는지 볼 수 있습니다.
R. Kap

1

PHP, 196 바이트

<?preg_match_all("#[\w*']+|  |$#m",$_GET[s],$m);foreach($m[0]as$s){if(!$s||$s=="  ")echo!$s?". ":" ";else{$l=$p+64+strlen(str_replace("'","",$s));if(!$p=strstr($s,"*")?20-$l%2*10:0)echo chr($l);}}

단어 194 바이트 중간에 아포스트로피가 하나만 있다고 가정 할 수 있다면

<?preg_match_all("#[\w*]+(<?=')[\w*]+|[\w*]+|  |$#m",$_GET[s],$m);foreach($m[0]as$s){if(!$s||$s=="  ")echo!$s?". ":" ";else{$l=$p+64+strlen($s);if(!$p=strstr($s,"*")?20-$l%2*10:0)echo chr($l);}}

@DLosc %0A 함수 로 urlencode 되었습니다 rawurlencode("\n"). 내가 입력 내 HTML 사이트 문자열 인코딩 자동으로 만드는 그래서 텍스트 영역으로이 경우에는 양식을 선호
요 르그 Hülsermann

@DLosc php.ini의 error_reporting이 켜져 있다고 생각합니다. 'error_reporting (0);'을 시도하십시오 후 <?. 하나의 오류는 $_GET[s]작동하지만 올바른 것은 $_GET["s"]아니며 $p=0;루프 전에 변수를 선언하고 초기화하는 것이 좋습니다 . 이제 당신에게 내 질문은 : 한 단어에서 말씀 중간에 하나의 아포스트로피라고 가정 할 수 있습니까?
Jörg Hülsermann

여러 아포스트로피의 경우 @DLosc 첫 번째 답변을 사용해야합니다. 두 번째-2 바이트는 단어의 중간에 하나의 아포스트로피에서만 작동합니다.
Jörg Hülsermann

내 문제가 무엇인지 알아 냈습니다. 서버에 짧은 여는 태그가 활성화되어 있지 않습니다. <?php작동 하도록 변경
DLosc

@Dlosc 나는 <?실제로 사용하지 않았습니다 . 나는 짧은 게시물을 여기의 게시물에만 사용합니다. 이제 빈 페이지로 다시 시작할 수 있다는 것을 알고 있습니다.
Jörg Hülsermann

1

PHP, 231 (226) 228 바이트

시작을 위해

<?preg_match_all("#([\w\*']+)([^\w\*']*)#",$argv[1],$m,2);foreach($m as list(,$a,$b)){$e=strlen(strtr($a,["'"=>""]))+$d;if(!$d=strstr($a,'*')?$e%2*10:0)echo chr($e+64),strpos(".$b","
")?". ":(strpos(".$b","  ")?" ":"");}echo".";

rund 파일에 저장하십시오 php <scriptpath> <text>. 텍스트에서 개행 문자를 이스케이프하여 셸에서 작동하도록합니다.


1
이것을 실행하는 방법을 알려줄 수 있습니까? 에서 입력을 읽는 것처럼 보이지만 $argv[1]입력에 줄 바꿈이 포함 된 경우 해당 접근 방식이 어떻게 작동하는지 모르겠습니다. "Neurotic Frogs *O*ught To Re*a*x In *M*ud Baths!"명령 줄 인수로 시도 하고 IFHCHCFF.출력 과 Undefined variable: d경고를 얻었 습니다 .
DLosc

@DLosc : 기본 설정에 경고 (경고 아님)가 없어야합니다. 가장 쉬운 방법은 앞에 추가 <?하고 파일에 저장 한 다음로 호출하는 것입니다 php <filename> <string>. 바이트 수에 2를 추가해야 할 수도 있습니다.
Titus

@Titus로 시작 <?하면 ?>.1로 순이익을 얻을 수 있습니다. FWIW, IFHCMFF.첫 번째 테스트 사례 (PHP 5.5.21 64 비트, VC14 사용)를 얻습니다. $argnwith를 사용 하는 -F것도 옵션 일 수 있습니다.
primo

내 말은 개행을 포함 php <filename> <string><string>수 있을 때 어떻게 가능한지 알 수 없다는 것 입니다.
DLosc

@DLosc : 버그가 수정되었습니다. 줄 바꿈의 경우 : 탈출하십시오.
Titus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.