Mein Kollege Jimmy ist ein bisschen neu in C / C ++. Er lernt auch langsam. Nun, um fair zu sein, sein Code wird immer kompiliert, aber er hat einige wirklich schlampige Gewohnheiten. Zum Beispiel weiß jeder, dass Sie ein Array wie folgt definieren können:
int spam[] = {4, 8, 15, 16, 23, 42};
Alle außer Jimmy. Er ist überzeugt, dass der einzige Weg, ein Array zu erstellen, so ist:
int spam[6];
spam[0] = 4;
spam[1] = 8;
spam[2] = 15;
spam[3] = 16;
spam[4] = 23;
spam[5] = 42;
Ich repariere das für ihn in der Code-Überprüfung, aber er wird es nicht lernen. Sie müssen also ein Tool schreiben, das dies bei einem Commit automatisch für ihn erledigt¹.
Die Herausforderung
Ich möchte, dass Sie entweder ein vollständiges Programm oder eine Funktion schreiben, die eine mehrzeilige Zeichenfolge als Eingabe verwendet und die kompaktere Version des C-Arrays ausgibt. Die Eingabe folgt immer diesem Format, einschließlich Leerzeichen:
identifier_one identifier_two[some_length];
identifier_two[0] = some_number;
identifier_two[1] = some_number;
identifier_two[2] = some_number;
...
identifier_two[some_length - 1] = some_number;
Kurz gesagt, die Eingabe ist immer gültig und gut definiert C. Ausführlicher:
Alle Bezeichner bestehen nur aus Buchstaben und Unterstrichen. Die Länge wird immer mindestens eins sein, und es werden niemals Indizes fehlen oder außerhalb der Grenzen liegen. Sie können auch davon ausgehen, dass die Indizes in Ordnung sind. Beispielsweise:
foo bar[3];
bar[0] = 1
bar[2] = 9;
foo bar[1];
bar[0] = 1;
bar[1] = 3;
und
foo bar[3];
bar[2] = 9;
bar[0] = 1
bar[1] = 3
sind alle ungültigen Eingaben und können undefiniertes Verhalten in Ihrer Übermittlung verursachen. Sie können auch davon ausgehen, dass alle Zahlen gültige Dezimalzahlen sind, negative oder positive. Die Eingabe enthält keine überflüssigen Leerzeichen. Die Ausgabe sollte immer in diesem Format erfolgen, einschließlich Leerzeichen:
identifier_one identifier_two[] = {n1, n2, n3, ...};
Hier sind einige Beispieldaten:
Input:
spam eggs[10];
eggs[0] = 0;
eggs[1] = 4;
eggs[2] = 8;
eggs[3] = -3;
eggs[4] = 3;
eggs[5] = 7;
eggs[6] = 888;
eggs[7] = 555;
eggs[8] = 0;
eggs[9] = -2;
Output:
spam eggs[] = {0, 4, 8, -3, 3, 7, 888, 555, 0, -2};
Input:
char ans[2];
ans[0] = 52;
ans[1] = 50;
Output:
char ans[] = {52, 50};
Input:
blah_blah quux[1];
quux[0] = 105;
Output:
blah_blah quux[] = {105};
Sie können Ihre Eingabe und Ausgabe in jedem vernünftigen Format vornehmen, z. B. STDIN / STDOUT, Funktionsargumente und Rückgabewert, Dateien lesen und schreiben usw. Es gelten Standardlücken. Die kürzeste Antwort in Bytes gewinnt!
¹Das ist passiv-aggressiv und eine schreckliche Idee. Sie haben nicht diese Idee von mir.
Antworten:
Vim,
4336 BytesSie müssen Jimmy kein Skript geben, bringen Sie ihm lediglich bei, einen geeigneten Texteditor zu verwenden. (Aus Gründen der Klarheit wird buchstäblich zurückgegeben)
quelle
<C-a>
ist kürzer alst]
, was ein lustiger kleiner Hack ist. Außerdem denke ich, dass Sie technisch 2 benötigen,<cr>
da es um Bestätigung bittet.norm df=
ist kürzer alss/.*=//g
3wC] = {<esc>
ist kürzer als<C-a>di]$s = {<esc>
.CJam,
4336 BytesOnline-Beispiel
Erläuterung:
Ein großes Dankeschön an Martin Ender für die Verbesserungen bei meiner ersten CJam-Antwort.
quelle
JavaScript (ES6),
656463 Bytesquelle
Retina ,
3028 BytesDie Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Probieren Sie es online!
Erläuterung
Wir werden die folgende Eingabe als Beispiel verwenden:
Bühne 1
Beachten Sie, dass in der ersten Zeile ein Leerzeichen steht.
Wir beginnen mit der Suche nach einer folgenden Zahl
];
und einem Zeilenvorschub und dann nach dem letzten Leerzeichen in der nächsten Zeile. Diese Übereinstimmung kann nur am Ende der ersten Zeile gefunden werden (aufgrund der];
). All dies wird durch ersetzt] = {
. Das heißt, es transformiert unsere Beispieleingabe in:Stufe 2
Jetzt passen wir alles von a
;
bis zur=
nächsten Zeile an und ersetzen es durch a,
. Dadurch wird die Zeichenfolge in Folgendes umgewandelt:Stufe 3
Alles was übrig bleibt ist das Ende zu reparieren und wir ersetzen das einzig verbleibende
;
durch};
:quelle
Julia,
112108105 BytesErläuterung
Gespeicherte Bytes durch Ersetzen von collect (eachmatch ()) durch [eachmatch () ...] und durch einen kürzeren regulären Ausdruck
quelle
eachmatch
Funktionsaufruf für eine weniger hübsche Ausgabe und -1 Byte entfernen . Ich habe Julia noch nie selbst programmiert, aber es könnte Sie interessieren, diesen Beitrag zu lesen: Tipps zum Golfen in Julia . Nochmals herzlich willkommen und genießen Sie Ihren Aufenthalt. :)matchall
wäre wahrscheinlich kürzer als splattingeachmatch
.Lua, 121 Bytes.
Erklärt
quelle
Batch, 160 Bytes
Hinweis: Die Zeile
set s=,
endet mit einem Leerzeichen. Übernimmt die Eingabe für STDIN. Das seltsame Linie 3 nimmt die Eingabe (zBint spam[6];
und ändert die[
in[] = {&rem
wasset s=int spam[] = {&rem 6];
die dann als zwei Aussagen interpretiert wird,set s=int spam[] = {
undrem 6];
, von denen die letztere ist ein Kommentar. Dann gilt für jede Zeile löschen wir den Text auf den ersten Platz (da kann man 't use=
in a pattern and the matching is non-greedy) und extrahiere den Wert.quelle
C 121 Bytes
quelle
Python
112111Bitte schlagen Sie mir ganz unkompliziert Verbesserungen vor, die mir in den Sinn kommen.
quelle
[:-1] for
.05AB1E ,
313028 BytesErläuterung
Probieren Sie es online!
Ein Byte dank Adnan gespeichert
quelle
žuDÀÀ
statt„[]„{}
speichert ein byte :).Java 7,
159158149154 BytesMehrere Bytes dank @cliffroot gespeichert .
Ungolfed & Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
String c(String[]a){a[0]=a[0].split("\\d")[0]+"]={ \b";for(String i:a)a[0]+=i.split("=[{]*")[1];return a[0].replace(';',',').replaceFirst(".$","};");}
String
in-Parameters und das Ersetzen des letzten Zeichens durch"};");
ein"")+"};";
.Perl, 42 + 2 (
-0p
) = 44 BytesNotwendigkeiten
-p
und-0
Flaggen zum Laufen. Zum Beispiel :quelle
Gelee , 27 Bytes
Probieren Sie es online!
Erläuterung
quelle
sed 51
quelle
Java, 106 Bytes
String-Manipulation in Java ist wie immer die Hölle.
Dies ist eine reine Regex-Antwort. Erstellen Sie eine einzelne Verkettung
String
und führenreplaceXxx
Sie diese aus , bis sie in Ordnung ist.Testen und ungolfed:
quelle
Gelee , 33 Bytes
TryItOnline
Wie?
quelle
Ruby, 64 Bytes
quelle
JavaScript, 125 Byte
Ich weiß, es ist länger als andere, aber ich wollte es unbedingt benutzen
eval
. Nur zum Spaß.Fügen Sie zum Ausführen Folgendes hier ein :
quelle
Haxe, 234 Bytes
Lange Funktionsnamen haben dies getötet: D
Probieren Sie die Testfälle hier !
quelle
V ,
25, 24 BytesProbieren Sie es online! Dieser enthält ein nicht druckbares
<esc>
Zeichen, daher hier ein Hexdump:Erläuterung:
quelle