神経カエルの解読


28

神経カエルの解読

Puzzling.SEがついに両生類に取り付かれた暗号を解読したので、それを解読するプログラムまたは関数を書きましょう!

(パズルを台無しにする前に見たい場合は、今すぐ上記のリンクをクリックしてください。)


暗号の仕組み

神経症カエルでO ughtへのRel AのX M UD浴場(略して「神経症カエル」)は、すべての文字は、1つのまたは2つの単語として暗号化されています。

  • イタリック体でない単語の長さは文字を表します。
    • neurotic => 8文字=> H
    • frogs => 5文字=> E
    • perpendicular => 13文字= M
  • 斜体を含む単語は次の単語を変更し、斜体の単語の長さが奇数の場合は10を追加し、斜体の単語の長さが偶数の場合は20を追加します。単語の一部またはすべてを斜体にすることができます。斜体の単語の後には、常に非斜体の単語が続きます。
    • *o*ught to =>奇数、2 => 12 => L
    • lo*u*nging calms =>偶数、5 => 25 => Y

平文のすべての単語は暗号文の文に対応し、平文のすべての文は暗号文の段落に対応します。

入力形式

プログラムまたは関数は、MarkdownでフォーマットされたメッセージをNeurotic Frogsで入力します。入力は、印刷可能なASCIIと改行のみで構成されます。

  • 単語は、正規表現に一致する文字の連続です[A-Za-z0-9']
    • 数字と文字はどちらも単語の長さにカウントされます。QB64を表しDます。
    • 注:アポストロフィ単語の長さにカウントされません。ではなくをIsn't表します。DE
  • 斜体の文字は、一対のアスタリスク(*letters*)で囲まれています。
    • 1つ以上の連続した文字を、単語全体(masseus*es**all*)までイタリック体にすることができます。単語内の複数の非連続文字も斜体にすることができます(g*e*n*e*rates)。
    • 斜体は、複数の単語にまたがったり、句読点を含めたり、アポストロフィを含めたりすることはありません。
    • ペアになっていないアスタリスクと複数の隣接するアスタリスクは発生しません。
  • 句読点は次の文字のいずれかです.,?!:;-()"
    • 文内の単語は、1つ以上の句読点文字および/または単一のスペースで区切られます。例:*all* welcomedtoad*s*, newtsEver*y*one--frogscap... blissthey're (I
    • 文は1つ以上の句読点文字で終わり、二重スペースで区切られます。 Th*e* Montgomery A*m*phibian Salon! Come luxuriate today!
    • 段落は単一の改行で区切られます。(段落の最後の文には、最後に1つ以上の句読点文字がまだあります。)

他の文字は入力に表示されず、処理する必要はありません。

あなたのコードは、あなたの裁量で、入力に単一の末尾の改行があると期待するかもしれません。

出力フォーマット

入力を解読した結果は、1つ以上の文になります。平文の文字は、大文字と小文字の任意の組み合わせにすることができます。文内の単語は単一のスペースで区切る必要があります。文はピリオド(.)で終了し、単一のスペースで区切る必要があります。最後の文の後に末尾のスペースを出力できます。出力はすべて1行になりますが、末尾の改行を出力できます。

その他の詳細

コードでは、標準の入力および出力メソッドのいずれかを使用できます。リストやその他のデータ構造ではなく、複数行の文字列として入力を受け取り、文字列を出力する必要があります。

バイト単位の最短コードが勝ちです!

テストケース

-->
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。ああ、あなたのスキルのために、それも。
魔法のタコUr

斜体を含む単語の後に、斜体を含まない単語が続くことが保証されていますか?
R. Kap

@ R.Kap正しい。それを明確にするために質問を編集しました。
DLosc

回答:


5

Perl、72バイト

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

シバンを1つとしてカウントすると、入力は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バイト

@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,". ")
ニール

現在の形式で動作するようです。
プリモ

@ニールありがとう。これにより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フラグは、標準入力のすべての行を読み込み、中にそれらのリストを格納します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

無敵のようです。
プリモ

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

もっとたくさんゴルフをすることができます。チャンスがあればいつでもやってみます。

すべてのテストケースでRepl.it!

説明:

Pythonの組み込みの非常に強力な機能を使用して、入力を解読します。これは、関数が各入力に対して行う基本的なプロセスです。

  1. まず、すべて--が単一のスペースに置き換えられ、すべてのアポストロフィが削除されます。次いで、イタリック体成分と、それは両方の1つの文字列にマッチしたとで置換されている進行ワードを含むすべての単語10 + len(second word)の連続の数a最初のワードの長さである場合、S odd、及び20 + len(second word)連続aさもなければ秒。これは、次の正規表現を使用します。

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

    私たちは、文を持っている場合たとえば、Perpendicular l*ou*nging calms.l*ou*nging calmsに置き換えられますaaaaaaaaaaaaaaaaaaaaaaaaa、または25 a以降、S l*ou*ngingの文字の偶数を持っており、calms5を持っています20+5=25

  2. 現在、新たに変更された入力は各句読点で区切られ、その後に改行(\n)が続き、段落が取得されます。次に、各段落が各句読点で区切られ、その後に2つのスペースが続いて文が取得され、最後に各文がそれに沿って単語に分割されますスペースを含む句読点。次に、(連続での実行など、各単語のためaの)、我々は文字列に上の追加WUnicodeのコードポイントに対応する文字64(文字の前のUnicodeコードポイントAであるが、@)を加えましたlen(word)。次にW、文のすべての単語が使い果たさ.れた後に単一のスペースを追加します。段落内のすべての文が使い果たされたら、その後に単一のスペースを追加します。

  3. 最後に、入力全体が完了した後、解読Wstdoutれたメッセージとして出力されます。


ちょっとした注意:出力文は二重ではなく、単一のスペースで区切られていると仕様に書かれています(この変更によりバイトも節約されます)。最初のゴルフの提案:からすべてをインポートしているreため、のsub代わりに使用しますstr.replace。より一般的なゴルフの提案:言葉ではないものや*句読点として扱うことはおそらくより効率的です。大きな巨大なキャラクタークラスを節約します。
DLosc

@DLoscああ、私の悪い。仕様では、出力内の文を2つのスペースで区切ることだと思いました。それを修正します。また、ゴルフの提案に感謝します!私はそれらで何ができるかを見ていきます。
R.ガプス

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

単語の途中にアポストロフィが1つしかないと仮定できる場合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 関数としてurlencodedされましたrawurlencode("\n")。私は、この場合には、入力のためのテキストエリアで、私のhtmlサイトは、それが自動的に文字列をエンコードすることができますので、フォーム好む
イェルクHülsermann

@DLosc php.iniのerror_reportingがオンになっていると思われます。「error_reporting(0);」を試してください 後<?。1つのエラー$_GET[s]が機能しますが$_GET["s"]、正しいのは$p=0;、ループの前に変数を宣言して初期化する方が適切です。さて、あなたへの私の質問は次のとおりです。1つのWordには、Wordの中央にある1つのアポストロフィしかないと思いますか?
ヨルクヒュルサーマン

複数のアポストロフィの@DLosc最初の回答を使用する必要があります。2番目の-2バイトは、単語の中央に1つのアポストロフがある場合にのみ機能します。
ヨルクヒュルサーマン

私の問題が何であるかを理解しました-私のサーバーは短い開始タグを有効にしていません。動作するように変更し<?phpます。
DLosc

@Dlosc私は<?実際に使用したことがありません。ここでの投稿でのみ短いタグを使用します。これで、空白のページに表示されることがわかりました。
ヨルクヒュルサーマン

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で始まる場合<??>.、で終わることもできます。1の純利益のためIFHCMFF.に、最初のテストケース(PHP 5.5.21 64ビット、VC14を使用)を取得します。$argnwith を使用する-Fこともオプションです。
プリモ

私が意味することは、改行を含めることphp <filename> <string>ができる場合にどのように可能かはわかりません<string>
DLosc

@DLosc:バグを修正しました。改行の場合:エスケープします。
タイタス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.