Escribe una función para descifrar el Cifrado de desafío Feynman # 1

8

El Feynman Challenge Cipher # 1 es el siguiente:

MEOTAIHSIBRTEWDGLGKNLANEAINOEEPEYST
NPEUOOEHRONLTIROSDHEOTNPHGAAETOHSZO
TTENTKEPADLYPHEODOWCFORRRNLCUEEEEOP
GMRLHNNDFTOENEALKEHHEATTHNMESCNSHIR
AETDAHLHEMTETRFSWEDOEOENEGFHETAEDGH
RLNNGOAAEOCMTURRSLTDIDOREHNHEHNAYVT
IERHEENECTRNVIOUOEHOTRNWSAYIFSNSHOE
MRTRREUAUUHOHOOHCDCHTEEISEVRLSKLIHI
IAPCHRHSIHPSNWTOIISISHHNWEMTIEYAFEL
NRENLEERYIPHBEROTEVPHNTYATIERTIHEEA
WTWVHTASETHHSDNGEIEAYNHHHNNHTW

La solución se describe como :

Es un cifrado de transposición simple: divide el texto en piezas de 5 columnas, luego lee desde abajo a la derecha hacia arriba. Los resultados son las primeras líneas de Chaucer's Canterbury Tales en inglés medio .

Cual es:

WHANTHATAPRILLEWITHHISSHOURESSOOTET
HEDROGHTEOFMARCHHATHPERCEDTOTHEROOT
EANDBATHEDEVERYVEYNEINSWICHLICOUROF
WHICHVERTUENGENDREDISTHEFLOURWHANZE
PHIRUSEEKWITHHISSWEETEBREFTHINSPIRE
DHATHINEVERYHOLTANDHEETHTHETENDRECR
OPPESANDTHEYONGESONNEHATHINTHERAMHI
SHALVECOURSYRONNEANDSMALEFOWELESMAK
ENMELODYETHATSLEPENALTHENYGHTWITHOP
ENYESOPRIKETHHEMNATUREINHIRCORAGEST
HANNELONGENFOLKTOGOONONPILGRIM

El reto:

Escribe una función para descifrar el cifrado.

La salida no necesita saltos de línea ni espacios.

La entrada no tiene saltos de línea ni espacios.

La solución más corta gana.

(Puntos de bonificación si puedes resolver los otros 2 cifrados: P)


Mi intento (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
fuente
1
¿Qué restricciones existen sobre los supuestos de entrada? Por ejemplo, ambas soluciones hasta ahora asumen entrada como una sola línea sin espacios en blanco; el suyo asume que está en una variable y gnibbler asume que está en stdin.
Peter Taylor

Respuestas:

7

Golfscript, 10 caracteres

n--1%5/zip

Toma información de stdin. Puede estar separado por nuevas líneas, como en la presentación de la pregunta, o no, como suponen muchas respuestas. (De todos modos, es necesario eliminar las nuevas líneas dado que es probable que llegue con una al final, lo que desordena los bloques de 5). Si suponemos que la entrada llega precisamente con una nueva línea, siendo el último carácter, podemos afeitar un carácter para

)!(%5/zip
Peter Taylor
fuente
3

Mathematica, 51


Mathematica es bastante detallado aquí, pero también es fácil adivinar lo que está haciendo.

Thread[Characters@#~Partition~5]~Reverse~{1,2}<>""&
Señor mago
fuente
3

J , 13 caracteres

|.@(/:5|i.@#)
efímero
fuente
2

Haskell, 52

f s=[s!!(x-i)|x<-[length s],j<-[1..5],i<-[j,j+5..x]]
hammar
fuente
3
x<-[length s]... repugnante. ¡Me encanta!
Thomas Eding
2

Japt -P, 4 3 bytes

Ôó5

Pruébalo en línea!

Siento que eso fue demasiado fácil? En una nota positiva, esto no se puede jugar demasiado suponiendo que estoy obteniendo el resultado correcto :)

EDITAR -1 byte gracias a @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
fuente
1
Hay un atajo para w ;)
Shaggy
1

Python - 56 caracteres

s=raw_input()
print"".join(s[-1-x::-5]for x in range(5))
gnibbler
fuente
2 caracteres más cortos con python 3 (-4 para en inputlugar de raw_input; +2 para agregar paréntesis para imprimir.
Steven Rumbalski
1

Scala, 62 caracteres

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

Suponiendo que la cadena ya está en una variable scomo lo hacen hammar y stevether.
Tomar la entrada de stdin es un poco más feo (92 caracteres):

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

y solo funciona si no hay nuevas líneas en la entrada.

Gareth
fuente
1

Perl , 58 caracteres

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

Scala 63 caracteres:

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

Suponiendo que la entrada está en s.

usuario desconocido
fuente
1

K, 34

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

ECMAScript 6 - 48 caracteres

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

Asume que la variable scontiene la cadena de entrada (sin ningún espacio en blanco) y crea la variable que ccontiene la salida.

MT0
fuente