ถอดรหัสกบที่มีอาการทางประสาท


28

ถอดรหัสกบที่มีอาการทางประสาท

ตอนนี้ Puzzling.SE ในที่สุดก็ถอดรหัสรหัสสัตว์ครึ่งบกครึ่งน้ำที่หมกมุ่นอยู่แล้วลองเขียนโปรแกรมหรือฟังก์ชั่นเพื่อถอดรหัส!

(ถ้าคุณต้องการที่จะดูปริศนาก่อนที่มันจะเสียสำหรับคุณคลิกที่ลิงค์ด้านบนทันที)


วิธีการทำงานของรหัส

ในโรคประสาทกบO ught การ Rel x ในM UD Baths ( "โรคประสาทกบ" สำหรับระยะสั้น) ทุกตัวอักษรจะถูกเข้ารหัสเป็นหนึ่งหรือสองคำ:

  • ความยาวของคำที่ไม่ใช่ตัวเอียงหมายถึงตัวอักษร
    • neurotic => 8 ตัวอักษร => H
    • frogs => 5 ตัวอักษร => E
    • perpendicular => 13 ตัวอักษร = M
  • คำที่มีตัวเอียงปรับเปลี่ยนคำต่อไปนี้เพิ่ม 10 ถ้าคำตัวเอียงเป็นความยาวคี่หรือ 20 ถ้าคำตัวเอียงเป็นแม้ในความยาว คำใดคำหนึ่งหรือทั้งหมดอาจเป็นตัวเอียง คำที่เป็นตัวเอียงจะตามด้วยคำที่ไม่ใช่ตัวเอียงเสมอ
    • *o*ught to => คี่ 2 => 12 => L
    • lo*u*nging calms => สม่ำเสมอ 5 => 25 => Y

คำทุกคำของเทนเท็กซ์สอดคล้องกับประโยคของไซเฟอร์เท็กซ์และทุกประโยคของเพลนเท็กซ์จะตรงกับย่อหน้าของไซเฟอร์เท็กซ์

รูปแบบอินพุต

โปรแกรมหรือฟังก์ชั่นของคุณจะต้องใส่ข้อความใน Neurotic Frogs ซึ่งจัดรูปแบบใน Markdown อินพุตจะประกอบด้วย ASCII ที่พิมพ์ได้และบรรทัดใหม่เท่านั้น

  • คำที่มีการวิ่งของตัวละครที่ตรงกับ [A-Za-z0-9']regex
    • ตัวเลขและตัวอักษรต่างก็มีความยาวเท่ากับคำ หมายถึงQB64D
    • หมายเหตุ: อะพอสโทรฟีจะไม่นับรวมความยาวของคำ Isn'tหมายถึงไม่ได้DE
  • ตัวอักษรเอียงจะถูกหุ้มด้วยเครื่องหมายดอกจัน ( *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

Perl, 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

JavaScript (ES6), 172 169 157 150 ไบต์

บันทึก 10 ไบต์ขอบคุณ @Neil

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=0 toString
Neil

จากความสนใจฉันได้ไปแก้ไขข้อผิดพลาดเหล่านั้นแล้วคิดสิ่งต่อไปนี้: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

ดูเหมือนว่าจะทำงานในรูปแบบปัจจุบัน
โม่

@ Neil ขอบคุณ ที่ช่วยประหยัด 12 ไบต์ แต่มันไม่ทำงานในกรณีทดสอบล่าสุด การแก้ไขที่เพิ่ม 9 สำหรับการทำให้สั้นลงสุทธิ 3 ไบต์
ETHproductions

@Neil กำจัด.replaceแล้วใช้เพียง.matchบันทึกอีก 12 ไบต์
ETHproductions

3

Python 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+'.'

ใช้ regex จำนวนมากเพื่อทำการประมวลผล เราแปลงช่องว่างสองครั้งเป็น~และใช้สิ่งนั้นเพื่อดำเนินการ ~และ\nได้รับการจัดการเป็นพิเศษ

การเพิ่มของตัวละครที่ใหญ่ที่สุดนั้นมาจากการประมวลผลอินพุตล่วงหน้าใน forบรรทัด นี่สามารถเล่นกอล์ฟต่อไปได้อย่างแน่นอน

ไอเดียมัน! (กรณีทดสอบทั้งหมด)

บันทึก 7 ไบต์ด้วย DLosc!


3

Pip , 65 64 ไบต์

คะแนนคือ 62 ไบต์ของรหัส + 2 สำหรับ-rsธง

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

Python 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''')

สามารถลงเล่นกอล์ฟได้มากขึ้นซึ่งฉันจะทำเมื่อใดก็ตามที่ฉันมีโอกาส

Rep..it กับทุกกรณีทดสอบ!

คำอธิบาย:

ใช้พลังอันยิ่งใหญ่ของบิวด์อิน Python ปกติเพื่อถอดรหัสอินพุต นี่เป็นกระบวนการพื้นฐานที่ฟังก์ชั่นดำเนินการสำหรับแต่ละอินพุต:

  1. ประการแรกทุกอย่าง--จะถูกแทนที่ด้วยช่องว่างเดียวและเครื่องหมายวรรคตอนทุกอันจะถูกลบออก จากนั้นคำทั้งหมดที่มีส่วนประกอบที่ทำให้เป็นตัวเอียงและคำที่ดำเนินการต่อจะถูกจับคู่ในหนึ่งสตริงและแทนที่ด้วย10 + len(second word)จำนวนas ที่ต่อเนื่องกันหากความยาวของคำแรกคือoddและs อื่น ๆ ที่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มีจำนวนคู่ของตัวละครและcalmsมี 20+5=255.

  2. ตอนนี้อินพุตที่แก้ไขใหม่จะถูกแบ่งที่เครื่องหมายวรรคตอนแต่ละอันตามด้วย newline ( \n) เพื่อรับย่อหน้าจากนั้นแต่ละย่อหน้าจะถูกแยกที่แต่ละเครื่องหมายวรรคตอนตามด้วย 2 ช่องว่างเพื่อรับประโยคและสุดท้ายประโยคแต่ละประโยคจะถูกแยกเป็นคำตาม เครื่องหมายวรรคตอนใด ๆ รวมถึงช่องว่าง แล้วสำหรับแต่ละคำ (รวมถึงการวิ่งติดต่อกันas), เราเพิ่มในสตริงWตัวอักษรที่สอดคล้องกับจุดรหัสของ UNICODE 64(จุดรหัส Unicode ของตัวละครก่อนAซึ่งเป็น@) len(word)บวก จากนั้นเราเพิ่มช่องว่างWเดียวเมื่อหมดประโยคทั้งหมดและเมื่อประโยคทั้งหมดในย่อหน้าหมดลงเราจะเพิ่ม.ช่องว่างตามมา

  3. ในที่สุดหลังจากอินพุตทั้งหมดผ่านไปแล้วWเอาต์พุตจะstdoutเป็นข้อความถอดรหัส


ผู้เยาว์ nitpick: spec บอกว่าประโยคเอาต์พุตถูกคั่นด้วยช่องว่างเดียวไม่ใช่สองเท่า (การเปลี่ยนแปลงนี้จะบันทึกเป็นไบต์ด้วย) ข้อเสนอแนะในการเล่นกอล์ฟครั้งแรก: ตั้งแต่ที่คุณกำลังนำเข้าทุกอย่างจากการreใช้แทนsub str.replaceข้อเสนอแนะการเล่นกอล์ฟทั่วไปเพิ่มเติม: อาจมีประสิทธิภาพมากกว่าในการดูแลทุกสิ่งที่ไม่ใช่คำหรือ*เครื่องหมายวรรคตอน บันทึกในคลาสตัวละครขนาดใหญ่ที่ยิ่งใหญ่
DLosc

@Doscosc โอ้ฉันไม่ดี ฉันคิดว่าสเป็คคือการแยกประโยคในเอาต์พุตด้วยช่องว่าง 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);}}

ถ้าฉันคิดได้ว่ามี Apostrophe เพียงอันเดียวที่อยู่ตรงกลางของคำ 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 มันถูก urlencoded เป็นฟังก์ชั่น%0A rawurlencode("\n")ฉันชอบในกรณีนี้รูปแบบที่มี textarea สำหรับการป้อนข้อมูลและเว็บไซต์ html ของฉันทำให้มันเข้ารหัสสตริงโดยอัตโนมัติ
JörgHülsermann

@DLosc ฉันสงสัยว่า error_reporting ใน php.ini เปิดอยู่ ลอง 'error_reporting (0);' หลังจาก<?นั้น หนึ่งข้อผิดพลาดเป็นของ$_GET[s]มันทำงาน แต่ถูกต้อง$_GET["s"]และดีกว่าที่จะประกาศและเริ่มต้นตัวแปร$p=0;ก่อนลูป ตอนนี้คำถามของฉันที่คุณคือ: ฉันสามารถสมมติว่าในหนึ่งคำเป็นเพียงเครื่องหมายวรรคตอนเดียวในกลางของ Word?
JörgHülsermann

@DLosc สำหรับ Apostrophes หลายอันฉันต้องใช้คำตอบแรกของฉัน ไบต์ที่สอง - 2 ทำงานได้กับ Apostroph หนึ่งอันที่อยู่ตรงกลางถ้าคำนั้น
JörgHülsermann

ฉันพบว่าปัญหาของฉันคืออะไร - เซิร์ฟเวอร์ของฉันไม่ได้เปิดใช้งานแท็กเปิดสั้น ๆ เปลี่ยนเป็น<?phpทำงาน
DLosc

@Dlosc ฉันไม่เคยใช้<?ในความเป็นจริง ฉันใช้แท็กสั้นเฉพาะในโพสต์ของฉันที่นี่ ตอนนี้ฉันรู้แล้วว่ามันสามารถเปิดใหม่ได้ในหน้าว่าง
JörgHü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".";

บันทึกไปยังแฟ้ม php <scriptpath> <text>rund หลีกเลี่ยงการขึ้นบรรทัดใหม่ในข้อความเพื่อให้มันทำงานในเชลล์


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 หากคุณเริ่มต้น<?คุณสามารถจบลงด้วย?>.เพื่อรับกำไรสุทธิสำหรับ 1 FWIW ฉันจะได้รับIFHCMFF.กรณีทดสอบครั้งแรก (โดยใช้ PHP 5.5.21 64-bit, VC14) ใช้$argnกับ-Fอาจเป็นตัวเลือก
primo

สิ่งที่ฉันหมายถึงคือฉันไม่เห็นว่าphp <filename> <string>เป็นไปได้เมื่อ<string>สามารถมีการขึ้นบรรทัดใหม่
DLosc

@DLosc: แก้ไขข้อผิดพลาด สำหรับการขึ้นบรรทัดใหม่: หลบหนีพวกเขา
ติตัส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.