Décryptez-le!
Remarque
C'est le défi du décryptage. Le défi du cryptage peut être trouvé ici .
Défi
Le défi est de décrypter une chaîne donnée, en utilisant les règles spécifiées ci-dessous. La chaîne ne contiendra que des alphabets minuscules , des chiffres et / ou des espaces vides . Si vous voulez savoir comment la chaîne d'entrée a été chiffrée, reportez-vous à ce défi!
Equivalent d'un personnage
Maintenant, vous devez d'abord savoir comment trouver «l'équivalent» de chaque caractère.
Si le caractère est une consonne, voici la manière de trouver son équivalent:
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.
Par exemple: «h» et «t» sont des équivalents l'un de l'autre parce que «h», «t» sont respectivement en 6ème position depuis le début et la fin.
La même procédure est suivie pour trouver l'équivalent des voyelles / chiffres. Vous listez toutes les voyelles ou les chiffres (à partir de 0) dans l'ordre et trouvez l'équivalent.
Ci-dessous se trouve la liste des équivalents de tous les caractères:
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
Règles de décryptage
Vous commencez avec deux chaînes vides, appelons-les
s1ets2. Nous nous déplacerons de gauche à droite de la chaîne d'entrée. Au début, nous considérerions la première chaîne vide, c'est-à-dires1. Nous basculerons entre les deux chaînes chaque fois que nous rencontrerons une voyelle.Nous prenons l'équivalent du caractère courant de la chaîne d'entrée, ou un espace vide s'il s'agit d'un espace vide. Appelons ce personnage
c.cest maintenant ajouté à droite des1(si nous considéronss1actuellement) ou à gauche des2(si nous considéronss2actuellement).Si ce caractère était une voyelle, passez à l'autre chaîne maintenant (
s1 <-> s2).Répétez les étapes 2 (et 3 pour les voyelles) pour chaque caractère de la chaîne d'entrée.
Concaténez
s1ets2et le résultat est la chaîne déchiffrée.
Maintenant, laissez-moi déchiffrer une chaîne pour vous.
String = "htioj ixej uy "
Initially, s1 = s2 = ""
Current: s1
Moving left to right
"h" -> "t" (s1 = "t")
"t" -> "h" (s1 = "th")
"i" -> "i" (s1 = "thi")
Vowel encountered. Switching to s2 now.
"o" -> "e" (s2 = "e")
Vowel encountered. Switching to s1 now.
"j" -> "s" (s1 = "this")
" " -> " " (s1 = "this ")
"i" -> "i" (s1 = "this i")
Vowel encountered. Switching to s2 now.
"x" -> "d" (s2 = "de") [Note that when dealing with s2, we append to the left]
"e" -> "o" (s2 = "ode")
Vowel encountered. Switching to s1 now.
"j" -> "s" (s1 = "this is"
" " -> " " (s1 = "this is ")
"u" -> "a" (s1 = "this is a")
Vowel encountered. Switching to s2 now.
"y" -> "c" (s2 = "code")
" " -> " " (s2 = " code")
Now, append s1 and s2 to get:
"this is a code"
Output -> "this is a code"
Exemples
"wqcjmc" -> "flyspy"
"toek" -> "hero"
"toyike" -> "heroic"
"uo" -> "ae"
"uoz" -> "abe"
"htoo jmuy" -> "the space"
"uh68v8x " -> "a d1g13t"
"fo78i d" -> "we xi12"
"htioj ixej uy " -> "this is a code"
"jea ceeac hnx8x vni kokhj jiuth xoqqc xohmcky" -> "so you really decrypted this string d1dnt you"
Vous pouvez également choisir d'utiliser des alphabets majuscules au lieu de minuscules.
Notation
C'est du code-golf , donc le code le plus court l'emporte!
Réponses
Gelée , 29 octets
ØḄ,ØẹØDṭ,U$F€yµe€ØẹŻœṗµ;ṚU$m2
Un programme complet qui imprime le texte décodé.
Essayez-le en ligne!
Comment?
ØḄ,ØẹØDṭ,U$F€yµe€ØẹŻœṗµ;ṚU$m2 - Main Link: list, S
ØḄ - consonant characters
Øẹ - vowel characters
, - pair
ØD - digit characters
ṭ - tack -> ["bcd...","aeiou","012..."]
$ - last two links as a monad: U - upend -> ["...dcb","uoiea","...210"] , - pair -> [["bcd...","aeiou","012..."],["...dcb","uoiea","...210"]] F€ - flatten each -> ["bcd...aeiou012...","...dcbuoiea...210"] y - translate S using that map µ - new monadic chain (i.e. f(A=that)) Øẹ - vowel characters e€ - (for c in A) exists in (vowels)? Ż - prepend a zero œṗ - partition (A) before truthy elements (of that) µ - new monadic chain (i.e. f(that)) ...e.g.: f(["thi","e","s i","do","s a","c "]) $ - last two links as a monad:
Ṛ - reverse ["c ","s a","do","s i","e","thi"]
U - upend [" c","a s","od","i s","e","iht"]
; - concatenate ["thi","e","s i","do","s a","c "," c","a s","od","i s","e","iht"]
m2 - mod-2 slice ["thi", "s i", "s a", ," c", "od", "e" ]
- implicit, smashing print -> this is a code
JavaScript (ES6), 112 110 109 octets
Attend un tableau de caractères.
s=>s.map(c=>(C="bzcydxfwgvhtjskrlqmpnn aueoii",c=C[j=C.search(c)^1]||9-c,+s?b=c+b:a+=c,s^=j>23),a=b='')&&a+b
Essayez-le en ligne!
Comment?
Nous recherchons l'index de chaque caractère cdans la chaîne de recherche suivante:
0 1 2
012345678901234567890123456789
"bzcydxfwgvhtjskrlqmpnn aueoii"
Si le caractère n'est pas trouvé, il doit s'agir d'un chiffre qui est remplacé par 9-c. Sinon, nous obtenons la position du caractère homologue en inversant le bit le moins significatif de l'index.
Par exemple: j→ 12→ 13→s
Le nouveau caractère est ajouté aou préfixé à b.
Nous basculons entre aet bchaque fois que l'indice est supérieur à 23 - c'est-à-dire qu'il cs'agit d'une voyelle.
Python, 226, 160 146 octets
Essayez-le en ligne
Je suis assez novice en python et je voulais essayer ce défi. Je sais que beaucoup de choses peuvent être améliorées à l'aide de lambda ou d'un code simplifié. J'affiche mon code pour avoir des commentaires.
Merci à @Arnauld de m'avoir aidé à apprendre de nouvelles façons de coder. Maintenant à 160 octets
Plus d'entrées et de raffinements. Maintenant à 146.
def k(y):
x='aueoiibzcydxfwgvhtjskrlqmpnn0918273645 '
s=1
b=['']*2
for i in y:n=x.find(i);b[s]+=x[n+1-2*(n%2)];s^=n<6
print(b[1]+b[0][::-1])
Ancien code:
def k(y):
x='aueoiibzcydxfwgvhtjskrlqmpnn0918273645 '
s=1
b=c=''
def a(t):
m=n+1 if n%2==0 else n-1;t+=x[m];return t
for i in y:
n=x.find(i)
if s:
b=a(b)
else:
c=a(c)
if n<=5:s=not s
b+=c[::-1]
print(b)
k('wqcjmc')
k('toek')
k('toyike')
k('uo')
k('uoz')
k('htoo jmuy')
k('uh68v8x ')
k('fo78i d')
k('htioj ixej uy ')
k('jea ceeac hnx8x vni kokhj jiuth xoqqc xohmcky')
Tester tous les exemples d'articles et obtenir la réponse correcte.
"wqcjmc" -> "flyspy"
"toek" -> "hero"
"toyike" -> "heroic"
"uo" -> "ae"
"uoz" -> "abe"
"htoo jmuy" -> "the space"
"uh68v8x " -> "a d1g13t"
"fo78i d" -> "we xi12"
"htioj ixej uy " -> "this is a code"
"jea ceeac hnx8x vni kokhj jiuth xoqqc xohmcky" -> "so you really decrypted this string d1dnt you"
Retina 0.8.2 , 89 83 80 71 octets
[aeiou]|$ $&¶
+`(¶.+)¶(.*)$ $2$1 O$^r`.\G
T`¶b-df-hj-maed\oup-tv-z_`Ro
Essayez-le en ligne! Le lien comprend des cas de test. Cela s'est avéré plus facile que l'encodage, comme le montre le fait que j'ai pu le coder dans Retina 0.8.2 plutôt que d'exiger Retina 1. Explication:
[aeiou]|$ $&¶
Divisez l'entrée sur les sous-chaînes se terminant sur les voyelles. Un fractionnement supplémentaire est forcé à la fin de la chaîne pour qu'il y ait au moins deux lignes.
+`(¶.+)¶(.*)$ $2$1
Joignez les lignes alternatives ensemble, de sorte que la première ligne est la concaténation de toutes les lignes impaires et la deuxième ligne est la concaténation de toutes les lignes paires.
r`.\G
Correspondance uniquement avec les caractères de la dernière (deuxième) ligne ...
O$^`
.. inversez les correspondances, inversant ainsi la deuxième ligne uniquement.
T`¶b-df-hj-maed\oup-tv-z_`Ro
Joignez les deux lignes ensemble et décodez les lettres. Le Roprovoque la translittération de la chaîne vers son inverse. La consonne du milieu net la voyelle icorrespondent à elles-mêmes et n'ont donc pas besoin d'être répertoriées. Les ¶cartes vers le spécial le _supprimant ainsi. Les 10 premières et dernières consonnes et les deux premières et dernières voyelles entourent ensuite les chiffres. (Le oest normalement spécial, il doit donc être cité ici.)
R , 190 octets
function(i,`/`=strsplit){a=el(" 01234aeibcdfghjklmnpqrstvwxyziou98765 "/"")
names(a)=rev(a)
j=k=""
for(l in a[el(i/"")]){if(T)j=c(j,l)else k=c(l,k)
if(grepl(l,"aeiou"))T=!T}
cat(j,k,sep="")}
Essayez-le en ligne!
Note à moi-même: apprenez un nouveau langage non- R aux défis textuels de golf ...
Commenté:
decrypt=function(i,
`/`=strsplit){ # use infix '/' as alias to strsplit function
a=el(" 01234aeibcdfghjklmnpqrstvwxyziou98765 "/"")
# a=vector of characters with equivalents at reverse index
names(a)=rev(a) # name characters by equivalent
j=k="" # initialize j,k as empty strings
for(l in a[el(i/"")]){ # for each input letter (split using /), find its equivalent l
if(T)j=c(j,l)else k=c(l,k) # if T=1 (initial value) append l to j, otherwise put it at start of k
if(grepl(l,"aeiou"))T=!T} # if it was a vowel, T=not T
cat(j,k,sep="")} # finally, output j,k
C (gcc) , 144 143 140 octets
-1-3 octets grâce au plafonnier
k,v,p,a;f(char*s,char*o){for(k=p=0,v=strlen(s);a=*s++;p^=1065233>>a-97&1)o[p?--v:k++]=a<33?a:a<58?105-a:"uzyxowvtisrqpnemlkjhagfdcb"[a-97];}
Essayez-le en ligne!
05AB1E , 27 26 octets
žMIå0šÅ¡ι€S`R«žN‡žM‡žh‡
E / S sous forme de liste de caractères.
Essayez-le en ligne ou vérifiez tous les cas de test (avec les E / S jointes à pretty-print).
Explication:
žM # Push the vowels "aeiou"
Iå # Check for each character in the input-list if it's in the vowel string
# i.e. ["h","t","i","o","j"," ","i","x","e","j"," ","u","y"," "]
# → [0,0,1,1,0,0,0,1,0]
0š # Prepend a leading 0
# → [0,0,0,1,1,0,0,0,1,0]
Å¡ # Split the (implicit) input-string on the truthy values
# → [["h","t","i"],["o"],["j"," ","i"],["x","e"],["j"," ","u"],["y"," "]]
ι # Uninterleave the list of lists
# → [[["h","t","i"],["j"," ","i"],["j"," ","u"]],[["o"],["x","e"],["y"," "]]]
€S # Convert each inner list of lists to a flattened list of characters
# → [["h","t","i","j"," ","i","j"," ","u"],["o","x","e","y"," "]]
` # Push both lists of characters separated to the stack
# → ["h","t","i","j"," ","i","j"," ","u"] and ["o","x","e","y"," "]
R # Reverse the second string
# → ["h","t","i","j"," ","i","j"," ","u"] and [" ","y","e","x","o"]
« # Merge the two lists together
# → ["h","t","i","j"," ","i","j"," ","u"," ","y","e","x","o"]
žN # Push the consonants "bcdfghjklmnpqrstvwxyz"
 # Bifurcate it; short for Duplicate & Reverse copy
‡ # Transliterate the "bcdfghjklmnpqrstvwxyz" to "zyxwvtsrqpnmlkjhgfdcb"
# → ["t","h","i","s"," ","i","s"," ","u"," ","c","e","d","o"]
žM‡ # Do the same for the vowels "aeiou"
# → ["t","h","i","s"," ","i","s"," ","a"," ","c","o","d","e"]
žh‡ # And the digits "0123456789"
# → ["t","h","i","s"," ","i","s"," ","a"," ","c","o","d","e"]
# (after which the result is output implicitly)
Perl 5 -F , 110 octets
map{push@{$o[$i]},y/0-9a-z/9876543210uzyxowvtisrqpnemlkjhagfdcb/r;$i^=/[aeiou]/}@F;say@{$o[0]},reverse@{$o[1]}
Essayez-le en ligne!