Texto ofuscado ciclando dígitos ternarios

28

El objetivo de este desafío es escribir la función / programa más corto para tomar el texto de entrada, cifrarlo usando el método a continuación y devolver el resultado.

Como ejemplo, usaré la cadena hello world.

Primero , obtenga el texto de entrada.

hello world

Segundo , convierta la cadena en ternario (base 3). Usa esta clave:

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

...

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

Con esta tecla, se hello worldconvierte 021011102102112222211112122102010, como se ve a continuación.

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

Tercero , mueva el primer dígito al final.

021011102102112222211112122102010
becomes
210111021021122222111121221020100

Cuarto , convierta el número nuevamente en una cadena usando la misma clave.

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

Por último , devuelva el texto cifrado.

vnhhr nqzgj

Aquí hay algunos ejemplos de texto y su salida:

the turtle ==> dvo fh ego

python ==> uudwqn

code golf ==> hpjoytqgp

Como se trata de código golf, gana la entrada más corta en bytes . Se permiten errores si algunos de los caracteres no son letras minúsculas o espacio. Este es mi primer desafío, por lo que cualquier sugerencia sería más que útil.

¡Buena suerte!

Tabla de clasificación:

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>

La tortuga
fuente
3
Tenga en cuenta que esto técnicamente es ofuscación, no encriptación. No hay clave de cifrado aquí.
John Dvorak
@ JanDvorak ¿Funcionará el "cifrado"?
The Turtle
Para construir sobre el comentario de @ JanDvorak, describiría esto como una "codificación", que es una forma estándar de expresar datos en un formato diferente (por ejemplo, puede expresar una cadena de bits con codificación hexadecimal o codificación base64).
apsillers
1
@ JanDvorak estuvo de acuerdo: es más probable que llame a ROT13 "ofuscación" en lugar de "codificación" (aunque satisfaga ambas definiciones). Probablemente el título más preciso sería "Ofuscar texto por ..."
apsillers
2
@TheTurtle La idea era empaquetar los personajes en un número entero grande ( uint64) usando poderes crecientes de 27. El desplazamiento por un dígito sería equivalente a multiplicar este entero grande por 3, y la introducción del primer dígito en el otro extremo sería simplemente una suma. Sin embargo, hay complicaciones, como descartando la última "acarreo" (tal vez a través de una modoperación), y no pude conseguir que funcione con pocos bytes
Luis Mendo

Respuestas:

16

Pyth, 23 22 bytes

sXc.<sXz=+GdJ^UK3K1KJG

Pruébelo en línea: Regular Input / Test Suite

Gracias a @isaacg por un byte.

Explicación:

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
fuente
1
Teníamos la misma idea. Escribí un puerto Pyth de mi CJam, luego me desplacé hacia abajo y vi tu respuesta: /
Andrea Biondo
1
Puede guardar un byte haciendo una asignación aumentada en Glugar de usar N, por ejemplo =+Gd.
isaacg
@isaacg gracias.
Jakube
14

Pyth, 26 bytes

J+Gds@LJiR3c.<s.DR9xLJz1 2

Pruébelo en línea en Pyth Compiler / Executor: demo | Casos de prueba

Idea

Suponga que todos los caracteres de entrada ya se han asignado a los enteros que especifica el paso 2.

Por cada número ternario de 3 dígitos, tenemos que xyz 3 = 9x + 3y + z , por lo que la división modular por 9 produce el cociente x residuo 3y + z .

Si la entrada es abc 3 def 3 ghi 3 , la aplicación de la división modular a cada uno produce a, 3b + c, d, 3e + f, g, 3h + i .

Después de rotar la lista desde arriba una unidad hacia la izquierda, podemos agrupar los enteros en pares. Esto produce la lista (3b + c, d), (3e + f, g), (3h + i, a) .

Ahora, si convertimos (3y + z, w) de base 3 a entero, obtenemos 3 (3y + z) + w = ​​9y + 3z + w = ​​zyw 3 .

Por lo tanto, aplicar la conversión de base a la lista de pares nos da bcd 3 efg 3 hia 3 , que es precisamente el resultado de rotar los dígitos ternarios concatenados una unidad hacia la izquierda.

Todo lo que queda por hacer es asignar los enteros resultantes a los 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
fuente
Sí, en unas pocas horas fui golpeado por CJam y Pyth. : /
kirbyfan64sos
¡Guauu! ¿Puedes escribir una explicación de cómo funciona? Soy curioso. :)
The Turtle
@ TheTurtle He editado mi respuesta.
Dennis
10

Pitón 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

Convierte un carácter ca un valor xque x=(ord(c)-97)%91, con el módulo que afectan solamente el espacio para convertirlo a 26. La conversión inversa es iachr((i-26)%91+32) , con el módulo solo afectando i=26para que se convierta en espacios.

Recorremos los caracteres, notando el valor actual xy el valor anterior y. Utilizamos los dos últimos dígitos ternarios de y, encontrado como y%9, y el primer dígito ternario de x, encontrado como x/9. El valor de la concatenación es y%9*3+x/9. Probablemente hay algunas optimizaciones que combinan esta aritmética con el desplazamiento por97 y la fijación del espacio.

Hacemos este ciclo, volvemos al primer carácter de la cadena al final. También hacemos un ciclo de preparación para escribir en un valor anterior y, suprimiendo el carácter para el primer ciclo cuando yaún no se ha inicializado.

xnor
fuente
8

CJam, 39 29 bytes

Lo bueno de este es que ni siquiera usa la conversión de base.

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

Pruébalo en línea .

Me acabo de dar cuenta de que tenía exactamente la misma idea que la respuesta Pyth de Jakube. De hecho, porté este código CJam a Pyth antes de ver su publicación, terminando con 25 bytes. Dado que fue mi primer golf en Pyth, supongo que no está tan mal.

Explicación

                              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
fuente
7

CJam, 30 29 27 bytes

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

Pruébelo en línea en el intérprete de CJam .

El enfoque es el mismo que en mi otra respuesta , que es un puerto de este código para Pyth.

Cómo 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
fuente
6

Javascript (ES6), 175 bytes

Una línea!

"Uso excesivo de vpremio variable , alguien?"

actualización: ¡ahora solo usa variables llamadas v, para confusión total!

¡Gracias @vihan por guardar 6 bytes!

¡Gracias @Neil por guardar 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 una función anónima. Para usar, agregue v=antes del código para darle un nombre a la función y llámelo comoalert(v("hello world"))

jrich
fuente
Puede usar .slice(-3)para guardar 6 bytes, momento en el que puede usar "00"+vpara guardar otro byte. (Puede concatenar con una plantilla pero la longitud resultante es la misma).
Neil
En realidad, puede guardar un montón de bytes agregando 27 a sus valores antes de convertirlos a base tres, ya que eso garantiza suficientes dígitos. .map(v=>(v<"V"?26:v.charCodeAt()-97).toString(3)).map(v=>("000"+v).slice(v.length))entonces se convierte .map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1)).
Neil
@Neil Wow, ¡eso realmente acortó el código! También lo convirtió en un verdadero 'one-liner', al eliminar la única variable intermedia. ¡Gracias!
jrich
5

Julia, 149 137 bytes

Mi primer golf!

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) sin golf:

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
fuente
Puede usar en =lugar de inpara bucles y puede usar b[1]en lugar de b[1:1]. Tampoco necesita un espacio entre cerrar parens y for.
Alex A.
@AlexA. Anima =, pero b[1]devuelve un carácter, que no se puede agregar a una cadena con *.
kevinsa5
Oh cierto, se olvidó de eso.
Alex A.
@AlexA. El fortruco es ingenioso. También puede tenerlo directamente después de una cotización cercana. No me di cuenta de que el analizador era tan flexible.
kevinsa5
También puede seguir directamente un literal numérico, como puede end.
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('{',' ')}

Reemplazado Math.floor con un bit a bit o. Creó una función anónima. Si estoy entendiendo correctamente, esto debería solucionar un poco mi novato (¡gracias Dennis!) Y obtener otros 2 bytes menos.

Tekgno
fuente
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 + explicación:

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.
fuente
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, esto se siente demasiado largo, pero al menos estoy ... superando a Python de alguna manera. Y a Ruby.

Lynn
fuente
3

Javascript (ES6), 141 124 120 bytes

Lo creas o no .... :-)

(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))

Al igual que con mi otra respuesta, esta es una función anónima y debe asignarse a una variable antes de que pueda usarse. Pruébalo aquí:

Pensé que podría recortar un par de bytes de mi respuesta anterior usando una técnica diferente, así que comencé con una similar a la de Tekgno y desde allí me aparté de la cabeza. Inicialicé algunas variables en la sección de argumentos de la función, y nuevamente metí todo en una .mapfunción. Entonces me di cuenta de String.fromCharCodeque sería mucho más eficiente fuera del .map. Después de todo lo dicho y hecho, ¡me había afeitado más de 30 45 bytes!

Edición 1: ahorró 17 bytes al deshacerse de los .replaces, utilizando una técnica similar a la solución Python de xnor.

OK, tal vez es hora de pasar a otro desafío ...

ETHproducciones
fuente
2

Python 2, 182 180 bytes

Esta solución no es ideal, debido a que el reemplazo es muy costoso. Intentar descubrir cómo evitarlo.

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('{',' ')

La entrada es como "hello world".

Kade
fuente
Necesita contar 2 bytes para las comillas requeridas en la entrada, ¿verdad?
mbomb007
@ mbomb007 Eso es lo que había pensado anteriormente, pero varias personas me han dicho que no necesito dar cuenta de eso.
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) Usar a Rulepara convertir las listas de dígitos a caracteres y viceversa.

murphy
fuente
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``

Atrezzo a vihan para la .matchexpresión regular.

Dendrobium
fuente
1

Rubí, 177

Necesita al menos Ruby 1.9 para el 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
fuente
1

Java, 458 449 bytes

Me entristeció un poco determinar que podía reducir 10 bytes al no utilizar las secuencias de Java 8 y el map()método.

Aquí está la versión de golf:

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);}}

Aquí hay una versión mucho menos golfizada. Está destinado a ser legible, pero no garantizo nada.

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 toma la cadena para convertir como argumento de línea de comando. Si desea tener espacios en su entrada, debe rodearlo con comillas dobles.

Quería proporcionar un ejemplo de uso de esto desde la línea de comandos, pero no pude hacer que este código funcionara fuera de Eclipse. Nunca aprendí a usar Java desde la línea de comandos ^ _ ^; Probablemente pueda hacer que esto se ejecute dentro del IDE de su elección sin demasiados problemas.

sadakatsu
fuente
si solo usa ArrayUtils una vez, el nombre completo dentro del código es más corto que esa declaración de importación. ver: codegolf.stackexchange.com/a/16100/10801 (mitad inferior de la respuesta vinculada)
masterX244
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 es una función anónima, por lo que debe recibir un nombre antes de poder usarse. (Por ejemplo encrypt=t=>...) Pruébalo aquí:

Empecé usando múltiples variables y forbucles en lugar de.map . Luego lo jugué de todas las maneras posibles sin cambiar el algoritmo, lo que me situó en algún lugar alrededor de 217 bytes. Después de echar un vistazo a la respuesta de UndefinedFunction, logré reducirla a 195, y una inspección de la respuesta de Dendrobium resultó en otros 14 de golf.

Hasta donde sé, no puedo ir más lejos o mi resultado sería prácticamente idéntico al de Dendrobium (¡excepto por ser un personaje más corto!). ¿Alguien puede encontrar el lugar donde guardé un personaje? :-)

Como de costumbre, las sugerencias son bienvenidas.

ETHproducciones
fuente
Gracias por el consejo regex! No estoy seguro de cómo exactamente el bucle for-of podría funcionar en esta función de una línea, pero tal vez ahorraría algo de espacio de todos modos. Puede publicar su versión si lo desea.
ETHproductions
0

Matlab, 113 bytes

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

La entrada es a través de stdin.

Ejemplo:

>> 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
fuente
0

Julia - 92 87 61 54 bytes

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

Sin golf:

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

El truco puede confundirte. Restando 6 mueve 'a' a cero después del mod. Agregar 9 * 65 es equivalente a agregar 65 a v1 + v2, que es parte del proceso de restaurar los valores a sus valores ascii. Puede reemplazar i=t%91+579con i=t%91-6, y luego reemplazar N=(v1+v2)%91+32con N=(v1+v2+65)%91+32para obtener el mismo resultado, pero requiere un carácter adicional.

Glen O
fuente