¡Encriptemos!

12

Desafío

El desafío es encriptar una cadena dada, usando las reglas que se especifican a continuación. La cadena solo contendrá alfabetos en minúscula , dígitos y / o espacios en blanco .

Equivalente de un personaje

Ahora, en primer lugar, necesitaría saber cómo encontrar el "equivalente" de cada personaje.

Si el carácter es una consonante, esta es la forma de encontrar su equivalente:

1) List all the consonants in alphabetical order
    b c d f g h j k l m n p q r s t v w x y z
2) Get the position of the consonant you are finding the equivalent of.
3) The equivalent is the consonant at that position when starting from the end.

por ejemplo: 'h' y 't' son equivalentes entre sí porque 'h', 't' están en la sexta posición desde el inicio y el final, respectivamente.

Se sigue el mismo procedimiento para encontrar el equivalente de vocales / dígitos. Usted enumera todas las vocales o los dígitos (comenzando desde 0) en orden y encuentra el equivalente.

A continuación se muestra la lista de los equivalentes de todos los caracteres:

b <-> z
c <-> y
d <-> x
f <-> w
g <-> v
h <-> t
j <-> s
k <-> r
l <-> q
m <-> p
n <-> n

a <-> u
e <-> o
i <-> i

0 <-> 9
1 <-> 8
2 <-> 7
3 <-> 6
4 <-> 5

Reglas de cifrado

1) Empiezas a moverte desde la izquierda y vas hacia la derecha.

2) Si el carácter es una consonante / dígito, se toma su equivalente y si se trata de un espacio en blanco, se toma un espacio en blanco.

3) Si el personaje es una vocal, tomas su equivalente y comienzas a moverte en la dirección opuesta. Por ejemplo, si se mueve hacia la derecha y encuentra una vocal, encripte ese carácter, luego salte al carácter sin encriptar más a la derecha y comience a encriptar en la dirección izquierda, y viceversa.

4) No debes considerar a un personaje en la misma posición dos veces. Se deben seguir los pasos hasta que se cubran todos los caracteres de la entrada.

5) El número total de caracteres en la entrada (incluidos los espacios en blanco) debe ser igual al número total de caracteres en la salida.

Tenga en cuenta que los caracteres cifrados aparecen en la salida en el orden en que se cifraron.

Ahora déjame encriptar una cadena para ti.

String = "tre d1go3t is"
Moving left to right
"t" -> "h"
"r" -> "k"
"e" -> "o"
Vowel encountered. Now moving right to left.
"s" -> "j"
"i" -> "i"
Vowel encountered. Now moving left to right.
" " -> " "
"d" -> "x"
"1" -> "8"
"g" -> "v"
"o" -> "e"
Vowel encountered. Now moving right to left.
" " -> " "
"t" -> "h"
"3" -> "6"

Output -> "hkoji x8ve h6"

Ejemplos

"flyspy" -> "wqcjmc"
"hero" -> "toek"
"heroic" -> "toyike"
"ae" -> "uo"
"abe" -> "uoz"
"the space" -> "htoo jmuy"
"a d1g13t" -> "uh68v8x "
"we xi12" -> "fo78i d"
"this is a code" -> "htioj ixej uy "

También puede optar por utilizar alfabetos en mayúsculas en lugar de minúsculas.

Puntuación

Este es el , por lo que gana el código más corto.

Manish Kundu
fuente
1
El paso 3 no está claro con respecto a cambiar de dirección. Creo que deberías decir algo como "Si te mueves hacia la derecha y encuentras una vocal, encripta ese carácter, salta al carácter sin encriptar de la derecha y comienza a encriptar en la dirección izquierda". (Si eso es lo que quieres decir). Creo que también debe especificar explícitamente que los caracteres cifrados aparecen en la salida en el orden en que se cifraron.
Dylnan
@dylnan agregó eso.
Manish Kundu
Solo por curiosidad: ¿puede describir el procedimiento de descifrado? Debido a que la función de cifrado no es su propio inverso (como en ROT13 algo). Entonces, si pasamos datos cifrados al mismo procedimiento de cifrado, no obtendremos el texto original. Gracias
Agnius Vasiliauskas
1
@AgniusVasiliauskas: Una forma de hacerlo sería: aplicar las mismas transformaciones de personaje. Mantenga 2 descifrar cadenas. Pase sobre la cuerda de izquierda a derecha. Alterne entre agregar caracteres a la primera cadena y preceder a la segunda cada vez que maneje una vocal. Fusionar las cuerdas al final.
Emigna
3
Pronto habrá un desafío de descifrado para el mismo, en el que intentaré explicar el proceso
Manish Kundu,

Respuestas:

4

JavaScript (Node.js) , 173 ... 166 156 ... 124 123 bytes

-28 bytes Gracias Arnauld

f=([q,...s])=>q?(c="aeioubcdfghjklmpqrstvwxyz",t=c.search(q),q=="0"|+q?9-q:~t?c[(t<5?4:29)-t]:q)+f(~t&&t<5?s.reverse():s):s

Pruébalo en línea!

En la primera iteración String, se cambiará a Array, y las iteraciones posteriores continuarán utilizándose Array. Voilà!

Enfoque original (166 bytes):

f=(s,i=0,r=s.length,d=1,c="bcdfghjklmnpqrstvwxyz",v="aeiou")=>(d^=!!(t=~v.search(q=s[d?i:r])),q<"0"|q>"9"?c[20-c.search(q)]||v[5+t]||q:9-q)+(i<r-1?f(s,i+d,r-!d,d):"")
Shieru Asakoto
fuente
&no funcionó para algunos números pero &&funcionó. Gracias.
Shieru Asakoto
¡Oh, sí, no encontré un método para optimizar eso y lo hiciste! ¡Gracias!
Shieru Asakoto
3
124 bytes usando la misma cadena para todas las letras y aplicando un poco más de golf.
Arnauld
Wow genial! No pensé en combinar las cuerdas
Shieru Asakoto
q=="0"|+qen realidad es 1 byte más corto que q>" "&&1/q.
Arnauld
3

05AB1E , 22 bytes

vćžN‡žM‡žh‡D?žMsåiR

Pruébalo en línea! o como un conjunto de pruebas

Explicación

v                        # for each char in input
 ć                       # extract the head of the current string (initially input)
  žN‡                   # transform consonants
      žM‡               # transofrm vowels
          žh‡           # transform numbers
              D?         # print a copy of the current char
                žMsåi    # if the current char is a vowel
                     R   # reverse the rest of the string
Emigna
fuente
žhžMžN)UvćXJXíJ‡D?žMsåiRera lo que estaba pensando para mejorar, pero no puedo reducir XJXiJlo suficiente.
Urna mágica del pulpo
@MagicOctopusUrn: Tuve una idea similar con la DJsíJque tampoco fue muy efectiva.
Emigna
1

C, 196 bytes

#define C(k,m)for(i=m;i--;)k[i]-c||putchar(k[m+~i],r^=m==5);
r;p(c,i){C("bcdfghjklmnpqrstvwxyz",21)C("0123456789",10)C("aeiou",5)C(" ",1)}f(S){char*s=S,*t=s+strlen(s);for(r=1;s<t;)p(r?*s++:*--t);}

Pruébalo en línea!

Steadybox
fuente
1

J , 132 bytes

f=:3 :0
c=.(u:97+i.26)-.v=.'aeiou'
d=.u:48+i.10
g=.;"0|.
a=.''
while.*#y do.a=.a,{.y rplc(g c),(g d),g v
y=.|.^:({:a e.v)}.y
end.a
)

Pruébalo en línea!

Un verbo explícito detallado esta vez.

Explicación:

c=.(u:97+i.26) hace una lista az

v=.'aeiou' hace una lista de vocales

-. elimina las vocales de la lista de letras

d=.u:48+i.10 hace una lista de dígitos

g=.;"0|. un verbo de utilidad para crear una lista de pares en caja de símbolos de reemplazo

   g d
┌─┬─┐
│0│9│
├─┼─┤
│1│8│
├─┼─┤
│2│7│
├─┼─┤
│3│6│
├─┼─┤
│4│5│
├─┼─┤
│5│4│
├─┼─┤
│6│3│
├─┼─┤
│7│2│
├─┼─┤
│8│1│
├─┼─┤
│9│0│
└─┴─┘

a=.'' una lista para almacenar el resultado

while.*#y do.a=.a,{.y rplc(g c),(g d),g v mientras la longitud de la lista es> 0, tome un símbolo, reemplácelo y agréguelo al resultado

y=.|.^:({:a e.v)}.y suelte un símbolo desde el principio de la lista y si el símbolo es una vocal, invierta la lista

end.termina el whileciclo

a devuelve el resultado

Galen Ivanov
fuente
1

Limpio , 221 206 198 190 186 178 bytes

import StdEnv
r=reverse
l=['bcdfghjklm01234aeou56789pqrstvwxyz']
$s#(a,b)=span(\e=all((<>)e)['aeiou'])s
|s>[]=[j\\e<-a++b%(0,0),i<-['in ':l]&j<-['in ':r l]|e==i]++ $(init(r b))=s

Pruébalo en línea!

Οurous
fuente
0

Retina , 78 bytes

T`dl`9-0uz-x\ow-vtis-pnem-j\hagfd-b
/[aeiou]/{*>0L`.*?[aeiou]
0`.*?[aeiou]

V`

Pruébalo en línea! El enlace incluye casos de prueba. Explicación:

T`dl`9-0uz-x\ow-vtis-pnem-j\hagfd-b

Cambia cada personaje con su equivalente.

/[aeiou]/{

Repita mientras quede una vocal.

*>0L`.*?[aeiou]

Salida del texto hasta la vocal.

0`.*?[aeiou]

Eliminar el texto hasta la vocal.

V`

Invierta el texto restante. Cuando no quedan vocales, esto se emite implícitamente, sin embargo, a los fines de los casos de prueba, el encabezado genera el texto al final de cada línea.

Neil
fuente
0

Stax , 24 bytes

╥j•td╢Ä;Sµ*ûⁿvÉ╫î▓J o╩π╗

Ejecutarlo

Aquí está la representación ascii del mismo programa.

VcGVdGVvGwB]qVvs#!Hv*c}cr\$|t

Traduce primero cada clase de personaje, luego comienza un ciclo while. En el bucle, genera el siguiente carácter e invierte condicionalmente el resto de la cadena si se encuentra una vocal.

VcG                             Push lowercase consonants and jump to trailing }
   VdG                          Push digits and jump to trailing }
      VvG                       Push lowercase vowels and jump to trailing }
         wB]qVvs#!Hv*c          While; run this block until popped value is falsy
          B]                    Split first character off string 
            q                   Output with no newline; keep on the stack
             Vvs#               1 if letter is a vowel, 0 otherwise
                 !Hv            Not, Double, then Decrement
                                    -1 for vowels, 1 otherwise
                    *           Multiply string. -1 causes reversal       
                     c          Copy value to be popped as while condition
                      }         Jump target from above.  Return when done.
                       cr\$     Copy, reverse, zip, and flatten.
                           |t   Translate: use string as a character map
                                    for replacements
recursivo
fuente