Ofuscar texto alternando dígitos ternários

28

O objetivo desse desafio é escrever a função / programa mais curta para receber o texto de entrada, criptografá-lo usando o método abaixo e retornar o resultado.

Como exemplo, vou usar a string hello world.

Primeiro , obtenha o texto de entrada.

hello world

Segundo , converta a string em ternário (base 3). Use esta chave:

a = 000
b = 001
c = 002
d = 010
e = 011
f = 012
g = 020

...

w = 211
x = 212
y = 220
z = 221
[space] = 222

Com esta chave, hello worldtorna-se 021011102102112222211112122102010, como visto abaixo.

 h   e   l   l   o       w   o   r   l   d
021 011 102 102 112 222 211 112 122 102 010

Terceiro , mova o primeiro dígito até o fim.

021011102102112222211112122102010
becomes
210111021021122222111121221020100

Quarto , converta o número novamente em uma seqüência de caracteres usando a mesma chave.

210 111 021 021 122 222 111 121 221 020 100
 v   n   h   h   r       n   q   z   g   j

Por fim , retorne o texto criptografado.

vnhhr nqzgj

Aqui estão alguns exemplos de texto e seus resultados:

the turtle ==> dvo fh ego

python ==> uudwqn

code golf ==> hpjoytqgp

Como esse é o código de golfe, a entrada mais curta em bytes vence. Erros são permitidos se alguns dos caracteres não tiverem letras minúsculas ou espaço. Este é o meu primeiro desafio, portanto, qualquer sugestão seria mais do que útil.

Boa sorte!

Entre os melhores:

var QUESTION_ID=54643;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:&lt;(?:s&gt;[^&]*&lt;\/s&gt;|[^&]+&gt;)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table></div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table></div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table><table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table>

A tartaruga
fonte
3
Observe que isso tecnicamente é ofuscação, não criptografia. Não há chave de criptografia aqui.
John Dvorak
@JanDvorak A "cifra" funciona?
The Turtle
Para desenvolver o comentário de @ JanDvorak, eu descreveria isso como uma "codificação", que é uma maneira padrão de expressar dados em um formato diferente (por exemplo, você pode expressar uma sequência de bits com codificação hexadecimal ou codificação base64).
Apsillers
1
@ JanDvorak concordou - eu seria mais provável chamar ROT13 "ofuscação" em vez de "codificação" (mesmo que satisfaça ambas as definições). Provavelmente o título mais preciso seria "text Ofuscação por ..."
apsillers
2
@ TheTurtle A idéia era empacotar os caracteres em um número inteiro grande ( uint64) usando poderes crescentes de 27. O deslocamento por um dígito seria então equivalente a multiplicar esse número inteiro grande por 3, e a introdução do primeiro dígito na outra extremidade seria simplesmente uma adição. Mas há complicações, como descartando o último "carry" (talvez através de uma modoperação), e eu não poderia obtê-lo para trabalhar com alguns bytes
Luis Mendo

Respostas:

16

Pitão, 23 22 bytes

sXc.<sXz=+GdJ^UK3K1KJG

Experimente on-line: Conjunto regular de entrada / teste

Graças a @isaacg por um byte.

Explicação:

sXc.<sXz=+GdJ^UK3K1KJG
        =+Gd             append a space the G (preinitialized with the alphabet)
               K3        assign 3 to K
            J^UK K       assign all 3-digit ternary numbers 
                         [[0,0,0], [0,0,1],...,[2,2,2]] to J
      Xz  G J            translate input from G to J
     s                   sum (join all ternary numbers to one big list)
   .<             1      rotate by 1
  c                K     split into lists of size 3
 X                  JG   translate from J to G
s                        join chars to string and print
Jakube
fonte
1
Tivemos a mesma ideia. Eu escrevi uma porta Pyth do meu CJam, então rolei para baixo e vi sua resposta: /
Andrea Biondo
1
Você pode salvar um byte executando uma atribuição aumentada em Gvez de usar N, por exemplo =+Gd.
Isaacg
@isaacg thanks.
Jakube 14/08/15
14

Pitão, 26 bytes

J+Gds@LJiR3c.<s.DR9xLJz1 2

Experimente online no Pyth Compiler / Executor: demo | casos de teste

Idéia

Suponha que todos os caracteres de entrada já tenham sido mapeados para os números inteiros especificados na etapa 2.

Para cada número ternário de 3 dígitos, temos que xyz 3 = 9x + 3y + z , portanto, a divisão modular por 9 produz o quociente x e o resíduo 3y + z .

Se a entrada é abc 3 def 3 ghi 3 , aplicar divisão modular a cada um produz a, 3b + c, d, 3e + f, g, 3h + i .

Depois de girar a lista acima de uma unidade para a esquerda, podemos agrupar os números inteiros em pares. Isso produz a lista (3b + c, d), (3e + f, g), (3h + i, a) .

Agora, se convertermos (3y + z, w) da base 3 em número inteiro, obteremos 3 (3y + z) + w = ​​9y + 3z + w = ​​zyw 3 .

Assim, aplicar a conversão base à lista de pares nos dá bcd 3 efg 3 hia 3 , que é precisamente o resultado da rotação dos dígitos ternários concatenados uma unidade para a esquerda.

Tudo o que resta a fazer é mapear os números inteiros resultantes de volta aos caracteres.

Código

J+Gd                        Concatenate "a...z" (G) with " " (d) and save in J.
                    L z     For each character in the input(z):
                   x J        Compute its index in J.
                 R          For each index I:
               .D 9           Compute (I / 9, I % 9).
              s             Concatenate the resulting pairs.
            .<         1    Rotate the resulting list one unit to the left.
           c             2  Split it back into pairs.
         R                  For each pair:
        i 3                   Perform conversion from base 3 to integer.
      L                     For each resulting integer:
     @ J                      Select the element of J at that index.
    s                       Concatenate the resulting characters.
Dennis
fonte
Sim, em poucas horas fui derrotado por CJam e Pyth. : /
kirbyfan64sos
Uau! Você pode escrever uma explicação de como isso funciona? Estou curioso. :)
The Turtle
@TheTurtle Eu editei minha resposta.
Dennis
10

Python 2, 96

s=input()
r=y=''
for c in s+s[0]:x=(ord(c)-97)%91;r+=y and chr((y%9*3+x/9-26)%91+32);y=x
print r

Converte um caractere cem um valor xcomo x=(ord(c)-97)%91, com o módulo afetando apenas o espaço para convertê-lo em 26. A conversão reversa é ipara chr((i-26)%91+32), com o módulo afetando apenasi=26 para torná-lo espaços.

Percorremos os caracteres, observando o valor atual xe o valor anterior y. Utilizamos os dois últimos dígitos ternários de y, encontrados como y%9, e o primeiro dígito ternário de x, encontrado como x/9. O valor da concatenação é y%9*3+x/9. Provavelmente, há algumas otimizações que combinam essa aritmética com a mudança 97e a fixação do espaço.

Nós fazemos esse loop, retornamos ao primeiro caractere da string no final. Também fazemos um loop de preparação para escrever em um valor anterior y, suprimindo o caractere para o primeiro loop quando yainda não foi inicializado.

xnor
fonte
8

CJam, 39 29 bytes

O mais legal sobre este é que ele nem usa conversão de base.

q'{,97>S+:XZZm*:Yere_(+3/YXer

Experimente online .

Acabei de perceber que tinha exatamente a mesma ideia que a resposta Pyth de Jakube. Na verdade, eu portado esse código CJam para Pyth antes de ver seu post, terminando com 25 bytes. Dado que foi o meu primeiro golfe Pyth, acho que não é tão ruim.

Explicação

                              e# Z = 3
q                             e# Push input string
 '{,                          e# Push ['\0' ... 'z']
    97>                       e# Keep ['a' ... 'z']
       S+                     e# Append space
         :X                   e# Assign "a...z " to X
           ZZm*               e# Push 3rd cartesian power of [0 1 2]
                              e# i.e. all 3-digit permutations of 0, 1, 2
                              e# (in lexicographical order)
               :Y             e# Assign those permutations to Y
                 er           e# Translate input from X to Y
                   e_         e# Flatten resulting 2D array
                     (+       e# Rotate first element to the end
                       3/     e# Split back into 3-digit elements
                         YXer e# Translate from Y to X
Andrea Biondo
fonte
7

CJam, 30 29 27 bytes

q'{,97>S+:Af#9fmd(+2/3fbAf=

Experimente on-line no intérprete CJam .

A abordagem é a mesma da minha outra resposta , que é uma porta desse código para Pyth.

Como funciona

q                           e# Read from STDIN.
 '{,                        e# Push ['\0' ... 'z'].
    97>                     e# Remove the first 97 elements (['\0' - '`']).
       S+:A                 e# Append a space and save in A.
           f#               e# Find the index of each input character in A.
             9fmd           e# Apply modular division by 9 to each index.
                 (+         e# Shift out the first quotient and append it.
                   2/       e# Split into pairs.
                     3fb    e# Convert each pair from base 3 to integer.
                        Af= e# Select the corresponding elements from A.
Dennis
fonte
6

Javascript (ES6), 175 bytes

Um one-liner!

"Uso excessivo de variável v prêmio , alguém?"

atualização: agora usa apenas variáveis ​​chamadasv , para total confusão!

Obrigado @vihan por salvar 6 bytes!

Obrigado @ Neil por salvar 27 bytes !!

v=>(([...v].map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1)).join``)+v[0]).slice(1).match(/..?.?/g).map(v=>(v=String.fromCharCode(parseInt(v,3)+97))>"z"?" ":v).join``

Define uma função anônima. Para usar, adicione v=antes do código para dar um nome à função e chame-a comoalert(v("hello world"))

jrich
fonte
Você pode usar .slice(-3)para salvar 6 bytes; nesse ponto, você pode usar "00"+vpara salvar outro byte. (Você poderia concatenar com um modelo, mas o comprimento resultante é o mesmo.)
Neil
Na verdade, você pode salvar um monte de bytes adicionando 27 aos seus valores antes de convertê-los na base três, pois isso garante dígitos suficientes. .map(v=>(v<"V"?26:v.charCodeAt()-97).toString(3)).map(v=>("000"+v).slice(v.length))então se torna .map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1)).
Neil
@ Neil Wow, que realmente reduziu o código! Também o transformou em um verdadeiro 'one-liner', removendo a única variável intermediária. Obrigado!
jrich
5

Julia, 149 137 bytes

Meu primeiro golfe!

s->(j=join;b=j([base(3,i==' '?26:i-'a',3)for i=s]);r=b[2:end]*b[1:1];j([i==26?" ":i+'a'for i=[parseint(r[i:i+2],3)for i=1:3:length(r)]]))

(parcialmente) ungolfed:

f = s -> (
    # join the ternary represenations:
    b = join([base(3, i == ' ' ? 26 : i - 'a',3) for i = s]);
    # rotate:
    r = b[2:end] * b[1:1];
    # calculate the new numbers:
    n = [parseint(r[i:i+2],3) for i = 1:3:length(r)];
    # convert back to characters:
    join([i == 26 ? " " : 'a' + i for i = n])
)
assert(f("hello world") == "vnhhr nqzgj")
assert(f("the turtle")  == "dvo fh ego")
assert(f("python")      == "uudwqn")
assert(f("code golf")   == "hpjoytqgp")
kevinsa5
fonte
Você pode usar em =vez de inpara loops e pode usar b[1]no lugar de b[1:1]. Você também não precisa de um espaço entre o fechamento de parênteses e for.
Alex A.
@AlexA. Felicita =, mas b[1]retorna um caractere, que não pode ser anexado a uma sequência com *.
kevinsa5
Ah, certo, esqueci disso.
Alex A.
@AlexA. O fortruque é bacana. Você também pode obtê-lo diretamente após uma cotação apertada. Não percebi que o analisador era tão flexível.
kevinsa5
Também pode seguir diretamente um literal numérico, como pode end .
13285 Alex A.
4

Javascript (ES6), 178 , 172 , 170

p=>{p=p.replace(' ','{');c="";l=p.length;for(i=0;i<l;){c+=String.fromCharCode(((p.charCodeAt(i)-97)%9)*3+(((p.charCodeAt((++i)%l)-97)/9)|0)+97)}return c.replace('{',' ')}

Math.floor substituído por um bit a bit ou. Criou uma função anônima. Se estou entendendo corretamente, isso deve corrigir um pouco o meu noobishness (obrigado Dennis!) E me dar mais 2 bytes para baixo.

Tekgno
fonte
3

Julia, 169 166 bytes

s->(J=join;t=J(circshift(split(J([lpad(i<'a'?"222":base(3,int(i)-97),3,0)for i=s]),""),-1));J([c[j:j+2]=="222"?' ':char(parseint(c[j:j+2],3)+97)for j=1:3:length(t)]))

Ungolfed + explicação:

function f(s::String)
    # Convert the input into a string in base 3, with space mapping to 222
    b = join([lpad(i < 'a' ? "222" : base(3, int(i) - 97), 3, 0) for i = s])

    # Split that into a vector of single digits and shift once
    p = circshift(split(b, ""), -1)

    # Join the shifted array back into a string
    t = join(p)

    # Convert groups of 3 back into characters
    c = [t[j:j+2] == "222" ? ' ' : char(parseint(t[j:j+2], 3) + 97) for j = 1:3:length(t)]

    # Return the joined string
    join(c)
end
Alex A.
fonte
3

Haskell, 160 bytes

a!k|Just v<-lookup k a=v
x=['a'..'z']++" "
y="012";z=mapM id[y,y,y]
m(a:u:r:i:s)=[u,r,i]:m(a:s)
m[e,a,t]=[[a,t,e]]
main=interact$map(zip z x!).m.(>>=(zip x z!))

Ugh, isso parece muito longo, mas pelo menos eu estou ... vencendo o Python de alguma forma. E Ruby.

Lynn
fonte
3

Javascript (ES6), 141 124 120 bytes

Acredite ou não.... :-)

(t,i=0,c=w=>(t.charCodeAt(w)-123)%91+26)=>String.fromCharCode(...[...t].map(k=>(c(i)%9*3+c(++i%t.length)/9+65|0)%91+32))

Como na minha outra resposta, esta é uma função anônima e precisa ser atribuída a uma variável antes que possa ser usada. Experimente aqui:

Eu pensei que seria capaz de raspar alguns bytes da minha resposta anterior usando uma técnica diferente, então comecei com uma semelhante à de Tekgno e joguei minha cabeça de lá. Inicializei algumas variáveis ​​na seção de argumentos da função e, novamente, coloquei tudo em uma .mapfunção. Então percebi String.fromCharCodeque seria muito mais eficiente fora do .map. Depois de tudo dito e feito, eu tinha raspado mais de 30 45 bytes!

Editar 1: salvou 17 bytes, livrando-se do.replace s, usando uma técnica semelhante à solução Python do xnor.

OK, talvez seja hora de passar para outro desafio ....

ETHproductions
fonte
2

Python 2, 182 180 bytes

Esta solução não é ideal, devido à substituição ser muito cara. Tentando descobrir como evitar isso.

b=lambda k:k and b(k/3)*10+k%3
s=''.join('%03d'%b(ord(x)-6-91*(x>' '))for x in input())
print`[chr(int((s[1:]+s[0])[i:i+3],3)+97)for i in range(0,len(s),3)]`[2::5].replace('{',' ')

Entrada é como "hello world".

Kade
fonte
Você precisa contar 2 bytes para as aspas necessárias na entrada, certo?
mbomb007
@ mbomb007 Isso é o que eu pensava anteriormente, mas várias pessoas me disseram que não preciso dar conta disso.
Kade
2

Mathematica, 162 bytes

r=Append[#->IntegerDigits[LetterNumber@#-1,3]~PadLeft~3&/@Alphabet[]," "->{2,2,2}];StringJoin[Partition[RotateLeft[Characters@#/.r//Flatten,1],3]/.(#2->#1&@@@r)]&

(Re) Usando a Rulepara converter as listas de dígitos em caracteres e vice-versa.

Murphy
fonte
2

Javascript (ES6), 179 bytes

s=>[...s+s[0]].map(q=>`00${(q<'a'?26:q.charCodeAt(0)-97).toString(3)}`.slice(-3)).join``.slice(1,-2).match(/..?.?/g).map(q=>q>221?' ':String.fromCharCode(parseInt(q,3)+97)).join``

Adereços para vihan para o .matchregex.

Dendrobium
fonte
1

Ruby, 177

Precisa de pelo menos Ruby 1.9 para o each_charmétodo

l=[*('a'..'z'),' '];n=(0..26).map{|m|m=m.to_s(3).rjust 3,'0'};s='';gets.chomp.each_char{|x|s+=n[l.index x]};puts("#{s[1..-1]}#{s[0]}".scan(/.../).map{|i|i=l[n.index i]}.join '')
David Bailey
fonte
1

Java, 458 449 bytes

Fiquei um pouco triste ao determinar que eu poderia cortar 10 bytes sem usar o Java 8 streams e o map()método.

Aqui está a versão do golfe:

import org.apache.commons.lang.ArrayUtils;class A{public static void main(String[]a){int b=0;String[] c=new String[27];for(;b<27;++b)c[b]=String.format("%03d",Integer.valueOf(Integer.toString(b,3)));String d=a[0],e="abcdefghijklmnopqrstuvwxyz ",f="",g="";for(b=0;b<d.length();++b)f+=c[e.indexOf(d.substring(b,b+1))];f=f.substring(1)+f.charAt(0);for(b=0;b<f.length();b+=3)g+=e.charAt(ArrayUtils.indexOf(c,f.substring(b,b+3)));System.out.println(g);}}

Aqui está uma versão muito menos golfe. Pretende-se que seja legível, mas não dou garantias.

import org.apache.commons.lang.ArrayUtils;
class A {
    public static void main(String[] a) {
        int b=0;
        String[] c = new String[27];
        for (; b < 27; ++b)
            c[b] = String.format("%03d", Integer.valueOf(Integer.toString(b, 3)));
        String
            d = a[0],
            e = "abcdefghijklmnopqrstuvwxyz ",
            f = "",
            g = "";
        for (b = 0; b < d.length(); ++b)
            f += c[e.indexOf(d.substring(b, b + 1))];
        f = f.substring(1) + f.charAt(0);
        for (b = 0; b < f.length(); b += 3)
            g += e.charAt(ArrayUtils.indexOf(c, f.substring(b, b + 3)));
        System.out.println(g);
    }
}

Este programa usa a string para converter como um argumento da linha de comandos. Se você quiser ter espaços em sua entrada, precisará envolvê-lo entre aspas duplas.

Eu queria fornecer um exemplo de uso disso na linha de comando, mas não consegui que esse código funcionasse fora do Eclipse. Eu nunca aprendi a usar Java na linha de comando ^ _ ^; Provavelmente, você pode executá-lo dentro do IDE de sua escolha sem muita dificuldade.

sadakatsu
fonte
se você usar o ArrayUtils apenas uma vez, o nome completo no código será menor que a declaração de importação. veja: codegolf.stackexchange.com/a/16100/10801 (metade inferior da resposta vinculada)
masterX244 28/15
1

Javascript (ES6), 181 180 bytes

t=>((x=[...t].map(k=>`00${(k<'!'?26:k.charCodeAt(0)-97).toString(3)}`.slice(-3)).join``).slice(1)+x[0]).match(/.../g).map(j=>j>221?' ':String.fromCharCode(parseInt(j,3)+97)).join``

Esta é uma função anônima e, portanto, precisa receber um nome antes de poder ser usada. (Por exemplo encrypt=t=>...) Experimente aqui:

Comecei usando várias variáveis ​​e forloops em vez de .map. Depois joguei o golfe de todas as formas possíveis sem alterar o algoritmo, o que me colocou em torno de 217 bytes. Depois de dar uma olhada na resposta da UndefinedFunction, consegui reduzi-la para 195, e algumas inspeções na resposta do Dendrobium resultaram em outros 14 jogadores.

Tanto quanto sei, não posso ir mais longe ou meu resultado seria praticamente idêntico ao do Dendrobium (exceto por ser um personagem mais baixo!). Alguém pode encontrar o lugar onde eu salvei um caractere? :-)

Como sempre, sugestões são bem-vindas!

ETHproductions
fonte
Obrigado pela dica regex! Não tenho certeza de como exatamente o loop for-of poderia ser trabalhado nessa função de uma linha, mas talvez isso economizasse algum espaço. Você pode postar sua versão, se quiser.
ETHproductions
0

Matlab, 113 bytes

x=dec2base(strrep(input('','s'),' ','{')-97,3)';strrep(char(base2dec(reshape(x([2:end 1]),3,[])',3)+97)','{',' ')

A entrada é através do stdin.

Exemplo:

>> x=dec2base(strrep(input('','s'),' ','{')-97,3)';strrep(char(base2dec(reshape(x([2:end 1]),3,[])',3)+97)','{',' ')
hello world
ans =
vnhhr nqzgj
Luis Mendo
fonte
0

Julia - 92 87 61 54 bytes

s->join(32+(3(i=[s...]%91+579)%27+i[[2:end,1]]÷9)%91)

Ungolfed:

function f(s)
  t=[s...];       # Convert the string into a char array
                      #
  i=t%91+579          # Mod 91 drops the alpha characters to sit just
                      # below space, then 579 is added as a trick,
                      # equivalent to subtracting 6 and adding 9*65
  v1=3i%27            # This shifts the bottom two ternary digits up
                      # and removes the first ternary digit
  v2=i[[2:end,19    # This shifts the first ternary digit down and
                      # removes the bottom two ternary digits. [2:end,1]
                      # rotates the array to put the first value at the end
  N=(v1+v2)%91+32     # this combines the ternary digits, then returns
                      # the values to the correct ASCII values
  j=join(N)           # join the char array back to a string
  return j
end

O truque pode confundir você. Subtrair 6 move 'a' para zero após o mod. Adicionar 9 * 65 é equivalente a adicionar 65 a v1 + v2, que faz parte do processo de restauração dos valores em seus valores ascii. Você pode substituir i=t%91+579por i=t%91-6e depois substituir N=(v1+v2)%91+32por N=(v1+v2+65)%91+32para obter o mesmo resultado, mas requer um caractere extra.

Glen O
fonte