Décryptez-le!

Aug 22 2020

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

  1. Vous commencez avec deux chaînes vides, appelons-les s1et s2. 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-à-dire s1. Nous basculerons entre les deux chaînes chaque fois que nous rencontrerons une voyelle.

  2. 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 de s1 (si nous considérons s1actuellement) ou à gauche de s2 (si nous considérons s2actuellement).

  3. Si ce caractère était une voyelle, passez à l'autre chaîne maintenant ( s1 <-> s2).

  4. Répétez les étapes 2 (et 3 pour les voyelles) pour chaque caractère de la chaîne d'entrée.

  5. Concaténez s1et s2et 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

5 JonathanAllan Aug 22 2020 at 02:48

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
4 Arnauld Aug 22 2020 at 03:06

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: j1213s

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.

4 JoeFerndz Aug 22 2020 at 16:44

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"
2 Neil Aug 22 2020 at 06:50

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

2 DominicvanEssen Aug 27 2020 at 01:51

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
2 gastropner Aug 22 2020 at 08:26

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!

KevinCruijssen Aug 24 2020 at 13:59

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)
Xcali Sep 04 2020 at 05:45

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!