Question

Veuillez répondre avec le code source le plus court possible pour un programme qui convertit un texte en clair arbitraire en son texte chiffré correspondant, en suivant les exemples d’entrée et de sortie que j’ai donnés ci-dessous. Points bonus * pour le moins de temps CPU ou le moins de mémoire utilisée.

Exemple 1:

Plaintext: Le renard brun rapide saute par-dessus le chien paresseux. Supercalifragilisticexpialidocious!

Texte chiffré: eTh kiquc nobrw xfo smjup rvoe eth yalz .odg! uioiapeislgriarpSueclfaiitcxildcos

Exemple 2:

Texte en clair: 123 1234 12345 123456 1234567 12345678 123456789

Texte chiffré: 312 4213 53124 642135 7531246 86421357 975312468

Règles:

  1. La ponctuation est définie pour être incluse dans le mot le plus proche.
  2. Le centre d'un mot est défini comme étant un plafond ((strlen (mot) +1) / 2).
  3. Les espaces sont ignorés (ou réduits).
  4. Les mots impairs se déplacent d'abord vers la droite. Même les mots se déplacent d'abord vers la gauche.

Vous pouvez le considérer comme une lecture en arrière de tous les autres caractères (à partir de la fin du mot), suivie des autres caractères. Corporation = & Gt; XoXpXrXtXoX = & Gt; niaorCoprto.

Merci à ceux qui ont souligné l'incohérence dans ma description. Cela a conduit nombre d'entre vous sur la mauvaise voie, ce dont je m'excuse. La règle 4 devrait clarifier les choses.

* Les points bonus ne seront attribués que si Jeff Atwood décide de le faire. Depuis que je n'ai pas vérifié avec lui, les chances sont minces. Désolé.

Était-ce utile?

La solution

Python, 50 caractères

Pour entrer dans i:

' '.join(x[::-2]+x[len(x)%2::2]for x in i.split())

Autre version gérant son propre IO:

print ' '.join(x[::-2]+x[len(x)%2::2]for x in raw_input().split())

Un total de 66 caractères en incluant les espaces. (Techniquement, le print peut être omis s’il est exécuté à partir d’une ligne de commande, car la valeur évaluée du code est affichée en sortie par défaut.)

Autre version utilisant reduce:

' '.join(reduce(lambda x,y:y+x[::-1],x) for x in i.split())

59 caractères.

Version originale (les paires et les paires vont d'abord à droite) pour une entrée dans <=>:

' '.join(x[::2][::-1]+x[1::2]for x in i.split())

48 caractères, y compris les espaces.

Une autre version alternative (légèrement plus longue) est légèrement plus efficace:

' '.join(x[len(x)%2-2::-2]+x[1::2]for x in i.split())

(53 caractères)

Autres conseils

J , 58 caractères

>,&.>/({~(,~(>:@+:@i.@-@<.,+:@i.@>.)@-:)@<:@#)&.><;.2,&' '

Haskell , 64 caractères

unwords.map(map snd.sort.zip(zipWith(*)[0..]$cycle[-1,1])).words

Eh bien, d'accord, si vous ajoutez les éléments requis &>; import List & ";

Python - 69 caractères

(y compris les espaces et les sauts de ligne)

Ceci gère toutes les E / S.

for w in raw_input().split():
 o=""
 for c in w:o=c+o[::-1]
 print o,

Perl, 78 caractères

Pour entrer dans $_. Si ce n'est pas acceptable, ajoutez six caractères pour $_=<>; ou $_=$s; au début. La nouvelle ligne sert uniquement à la lecture.

for(split){$i=length;print substr$_,$i--,1,''while$i-->0;
print"$_ ";}print $/

C, 140 caractères

Joliment formaté:

main(c, v)
  char **v;
{
  for( ; *++v; )
  {
    char *e = *v + strlen(*v), *x;
    for(x = e-1; x >= *v; x -= 2)
      putchar(*x);
    for(x = *v + (x < *v-1); x < e; x += 2)
      putchar(*x);
    putchar(' ');
  }
}

Compressé:

main(c,v)char**v;{for(;*++v;){char*e=*v+strlen(*v),*x;for(x=e-1;x>=*v;x-=2)putchar(*x);for(x=*v+(x<*v-1);x<e;x+=2)putchar(*x);putchar(32);}}

Lua

fonction 130 caractères, programme de fonctionnement 147 caractères

Lua n'a pas assez d'amour en code golf - peut-être parce qu'il est difficile d'écrire un programme court quand on a des mots-clés longs comme function / end, if / then / <pre></pre>, etc.

J'écris d'abord la fonction de manière détaillée avec des explications, puis je la réécris en tant que fonction autonome compressée, puis j'appelle cette fonction sur l'argument unique spécifié sur la ligne de commande.

J'ai dû formater le code avec <=> balises car Markdown effectue un travail de formatage horrible en Lua.

Techniquement, vous pouvez obtenir un programme plus petit en incluant la fonction, mais il est plus modulaire de la manière suivante:)

t = "The quick brown fox jumps over the lazy dog. Supercalifragilisticexpialidocious!"
T = t:gsub("%S+", -- for each word in t...
                  function(w) -- argument: current word in t
                    W = "" -- initialize new Word
                    for i = 1,#w do -- iterate over each character in word
                        c = w:sub(i,i) -- extract current character
                        -- determine whether letter goes on right or left end
                        W = (#w % 2 ~= i % 2) and W .. c or c .. W
                    end
                    return W -- swap word in t with inverted Word
                  end)


-- code-golf unit test
assert(T == "eTh kiquc nobrw xfo smjup rvoe eth yalz .odg !uioiapeislgriarpSueclfaiitcxildcos")

-- need to assign to a variable and return it,
-- because gsub returns a pair and we only want the first element
f=function(s)c=s:gsub("%S+",function(w)W=""for i=1,#w do c=w:sub(i,i)W=(#w%2~=i%2)and W ..c or c ..W end return W end)return c end
--       1         2         3         4         5         6         7         8         9        10        11        12        13
--34567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
-- 130 chars, compressed and written as a proper function

print(f(arg[1]))
--34567890123456
-- 16 (+1 whitespace needed) chars to make it a functioning Lua program, 
-- operating on command line argument

Sortie:

$ lua insideout.lua 'The quick brown fox jumps over the lazy dog. Supercalifragilisticexpialidocious!'
eTh kiquc nobrw xfo smjup rvoe eth yalz .odg !uioiapeislgriarpSueclfaiitcxildcos

Je suis toujours assez nouveau chez Lua, alors j'aimerais voir une solution plus courte s'il en existe une.


Pour un chiffrement minimal sur tous les arguments en stdin, nous pouvons faire 111 caractères:

for _,w in ipairs(arg)do W=""for i=1,#w do c=w:sub(i,i)W=(#w%2~=i%2)and W ..c or c ..W end io.write(W ..' ')end

Mais cette approche génère un espace de fin, comme certaines des autres solutions.

Pour une entrée dans s:

f=lambda t,r="":t and f(t[1:],len(t)&1and t[0]+r or r+t[0])or r
" ".join(map(f,s.split()))

Python, 90 caractères, y compris les espaces.

TCL

125 caractères

set s set f foreach l {}
$f w [gets stdin] {$s r {}
$f c [split $w {}] {$s r $c[string reverse $r]}
$s l "$l $r"}
puts $l

Bash - 133, en supposant que l'entrée est dans la variable $ w

Jolie

for x in $w; do 
    z="";
    for l in `echo $x|sed 's/\(.\)/ \1/g'`; do
        if ((${#z}%2)); then
            z=$z$l;
        else
            z=$l$z;
        fi;
    done;
    echo -n "$z ";
done;
echo

Compressé

for x in $w;do z="";for l in `echo $x|sed 's/\(.\)/ \1/g'`;do if ((${#z}%2));then z=$z$l;else z=$l$z;fi;done;echo -n "$z ";done;echo

Ok, donc un espace de fin est généré.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top