Szyfrujmy to!


12

Wyzwanie

Wyzwanie polega na zaszyfrowaniu danego ciągu przy użyciu reguł określonych poniżej. Ciąg będzie zawierał tylko małe litery , cyfry i / lub spacje .

Odpowiednik postaci

Teraz najpierw musisz wiedzieć, jak znaleźć „ekwiwalent” każdej postaci.

Jeśli postać 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 równoważne, ponieważ „h”, „t” znajdują się odpowiednio na 6. pozycji od początku i końca.

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

Poniżej znajduje się lista ekwiwalentó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 szyfrowania

1) Zaczynasz poruszać się od lewej i idziesz w prawo.

2) Jeżeli znak jest spółgłoską / cyfrą, to pobierany jest jej odpowiednik, a jeśli jest to spacja, to jest brana spacja.

3) Jeśli postać jest samogłoską, bierzesz jej ekwiwalent i zaczynasz poruszać się w przeciwnym kierunku. Na przykład, jeśli poruszasz się w prawo i napotykasz samogłoskę, zaszyfruj tę postać, a następnie przejdź do najbardziej niezszyfrowanej prawej strony i zacznij szyfrować w lewą stronę i odwrotnie.

4) Nie powinieneś brać pod uwagę postaci w tej samej pozycji dwa razy. Kroki należy wykonywać, aż wszystkie znaki na wejściu zostaną pokryte.

5) Całkowita liczba znaków na wejściu (w tym spacje) powinna być równa całkowitej liczbie znaków na wyjściu.

Należy pamiętać, że zaszyfrowane znaki pojawiają się na wyjściu w kolejności, w jakiej zostały zaszyfrowane.

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

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"

Przykłady

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

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

Punktacja

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


1
Krok 3 jest nieco niejasny w odniesieniu do kierunków zmiany. Myślę, że powinieneś powiedzieć coś takiego: „Jeśli poruszasz się w prawo i napotykasz samogłoskę, zaszyfruj tę postać, a następnie przejdź do najbardziej niezszyfrowanej prawej strony i zacznij szyfrować w lewo”. (Jeśli o to ci chodzi). Myślę, że powinieneś również wyraźnie określić, że zaszyfrowane znaki pojawiają się na wyjściu w kolejności, w jakiej zostały zaszyfrowane.
dylnan

@dylnan Dodał to.
Manish Kundu

Po prostu z ciekawości - czy możesz opisać procedurę deszyfrowania? Ponieważ funkcja szyfrowania nie jest odwrotna (jak w przypadku ROT13 algo). Więc jeśli przekażemy zaszyfrowane dane do tej samej procedury szyfrowania - nie otrzymamy oryginalnego tekstu. Dzięki
Agnius Vasiliauskas,

1
@AgniusVasiliauskas: Jednym ze sposobów na to byłoby: Zastosuj te same transformacje postaci. Zachowaj 2 ciągi odszyfrowujące. Pętla od sznurka od lewej do prawej. Na zmianę dołączaj znaki do pierwszego ciągu znaków i przechodź do drugiego za każdym razem, gdy posługujesz się samogłoską. Scal ciągi na końcu.
Emigna

3
Wkrótce pojawi się wyzwanie odszyfrowania tego samego, w którym postaram się wyjaśnić proces
Manish Kundu

Odpowiedzi:


4

JavaScript (Node.js) , 173 ... 166 156 ... 124 123 bajtów

-28 bajtów Dzięki 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

Wypróbuj online!

W pierwszej iteracji Stringzostanie zmieniona na Array, a kolejne iteracje będą nadal używane Array. Voilà!

Podejście oryginalne (166 bajtów):

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

&nie działał dla niektórych liczb, ale &&działał. Dzięki.
Shieru Asakoto,

O tak, nie znalazłem metody, aby to zoptymalizować, a ty to zrobiłeś! Dzięki!
Shieru Asakoto,

3
124 bajty , używając tego samego ciągu dla wszystkich liter i stosując trochę golfa.
Arnauld

Wow genialne! W ogóle nie myślałem o łączeniu strun
Shieru Asakoto

q=="0"|+qjest faktycznie o 1 bajt krótszy niż q>" "&&1/q.
Arnauld

3

05AB1E , 22 bajty

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

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

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

žhžMžN)UvćXJXíJ‡D?žMsåiRto było to, co myślałem o poprawie, ale nie mogę XJXiJwystarczająco ograniczyć.
Magic Octopus Urn

@MagicOctopusUrn: Miałem podobny pomysł, z DJsíJktórym też nie był zbyt skuteczny.
Emigna

1

C, 196 bajtów

#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);}

Wypróbuj online!


1

J , 132 bajty

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
)

Wypróbuj online!

Tym razem pełny czasownik jawny.

Wyjaśnienie:

c=.(u:97+i.26) tworzy listę az

v=.'aeiou' tworzy listę samogłosek

-. usuwa samogłoski z listy liter

d=.u:48+i.10 tworzy listę cyfr

g=.;"0|. czasownik narzędziowy do tworzenia listy zapakowanych par symboli zastępczych

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

a=.'' lista do przechowywania wyniku

while.*#y do.a=.a,{.y rplc(g c),(g d),g v podczas gdy długość listy wynosi> 0, weź symbol, zastąp go i dołącz do wyniku

y=.|.^:({:a e.v)}.y upuść jeden symbol z początku listy, a jeśli symbolem jest samogłoska, odwróć listę

end.kończy whilepętlę

a zwraca wynik


1

Czysty , 221 206 198 190 186 178 bajtów

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

Wypróbuj online!


0

Siatkówka , 78 bajtów

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

V`

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

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

Zamień każdą postać na jej odpowiednik.

/[aeiou]/{

Powtarzaj, dopóki samogłoska pozostaje.

*>0L`.*?[aeiou]

Wypisz tekst do samogłoski.

0`.*?[aeiou]

Usuń tekst aż do samogłoski.

V`

Odwróć pozostały tekst. Gdy nie ma już samogłosek, jest to domyślnie wyprowadzane, jednak na potrzeby przypadków testowych nagłówek wypisuje tekst na końcu każdej linii.


0

Stax , 24 bajty

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

Uruchom

Oto reprezentacja ascii tego samego programu.

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

Najpierw tłumaczy każdą klasę znaków, a następnie rozpoczyna pętlę while. W pętli wyświetla następny znak i warunkowo odwraca resztę łańcucha, jeśli napotkana zostanie samogłoska.

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.