Tulis fungsi untuk mendekripsi Feynman Challenge Cipher # 1

8

The Feynman Challenge Cipher # 1 adalah sebagai berikut:

MEOTAIHSIBRTEWDGLGKNLANEAINOEEPEYST
NPEUOOEHRONLTIROSDHEOTNPHGAAETOHSZO
TTENTKEPADLYPHEODOWCFORRRNLCUEEEEOP
GMRLHNNDFTOENEALKEHHEATTHNMESCNSHIR
AETDAHLHEMTETRFSWEDOEOENEGFHETAEDGH
RLNNGOAAEOCMTURRSLTDIDOREHNHEHNAYVT
IERHEENECTRNVIOUOEHOTRNWSAYIFSNSHOE
MRTRREUAUUHOHOOHCDCHTEEISEVRLSKLIHI
IAPCHRHSIHPSNWTOIISISHHNWEMTIEYAFEL
NRENLEERYIPHBEROTEVPHNTYATIERTIHEEA
WTWVHTASETHHSDNGEIEAYNHHHNNHTW

Solusinya digambarkan sebagai :

Ini adalah sandi transposisi sederhana: pisahkan teks menjadi potongan-potongan 5 kolom, lalu baca dari kanan bawah ke atas. Apa hasil adalah garis pembukaan Chaucer's Canterbury Tales in Middle English .

Yang mana:

WHANTHATAPRILLEWITHHISSHOURESSOOTET
HEDROGHTEOFMARCHHATHPERCEDTOTHEROOT
EANDBATHEDEVERYVEYNEINSWICHLICOUROF
WHICHVERTUENGENDREDISTHEFLOURWHANZE
PHIRUSEEKWITHHISSWEETEBREFTHINSPIRE
DHATHINEVERYHOLTANDHEETHTHETENDRECR
OPPESANDTHEYONGESONNEHATHINTHERAMHI
SHALVECOURSYRONNEANDSMALEFOWELESMAK
ENMELODYETHATSLEPENALTHENYGHTWITHOP
ENYESOPRIKETHHEMNATUREINHIRCORAGEST
HANNELONGENFOLKTOGOONONPILGRIM

Tantangan:

Tulis fungsi untuk mendekripsi sandi.

Output tidak membutuhkan jeda baris atau spasi.

Input tidak memiliki jeda baris atau spasi.

Solusi terpendek menang.

(Poin bonus jika Anda dapat memecahkan 2 cipher lainnya: P)


Usaha saya (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

Steve Robbins
sumber
1
Batasan apa yang ada pada asumsi input? Misalnya, kedua solusi sejauh ini menganggap input sebagai satu baris tanpa spasi putih; Anda mengasumsikan bahwa itu dalam variabel dan gnibbler mengasumsikan bahwa itu ada di stdin.
Peter Taylor

Jawaban:

7

Golfscript, 10 karakter

n--1%5/zip

Mengambil input dari stdin. Mungkin dipisahkan oleh baris baru, seperti dalam presentasi pertanyaan, atau tidak, seperti yang diasumsikan oleh banyak jawaban. (Tetap saja menelanjangi baris baru perlu diberikan karena kemungkinan akan tiba dengan satu di ujung, yang mengacaukan blok 5) Jika kita berasumsi bahwa input datang dengan tepat satu baris baru, sebagai karakter terakhir, kita dapat mencukur satu karakter

)!(%5/zip
Peter Taylor
sumber
3

Mathematica, 51


Mathematica cukup bertele-tele di sini, tetapi juga mudah untuk menebak apa yang dilakukannya.

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

J , 13 karakter

|.@(/:5|i.@#)
singkat
sumber
2

Haskell, 52

f s=[s!!(x-i)|x<-[length s],j<-[1..5],i<-[j,j+5..x]]
hammar
sumber
3
x<-[length s]... menjijikkan. Aku menyukainya!
Thomas Eding
2

Japt -P, 4 3 byte

Ôó5

Cobalah online!

Saya merasa itu terlalu mudah? Pada catatan positif, ini tidak mungkin golf terlalu banyak dengan asumsi saya mendapatkan hasil yang benar :)

EDIT -1 byte berkat @Shaggy!

Ôó5    # full program
Ô      # reverse input string
 ó5    # create a 5-element array by repeatedly
       # picking every 5th character.
       # -P flag concatenates array on output!
dana
sumber
1
Ada jalan pintas untuk w ;)
Shaggy
1

Python - 56 karakter

s=raw_input()
print"".join(s[-1-x::-5]for x in range(5))
gnibbler
sumber
2 karakter lebih pendek dengan python 3 (-4 untuk inputbukan raw_input; +2 untuk menambahkan tanda kurung untuk dicetak.
Steven Rumbalski
1

Scala, 62 karakter

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

Membuat asumsi bahwa string sudah dalam variabel sseperti yang dilakukan oleh hammar dan stevether.
Mengambil input dari stdin sedikit lebih buruk (92 karakter):

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

dan itu hanya berfungsi jika tidak ada baris baru di input.

Gareth
sumber
1

Perl , 58 karakter

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

Scala 63 chars:

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

Asumsikan input dalam s.

Pengguna tidak diketahui
sumber
1

K, 34

{a::(5*!76)_x;1'{a[;x]@|!#a}@'|!5}
tmartin
sumber
1

ECMAScript 6 - 48 Karakter

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

Diasumsikan bahwa variabel sberisi string input (tanpa karakter spasi putih) dan membuat variabel yang cberisi output.

MT0
sumber
0

Python 3.6 , 48 byte

Rekursi + f-Strings

f=lambda a:a and f'{a[::-5]+f(a[:-1])}'[:len(a)]

Cobalah online!

PieCot
sumber