ファインマンチャレンジ暗号#1を復号化する関数を作成する


8

ファインマンチャレンジ暗号#1は、次のとおりです。

MEOTAIHSIBRTEWDGLGKNLANEAINOEEPEYST
NPEUOOEHRONLTIROSDHEOTNPHGAAETOHSZO
TTENTKEPADLYPHEODOWCFORRRNLCUEEEEOP
GMRLHNNDFTOENEALKEHHEATTHNMESCNSHIR
AETDAHLHEMTETRFSWEDOEOENEGFHETAEDGH
RLNNGOAAEOCMTURRSLTDIDOREHNHEHNAYVT
IERHEENECTRNVIOUOEHOTRNWSAYIFSNSHOE
MRTRREUAUUHOHOOHCDCHTEEISEVRLSKLIHI
IAPCHRHSIHPSNWTOIISISHHNWEMTIEYAFEL
NRENLEERYIPHBEROTEVPHNTYATIERTIHEEA
WTWVHTASETHHSDNGEIEAYNHHHNNHTW

ソリューションは次のように説明されます。

これは単純な転置暗号です。テキストを5列の断片に分割し、右下から上に向かって読み取ります。結果は、チョーサーのカンタベリー物語のミドルイングリッシュでのオープニングラインです。

それは:

WHANTHATAPRILLEWITHHISSHOURESSOOTET
HEDROGHTEOFMARCHHATHPERCEDTOTHEROOT
EANDBATHEDEVERYVEYNEINSWICHLICOUROF
WHICHVERTUENGENDREDISTHEFLOURWHANZE
PHIRUSEEKWITHHISSWEETEBREFTHINSPIRE
DHATHINEVERYHOLTANDHEETHTHETENDRECR
OPPESANDTHEYONGESONNEHATHINTHERAMHI
SHALVECOURSYRONNEANDSMALEFOWELESMAK
ENMELODYETHATSLEPENALTHENYGHTWITHOP
ENYESOPRIKETHHEMNATUREINHIRCORAGEST
HANNELONGENFOLKTOGOONONPILGRIM

チャレンジ:

暗号を復号化する関数を記述します。

出力には改行やスペースは必要ありません。

入力には改行やスペースがありません。

最短のソリューションが優先されます。

(他の2つの暗号を解くことができる場合のボーナスポイント:P)


私の試み(PHP 77 70):

$b=strrev($a);for($i=0;$i<5;$i++)for($j=0;$j<381;$j++)$r.=$b[$i+$j*5];

http://codepad.org/PFj9tGb1


1
入力の仮定にはどのような制限がありますか?たとえば、これまでの両方のソリューションでは、入力を空白のない単一行と想定しています。あなたのものはそれが変数にあると想定し、gniblerはそれが標準入力にあると想定します。
— Peter Taylor

回答:


7

Golfscript、10文字

n--1%5/zip

stdinから入力を受け取ります。多くの回答が想定しているように、質問のプレゼンテーションのように、改行で区切られる場合とそうでない場合があります。(いずれにしても、最後に1つが付いて5のブロックがめちゃくちゃになる可能性があるため、改行を取り除く必要があります)。入力が最後の文字である正確に1つの改行で到着すると仮定すると、1つの文字を剃って

)!(%5/zip

3

Mathematica、51歳


Mathematicaはここではかなり冗長ですが、何をしているのかを推測するのも簡単です。

Thread[Characters@#~Partition~5]~Reverse~{1,2}<>""&



2

Japt -P、4 3バイト

Ôó5

オンラインでお試しください!

簡単すぎると思いませんか?前向きなことに、私が正しい結果を得ているとすれば、これはあまりゴルフになりません。

@Shaggyのおかげで-1バイト編集!

Ôó5    # full program
Ô      # reverse input string
 ó5    # create a 5-element array by repeatedly
       # picking every 5th character.
       # -P flag concatenates array on output!

1
のショートカットがありw ます;)
— Shaggy

1

Python-56文字

s=raw_input()
print"".join(s[-1-x::-5]for x in range(5))

Python 3 inputでは2文字短縮(代わりに-4、raw_input印刷する括弧を追加するには+2)
— Steven Rumbalski

1

Scala、62文字

print((for(x<-0 to 4;y<-379-x to 0 by -5)yield s(y)).mkString)

文字列はすでにshammarやstevetherと同じように変数にあると仮定しています。
stdinから入力を取得するのは少し醜い(92文字):

var s=io.Source.stdin.mkString
print((for(x<-0 to 4;y<-379-x to 0 by -5)yield s(y)).mkString)

入力に改行がない場合にのみ機能します。


1

Perl、58文字

perl -lne'$c[$c++%5].=$_ for split//}END{$"=$,,print$_=reverse"@c"'

1

Scala 63文字:

(1 to 5).map(n=>s.reverse.drop(n)).map(_.sliding(1,5).mkString)

入力がsであると仮定します。



1

ECMAScript 6-48文字

for(c='',i=5;i--;)c+=(x=>s[x]?f(x+5)+s[x]:'')(i)

変数sに入力文字列(空白文字なし)が含まれていると想定し、c出力を含む変数を作成します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.