Odszyfrujmy to!
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
Zaczynasz od dwóch pustych ciągów, nazwijmy je
s1is2. Będziemy poruszać się od lewej do prawej strony ciągu wejściowego. Na początku rozważalibyśmy pierwszy pusty ciąg, tjs1. Będziemy przełączać się między dwoma ciągami, gdy napotkamy samogłoskę.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 stronies1(jeśli rozważamys1obecnie) lub po lewej stronies2(jeśli rozważamys2obecnie).Jeśli tym znakiem była samogłoska, przełącz się na inny ciąg teraz (
s1 <-> s2).Powtórz krok 2 (i 3 dla samogłosek) dla każdego znaku w ciągu wejściowym.
Połącz,
s1as2wynikiem 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
Galaretka , 29 bajtów
ØḄ,ØẹØDṭ,U$F€yµe€ØẹŻœṗµ;ṚU$m2
Pełny program, który drukuje zdekodowany tekst.
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
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
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: j→ 12→ 13→s
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ą.
Python, 226, 160 146 bajtów
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"
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ć).
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="")}
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
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];}
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)
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]}