Verschlüsseln wir es!

12

Herausforderung

Die Herausforderung besteht darin, eine bestimmte Zeichenfolge mit den unten angegebenen Regeln zu verschlüsseln. Die Zeichenfolge enthält nur Kleinbuchstaben , Ziffern und / oder Leerzeichen .

Äquivalent eines Zeichens

Zunächst müssten Sie wissen, wie Sie das "Äquivalent" der einzelnen Zeichen finden.

Wenn der Charakter ein Konsonant ist, ist dies der Weg, um seine Entsprechung zu finden:

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.

Beispiel: 'h' und 't' sind Äquivalente voneinander, weil 'h' und 't' sich vom Anfang bzw. Ende an an der sechsten Position befinden.

Das gleiche Verfahren wird angewendet, um das Äquivalent von Vokalen / Ziffern zu finden. Sie listen alle Vokale oder Ziffern (beginnend mit 0) der Reihe nach auf und finden das Äquivalent.

Nachstehend finden Sie eine Liste der Entsprechungen aller Zeichen:

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

Verschlüsselungsregeln

1) Sie bewegen sich von links nach rechts.

2) Wenn das Zeichen ein Konsonant / eine Ziffer ist, wird sein Äquivalent genommen, und wenn es ein Leerzeichen ist, wird ein Leerzeichen genommen.

3) Wenn der Charakter ein Vokal ist, nimmst du das Äquivalent und bewegst dich in die entgegengesetzte Richtung. Wenn Sie sich zum Beispiel nach rechts bewegen und auf einen Vokal stoßen, verschlüsseln Sie dieses Zeichen. Wechseln Sie dann zum am weitesten rechts befindlichen unverschlüsselten Zeichen und beginnen Sie mit der Verschlüsselung in der linken Richtung und umgekehrt.

4) Sie sollten einen Charakter nicht zweimal an derselben Position betrachten. Die Schritte sollten befolgt werden, bis alle Zeichen in der Eingabe abgedeckt sind.

5) Die Gesamtzahl der Zeichen in der Eingabe (einschließlich Leerzeichen) sollte der Gesamtzahl der Zeichen in der Ausgabe entsprechen.

Bitte beachten Sie, dass die verschlüsselten Zeichen in der Ausgabe in der Reihenfolge angezeigt werden, in der sie verschlüsselt wurden.

Lassen Sie mich jetzt eine Zeichenfolge für Sie verschlüsseln.

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"

Beispiele

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

Sie können auch Großbuchstaben anstelle von Kleinbuchstaben verwenden.

Wertung

Das ist , also gewinnt der kürzeste Code!

Manish Kundu
quelle
1
Schritt 3 ist etwas unklar, was das Umschalten von Richtungen angeht. Ich denke, Sie sollten etwas sagen wie "Wenn Sie sich nach rechts bewegen und auf einen Vokal stoßen, verschlüsseln Sie dieses Zeichen, und springen Sie dann zum am weitesten rechts stehenden unverschlüsselten Zeichen und beginnen Sie mit der Verschlüsselung in die linke Richtung." (Wenn du das meinst). Ich denke, Sie sollten auch explizit angeben, dass die verschlüsselten Zeichen in der Ausgabe in der Reihenfolge angezeigt werden, in der sie verschlüsselt wurden.
Dylnan
@dylnan Hat das hinzugefügt.
Manish Kundu
Nur aus Neugier - Können Sie den Entschlüsselungsvorgang beschreiben? Weil die Verschlüsselungsfunktion keine eigene Inverse ist (wie in ROT13 algo). Wenn wir also verschlüsselte Daten an dasselbe Verschlüsselungsverfahren übergeben, erhalten wir nicht den Originaltext. Danke
Agnius Vasiliauskas
1
@AgniusVasiliauskas: Eine Möglichkeit wäre: Wende die gleichen Charaktertransformationen an. Bewahren Sie 2 entschlüsselte Zeichenfolgen auf. Schleife über die Zeichenfolge von links nach rechts. Wechseln Sie zwischen dem Anhängen von Zeichen an die erste Zeichenfolge und dem Voranstellen an die zweite Zeichenfolge, wenn Sie mit einem Vokal umgehen. Führe die Saiten am Ende zusammen.
Emigna
3
Es wird bald eine Entschlüsselungsherausforderung dafür geben, in der ich versuchen werde, den Prozess zu erklären
Manish Kundu,

Antworten:

4

JavaScript (Node.js) , 173 ... 166 156 ... 124 123 Bytes

-28 byte Danke 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

Probieren Sie es online!

In der ersten Iteration Stringwird auf geändert Array, und nachfolgende Iterationen werden weiterhin verwendet Array. Voilà!

Ursprünglicher Ansatz (166 Bytes):

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):"")
Shieru Asakoto
quelle
&hat bei einigen zahlen nicht funktioniert aber &&funktioniert. Vielen Dank.
Shieru Asakoto
Oh ja, ich habe keine Methode gefunden, um das zu optimieren und du hast es geschafft! Vielen Dank!
Shieru Asakoto
3
124 Bytes, indem Sie dieselbe Zeichenfolge für alle Buchstaben verwenden und etwas mehr Golf spielen.
Arnauld
Wow genial! Ich dachte gar nicht daran, die Saiten zu kombinieren
Shieru Asakoto
q=="0"|+qist eigentlich 1 Byte kürzer als q>" "&&1/q.
Arnauld
3

05AB1E , 22 Bytes

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

Probieren Sie es online! oder als Testsuite

Erläuterung

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
Emigna
quelle
žhžMžN)UvćXJXíJ‡D?žMsåiRwar das, was ich für eine Verbesserung hielt, aber ich kann nicht XJXiJgenug reduzieren .
Magic Octopus Urn
@MagicOctopusUrn: Ich hatte eine ähnliche Idee, mit DJsíJder auch nicht sehr effektiv war.
Emigna
1

C 196 Bytes

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

Probieren Sie es online!

Steadybox
quelle
1

J , 132 Bytes

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
)

Probieren Sie es online!

Diesmal ein ausführliches, explizites Verb.

Erläuterung:

c=.(u:97+i.26) macht eine Liste az

v=.'aeiou' macht eine Liste von Vokalen

-. Entfernt die Vokale aus der Liste der Buchstaben

d=.u:48+i.10 erstellt eine Liste mit Ziffern

g=.;"0|. Ein Hilfsverb zum Erstellen einer Liste von Ersetzungssymbolpaaren in Kästchen

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

a=.'' eine Liste zum Speichern des Ergebnisses

while.*#y do.a=.a,{.y rplc(g c),(g d),g v solange die Länge der Liste> 0 ist, nimm ein Symbol, ersetze es und hänge es an das Ergebnis an

y=.|.^:({:a e.v)}.y Lassen Sie ein Symbol am Anfang der Liste fallen. Wenn das Symbol ein Vokal ist, kehren Sie die Liste um

end.Beendet die whileSchleife

a gibt das Ergebnis zurück

Galen Ivanov
quelle
1

Sauber , 221 206 198 190 186 178 Bytes

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

Probieren Sie es online!

Οurous
quelle
0

Netzhaut , 78 Bytes

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

V`

Probieren Sie es online! Link enthält Testfälle. Erläuterung:

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

Tauschen Sie jedes Zeichen mit seinem Äquivalent aus.

/[aeiou]/{

Wiederholen, solange ein Vokal übrig bleibt.

*>0L`.*?[aeiou]

Gib den Text bis zum Vokal aus.

0`.*?[aeiou]

Löschen Sie den Text bis zum Vokal.

V`

Kehren Sie den restlichen Text um. Wenn keine Vokale mehr vorhanden sind, wird dies implizit ausgegeben. Für die Testfälle gibt der Header jedoch den Text am Ende jeder Zeile aus.

Neil
quelle
0

Stax , 24 Bytes

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

Starte es

Hier ist die ASCII-Darstellung des gleichen Programms.

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

Es übersetzt zuerst jede Zeichenklasse und beginnt dann eine while-Schleife. In der Schleife wird das nächste Zeichen ausgegeben und der Rest der Zeichenfolge wird bedingt umgekehrt, wenn ein Vokal angetroffen wird.

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
rekursiv
quelle