Escreva uma função para descriptografar a Cifra de Desafio Feynman # 1

8

A cifra de desafio 1 de Feynman é a seguinte:

MEOTAIHSIBRTEWDGLGKNLANEAINOEEPEYST
NPEUOOEHRONLTIROSDHEOTNPHGAAETOHSZO
TTENTKEPADLYPHEODOWCFORRRNLCUEEEEOP
GMRLHNNDFTOENEALKEHHEATTHNMESCNSHIR
AETDAHLHEMTETRFSWEDOEOENEGFHETAEDGH
RLNNGOAAEOCMTURRSLTDIDOREHNHEHNAYVT
IERHEENECTRNVIOUOEHOTRNWSAYIFSNSHOE
MRTRREUAUUHOHOOHCDCHTEEISEVRLSKLIHI
IAPCHRHSIHPSNWTOIISISHHNWEMTIEYAFEL
NRENLEERYIPHBEROTEVPHNTYATIERTIHEEA
WTWVHTASETHHSDNGEIEAYNHHHNNHTW

A solução é descrita como :

É uma cifra de transposição simples: divida o texto em partes de 5 colunas e leia a partir do canto inferior direito para cima. Quais são os resultados das linhas de abertura do Chaucer Canterbury Tales no inglês médio .

Qual é:

WHANTHATAPRILLEWITHHISSHOURESSOOTET
HEDROGHTEOFMARCHHATHPERCEDTOTHEROOT
EANDBATHEDEVERYVEYNEINSWICHLICOUROF
WHICHVERTUENGENDREDISTHEFLOURWHANZE
PHIRUSEEKWITHHISSWEETEBREFTHINSPIRE
DHATHINEVERYHOLTANDHEETHTHETENDRECR
OPPESANDTHEYONGESONNEHATHINTHERAMHI
SHALVECOURSYRONNEANDSMALEFOWELESMAK
ENMELODYETHATSLEPENALTHENYGHTWITHOP
ENYESOPRIKETHHEMNATUREINHIRCORAGEST
HANNELONGENFOLKTOGOONONPILGRIM

O desafio:

Escreva uma função para descriptografar a cifra.

A saída não precisa de quebras de linha ou espaços.

A entrada is não possui quebras de linha ou espaços.

A solução mais curta vence.

(Pontos de bônus se você puder resolver as outras 2 cifras: P)


Minha tentativa (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
fonte
1
Quais restrições existem nas suposições de entrada? Por exemplo, ambas as soluções até agora assumem a entrada como uma única linha sem espaço em branco; o seu assume que ele está em uma variável e o gnibbler assume que está no stdin.
Peter Taylor

Respostas:

7

Golfscript, 10 caracteres

n--1%5/zip

Recebe entrada de stdin. Pode ser separado por novas linhas, como na apresentação da pergunta, ou não, como muitas respostas supõem. (Retirar as novas linhas é necessário de qualquer maneira, uma vez que é provável que chegue com uma no final, o que atrapalha os 5). Se assumirmos que a entrada chega com exatamente uma nova linha, sendo o último caractere, podemos raspar um caractere para

)!(%5/zip
Peter Taylor
fonte
3

Mathematica, 51


O Mathematica é bastante detalhado aqui, mas também é fácil adivinhar o que está fazendo.

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

J , 13 caracteres

|.@(/:5|i.@#)
efémero
fonte
2

Haskell, 52

f s=[s!!(x-i)|x<-[length s],j<-[1..5],i<-[j,j+5..x]]
hammar
fonte
3
x<-[length s]... repugnante. Eu amo isso!
Thomas Eding
2

Japt -P, 4 3 bytes

Ôó5

Experimente online!

Eu sinto que isso foi fácil demais? Em uma nota positiva, isso não pode ser muito jogado, desde que eu esteja obtendo o resultado correto :)

EDIT -1 byte graças 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
fonte
1
Existe um atalho para w ;)
Shaggy
1

Python - 56 caracteres

s=raw_input()
print"".join(s[-1-x::-5]for x in range(5))
mordedor
fonte
2 caracteres mais curtos com python 3 (-4 para inputem vez de raw_input; +2 para adicionar parênteses 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)

Assumindo que a string já esteja em uma variável, scomo hammar e stevether.
Tomar a entrada de stdin é um pouco mais feio (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)

e só funciona se não houver novas linhas na entrada.

Gareth
fonte
1

Perl , 58 caracteres

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

Scala 63 caracteres:

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

Supondo que a entrada esteja em s.

Usuário desconhecido
fonte
1

K, 34

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

ECMAScript 6 - 48 caracteres

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

Supõe que a variável scontenha a sequência de entrada (sem caracteres de espaço em branco) e crie a variável que ccontém a saída.

MT0
fonte
0

Python 3.6 , 48 bytes

Recursão + F-Strings

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

Experimente online!

PieCot
fonte