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


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

3

Mathematica, 51


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

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


2

Haskell, 52

f s=[s!!(x-i)|x<-[length s],j<-[1..5],i<-[j,j+5..x]]

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!

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

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.


1

Perl , 58 karakter

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



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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.