Schreiben Sie eine Funktion zum Entschlüsseln von Feynman Challenge Cipher # 1

8

Die Feynman Challenge Cipher # 1 lautet wie folgt:

MEOTAIHSIBRTEWDGLGKNLANEAINOEEPEYST
NPEUOOEHRONLTIROSDHEOTNPHGAAETOHSZO
TTENTKEPADLYPHEODOWCFORRRNLCUEEEEOP
GMRLHNNDFTOENEALKEHHEATTHNMESCNSHIR
AETDAHLHEMTETRFSWEDOEOENEGFHETAEDGH
RLNNGOAAEOCMTURRSLTDIDOREHNHEHNAYVT
IERHEENECTRNVIOUOEHOTRNWSAYIFSNSHOE
MRTRREUAUUHOHOOHCDCHTEEISEVRLSKLIHI
IAPCHRHSIHPSNWTOIISISHHNWEMTIEYAFEL
NRENLEERYIPHBEROTEVPHNTYATIERTIHEEA
WTWVHTASETHHSDNGEIEAYNHHHNNHTW

Die Lösung wird beschrieben als :

Es ist eine einfache Transpositions-Chiffre: Teilen Sie den Text in 5-Spalten-Teile und lesen Sie ihn dann von rechts unten nach oben. Das Ergebnis sind die Eröffnungszeilen von Chaucers Canterbury Tales in Mittelenglisch .

Welches ist:

WHANTHATAPRILLEWITHHISSHOURESSOOTET
HEDROGHTEOFMARCHHATHPERCEDTOTHEROOT
EANDBATHEDEVERYVEYNEINSWICHLICOUROF
WHICHVERTUENGENDREDISTHEFLOURWHANZE
PHIRUSEEKWITHHISSWEETEBREFTHINSPIRE
DHATHINEVERYHOLTANDHEETHTHETENDRECR
OPPESANDTHEYONGESONNEHATHINTHERAMHI
SHALVECOURSYRONNEANDSMALEFOWELESMAK
ENMELODYETHATSLEPENALTHENYGHTWITHOP
ENYESOPRIKETHHEMNATUREINHIRCORAGEST
HANNELONGENFOLKTOGOONONPILGRIM

Die Herausforderung:

Schreiben Sie eine Funktion zum Entschlüsseln der Chiffre.

Die Ausgabe benötigt keine Zeilenumbrüche oder Leerzeichen.

Die Eingabe hat keine Zeilenumbrüche oder Leerzeichen.

Die kürzeste Lösung gewinnt.

(Bonuspunkte, wenn Sie die anderen 2 Chiffren lösen können: P)


Mein Versuch (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
quelle
1
Welche Einschränkungen bestehen bei den Eingangsannahmen? ZB gehen beide Lösungen bisher von einer Eingabe als einzelne Zeile ohne Leerzeichen aus. Ihr geht davon aus, dass es sich um eine Variable handelt, und Gnibbler geht davon aus, dass es sich um eine Standardvariable handelt.
Peter Taylor

Antworten:

7

Golfscript, 10 Zeichen

n--1%5/zip

Nimmt Eingaben von stdin entgegen. Es kann durch Zeilenumbrüche getrennt sein, wie in der Fragenpräsentation, oder nicht, wie viele Antworten annehmen. (Das Entfernen der Zeilenumbrüche ist ohnehin erforderlich, da es wahrscheinlich mit einer am Ende ankommt, was die 5er-Blöcke durcheinander bringt.) Wenn wir davon ausgehen, dass die Eingabe mit genau einer neuen Zeile als letztem Zeichen eingeht, können wir ein Zeichen rasieren

)!(%5/zip
Peter Taylor
quelle
3

Mathematica, 51


Mathematica ist hier ziemlich ausführlich, aber es ist auch leicht zu erraten, was es tut.

Thread[Characters@#~Partition~5]~Reverse~{1,2}<>""&
Mr.Wizard
quelle
3

J , 13 Zeichen

|.@(/:5|i.@#)
kurzlebig
quelle
2

Haskell, 52

f s=[s!!(x-i)|x<-[length s],j<-[1..5],i<-[j,j+5..x]]
Hammar
quelle
3
x<-[length s]... widerlich. Ich liebe es!
Thomas Eding
2

Japt -P, 4 3 Bytes

Ôó5

Probieren Sie es online aus!

Ich denke, das war zu einfach? Positiv ist zu vermerken, dass dies unmöglich zu viel Golf gespielt werden kann, vorausgesetzt, ich erhalte das richtige Ergebnis :)

BEARBEITEN -1 Byte dank @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
quelle
1
Es gibt eine Abkürzung für w ;)
Shaggy
1

Python - 56 Zeichen

s=raw_input()
print"".join(s[-1-x::-5]for x in range(5))
Gnibbler
quelle
2 Zeichen kürzer mit Python 3 (-4 für inputstatt raw_input; +2 für das Hinzufügen von Klammern zum Drucken.
Steven Rumbalski
1

Scala, 62 Zeichen

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

Unter der Annahme, dass sich die Zeichenfolge bereits in einer Variablen befindet, swie dies bei Hammar und Stevether der Fall ist.
Die Eingabe von stdin ist etwas hässlicher (92 Zeichen):

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

und es funktioniert nur, wenn die Eingabe keine Zeilenumbrüche enthält.

Gareth
quelle
1

Perl , 58 Zeichen

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

Scala 63 Zeichen:

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

Angenommen, die Eingabe erfolgt in s.

Benutzer unbekannt
quelle
1

K, 34

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

ECMAScript 6 - 48 Zeichen

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

Angenommen, die Variable senthält die Eingabezeichenfolge (ohne Leerzeichen) und erstellt die Variable, cdie die Ausgabe enthält.

MT0
quelle