Giải mã ếch thần kinh


28

Giải mã ếch thần kinh

Bây giờ Puzzling.SE cuối cùng đã phá vỡ mật mã bị ám ảnh bởi động vật lưỡng cư của tôi , hãy viết một chương trình hoặc chức năng để giải mã nó!

(Nếu bạn muốn xem câu đố trước khi làm hỏng nó, hãy nhấp vào liên kết ở trên ngay bây giờ.)


Mật mã hoạt động như thế nào

Trong Ếch thần kinh O ught To Rel a x In M ud Tắm (gọi tắt là "Ếch thần kinh"), mỗi chữ cái được mã hóa thành một hoặc hai từ:

  • Độ dài của một từ không in nghiêng thể hiện một chữ cái.
    • neurotic => 8 chữ cái => H
    • frogs => 5 chữ cái => E
    • perpendicular => 13 chữ cái = M
  • Một từ có chứa chữ in nghiêng sửa đổi từ sau, thêm 10 nếu từ in nghiêng là số lẻ có độ dài hoặc 20 nếu từ in nghiêng thậm chí có độ dài. Bất kỳ hoặc tất cả các từ có thể được in nghiêng. Một từ in nghiêng luôn được theo sau bởi một từ không in nghiêng.
    • *o*ught to => lẻ, 2 => 12 => L
    • lo*u*nging calms => chẵn, 5 => 25 => Y

Mỗi từ của bản rõ tương ứng với một câu của bản mã, và mỗi câu của bản rõ tương ứng với một đoạn của bản mã.

định dạng đầu vào

Chương trình hoặc chức năng của bạn sẽ nhập một thông báo trong Neurotic Frogs, được định dạng trong Markdown. Đầu vào sẽ chỉ bao gồm ASCII có thể in và các dòng mới.

  • Từ là chạy các ký tự phù hợp với regex [A-Za-z0-9'].
    • Số và chữ đều được tính theo chiều dài của một từ. QB64đại diện D.
    • LƯU Ý: Dấu nháy đơn không được tính vào độ dài của từ. Isn'tđại diện D, không E.
  • Chữ in nghiêng được gói trong một cặp dấu hoa thị ( *letters*).
    • Một hoặc nhiều chữ cái liên tiếp có thể được in nghiêng, lên đến toàn bộ một từ ( masseus*es*, *all*); nhiều chữ cái không liên tiếp trong một từ cũng có thể được in nghiêng ( g*e*n*e*rates).
    • Chữ in nghiêng không bao giờ kéo dài nhiều từ, không bao giờ có dấu chấm câu và không bao giờ bao gồm dấu nháy đơn.
    • Dấu sao không ghép đôi và nhiều dấu sao liền kề sẽ không bao giờ xảy ra.
  • Dấu câu là bất kỳ ký tự nào sau đây : .,?!:;-()".
    • Các từ trong câu được phân tách bằng một hoặc nhiều ký tự dấu chấm câu và / hoặc một khoảng trắng. Ví dụ: *all* welcomed, toad*s*, newts, Ever*y*one--frogs, cap... bliss,they're (I
    • Các câu kết thúc bằng một hoặc nhiều ký tự dấu chấm câu và được phân tách bằng dấu cách kép: Th*e* Montgomery A*m*phibian Salon! Come luxuriate today!
    • Các đoạn được phân tách bằng một dòng mới. (Câu cuối cùng của đoạn văn vẫn có một hoặc nhiều ký tự dấu chấm câu ở cuối.)

Các ký tự khác sẽ không xuất hiện trong đầu vào và không cần xử lý.

Mã của bạn có thể, theo quyết định của bạn, hy vọng đầu vào sẽ có một dòng mới duy nhất.

Định dạng đầu ra

Kết quả của việc giải mã đầu vào sẽ là một hoặc nhiều câu. Chữ cái viết rõ có thể là bất kỳ sự kết hợp nào của chữ hoa và chữ thường. Các từ trong một câu phải được phân tách bằng khoảng trắng đơn. Các câu phải kết thúc bằng dấu chấm ( .) và được phân tách bằng một khoảng trắng. Bạn có thể xuất ra một dấu cách sau câu cuối cùng. Tất cả đầu ra của bạn sẽ nằm trên một dòng, nhưng bạn có thể xuất ra một dòng mới.

Chi tiết linh tinh

Mã của bạn có thể sử dụng bất kỳ phương thức đầu vào và đầu ra tiêu chuẩn nào. Nó phải nhận đầu vào dưới dạng một chuỗi nhiều dòng, không phải là danh sách hoặc cấu trúc dữ liệu khác và nó phải xuất ra một chuỗi.

Mã ngắn nhất tính bằng byte thắng!

Các trường hợp thử nghiệm

-->
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 cho đầu vào cô dâu công chúa. Oh, và cho kỹ năng của bạn, điều đó cũng vậy.
Bạch tuộc ma thuật Urn

Là một từ có chứa chữ nghiêng được đảm bảo theo sau bởi một từ không chứa chữ nghiêng?
R. Kap

@ R.Kap Đúng. Tôi đã chỉnh sửa câu hỏi để làm rõ điều đó.
DLosc

Câu trả lời:


5

Perl, 72 byte

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

Đếm shebang là một, đầu vào được lấy từ stdin.

Sử dụng mẫu

$ 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
Tôi đang trao phần thưởng cho câu trả lời này, vì đây là phần thưởng ngắn nhất vào cuối thời kỳ tiền thưởng bên cạnh phần thưởng của tôi (thực sự, là phần duy nhất đến gần).
DLosc

4

JavaScript (ES6), 172 169 157 150 byte

Đã lưu 10 byte nhờ @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``+"."

Có lẽ có thể được cải thiện hơn nữa. Đầu ra trong tất cả các chữ thường.


Lưu 2 byte bằng cách di chuyển i=0vào toString.
Neil

Vì thích thú, tôi đã đi sửa những lỗi đó và nghĩ ra điều này: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

Có vẻ như để làm việc trong hình thức hiện tại của nó.
primo

@Neil Cảm ơn. Điều đó tiết kiệm 12 byte, nhưng nó không hoạt động trong trường hợp thử nghiệm cuối cùng. Sửa lỗi thêm 9 để rút ngắn 3 byte.
Sản xuất ETH

@Neil Loại bỏ .replacevà chỉ sử dụng .matchlưu 12 byte khác.
Sản xuất ETH

3

Python 2, 238 221 218 214 207 205 byte

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

Sử dụng rất nhiều regex để xử lý. Chúng tôi biến đổi không gian kép thành ~và sử dụng nó để xử lý nó. ~\nđược xử lý đặc biệt.

Mức tăng ký tự lớn nhất đến từ quá trình tiền xử lý của đầu vào trong fordòng; điều này chắc chắn có thể được chơi golf hơn nữa.

Nghĩa là nó!(tất cả các trường hợp thử nghiệm)

Đã lưu 7 byte nhờ DLosc!


3

Pip , 65 64 byte

Điểm số là 62 byte mã + 2 cho các -rscờ.

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

Hãy thử trực tuyến!

Giải trình

Các -rcờ đọc tất cả các dòng stdin và lưu trữ một danh sách của họ trong g. Các-s lá cờ đặt định dạng đầu ra của danh sách này để không gian tách ra.

Cách dễ nhất để đọc mã này là từ bên ngoài vào:

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

Có vẻ bất khả chiến bại.
primo

1

Python 2.7, 390 342 341 339 335 byte:

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)

Đưa đầu vào theo định dạng:

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

Có thể chơi golf xuống nhiều hơn nữa, điều mà tôi sẽ làm bất cứ khi nào tôi có cơ hội.

Altern.it với tất cả các trường hợp thử nghiệm!

Giải trình:

Sử dụng sức mạnh to lớn của các biểu thức chính quy của Python để giải mã đầu vào. Đây là quá trình cơ bản mà chức năng trải qua cho mỗi đầu vào:

  1. Đầu tiên, tất cả --được thay thế bằng một khoảng trắng duy nhất và mọi dấu nháy đơn được loại bỏ. Sau đó, tất cả các từ có chứa các thành phần in nghiêng và từ tiến hành nó đều được khớp trong một chuỗi và được thay thế bằng 10 + len(second word)số as liên tiếp nếu độ dài của từ đầu tiên oddvà s 20 + len(second word)liên tiếp akhác. Điều này sử dụng biểu thức chính quy sau:

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

    Ví dụ: nếu chúng ta có câu Perpendicular l*ou*nging calms., l*ou*nging calmssẽ được thay thế bằng aaaaaaaaaaaaaaaaaaaaaaaaa, hoặc 25 agiây, vì l*ou*ngingcó số ký tự chẵn và calmscó 5 20+5=25..

  2. Bây giờ, đầu vào mới được sửa đổi được phân chia tại mỗi dấu chấm câu theo sau là một dòng mới ( \n) để lấy các đoạn văn, sau đó mỗi đoạn được chia ở mỗi dấu chấm theo sau 2 dấu cách để có các câu và cuối cùng, mỗi câu được chia thành các từ bất kỳ dấu câu bao gồm cả một khoảng trắng. Sau đó, đối với mỗi từ (bao gồm cả các lần chạy liên tiếp a), chúng ta thêm vào một chuỗi ký tự Wtương ứng với điểm mã unicode 64(điểm mã unicode của ký tự trước Ađó @) len(word). Sau đó, chúng tôi thêm một khoảng trắng vào Wmột khi tất cả các từ của câu đã hết và khi tất cả các câu trong đoạn văn bị cạn kiệt, chúng tôi thêm một .khoảng trống theo sau bởi một khoảng trắng.

  3. Cuối cùng, sau khi toàn bộ đầu vào đã được trải qua, Wlà đầu ra stdoutdưới dạng tin nhắn được giải mã.


Tiểu nitlog: spec cho biết các câu đầu ra được phân tách bằng khoảng trắng đơn, không gấp đôi (thay đổi này cũng tiết kiệm một byte). Gợi ý chơi gôn ban đầu: vì bạn đang nhập mọi thứ từ đó re, hãy sử dụng subthay vì str.replace. Gợi ý chơi golf tổng quát hơn: có thể hiệu quả hơn khi coi mọi thứ không phải là một từ hoặc *là dấu câu. Tiết kiệm trên các lớp nhân vật lớn rất lớn.
DLosc

@DLosc ơi, xấu quá. Tôi nghĩ thông số kỹ thuật là tách các câu trong đầu ra bằng 2 khoảng trắng. Tôi sẽ sửa nó. Ngoài ra, cảm ơn các đề nghị chơi golf! Tôi sẽ xem những gì tôi có thể làm với những người đó.
R. Kap

1

PHP, 196 byte

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

Nếu tôi có thể cho rằng chỉ có một Dấu nháy đơn ở giữa một từ 194 Byte

<?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 Nó được mã hóa %0A thành một hàm rawurlencode("\n"). Trong trường hợp này, tôi thích một biểu mẫu có textarea cho đầu vào và vì vậy trang html của tôi làm cho nó tự động mã hóa chuỗi
Jörg Hülsermann

@DLosc Tôi nghi ngờ rằng có thông báo lỗi trong php.ini. thử 'error_Vporting (0);' sau khi <?. Một lỗi thuộc về $_GET[s]nó hoạt động nhưng chính xác là $_GET["s"]và tốt hơn hết là khai báo biến $p=0;trước vòng lặp. Bây giờ câu hỏi của tôi ở bạn là: Tôi có thể đoán rằng trong một từ chỉ có một Dấu nháy đơn ở giữa Lời không?
Jörg Hülsermann

@DLosc cho nhiều Apostrophes Tôi phải sử dụng câu trả lời đầu tiên của mình. Byte thứ hai - 2 chỉ hoạt động với một Apostroph ở giữa nếu từ.
Jörg Hülsermann

Tôi đã tìm ra vấn đề của mình là gì - máy chủ của tôi không kích hoạt các thẻ mở ngắn. Thay đổi để <?phplàm việc.
DLosc

@Dlosc Tôi chưa bao giờ sử dụng <?trong thực tế. Tôi chỉ sử dụng thẻ ngắn trong bài viết của tôi ở đây. Bây giờ tôi biết rằng nó có thể nối lại trong một trang trống.
Jörg Hülsermann

1

PHP, 231 226 228 byte

Cho một sự khởi đầu

<?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".";

Lưu vào tập tin, rund php <scriptpath> <text>. Thoát dòng mới trong văn bản để làm cho nó hoạt động trong vỏ.


1
Bạn có thể đưa ra một số hướng dẫn về việc chạy này? Có vẻ như nó đọc đầu vào từ $argv[1], nhưng tôi không biết cách tiếp cận đó sẽ hoạt động như thế nào khi đầu vào chứa dòng mới. Tôi đã thử "Neurotic Frogs *O*ught To Re*a*x In *M*ud Baths!"làm một đối số dòng lệnh và nhận được IFHCHCFF.đầu ra (cũng như một Undefined variable: dcảnh báo).
DLosc

@DLosc: Thông báo đó (không phải cảnh báo) không nên có ở đó với cài đặt mặc định. Cách dễ nhất là trả trước <?, lưu nó vào một tệp và gọi nó với php <filename> <string>. Tôi có thể phải thêm 2 vào số byte.
Tít

@Titus Nếu bạn bắt đầu <?, bạn cũng có thể kết thúc bằng ?>., với mức tăng ròng cho 1. FWIW, tôi nhận được IFHCMFF.cho trường hợp thử nghiệm đầu tiên (sử dụng PHP 5.5.21 64-bit, VC14). Sử dụng $argnvới -Fcũng có thể là một lựa chọn.
primo

Ý tôi là, tôi không thấy làm thế nào php <filename> <string>có thể khi <string>có thể chứa các dòng mới.
DLosc

@DLosc: đã sửa lỗi. Đối với các dòng mới: thoát khỏi chúng.
Tít
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.