Obscurcir le texte en faisant défiler les chiffres ternaires

28

Le but de ce défi est d'écrire la fonction / le programme le plus court pour prendre le texte saisi, le crypter en utilisant la méthode ci-dessous et renvoyer le résultat.

À titre d'exemple, je vais utiliser la chaîne hello world.

Tout d'abord , récupérez le texte saisi.

hello world

Ensuite , convertissez la chaîne en ternaire (base 3). Utilisez cette clé:

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

...

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

Avec cette clé, hello worlddevient 021011102102112222211112122102010, comme indiqué ci-dessous.

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

Troisièmement , déplacez le premier chiffre à la fin.

021011102102112222211112122102010
becomes
210111021021122222111121221020100

Quatrièmement , reconvertissez le nombre en chaîne à l'aide de la même clé.

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

Enfin , renvoyez le texte chiffré.

vnhhr nqzgj

Voici quelques exemples de texte et leur sortie:

the turtle ==> dvo fh ego

python ==> uudwqn

code golf ==> hpjoytqgp

Comme il s'agit du code golf, l'entrée la plus courte en octets l' emporte. Les erreurs sont autorisées si certains des caractères ne sont pas des lettres minuscules ou de l'espace. C'est mon premier défi, donc toute suggestion serait plus qu'utile.

Bonne chance!

Classement:

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 tortue
la source
3
Notez que c'est techniquement de l'obscurcissement, pas du cryptage. Il n'y a pas de clé de chiffrement ici.
John Dvorak
@JanDvorak Le "chiffrement" fonctionnera-t-il?
The Turtle
Pour m'appuyer sur le commentaire de @ JanDvorak, je décrirais cela comme un "codage", qui est une façon standard d'exprimer des données dans un format différent (par exemple, vous pouvez exprimer une chaîne de bits avec un codage hexadécimal ou un codage base64).
apsillers
1
@JanDvorak D'accord - Je serais plus susceptible d'appeler ROT13 "obfuscation" plutôt que "encoding" (même s'il satisfait les deux définitions). Le titre le plus précis serait probablement "Obfuscate text by ..."
apsillers
2
@TheTurtle L'idée était de regrouper les caractères dans un grand entier ( uint64) en utilisant des pouvoirs croissants de 27. Le déplacement d'un chiffre équivaudrait alors à multiplier ce grand entier par 3, et l'introduction du premier chiffre à l'autre extrémité serait simplement un ajout. Mais il y a des complications, telles que l'élimination du dernier "carry" (peut-être via une modopération), et je n'ai pas pu le faire fonctionner avec quelques octets
Luis Mendo

Réponses:

16

Pyth, 23 22 octets

sXc.<sXz=+GdJ^UK3K1KJG

Essayez-le en ligne: Regular Input / Test Suite

Merci à @isaacg pour un octet.

Explication:

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
la source
1
Nous avions la même idée. J'ai écrit un port Pyth de ma CJam, puis j'ai fait défiler vers le bas et j'ai vu votre réponse: /
Andrea Biondo
1
Vous pouvez enregistrer un octet en effectuant une affectation augmentée au Glieu d'utiliser N, par exemple =+Gd.
isaacg
@isaacg merci.
Jakube
14

Pyth, 26 octets

J+Gds@LJiR3c.<s.DR9xLJz1 2

Essayez-le en ligne dans le compilateur / exécuteur Pyth: démo | cas de test

Idée

Supposons que tous les caractères d'entrée ont déjà été mappés aux entiers spécifiés à l'étape 2.

Pour chaque nombre ternaire à 3 chiffres, nous avons que xyz 3 = 9x + 3y + z , donc la division modulaire par 9 donne le quotient x et le résidu 3y + z .

Si l'entrée est abc 3 def 3 ghi 3 , l'application d'une division modulaire à chacun donne a, 3b + c, d, 3e + f, g, 3h + i .

Après avoir fait tourner la liste du dessus d'une unité vers la gauche, nous pouvons regrouper les entiers en paires. Cela donne la liste (3b + c, d), (3e + f, g), (3h + i, a) .

Maintenant, si nous convertissons (3y + z, w) de la base 3 en entier, nous obtenons 3 (3y + z) + w = ​​9y + 3z + w = ​​zyw 3 .

Ainsi, l'application de la conversion de base à la liste des paires nous donne bcd 3 efg 3 hia 3 , qui est précisément le résultat de la rotation des chiffres ternaires concaténés d'une unité vers la gauche.

Il ne reste plus qu'à mapper les entiers résultants en caractères.

Code

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
la source
Oui, en quelques heures, j'ai été battu par CJam et Pyth. : /
kirbyfan64sos
Hou la la! Pouvez-vous expliquer comment cela fonctionne? Je suis curieux. :)
The Turtle
@TheTurtle J'ai édité ma réponse.
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

Convertit un caractère cen une valeur xtelle que x=(ord(c)-97)%91, avec le modulo affectant uniquement l'espace pour le convertir en 26. La conversion inverse est ien chr((i-26)%91+32), avec le modulo affectant uniquement i=26pour le faire devenir des espaces.

Nous parcourons les caractères en notant la valeur actuelle xet la valeur précédente y. Nous utilisons les deux derniers chiffres ternaires de y, trouvés comme y%9, et le premier chiffre ternaire de x, trouvés comme x/9. La valeur de la concaténation est y%9*3+x/9. Il y a probablement des optimisations combinant cette arithmétique avec le décalage 97et la fixation de l'espace.

Nous faisons cette boucle autour, nous revenons au premier caractère de la chaîne à la fin. Nous faisons également une boucle de préparation pour écrire dans une valeur précédente y, en supprimant le caractère de la première boucle lorsqu'elle yn'a pas encore été initialisée.

xnor
la source
8

CJam, 39 29 octets

La chose intéressante à propos de celui-ci est qu'il n'utilise même pas la conversion de base.

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

Essayez-le en ligne .

Je viens de réaliser que j'avais exactement la même idée que la réponse Python de Jakube. J'ai en fait porté ce code CJam sur Pyth avant de voir son message, se terminant par 25 octets. Étant donné que c'était mon premier golf Pyth, je suppose que ce n'est pas trop mal.

Explication

                              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
la source
7

CJam, 30 29 27 octets

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

Essayez-le en ligne dans l' interpréteur CJam .

L'approche est la même que dans mon autre réponse , qui est un portage de ce code vers Pyth.

Comment ça marche

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
la source
6

Javascript (ES6), 175 octets

Un one-liner!

"Surutilisation de la vprime variable , quelqu'un?"

mise à jour: utilise désormais uniquement les variables appelées v, pour une confusion totale!

Merci @vihan d'avoir économisé 6 octets!

Merci @Neil d'avoir économisé 27 octets !!

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

Définit une fonction anonyme. Pour l'utiliser, ajoutez v=avant le code pour donner un nom à la fonction, et appelez-la commealert(v("hello world"))

jrich
la source
Vous pouvez utiliser .slice(-3)pour enregistrer 6 octets, auquel moment vous pouvez utiliser "00"+vpour enregistrer un autre octet. (Vous pouvez concaténer avec un modèle mais la longueur résultante est la même.)
Neil
En fait, vous pouvez enregistrer tout un tas d'octets en ajoutant 27 à vos valeurs avant de les convertir en base trois, car cela garantit suffisamment de chiffres. .map(v=>(v<"V"?26:v.charCodeAt()-97).toString(3)).map(v=>("000"+v).slice(v.length))devient alors .map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1)).
Neil
@Neil Wow, cela a vraiment raccourci le code! Il en a également fait un véritable «one-liner», en supprimant la seule variable intermédiaire. Merci!
jrich
5

Julia, 149 137 octets

Mon premier 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)]]))

(partiellement) non 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
la source
Vous pouvez utiliser =plutôt quein pour les boucles et vous pouvez utiliser b[1]à la place de b[1:1]. Vous n'avez pas non plus besoin d'espace entre les parenthèses fermantes et for.
Alex A.
@AlexA. Bravo pour= , mais b[1]renvoie un caractère, qui ne peut pas être ajouté à une chaîne avec *.
kevinsa5
Oh oui, j'ai oublié ça.
Alex A.
@AlexA. L' forastuce est astucieuse. Vous pouvez également l'avoir directement après un devis de clôture. Je ne savais pas que l'analyseur était si flexible.
kevinsa5
Il peut également suivre directement un littéral numérique, comme c'est possible 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('{',' ')}

Remplacement de Math.floor par un bit ou. Création d'une fonction anonyme. Si je comprends bien, cela devrait corriger quelque peu mon noobishness (merci Dennis!) Et me faire descendre encore 2 octets.

Tekgno
la source
3

Julia, 169 166 octets

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

Non golfé + explication:

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.
la source
3

Haskell, 160 octets

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, cela semble beaucoup trop long, mais au moins je ... bat Python d'une manière ou d'une autre. Et Ruby.

Lynn
la source
3

Javascript (ES6), 141 124 120 octets

Croyez-le ou non.... :-)

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

Comme pour mon autre réponse, il s'agit d'une fonction anonyme qui doit être affectée à une variable avant de pouvoir être utilisée. Essayez-le ici:

J'ai pensé que je pourrais être en mesure de raser quelques octets de ma réponse précédente en utilisant une technique différente, alors j'ai commencé avec une similaire à celle de Tekgno et j'ai commencé à jouer au golf à partir de là. J'ai initialisé certaines variables dans la section des arguments de la fonction, et encore une fois tout bourré dans une .mapfonction. Ensuite, j'ai réalisé que ce String.fromCharCodeserait beaucoup plus efficace en dehors du .map. Après tout a été dit et fait, j'avais rasé plus de 30 45 octets!

Edit 1: économisé 17 octets en se débarrassant des .replaces, en utilisant une technique similaire à la solution Python de xnor.

OK, il est peut-être temps de passer à un autre défi ...

ETHproductions
la source
2

Python 2, 182 180 octets

Cette solution n'est pas idéale, car le remplacement est très coûteux. Essayer de comprendre comment éviter cela.

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'entrée est comme "hello world".

Kade
la source
Vous devez compter 2 octets pour les guillemets requis dans l'entrée, non?
mbomb007
@ mbomb007 C'est ce que j'avais pensé auparavant, mais plusieurs personnes m'ont dit que je n'avais pas besoin de tenir compte de cela.
Kade
2

Mathematica, 162 octets

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

(Re) Utiliser un Rulepour convertir les listes de chiffres en caractères et inversement.

murphy
la source
2

Javascript (ES6), 179 octets

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

Props à vihan pour l' .matchexpression régulière.

Dendrobium
la source
1

Rubis, 177

Nécessite au moins Ruby 1.9 pour la each_charméthode

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
la source
1

Java, 458 449 octets

Cela m'a rendu un peu triste de déterminer que je pouvais raser 10 octets en n'utilisant pas les flux Java 8 et la map()méthode.

Voici la version golfée:

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

Voici une version beaucoup moins golfée. Il est destiné à être lisible, mais je ne donne aucune garantie.

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

Ce programme prend la chaîne à convertir en argument de ligne de commande. Si vous voulez avoir des espaces dans votre entrée, vous devez l'entourer de guillemets doubles.

Je voulais fournir un exemple d'utilisation de cela à partir de la ligne de commande, mais je n'ai pas réussi à faire fonctionner ce code en dehors d'Eclipse. Je n'ai jamais appris à utiliser Java à partir de la ligne de commande ^ _ ^; Vous pouvez probablement le faire fonctionner dans l'IDE de votre choix sans trop de problèmes.

sadakatsu
la source
si vous n'utilisez ArrayUtils qu'une seule fois, l'utilisation du nom complet dans le code est plus courte que cette instruction d'importation. voir: codegolf.stackexchange.com/a/16100/10801 (moitié inférieure de la réponse liée)
masterX244
1

Javascript (ES6), 181 180 octets

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

Il s'agit d'une fonction anonyme, il faut donc lui donner un nom avant de pouvoir l'utiliser. (Par exemple encrypt=t=>...) Essayez-le ici:

J'ai commencé à utiliser plusieurs variables et forboucles au lieu de .map. Je l'ai ensuite joué de toutes les manières possibles sans changer l'algorithme, ce qui m'a mis quelque part autour de 217 octets. Après avoir jeté un coup d'œil à la réponse de UndefinedFunction, j'ai réussi à la ramener à 195, et une inspection de la réponse de Dendrobium a abouti à 14 autres parties.

Pour autant que je sache, je ne peux pas aller plus loin ou mon résultat serait pratiquement identique à celui de Dendrobium (à l'exception d'être un caractère plus court!). Quelqu'un peut-il trouver l'endroit où j'ai enregistré un personnage? :-)

Comme d'habitude, les suggestions sont les bienvenues!

ETHproductions
la source
Merci pour l'astuce regex! Je ne sais pas exactement comment la boucle for-of pourrait être intégrée à cette fonction d'une ligne, mais peut-être que cela économiserait de l'espace de toute façon. Vous pouvez publier votre version si vous le souhaitez.
ETHproductions
0

Matlab, 113 octets

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

L'entrée se fait via stdin.

Exemple:

>> 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
la source
0

Julia - 92 87 61 54 octets

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

Non 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

L'astuce peut vous dérouter. Soustraire 6 déplace «a» vers le bas à zéro après le mod. Ajouter 9 * 65 équivaut à ajouter 65 à v1 + v2, ce qui fait partie du processus de restauration des valeurs à leurs valeurs ascii. Vous pouvez remplacer i=t%91+579par i=t%91-6, puis remplacer N=(v1+v2)%91+32par N=(v1+v2+65)%91+32pour obtenir le même résultat, mais cela nécessite un caractère supplémentaire.

Glen O
la source