Offuscamento del testo tramite il ciclo delle cifre ternarie


28

L'obiettivo di questa sfida è scrivere la funzione / programma più breve per prendere il testo di input, crittografarlo usando il metodo seguente e restituire il risultato.

Ad esempio, userò la stringa hello world.

Innanzitutto , ottieni il testo di input.

hello world

In secondo luogo , converti la stringa in ternario (base 3). Usa questo tasto:

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 questa chiave, hello worlddiventa 021011102102112222211112122102010, come visto di seguito.

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

Terzo , sposta la prima cifra alla fine.

021011102102112222211112122102010
becomes
210111021021122222111121221020100

In quarto luogo , riconvertire il numero in una stringa utilizzando la stessa chiave.

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

Infine , restituisci il testo crittografato.

vnhhr nqzgj

Ecco alcuni esempi di testo e il loro output:

the turtle ==> dvo fh ego

python ==> uudwqn

code golf ==> hpjoytqgp

Poiché si tratta di code golf, vince la voce più breve in byte . Gli errori sono consentiti se alcuni dei caratteri non sono lettere minuscole o spazio. Questa è la mia prima sfida, quindi qualsiasi suggerimento sarebbe più che utile.

In bocca al lupo!

Classifica:

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>


3
Si noti che tecnicamente si tratta di offuscamento, non di crittografia. Non esiste una chiave di crittografia qui.
John Dvorak,

@JanDvorak "Cipher" funzionerà?
La tartaruga

Per basarmi sul commento di @ JanDvorak, lo descriverei come una "codifica", che è un modo standard di esprimere i dati in un formato diverso (ad esempio, puoi esprimere una stringa di bit con codifica esadecimale o codifica base64).
apsillers

1
@JanDvorak Concordato: sarebbe più probabile che chiamassi ROT13 "offuscamento" piuttosto che "codifica" (anche se soddisfa entrambe le definizioni). Probabilmente il titolo più preciso sarebbe "Testo
offuscato di

2
@TheTurtle L'idea era di raggruppare i caratteri in un intero grande ( uint64) usando i poteri crescenti di 27. Lo spostamento di una cifra equivarrebbe quindi a moltiplicare questo grande numero intero per 3e l'introduzione della prima cifra sull'altra estremità sarebbe semplicemente un'aggiunta. Ma ci sono complicazioni, come scartare l'ultimo "carry" (forse tramite modun'operazione), e non sono riuscito a farlo funzionare con pochi byte
Luis Mendo,

Risposte:


16

Pyth, 23 22 byte

sXc.<sXz=+GdJ^UK3K1KJG

Provalo online: suite di input / test regolari

Grazie a @isaacg per un byte.

Spiegazione:

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

1
Abbiamo avuto la stessa idea. Ho scritto una porta Pyth del mio CJam, poi ho fatto scorrere verso il basso e ho visto la tua risposta: /
Andrea Biondo,

1
È possibile salvare un byte eseguendo un'assegnazione aumentata Ginvece di utilizzare N, ad es =+Gd.
isaacg,

@isaacg grazie.
Jakube,

14

Pyth, 26 byte

J+Gds@LJiR3c.<s.DR9xLJz1 2

Provalo online in Pyth Compiler / Executor: demo | casi test

Idea

Supponiamo che tutti i caratteri di input siano già stati mappati sugli interi specificati dal passaggio 2.

Per ogni numero ternario di 3 cifre, abbiamo che xyz 3 = 9x + 3y + z , quindi la divisione modulare per 9 produce il quoziente x e il residuo 3y + z .

Se l'ingresso è abc 3 def 3 ghi 3 , l'applicazione di una divisione modulare a ciascuno produce a, 3b + c, d, 3e + f, g, 3h + i .

Dopo aver ruotato l'elenco da sopra un'unità a sinistra, possiamo raggruppare gli interi in coppie. Questo produce la lista (3b + c, d), (3e + f, g), (3h + i, a) .

Ora, se convertiamo (3y + z, w) dalla base 3 in intero, otteniamo 3 (3y + z) + w = ​​9y + 3z + w = ​​zyw 3 .

Pertanto, l'applicazione della conversione di base all'elenco di coppie ci dà bcd 3 efg 3 hia 3 , che è precisamente il risultato della rotazione delle cifre ternarie concatenate di un'unità a sinistra.

Tutto quello che resta da fare è mappare gli interi risultanti sui caratteri.

Codice

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.

Sì, tra qualche ora sono stato battuto da CJam e Pyth. : /
kirbyfan64sos

Wow! Puoi scrivere una spiegazione di come funziona? Sono curioso. :)
La tartaruga

@TheTurtle Ho modificato la mia risposta.
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 un carattere cin un valore xcome x=(ord(c)-97)%91, con il modulo che interessa solo lo spazio per convertirlo in 26. La conversione inversa è iin chr((i-26)%91+32), con il modulo che interessa solo i=26per trasformarlo in spazi.

Eseguiamo il ciclo tra i caratteri, notando il valore corrente xe il valore precedente y. Usiamo le ultime due cifre ternarie di y, trovate come y%9, e la prima cifra ternaria di x, trovate come x/9. Il valore del concatenamento è y%9*3+x/9. Probabilmente ci sono alcune ottimizzazioni che combinano questa aritmetica con lo spostamento 97e il fissaggio dello spazio.

Facciamo questo giro intorno, torniamo al primo carattere della stringa alla fine. Facciamo anche un ciclo di preparazione per scrivere un valore precedente y, sopprimendo il carattere per il primo ciclo quando ynon è stato ancora inizializzato.


8

CJam, 39 29 byte

La cosa bella di questo è che non usa nemmeno la conversione di base.

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

Provalo online .

Mi sono appena reso conto di avere esattamente la stessa idea della risposta Pyth di Jakube. In realtà ho portato questo codice CJam su Pyth prima di vedere il suo post, finendo con 25 byte. Dato che è stato il mio primo golf Pyth immagino che non sia poi così male.

Spiegazione

                              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

7

CJam, 30 29 27 byte

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

Provalo online nell'interprete CJam .

L'approccio è lo stesso dell'altra mia risposta , che è una porta di questo codice per Pyth.

Come funziona

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.


6

Javascript (ES6), 175 byte

Una fodera!

"Uso eccessivo del vpremio variabile , qualcuno?"

aggiornamento: ora utilizza solo le variabili chiamate v, per totale confusione!

Grazie @vihan per aver salvato 6 byte!

Grazie @Neil per aver salvato 27 byte !!

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

Definisce una funzione anonima. Per usarlo, aggiungi v=prima del codice per dare un nome alla funzione e chiamalo comealert(v("hello world"))


È possibile utilizzare .slice(-3)per salvare 6 byte, a quel punto è possibile utilizzare "00"+vper salvare un altro byte. (Potresti concatenare con un modello ma la lunghezza risultante è la stessa.)
Neil

In realtà, puoi salvare un sacco di byte aggiungendo 27 ai tuoi valori prima di convertirli in base tre, in quanto ciò garantisce cifre sufficienti. .map(v=>(v<"V"?26:v.charCodeAt()-97).toString(3)).map(v=>("000"+v).slice(v.length))allora diventa .map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1)).
Neil,

@Neil Wow, che ha davvero abbreviato il codice! Lo ha anche reso un vero "one-liner", rimuovendo l'unica variabile intermedia. Grazie!
jrich

5

Julia, 149 137 byte

Il mio primo 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)]]))

(parzialmente) non golfato:

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

Puoi usare =piuttosto che inper i loop e puoi usare b[1]al posto di b[1:1]. Inoltre, non è necessario uno spazio tra parentesi chiuse e for.
Alex A.

@AlexA. Saluti =, ma b[1]restituisce un personaggio, che non può essere aggiunto a una stringa *.
kevinsa5,

Oh giusto, me ne sono dimenticato.
Alex A.

@AlexA. Il fortrucco è elegante. Puoi anche averlo direttamente dopo un preventivo. Non mi ero reso conto che il parser fosse così flessibile.
kevinsa5,

Può anche seguire direttamente un valore letterale numerico, come può 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('{',' ')}

Sostituito Math.floor con un bit per bit o. Creata una funzione anonima. Se ho capito bene, questo dovrebbe sistemare un po 'il mio noobishness (grazie Dennis!) E ridurmi di altri 2 byte.


3

Julia, 169 166 byte

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 + spiegazione:

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

3

Haskell, 160 byte

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

Uh, sembra troppo lungo, ma almeno sto ... battendo Python in qualche modo. E rubino.


3

Javascript (ES6), 141 124 120 byte

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

Come con la mia altra risposta, questa è una funzione anonima e deve essere assegnata a una variabile prima che possa essere utilizzata. Provalo qui:

Pensavo di essere in grado di radere un paio di byte dalla mia risposta precedente usando una tecnica diversa, quindi ho iniziato con uno simile a quello di Tekgno e ho giocato a golf da lì. Ho inizializzato alcune variabili nella sezione degli argomenti della funzione, e di nuovo ho inserito tutto in una .mapfunzione. Poi ho capito che String.fromCharCodesarebbe stato molto più efficiente al di fuori del .map. Dopo che tutto è stato detto e fatto, mi ero rasato più di 30 45 byte!

Modifica 1: salvato 17 byte eliminando i .replacemessaggi di posta elettronica, usando una tecnica simile alla soluzione Python di xnor.

OK, forse è tempo di passare a un'altra sfida ...


2

Python 2, 182 180 byte

Questa soluzione non è l'ideale, poiché la sostituzione è molto costosa. Cercare di capire come 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('{',' ')

L'input è come "hello world".


È necessario contare 2 byte per le virgolette richieste nell'input, giusto?
mbomb007,

@ mbomb007 Questo è quello che avevo pensato in precedenza, ma più persone mi hanno detto che non ho bisogno di spiegarmelo.
Kade,

2

Mathematica, 162 byte

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

(Ri) Usare a Ruleper convertire gli elenchi di cifre in caratteri e viceversa.


2

Javascript (ES6), 179 byte

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

Puntelli a vihan per la .matchregex.


1

Ruby, 177

Richiede almeno Ruby 1.9 per il each_charmetodo

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

1

Java, 458 449 byte

Mi ha reso un po 'triste determinare che potevo radere via 10 byte non usando i flussi Java 8 e il map()metodo.

Ecco la versione golfata:

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

Ecco una versione molto meno giocata a golf. È inteso per essere leggibile, ma non fornisco garanzie.

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

Questo programma accetta la stringa da convertire come argomento della riga di comando. Se si desidera avere spazi nell'input, è necessario circondarlo con virgolette doppie.

Volevo fornire un esempio dell'uso di questo dalla riga di comando, ma non sono riuscito a far funzionare questo codice al di fuori di Eclipse. Non ho mai imparato a usare Java dalla riga di comando ^ _ ^; Probabilmente puoi farlo funzionare nell'IDE di tua scelta senza troppi problemi.


se si utilizza ArrayUtils solo una volta, utilizzando il nome completo nel codice è più breve di tale istruzione di importazione. vedi: codegolf.stackexchange.com/a/16100/10801 (metà inferiore della risposta collegata)
masterX244,

1

Javascript (ES6), 181 180 byte

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

Questa è una funzione anonima, quindi deve essere assegnato un nome prima di poter essere utilizzata. (Ad esempio encrypt=t=>...) Provalo qui:

Ho iniziato utilizzando più variabili e forloop anziché .map. Ho quindi giocato a golf in ogni modo possibile senza cambiare l'algoritmo, che mi ha messo da qualche parte intorno a 217 byte. Dopo aver dato un'occhiata alla risposta di UndefinedFunction, sono riuscito a portarlo a 195, e qualche ispezione della risposta di Dendrobium ha portato a un altro 14.

Per quanto ne so, non posso andare oltre o il mio risultato sarebbe praticamente identico a quello di Dendrobium (tranne per essere un personaggio più corto!). Qualcuno può trovare il posto in cui ho salvato un carattere? :-)

Come al solito, i suggerimenti sono benvenuti!


Grazie per il suggerimento regex! Non sono sicuro di come si possa lavorare esattamente il for-of loop in questa funzione a una riga, ma forse risparmierebbe comunque spazio. Puoi pubblicare la tua versione se vuoi.
ETHproductions

0

Matlab, 113 byte

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

L'input avviene tramite stdin.

Esempio:

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

0

Julia - 92 87 61 54 byte

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

Il trucco potrebbe confonderti. Sottraendo 6 si sposta 'a' a zero dopo il mod. L'aggiunta di 9 * 65 equivale all'aggiunta di 65 a v1 + v2, che fa parte del processo di ripristino dei valori ai loro valori ASCII. È possibile sostituire i=t%91+579con i=t%91-6, quindi sostituire N=(v1+v2)%91+32con N=(v1+v2+65)%91+32per ottenere lo stesso risultato, ma richiede un carattere in più.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.