Ihre Aufgabe ist es, ein paar Tastenanschläge zu simulieren, die ein Benutzer eingibt.
Eingang
Ein String-Array oder ein String mit einem Begrenzer Ihrer Wahl (außerhalb des Bereichs 32-126), der mindestens einen 'Tastenanschlag' enthält.
Dieses Array enthält nur zwei Arten von Zeichenfolgen: passive Tastenanschläge (einzelne Zeichen) und Befehle (Zeichen in Klammern [ ]
).
- Passive Tastenanschläge
- ASCII-Zeichencodes
[32-126]
- ASCII-Zeichencodes
- Befehle:
[B]
: Rücktaste (letztes hinzugefügtes Zeichen entfernen, falls vorhanden)[C]
: Kopieren Sie alles, was bereits geschrieben wurde[D]
: lösche alles was geschrieben wurde[P]
: Einfügen, was kopiert wurde
Ausgabe
Die von den Tastenanschlägen erzeugte Zeichenfolge.
Beispiele
['H', 'e', 'l', 'l', 'o'] -> 'Hello'
['H', 'e', 'l', 'l', 'o', ' ', '[C]', '[P]'] -> 'Hello Hello '
['[D]', 'D', '[B]'] -> ''
['H', '[C]', 'i', '[P]', '[C]', '[P]'] -> 'HiHHiH'
['e', '[C]', '[B]', 'I', ' ', 'l', 'i', 'k', '[P]', ' ', 'b', '[P]', '[P]', 's', '!'] -> I like bees!
['N', '[P]'] -> 'N'
['#', '5', '0', 'K', '0', '0', '1', '[D]', '#', 'n', 'o', 't'] -> '#not'
['H', 'o', 'w', ' ', '[D]', 'H', 'e', 'y'] -> 'Hey'
['s', 'u', 'd', '[B]', 'p', '[C]', '[D]', 'I', ' ' , 'h', 'a', 'v', 'e', ' ', '[P]', 'p', 'e', 'r', '!'] -> 'I have supper!'
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes!
[D]
dem es nicht das einzige ist, das verwendet wird, damit der Code nicht einfach so istsplit('[D]')[1]
oder so.[D]
Antworten:
05AB1E ,
34333127 BytesVerwendet die CP-1252- Codierung.
Probieren Sie es online!
Erläuterung
Die im obigen Code bewerteten Funktionspaare sind:
4 Bytes mit dem
mod 5
Trick aus Lynns CJam-Antwort gespeichertquelle
Vim,
76, 64, 62, 58 TastenanschlägeVielen Dank an Loovjo für das Speichern von 7 Tastenanschlägen
Hat jemand gesagt, Tastatureingaben simulieren? Dann ist es eine gute Sache, dass es in meiner Lieblingssprache zum Golfen nur darum geht , Tastenanschläge zu simulieren!
Die Eingabe erfolgt in folgendem Format:
Dies ist eine ziemlich einfache Antwort. Es übersetzt einfach jeden "Befehl" in den vim-Tastendruck, der diesem Befehl entspricht. Nehmen wir es Zeile für Zeile.
Das spart eine Menge Bytes. Vim hat eine eingebaute "Befehlszeile", in der Sie Zuordnungen erstellen, Einstellungen ändern, Dateien speichern usw. Hier erstellen wir eine Zuordnung.
:no
ist eine Abkürzung für:nnoremap
"Wenn wir uns im normalen Modus befinden, ersetzen Sie diese rechte Seite durch diese linke Seite." Da wir:%s/
fünf verschiedene Zeiten anrufen , spart dies viel. Das\M
ist ein schöner Trick. Dies bedeutet, dass die folgende Suche "Sehr keine Magie" lautet, was bedeutet, dass der reguläre Ausdruck[B]
dem wörtlichen Text entspricht[B]
und nicht einem Bereich, der nur ein B enthält. Da die Mehrzahl der Ersatzbefehle eckige Klammern enthält, füllen wir die erste aus.Dann rufen wir fünf Ersatzbefehle auf. Es ist erwähnenswert, warum ich
<C-v>
so oft angerufen habe. Charaktere mögen<esc>
,<C-v>
,<C-r>
etc. sind nicht druckbare Zeichen und muss mit einem in die Befehlszeile eingegeben werden<C-v>
.[B]: Rücktaste. Dieser ist ziemlich einfach. Ersetzen Sie einfach jedes
[B]
mitCtrl-h
, was in vim der Rücktaste entspricht.[C]: Kopieren Sie alles, was bereits geschrieben wurde. Dies wird übersetzt in
<esc>0y$A
. Das heisst:Wir konnten fast nicht einfach
Y
an Stelle von0y$
dem Mittel „riss die ganze Linie“, aber das greift auch eine neue Zeile , dass wir nicht wollen.[D]: alles löschen, was geschrieben wurde. Das ist
<esc>"_S
.<esc>
Beendet wie zuvor den Einfügemodus, damit wir Befehle ausführen können. Es gibt einige Dinge, die hier bequemer sind. So machen wir es[P]: Füge ein, was kopiert wurde. Dieser ist auch sehr einfach. Es ist nur
<C-r>"
was bedeutetInsert the contents of register '"'
."
Zufällig ist es das Hauptregister, zu dem 'y' gehört.Nachdem wir alle Befehle übersetzt haben, müssen wir alle Zeilen miteinander verbinden, indem wir alle Zeilenumbrüche entfernen. Dank unseres Mappings ist dies gerecht
Das
<bs>
ist ein Backspace (ASCII 0x08) und wir brauchen es, weil[
wir es ausgefüllt haben.Inzwischen haben wir die Eingabe in VIM-Code übersetzt und müssen ihn nur noch ausführen. Also wir:
quelle
<C-r>
dokumentiert?:h mode_keystroke
. In diesem Fall wäre es:h i_ctrl-r
/g
Flag kümmern muss . Ich werde diese Details hinzufügen.0ii<esc>D@"
man auch?CJam , 33 Bytes
Probieren Sie es online!
Erläuterung
Die "Hash-Funktion"
1>3b
Karten[B]
bis 291 (= 1 mod 5),[D]
bis 297 (= 2 mod 5),[P]
bis 333 (= 3 mod 5),[C]
bis 294 (= 4 mod 5).Dieser Wert (Mod 5) wird als Index für eine Liste von CJam-Codeausschnitten verwendet:
h
wird beispielsweise das Snippet"h"
zurückgegeben, wodurch eine Einzelzeichenfolge auf den Stapel verschoben wird.[B]
wird das Snippet;
zurückgegeben, das ein Element öffnet.[D]
wird das Snippet];
zurückgegeben, wodurch der Stapel gelöscht wird.[P]
wird das SnippetL~
zurückgegeben, das VariableL
an den Stapel anfügt .[C]
wird das Snippet]:L~
zurückgegeben, das den aktuellen Stack in der Variablen speichertL
.Diese Snippets werden verkettet und ausgeführt. Der letzte Stapel wird implizit von CJam gedruckt.
L
Ist anfangs die leere Liste, so ist der Kopierpuffer anfangs "leer".quelle
Python 2,
969593 Bytesquelle
or"E"
die Definition verschiebenx
, um Platz zu sparen?x
nicht lohnen. Dasx=="C"
kann einfach seino=="[C]"
.Jelly ,
50 5148 BytesTryItOnline
Oder alle Testfälle
Wie?
Beispielsweise
- mit einem Kapital
'B'
als Testfall, da es zurückgekehrt wäre, bevor ich einen Fehler behoben habe"I likeees!"
quelle
['e', 'e', 'e', '[B]', '[C]', '[B]', '[D]', 'I', ' ', 'l', 'i', 'k', '[P]', '[B]', ' ', 'b', '[P]', 's', '!']
.JavaScript (ES6),
84807776 Byte3 Bytes dank @Neil gespeichert, 1 dank @ edc65
.map
ist zwei Bytes länger:Testschnipsel
Code-Snippet anzeigen
quelle
reduce
Version einsparen können(s,[c,z])
..map
Version.x=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?'':s+=z?t:c,t='')
1 Byte weniger. Kurioserweise undefiniert <jedesx=>x.reduce((s,[c,z])=>z<'C'?s.slice(0,-1):z<'D'?t=s:z<'P'?"":z?t:s+c,t="")
speichert ein weiteres Zeichen. Wenn z wahr ist, fügen Sie ein, andernfalls fügen Sie ein Zeichen zur Ausgabe hinzu.z?s+t:s+c
dass 1 Byte mehr alss+=z?t:c
Perl,
5350 BytesBeinhaltet +1 für
-p
Geben Sie eine Eingabe in STDIN ein, die durch Zeilenumbrüche abgeschlossen wird (die letzte Zeile kann weggelassen werden, sodass sie als durch Zeilenumbrüche getrennte Zeichenfolge gilt):
gibt
keystrokes.pl
:Fast erwischt die Gelee-Antwort, aber der Unhold entkam auf 48 Bytes ...
quelle
Python
120 119116 BytesIdeone
Eine rekursive Funktion mit Eingabe,
s
eine Liste der Tastenanschläge.Jeder rekursive Aufruf aktualisiert den Rückgabetext
r
und im Fall von a[C]
die Zwischenablage,c
biss
leer ist.Die neuen Werte von
r
undc
werden durch Indizieren in ein Wörterbuch gefunden{...}
und beim Entpacken übergeben*
. Für die passiven Tastenanschläges[0][1:2]
wird eine leere Zeichenfolge zurückgegeben und der Schlüssel''
wird stattdessen verwendet.quelle
lambda s,r='',c=''
anstelle von definierenlambda s,r,c=''
?s
) ein Eingabe-Array von Zeichen verwenden, sodass die Funktion mit keiner anderen Eingabe arbeiten muss.Haskell,
136 133 130127 BytesProbieren Sie es auf Ideone.
Erläuterung:
k
Führt eine Endrekursion über eine Liste von Befehlen durch.b
Ist der Puffer, in dem der String aufgebaut ist,c
speichert der kopierte Teil.Bearbeiten: Um einige Bytes zu speichern, werden die Befehle
[B][C][D][P]
nicht mehr genau verglichen, sondern: kleiner als'C'
? ->B
und so weiter. Vielen Dank an @nimi für das Speichern von 3 Bytes.quelle
init b
eine Ausnahme aus, wennb
die Liste leer ist.Mathematica, 100 Bytes
Anonyme Funktion. Nimmt eine Liste von Zeichenfolgen als Eingabe und gibt eine Zeichenfolge als Ausgabe zurück. Ignorieren Sie alle generierten Nachrichten.
quelle
Java 7,
207203 BytesDies kann auf jeden Fall noch etwas mehr Golf gespielt werden,
aber dies ist meine erste Antwort. Wird bearbeiten , nachdem ich etwas , diese zu entfernen gefundenersetzt mitequals
-Checks ..charAt
, kann aber wahrscheinlich noch golfed werden ..Ungolfed & Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
PHP, 131 Bytes
17 Bytes werden durch den ternären Operator @IsmaelMiguel gespeichert
quelle
<?$c=[];foreach($_GET[a]as$k=>$v)$v=="[P]"?$o=array_merge($o,$c):($v=="[C]"?$c=$o:($v=="[B]"?array_pop($o):$v=="[D]"?$o=[]:$o[]=$v));echo join($o);
. (Ersetzte deine gesamteif()
Kette durch eine Kette von Trenary-Operationen).PHP, 108 Bytes
Verwendet einen stringbasierten Ansatz anstatt eines arraybasierten.
Verwenden Sie wie:
edit: 8 Bytes wurden gespeichert, indem die Reihenfolge der?: s geändert und negativ gemacht wurde, um zu vermeiden, dass so viele Klammern verwendet werden müssen.
quelle
$s=$argv[++$i]
anstelle vonnull!==$s=$argv[++$i]
PHP> 7 können Sie auch schreiben$s=$argv[++$i]??0
, um den Hinweis zu überspringen'0'
, wie'0'
es falsch ist. Es gibt so viele andere Notizen, die überspringen, dass gerade eine Zeitverschwendung erscheint.SpecBAS - 216 Bytes
Die Eingabe erfolgt als Zeichenfolge mit Kommas, die dann in ein Array umgewandelt wird.
quelle
V , 49 Bytes
Probieren Sie es online!
Da dies nicht druckbare Zeichen enthält, ist hier ein Hexdump:
Dies ist nur eine direkte Übersetzung meiner Antwort, damit ich mit Jelly mithalten kann. Leider bin ich immer noch ein Byte vorüber, aber ich arbeite immer noch an dem letzten. :)
Auf diese Antwort bin ich sowieso stolzer. Wenn Sie also eine sehr ausführliche Erklärung wünschen, lesen Sie diese stattdessen.
quelle
Eigentlich 56 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Java, 181
Mehr lesbare Version:
quelle
if(s.length()>1){...}else
p==1
inp<2
MATL , 46 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
TCL, 186 Bytes
Schön formatiert:
Ich wollte nur beweisen, dass ich das in TCL kann
quelle
foreach
durchlmap
;return
vonset x
. Das kann ich auf einen Blick sagen.Scala, 158 Bytes
Ungolfed:
Löst dieses Problem als Falte mit dem Ergebnis und der Zwischenablage als Akkumulator. Leider hat scala keinen ternären bedingten Operator, sondern wird
if else
als Ausdruck verwendet.quelle
PHP 7.1,
9592 BytesHinweis: Benötigt PHP 7.1 für negative String-Offsets.
Ohne negative String-Offsets (101 Bytes):
Laufen Sie wie folgt:
Erläuterung
Optimierungen
quelle