Viết hàm để giải mã Mật mã thách thức Feynman # 1


8

Các Feynman Challenge Cipher # 1 như sau:

MEOTAIHSIBRTEWDGLGKNLANEAINOEEPEYST
NPEUOOEHRONLTIROSDHEOTNPHGAAETOHSZO
TTENTKEPADLYPHEODOWCFORRRNLCUEEEEOP
GMRLHNNDFTOENEALKEHHEATTHNMESCNSHIR
AETDAHLHEMTETRFSWEDOEOENEGFHETAEDGH
RLNNGOAAEOCMTURRSLTDIDOREHNHEHNAYVT
IERHEENECTRNVIOUOEHOTRNWSAYIFSNSHOE
MRTRREUAUUHOHOOHCDCHTEEISEVRLSKLIHI
IAPCHRHSIHPSNWTOIISISHHNWEMTIEYAFEL
NRENLEERYIPHBEROTEVPHNTYATIERTIHEEA
WTWVHTASETHHSDNGEIEAYNHHHNNHTW

Giải pháp được mô tả là :

Đó là một mật mã chuyển vị đơn giản: chia văn bản thành các đoạn 5 cột, sau đó đọc từ dưới bên phải lên trên. Kết quả là những dòng mở đầu của Canterbury Tales bằng tiếng Anh .

Đó là:

WHANTHATAPRILLEWITHHISSHOURESSOOTET
HEDROGHTEOFMARCHHATHPERCEDTOTHEROOT
EANDBATHEDEVERYVEYNEINSWICHLICOUROF
WHICHVERTUENGENDREDISTHEFLOURWHANZE
PHIRUSEEKWITHHISSWEETEBREFTHINSPIRE
DHATHINEVERYHOLTANDHEETHTHETENDRECR
OPPESANDTHEYONGESONNEHATHINTHERAMHI
SHALVECOURSYRONNEANDSMALEFOWELESMAK
ENMELODYETHATSLEPENALTHENYGHTWITHOP
ENYESOPRIKETHHEMNATUREINHIRCORAGEST
HANNELONGENFOLKTOGOONONPILGRIM

Các thách thức:

Viết hàm để giải mã mật mã.

Đầu ra không cần ngắt dòng hoặc dấu cách.

Đầu vào không có ngắt dòng hoặc dấu cách.

Giải pháp ngắn nhất chiến thắng.

(Điểm thưởng nếu bạn có thể giải được 2 mật mã khác: P)


Nỗ lực của tôi (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
Có những hạn chế nào đối với các giả định đầu vào? Ví dụ, cả hai giải pháp cho đến nay đều giả sử đầu vào là một dòng duy nhất không có khoảng trắng; của bạn giả định rằng đó là một biến số và gnibbler giả định rằng đó là trên stdin.
Peter Taylor

Câu trả lời:


7

Golf, 10 ký tự

n--1%5/zip

Lấy đầu vào từ stdin. Nó có thể được phân tách bằng các dòng mới, như trong phần trình bày câu hỏi, hoặc không, như nhiều câu trả lời giả định. (Tước các dòng mới là cần thiết dù sao đi nữa vì nó có khả năng đến với một ở cuối, làm rối tung các khối 5). Nếu chúng ta giả sử rằng đầu vào đến với chính xác một dòng mới, là ký tự cuối cùng, chúng ta có thể cạo một ký tự thành

)!(%5/zip

3

Toán học, 51


Mathematica khá dài dòng ở đây, nhưng cũng dễ đoán những gì nó đang làm.

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]... kinh tởm Tôi thích nó!
Thomas Eding

2

Japt -P, 4 3 byte

Ôó5

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

Tôi cảm thấy như thế là quá dễ dàng? Trên một lưu ý tích cực, điều này có thể không thể được đánh golf quá nhiều giả sử tôi đang nhận được kết quả chính xác :)

EDIT -1 byte nhờ @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
Có một lối tắt cho w ;)
Shaggy


1

Scala, 62 ký tự

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

Giả định rằng chuỗi đã có trong một biến snhư hammar và hoàn toàn làm được.
Lấy đầu vào từ stdin thì hơi xấu hơn (92 ký tự):

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

và nó chỉ hoạt động nếu không có dòng mới trong đầu vào.


1

Perl , 58 ký tự

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



1

ECMAScript 6 - 48 ký tự

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

Giả sử rằng biến schứa chuỗi đầu vào (không có bất kỳ ký tự khoảng trắng nào) và tạo biến cchứa đầu ra.


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.