Odszyfrujmy to!

Aug 22 2020

Uwaga

To jest wyzwanie odszyfrowania. Wyzwanie szyfrowania można znaleźć tutaj .

Wyzwanie

Wyzwanie polega na odszyfrowaniu podanego ciągu przy użyciu reguł określonych poniżej. Ciąg będzie zawierał tylko małe litery , cyfry i / lub spacje . Jeśli chcesz wiedzieć, jak zaszyfrowano ciąg wejściowy, zapoznaj się z tym wyzwaniem!

Odpowiednik znaku

Po pierwsze, musisz wiedzieć, jak znaleźć „odpowiednik” każdego znaku.

Jeśli znak jest spółgłoską, jest to sposób na znalezienie jej odpowiednika:

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.

np .: „h” i „t” są sobie odpowiednikami, ponieważ „h”, „t” znajdują się odpowiednio na 6 pozycji od początku i od końca.

Ta sama procedura jest stosowana w celu znalezienia odpowiednika samogłosek / cyfr. Podajesz kolejno wszystkie samogłoski lub cyfry (zaczynając od 0) i znajdujesz odpowiednik.

Poniżej podano listę odpowiedników wszystkich znaków:

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

Zasady deszyfrowania

  1. Zaczynasz od dwóch pustych ciągów, nazwijmy je s1i s2. Będziemy poruszać się od lewej do prawej strony ciągu wejściowego. Na początku rozważalibyśmy pierwszy pusty ciąg, tj s1. Będziemy przełączać się między dwoma ciągami, gdy napotkamy samogłoskę.

  2. Bierzemy odpowiednik bieżącego znaku ciągu wejściowego lub spację, jeśli jest to spacja. Nazwijmy tę postać c. cjest teraz dołączany po prawej stronie s1 (jeśli rozważamy s1obecnie) lub po lewej stronie s2 (jeśli rozważamy s2obecnie).

  3. Jeśli tym znakiem była samogłoska, przełącz się na inny ciąg teraz ( s1 <-> s2).

  4. Powtórz krok 2 (i 3 dla samogłosek) dla każdego znaku w ciągu wejściowym.

  5. Połącz, s1a s2wynikiem jest odszyfrowany ciąg.

Teraz pozwól mi odszyfrować dla ciebie ciąg.

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"

Przykłady

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

Możesz także użyć wielkich liter zamiast małych.

Punktacja

To jest code-golf , więc wygrywa najkrótszy kod!

Odpowiedzi

5 JonathanAllan Aug 22 2020 at 02:48

Galaretka , 29 bajtów

ØḄ,ØẹØDṭ,U$F€yµe€ØẹŻœṗµ;ṚU$m2

Pełny program, który drukuje zdekodowany tekst.

Wypróbuj online!

W jaki sposób?

ØḄ,ØẹØ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 bajtów

Oczekuje tablicy znaków.

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

Wypróbuj online!

W jaki sposób?

Szukamy indeksu każdego znaku cw następującym ciągu wyszukiwania:

 0         1         2
 012345678901234567890123456789
"bzcydxfwgvhtjskrlqmpnn  aueoii"

Jeśli znak nie zostanie znaleziony, musi to być cyfra, która jest zastępowana 9-c. W przeciwnym razie pozycję znaku odpowiednika uzyskujemy odwracając najmniej znaczący bit indeksu.

Na przykład: j1213s

Nowy znak jest dołączany alub poprzedzany b.

Przełączamy się pomiędzy ai bzawsze, gdy indeks jest większy niż 23 - tj. cJest samogłoską.

4 JoeFerndz Aug 22 2020 at 16:44

Python, 226, 160 146 bajtów

Wypróbuj online

Python jest dla mnie dość nowy i chciałem spróbować tego wyzwania. Wiem, że wiele z tego można poprawić za pomocą lambda lub uproszczonego kodu. Pokazuję mój kod, aby uzyskać informacje zwrotne.

Dziękuję @Arnauld za pomoc w nauce nowych sposobów kodowania. Teraz na 160 bajtów

Więcej danych wejściowych i udoskonaleń. Teraz w 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])

Stary kod:

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

Przetestowano wszystkie przykładowe pozycje i otrzymałem poprawną odpowiedź.

"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 bajtów

[aeiou]|$
$&¶
+`(¶.+)¶(.*)$
$2$1
O$^r`.\G

T`¶b-df-hj-maed\oup-tv-z_`Ro

Wypróbuj online! Link zawiera przypadki testowe. Okazało się to łatwiejsze niż kodowanie, o czym świadczy fakt, że udało mi się to zakodować w Retina 0.8.2 zamiast wymagać Retina 1. Wyjaśnienie:

[aeiou]|$
$

Podziel wejście na podciągi kończące się samogłoskami. Dodatkowy podział jest wymuszany na końcu struny, tak aby były co najmniej dwie linie.

+`(¶.+)¶(.*)$
$2$1

Połącz ze sobą kolejne wiersze, tak aby pierwsza linia była połączeniem wszystkich nieparzystych linii, a druga - połączeniem wszystkich parzystych linii.

r`.\G

Dopasowywanie tylko znaków w ostatnim (drugim) wierszu ...

O$^`

.. odwrócić dopasowania, a tym samym odwrócić tylko drugą linię.

T`¶b-df-hj-maed\oup-tv-z_`Ro

Połącz ze sobą dwie linie i odszyfruj litery. RoPowoduje, że łańcuch transliterację na jego odwrotnej. Środkowa spółgłoska ni samogłoska mapują się ina siebie, więc nie muszą być wymienione. Te mapy na szczególny _sposób jej usuwania. Pierwsze i ostatnie 10 spółgłosek oraz dwie pierwsze i ostatnie samogłoski otaczają cyfry. ( oZwykle jest specjalny, więc należy go tutaj zacytować).

2 DominicvanEssen Aug 27 2020 at 01:51

R , 190 bajtów

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="")}

Wypróbuj online!

Notatka dla siebie: naucz się nowego, nie R , języka do golfowych wyzwań tekstowych ...

Skomentował:

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 bajtów

-1 -3 bajty dzięki aplikacji Ceilingcat

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

Wypróbuj online!

KevinCruijssen Aug 24 2020 at 13:59

05AB1E , 27 26 bajtów

žMIå0šÅ¡ι€S`R«žN‡žM‡žh‡

I / O jako lista znaków.

Wypróbuj online lub sprawdź wszystkie przypadki testowe (z I / O dołączonym do pretty-print).

Wyjaśnienie:

ž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 bajtów

map{push@{$o[$i]},y/0-9a-z/9876543210uzyxowvtisrqpnemlkjhagfdcb/r;$i^=/[aeiou]/}@F;say@{$o[0]},reverse@{$o[1]}

Wypróbuj online!