Diese Aufgabe ist recht einfach und verwendet drei unterschiedliche "Operator" -Zeichen. Ihre Aufgabe ist es , eine einfache Folge von Buchstaben angegeben, führen Sie die folgende Aufgabe , es zu codieren , mit <
, >
, *
. Sie können entweder Groß- oder Kleinbuchstaben verwenden. Sie müssen nicht beide Zeichen verarbeiten.
Erklärung der Chiffre
Die Verschlüsselung ist einfach: Sie verwenden Inkrementierungs- und Dekrementierungsoperationen, um vom Buchstaben 1 zum Endbuchstaben zu gelangen, *
wobei Sie die Funktion "Senden" haben. Der Operator für "Inkrementieren" ist >
und "Dekrementieren" ist <
.
Ein Beispiel mit dem Wort adbc
:
- Beginnen Sie mit dem ersten Buchstaben des Wortes und geben Sie diesen Buchstaben aus.
a
- Verwenden Sie
>
als nächstes und<
(wie brainfuck), um durch den aktuellen Buchstaben zum nächsten zu navigieren.a>
würde dazu führena
, dass der Buchstabe um 1 erhöht wirdb
.a<
Dies würde dazu führen,z
dass Sie den Buchstaben absenken (er wird umbrochen, Sie müssen immer die Richtung wählen, die zu der MINDESTEN Anzahl von Operationen führt). - Nach der Ausgabe der richtigen minimierten Kombination von
<
und>
Ausgabe von a,*
um anzuzeigen, dass wir den nächsten Buchstaben erreicht haben.
Die zu codierenden Schritte adbc
wären:
a # a
a>>>* # ad
a>>>*<<* # adb
a>>>*<<*>* # adbc
Beispiele
Die zu codierenden Schritte aza
wären:
a # a
a<* # az
a<*>* # aza
Mehr Beispiele:
"abcdef" = "a>*>*>*>*>*"
"zyaf" = "z<*>>*>>>>>*"
"zzzzzz" = "z*****"
"z" = "z"
"zm" = "z<<<<<<<<<<<<<*" or "z>>>>>>>>>>>>>*" (equidistant)
"zl" = "z>>>>>>>>>>>>*"
"alphabet" = "a>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*"
"banana" = "b<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*" OR "b<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*"
"abcdefghijklmnopqrstuvwxyz" = "a>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*"
"abcdefz" = "a>*>*>*>*>*<<<<<<*"
Regeln
- Wir codieren und nicht decodieren, also bring das nicht durcheinander.
- Sie können davon ausgehen, dass die Nachricht Buchstaben
[A-Z]
oder[a-z]
Ihre Wahl enthält. - Sie können ein beliebiges nicht buchstabiertes / numerisches / reserviertes Zeichen verwenden, um
*
(EG$
) zu kennzeichnen . - Sie müssen das Ende haben
*
, es ist nicht implizit bei Wiederholungen. - Sie dürfen keine leeren Zeichenketten annehmen, aber ein einzelnes Zeichen ist möglich.
- Wenn der Abstand zum nächsten Buchstaben gleich groß ist, können Sie eine Richtung wählen.
- Dies ist Code-Golf , die niedrigste Anzahl an Bytes gewinnt.
Bitte erläutern Sie Ihre Antwort, es hilft anderen, auf diese Weise zu lernen.
abcdefghijklmnopqrstuvwxyz
eine eigene Eingabe dar und ist das nicht?zl
sollte verwenden>
.alphabet
ist meiner meinung nacha>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*
undzl
solltez>>>>>>>>>>>>*
undbanana
sollte es eine zweite lösung gebenb<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*
zm
. @jorg gute fänge, alle behoben, war ein manueller aufwand.Antworten:
Gelee , 17 Bytes
Verwendet ein Leerzeichen anstelle von
*
(ein Leerzeichen⁶
oder eine neue Zeile⁷
speichert ein Byte mehr als”*
).Funktioniert entweder nur mit Großbuchstaben oder nur mit Kleinbuchstaben.
Probieren Sie es online! oder sehen Sie sich eine Testsuite an (in der diese Leerzeichen
*
zur Erleichterung des Lesensnachträglich durch ersetzt werden).Wie?
quelle
8086 Maschinencode,
70 6867 BytesWie es funktioniert:
quelle
Python 3 , 87 Bytes
Probieren Sie es online!
Funktioniert entweder mit Klein- oder Großbuchstaben.
Das Programm erstellt die Ausgabezeichenfolge,
r
während es die Zeichen in der Eingabezeichenfolge durchläuft. Es speichert das vorherige Zeichen alsp
und berechnet die Inkrementierungsoperation, um vomp
neuen Zeichen zum neuen Zeichen zu gelangenc
.Das Intervall zwischen den Zeichen ist
ord(c)-ord(p)
, und es(ord(c)-ord(p)-13)%26-13
dauert modulo 26 bis das Intervall[-13..12]
. Ein negatives Ergebnis bedeutet, dass das Zurücktreten kürzer ist, und ein positives Ergebnis bedeutet, dass das Zurücktreten kürzer ist. Dies muss in eine Zeichenfolge von>
oder<
abhängig von dem Vorzeichen konvertiert werden . Anstattabs
eine Bedingung oder eine Bedingung zu verwenden, nutzen wir die String-Multiplikation von Pythons*n
, um den leeren String zu erhalten, wenn ern
negativ ist. Im Ausdruck'<'*-d+'>'*d
trägt der falsch signierte Teil nicht bei.Der Anfangszustand wird durch Aufteilen der Eingabe in das erste Zeichen und den Rest durch Entpacken von Python 3 behandelt
r,*s=input()
. Das Anfangszeichen wird verwendet, um mit dem Erstellen des Strings zu beginnen, sowie das anfängliche "vorherige" Zeichen.Vielen Dank an ovs für den Vorschlag, zu Python 3 zu wechseln, um dieses Entpacken durchzuführen.
quelle
Python 3 ,
11093 BytesProbieren Sie es online!
quelle
JavaScript (ES6),
118109107 ByteBei der Eingabe wird die Groß- und Kleinschreibung nicht berücksichtigt.
Wie es funktioniert
Im Gegensatz zu Python gibt der JS-Modulo-Operator eine Zahl mit demselben Vorzeichen wie die Dividende und nicht wie der Divisor zurück. Außerdem gibt die JS-
repeat()
Methode einen Fehler aus, wenn eine negative Zahl angegeben wird, anstatt eine leere Zeichenfolge zurückzugeben (und dies ist*
ohnehin erheblich länger als eine einfache Zeichenfolge ).Dies sind eher ungünstige Verhaltensweisen für diese Herausforderung. Wir sollten also besser herausfinden, in welchem Fall wir uns genau befinden, als uns auf mathematische Tricks zu verlassen. (Das heißt nicht, dass es solche Tricks nicht gibt, sondern dass ich sie nicht gefunden habe.)
Nachfolgend finden Sie eine Tabelle, in der die 4 möglichen Fälle beschrieben werden. Dabei
d
handelt es sich um den vorzeichenbehafteten Abstand zwischen dem aktuellen und dem vorherigen Zeichen:Testfälle
Code-Snippet anzeigen
quelle
PHP, 127 Bytes
Testfälle
PHP, 137 Bytes
Testfälle
quelle
JavaScript (ES6),
111103 ByteUrsprünglich hat die Version 111 Bytes gedauert, bevor ich @ Arnauld's Trick des Einstellens
n
während des Rechnens angepasst habe.p
Ich denke, es gibt wahrscheinlich einen anderen Trick,s
der verwendet wird,n
aber es wird spät, so dass ich mich nicht darum kümmere:quelle
Haskell (Lambdabot),
161153 BytesProbieren Sie es online!
Erläuterung:
quelle
EXCEL VBA 130 Bytes
Führen Sie es aus dem Excel VBA-Direktfenster aus.
Erläuterung:
Einfache for-Schleife, die mit der String-Funktion die Anzahl ">" oder "<" n wiederholt, wobei n die ASCII-Differenz zwischen der i- und der i + 1-Zeichenfolge ist.
quelle
Java 7-, 232 Bytes
So ziemlich die triviale Lösung. Ungolfed und kommentiert:
quelle
C 170 Bytes
Ausführliches Live
quelle
#define x q<14?q:q+26 e(c){putchar(c);}i,q;m(a,b){q=b-a;i=q?(a>b?x:-x):0;while(i>0)e('>'),i--;while(i<0)e('<'),i++;}f(char*l){e(*l);while(*(l+1))m(*l,*(l+1)),e('*'),l++;}
JavaScript (ES6),
140128129111113 ByteIch bin einen anderen Weg gegangen als die anderen JS-Lösungen, aber es hat nicht allzu gut geklappt - hier ist, was ich bisher habe:
Original, 131 Bytes
Code-Snippet anzeigen
quelle
([x,...s])=>x+s.map(...)
spart 12 Bytes. Beachten Sie, dass Sie auch ein Druckzeichen an das Ende anhängen sollten. Ich schlage vor, eine Zahl zu verwenden, die`1`+1
stattdessen nur 2 Byte kostet`*`
.join
hätte leider zu einer ungültigen Ausgabe für Einzelbuchstabeneingaben geführt. Das Verschieben des Druckzeichens innerhalb dermap
Methode kostet jedoch nur 1 Byte.([x,...s])=>x+s.map(y=>'<><>'[r=(d=y[c='charCodeAt']()-x[c](x=y))/13+2|0].repeat([d+26,-d,d,26-d][r])+0).join``
für 111 Bytesreduce
Lösung zu finden, aber es hat sich herausgestellt, dass dies 115 Bytes sind.C ++,
210 bis190 BytesMein erster Versuch beim Golfen!
k speichert, welches von <,> oder * gedruckt werden soll. Zuerst wird einfach das erste Element des Arrays gedruckt und dann eine Schleife für ein vom ersten bis zum letzten Element des Arrays ausgeführt. j speichert das vorherige Element und vergleicht dann, ob j näher an * a liegt, indem <oder> k auf <,> gesetzt und dann k gedruckt wird, und führt dann diese Schleife aus, bis j gleich p wird. Dann nach jedem Ende der zweiten Schleife drucken *.
quelle
*p!=0
kann mit ersetzt werden*p
. Ich bin mir ziemlich sicher, dass der Platzchar *a
auch unnötig ist. Sie müssen auch#include <iostream>
undusing namespace std;
(obwohl ich denke, es könnte billiger sein, nur hinzuzufügenstd::
), um dies zu einer vollständigen Antwort zu machen.std::
oderusing namespace std;
Sie werden wahrscheinlich auch#include <iostream>
in Ihrer Byteanzahl benötigen .05AB1E , 17 Bytes
Probieren Sie es online!
Erläuterung
Anwendungen
>
,<
und<space>
zu bezeichnen Erhöhung , Verminderung , einreichenquelle
Haskell ,
167168126 BytesVerwenden Sie jetzt die arithmetische Lösung von xnor. Rufen Sie mit auf,
e str
wostr :: String
die zu codierende Zeichenfolge ist.quelle
Haskell , 109 Bytes
Probieren Sie es online! Verwendet den Ansatz von xnor . Mit anrufen
f "somestring"
.quelle