In der Programmiersprache C sind Arrays wie folgt definiert:
int foo[] = {4, 8, 15, 16, 23, 42}; //Foo implicitly has a size of 6
Die Größe des Arrays ergibt sich aus den initialisierenden Elementen (in diesem Fall 6). Sie können auch ein C-Array auf diese Weise schreiben, seine Größe explizit festlegen und dann jedes Element in der folgenden Reihenfolge definieren:
int foo[6]; //Give the array an explicit size of 6
foo[0] = 4;
foo[1] = 8;
foo[2] = 15;
foo[3] = 16;
foo[4] = 23;
foo[5] = 42;
Die Herausforderung
Sie müssen ein Programm oder eine Funktion schreiben, die Arrays von der ersten zur zweiten Möglichkeit erweitert. Da Sie ein Programm schreiben, um Code länger zu machen, und Ironie lieben, müssen Sie Ihren Code so kurz wie möglich halten.
Die Eingabe ist eine Zeichenfolge, die das ursprüngliche Array darstellt, und die Ausgabe ist die erweiterte Array-Definition. Sie können davon ausgehen, dass die Eingabe immer so aussieht:
<type> <array_name>[] = {<int>, <int>, <int> ... };
"Type" und "array_name" bestehen ausschließlich aus Buchstaben und Unterstrichen _
. Die Elemente der Liste sind immer eine Zahl im Bereich von -2.147.483.648 bis 2.147.483.647. Eingaben in einem anderen Format müssen nicht verarbeitet werden.
Das Leerzeichen in Ihrer Ausgabe muss genau mit dem Leerzeichen in der Testausgabe übereinstimmen, auch wenn ein abschließender Zeilenumbruch zulässig ist.
Test IO:
#in
short array[] = {4, 3, 2, 1};
#out
short array[4];
array[0] = 4;
array[1] = 3;
array[2] = 2;
array[3] = 1;
#in
spam EGGS[] = {42};
#out
spam EGGS[1];
EGGS[0] = 42;
#in
terrible_long_type_name awful_array_name[] = {7, -8, 1337, 0, 13};
#out
terrible_long_type_name awful_array_name[5];
awful_array_name[0] = 7;
awful_array_name[1] = -8;
awful_array_name[2] = 1337;
awful_array_name[3] = 0;
awful_array_name[4] = 13;
Einsendungen in jeder Sprache werden empfohlen, aber Bonuspunkte, wenn Sie dies in C tun können .
Bestenliste:
Hier ist eine Rangliste mit den wichtigsten Antworten:
foo[0]=1;
akzeptabel?Antworten:
Pyth, 44 Bytes
Testsuite
Regulärer Ausdruck und String-Chopping. Nicht besonders schlau.
Erläuterung:
quelle
Vim,
54, 52, 49,47 TastenanschlägeErläuterung:
Jetzt sieht unser Puffer so aus:
und unser Cursor befindet sich in der letzten Zeile.
Zweite Hälfte:
Jetzt sieht alles gut aus, wir müssen nur noch die ursprüngliche Array-Deklaration hinzufügen. So machen wir es:
quelle
int foo[6] = {
und endend mitint foo[12
(Cursor an) die "2")df<space>
,dW
um ein Byte zu speichern, aber ich habe vergessen, dassdf<space>
das in Zeile 6 aus dem Makro ausbricht, aberdW
nicht. Ich werde eine Revision zurücksetzen. Vielen Dank für den Hinweis!Retina,
10810410069 BytesDie Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Schlagen Sie das, PowerShell ...
Code Erklärung
Erste Linie:
].+{((\S+ ?)+)
Erstens müssen wir den Typ, den Array-Namen und die öffnende Klammer beibehalten (es wird ein Byte gespeichert), damit wir nicht mit ihnen übereinstimmen. Also haben wir den Schließbügel übereinstimmen, eine beliebige Anzahl von Zeichen und eine Öffnung geschweifte Klammer:
].+{
. Dann passen wir die Nummernliste an. Kürzeste Ich habe in der Lage gewesen , so weit zu finden , ist dies:((\S+ ?)+)
. Wir passen eine beliebige Anzahl von Nicht-Leerzeichen (dies beinhaltet Zahlen, mögliche negative Vorzeichen und mögliche Komma), gefolgt von einem Leerzeichen, das kann oder nicht sein kann:\S+ ?
. Diese Zeichengruppe wird dann so oft wie nötig wiederholt(\S+ ?)+
und in die große Erfassungsgruppe eingefügt. Beachten Sie, dass die schließende geschweifte Klammer oder das Semikolon nicht übereinstimmen. Die dritte Zeile erklärt, warum.Zweite Reihe:
$#2];$1
Da wir nur einen Teil der Eingabe abgeglichen haben, sind die nicht übereinstimmenden Teile weiterhin vorhanden. Also haben wir die Länge der Liste nach dem unübertroffenen Öffnungswinkel:
$#2
. Der Modifikator "Ersetzen"#
hilft uns dabei, da er die Anzahl der Übereinstimmungen mit einer bestimmten Erfassungsgruppe angibt. In diesem Fall Erfassungsgruppe2
. Dann setzen wir eine abschließende Klammer und ein Semikolon und schließlich unsere ganze Liste.Bei Eingabe
short array[] = {4, 3, 2, 1};
lautet die interne Darstellung nach diesem Ersetzen:(Beachten Sie die schließende geschweifte Klammer und das Semikolon)
Dritte Zeile:
+`((\w+[).+;(\S+ )*)(-?\d+).+
Dies ist ein geschleifter Abschnitt. Das heißt, es wird solange ausgeführt, bis keine Stufe in der Schleife eine Änderung am Eingang vornimmt. Zuerst haben wir den Array - Namen übereinstimmen, durch eine öffnende Klammer gefolgt:
(\w+\[)
. Dann kann eine beliebige Anzahl von beliebigen Zeichen und ein Semikolon:.+;
. Dann passen wir die Liste wieder, aber diesmal nur Zahlen und das Komma nach jeder Nummer, die einen Raum hat sie zu folgen:(\S+ )*
. Dann haben wir die letzte Nummer in der Liste erfassen:(-?\d+)
und alle restlichen Zeichen dahinter:.+
.Vierte Zeile:
$1¶$2$#3] = $4;
Wir ersetzen es dann mit dem Array - Namen und die Liste durch eine neue Zeile folgt:
$1¶
. Als nächstes haben wir den Array - Namen, durch die Länge des zuvor abgestimmten Liste folgt, ohne das letzte Element ( im wesentlichenlist.length - 1
):$2$#3
. Gefolgt von einer schließenden Klammer und einem Zuweisungsoperator mit Leerzeichen, gefolgt vom letzten Element unserer Nummernliste:] = $4;
Nach dem ersten Ersetzen sieht die interne Darstellung folgendermaßen aus:
Beachten Sie, dass die schließende geschweifte Klammer und das Semikolon dank der
.+
am Ende der dritten Zeile verschwunden sind . Nach drei weiteren Ersetzungen sieht die interne Darstellung folgendermaßen aus:Da in der dritten Zeile nichts mehr zu finden ist, ersetzt die vierte Zeile nichts und die Zeichenfolge wird zurückgegeben.
TL; DR: Zuerst ändern wir das Int-Listenformat ein bisschen. Dann nehmen wir das letzte Element der Liste und den Namen und setzen sie nach der Array-Initialisierung. Wir machen das so lange, bis die int-Liste leer ist. Dann geben wir den geänderten Code zurück.
Probieren Sie es online!
quelle
M!`
undG`
sind ähnlich, aber nicht ganz gleich. Achtung.V, 37 Bytes
V ist eine 2D-Saiten-basierte Golfsprache, die ich geschrieben habe und die aus vim entwickelt wurde. Dies funktioniert ab Commit 17 .
Erläuterung:
Dies ist so ziemlich eine direkte Übersetzung meiner vim-Antwort , wenn auch deutlich kürzer.
Dann haben wir einfach:
Da dieser Unicode-Wahnsinn schwer einzugeben sein kann, können Sie die Datei mit diesem umkehrbaren Hexdump erstellen:
Dies kann ausgeführt werden, indem Sie V installieren und Folgendes eingeben:
quelle
Designed off of vim.
2 Notizen: 1. Die meisten Leute sagenfrom
nichtoff of
, und 2. warum gab es das nicht. +1C,
215 Bytes, 196 BytesDank @tucuxi 19 Bytes gespart!
Golf gespielt:
Ungolfed:
Verknüpfung:
http://ideone.com/h81XbI
Erläuterung:
Um das zu bekommen
<type> <array_name>
,sscanf()
lautet der Formatstring wie folgt:Um die int-Werte aus der Zeichenfolge zu extrahieren
int foo[] = {4, 8, 15, 16, 23, 42};
, tokenisiere ich die Zeichenfolge im Wesentlichen mit dieser Funktion:woher:
i
ist die Eingabezeichenfolge (achar*
)t
ist der Versatz der Zeigerposition voni
x
ist die tatsächlicheint
aus der Zeichenfolge analysiertn
ist die Gesamtzahl der Zeichen, einschließlich der gefundenen ZifferDie
sscanf()
Formatzeichenfolge bedeutet Folgendes:Wenn Sie die Eingabezeichenfolge als Zeichenarray darstellen:
Wenn sich das
int
4
Element bei Index 13,8
bei Index 16 usw. befindet, sieht das Ergebnis jedes Durchlaufs in der Schleife folgendermaßen aus:quelle
o
innerhalb von sprintf über verketten%s
. Dies sollte etwa 7 Zeichen rasieren.C
195180 Bytes195-Byte-Original:
Golf gespielt:
ungolfed:
Die beiden Verknüpfungen verwenden den
m
Modifikator, um ScanFs%s
zu veranlassen, ihren eigenen Speicher zuzuweisen (spart das Deklarieren von Char-Arrays), und verwendenstrtok
(der standardmäßig auch ohne Includes verfügbar ist ), um den Nummernanalyseteil durchzuführen .180-Byte-Aktualisierung:
ungolfed:
Verwendet die Idee von bnf679, an einen String anzuhängen, um keine Kommas zählen zu müssen.
quelle
Python 3.6 (Vorabversion), 133
Macht viel Gebrauch von F-Strings .
Ungolfed-Version:
quelle
Ruby,
1271101089988 BytesAnonyme Funktion mit einem einzelnen Argument als Eingabe.Vollständiges Programm, liest die Eingabe von STDIN. (Wenn Sie Rohr eine Datei in ist das Newline optional.)ReturnsDruckt die Ausgabezeichenfolge.@TimmyD prahlte damit, dass seine Lösung alle anderen Nicht-Esolangs als Herausforderung geschlagen hatte, und überwand schließlich die (zum Zeitpunkt des Schreibens) 114-Byte-Powershell-Lösung, die sie veröffentlicht hatten.
Cᴏɴᴏʀ O'Bʀɪᴇɴs Trick mit dem Aufteilen]
und Spleißen der zweiten Hälfte, um die Zahlen zu verbessern .Ich muss den splat Operator mehr benutzen. Es ist so nützlich!
Entlehnt einen Trick aus der JavaScript ES6-Antwort von @ Neil, um mehr Bytes zu sparen, indem nach Wörtern gescannt wird, anstatt
gsub
und zu verwendensplit
.quelle
05AB1E ,
525047 BytesCode:
Verwendet die CP-1252- Codierung. Probieren Sie es online! .
quelle
JavaScript (ES6), 100 Byte
Da nur die Wörter wichtig sind, werden einfach alle Wörter in der Originalzeichenfolge sowie führende Minuszeichen abgeglichen und das Ergebnis erstellt. (Ich dachte ursprünglich, ich würde verwenden,
replace
aber das stellte sich als roter Hering heraus.)quelle
[t,n,...m]
Fast eine mystische VisionPyth -
5350464544 Bytes2 Bytes gespart dank @FryAmTheEggman.
Test Suite .
quelle
Pip ,
4847 BytesÜbernimmt die Eingabe von stdin und druckt auf stdout.
Erläuterung
Tl; dr: Führt eine Regex-Ersetzung durch, wobei Erfassungsgruppen und eine Rückruffunktion verwendet werden, um das Ergebnis zu erstellen.
Die
q
spezielle Variable liest eine Eingabezeile. Der reguläre Ausdruck ist(\S+)(. = ).(.+)}
, der mit allen Zeichen außer dem Typ (einschließlich Leerzeichen) und dem abschließenden Semikolon übereinstimmt. Unter Verwendung des ersten Beispiel von der Frage, bekommen die diesen Gruppenfoo[
,] =
und4, 8, 15, 16, 23, 42
.Die Ersetzung ist der Rückgabewert der unbenannten Funktion
{[b#Yd^k']';.n.b.,#y.c.y]}
, die mit der gesamten Übereinstimmung plus den Erfassungsgruppen als Argumente aufgerufen wird. Ruft innerhalb der Funktion dieb
Erfassungsgruppe 1, diec
Gruppe 2 und died
Gruppe 3 ab.Wir bauen eine Liste, die ersten drei Punkte von denen sein
"foo["
,6
und"]"
. Um das zu erhalten6
, teilen wird
die eingebaute Variablek
= auf", "
,Y
verknüpfen die resultierende Liste von Ganzzahlen mit dery
Variablen für die zukünftige Verwendung und nehmen die Länge (#
).']
ist ein buchstäbliches Zeichen.Was bleibt, ist eine Reihe von Zeichenfolgen der Form zu konstruieren
";\nfoo[i] = x"
. Dazu verketten wir folgendes:';
,n
(a built-in für Newline),b
(1. Capture - Gruppe),,#y
(entspricht Pythonrange(len(y))
),c
(2. Capture - Gruppe), undy
. Die Verkettung funktioniert bei Listen und Bereichen elementweise. Das Ergebnis ist eine Liste von Zeichenfolgen. Alles in allem ist der Rückgabewert der Funktion eine Liste wie die folgende:Da diese Liste in einer Zeichenfolge
R
verwendet wird, wird sie implizit in eine Zeichenfolge umgewandelt. Die Standardkonvertierung von Liste in Zeichenfolge in Pip verkettet alle Elemente:Schließlich wird das Ergebnis (einschließlich des Typs und des letzten Semikolons, die von der Regex nicht übereinstimmten und daher unverändert bleiben) automatisch gedruckt.
quelle
Perl 5.10,
73726866 + 1 (für -n Schalter) = 67 BytesDies ist eine schöne Herausforderung für Perl und die bisher kürzeste unter den Mehrzwecksprachen. Gleichwertig
quelle
PowerShell v2 +,
114 -105 ByteNimmt die Eingabezeichenfolge
$args
und-replace
s die eckige Klammer mit nichts und führt dann ein-split
On-Whitespace aus. Wir speichern das erste Bit in$a
, das zweite Bit in$b
, das=
In$c
und die Array-Elemente in$d
. Im folgenden Beispiel wird diesfoo
in$a
undbar
in$b
sowie das gesamte Array in gespeichert$d
.Wir geben dann unsere erste Zeile mit
"$a ..."
und in der Mitte als Transformation$d
von einem Array von Zeichenfolgen der Form{1,
,2,
...100};
in ein reguläres int-Array aus, indem-join
wir sie zu einer Zeichenfolge zusammenfassen und danniex
zweimal durchlaufen (ähnlich wieeval
). Wir speichern das resultierende Array wieder in,$d
bevor wir die.length
Methode aufrufen , um die entsprechende Zahl[]
in der Ausgabezeile einzufügen.Wir senden dann
$d
durch eine Schleife mit|%{...}
. Jede Iteration wird"$b..."
mit einer$i
in Klammern eingeschlossenen Zählervariable und dem aktuellen Wert ausgegeben$_
. Die$i
Variable startet nicht initialisiert (äquivalent zu$null
), aber sie++
wirdint
vor der Ausgabe in ein umgewandelt, so dass sie bei0
allen vor dem Inkrementieren$i
für die nächste Schleifeniteration mit der Ausgabe beginnt .Alle Ausgabezeilen verbleiben in der Pipeline, und die Ausgabe an das Terminal erfolgt implizit bei Programmbeendigung.
Beispiel
quelle
C
278-280BytesGolf gespielt:
ungolfed:
Während der Arbeit haben einige eine kürzere Version gepostet, die sscanf für das Parsen verwendet, anstatt Datenzeiger zu verwenden ... nett!
UPDATE: Beim Drucken von Elementen wurden fehlende Leerzeichen um den gleichen Wert gefunden . IDE-Online-Link: http://ideone.com/KrgRt0 . Beachten Sie, dass diese Implementierung negative Zahlen unterstützt ...
quelle
Awk, 101 Bytes
Besser lesbar:
-
. Die Felder wären also der Typname, der Variablenname und die Zahlen.};
). Die Größe des Arrays ist alsoNF - 3
.FS
entweder beim Aufruf von awk (using-F
) oder in einemBEGIN
Block zuweisen . Im Interesse der Kürze….quelle
FS
muss entweder in zugewiesen werdenBEGIN
oder verwendet werden,-F
sonst wird es nicht verwendet, um die erste Zeile zu teilen, und da es nur 1 Eingabezeile gibt ...awk '-F[^[:alnum:]_-]+' '{printf"%s %s[%d];\n",$1,$2,NF-3;for(i=3;i<NF;i++)printf$2"[%d] = %d;\n",i-3,$i}'
, das sind 102 Bytes, die sich nichtawk
selbst zählen. Hmmm. Kann ich die Anführungszeichen ausschließen?C+O bytes
wo aufC
undO
stellen die Bytes aus Code bzw. Optionen dar. Natürlich benutze ich im Allgemeinen nur einenBEGIN
Block, damit ich nicht darüber nachdenken muss. : pJavaScript ES6,
134132130129 Bytes1 Byte dank Neil gespeichert.
quelle
`[${i}] = `+t+";"
sein`[${i}] = ${t};`
?Bash,
133129 BytesErster Versuch, sicher ist es möglich, es kürzer zu machen.
quelle
D,
197, 188 Bytesoder ungolfed:
quelle
Julia,
154134101 BytesDies ist eine Funktion, die eine Zeichenfolge akzeptiert und eine Zeichenfolge mit einer einzelnen nachgestellten Zeile zurückgibt.
Ungolfed:
Wir definieren
c
, dass es sich um ein Array von Übereinstimmungen der Eingabe im regulären Ausdruck handelt-?\w+
. Es gibt den Typ, den Arraynamen und dann jeden Wert an. Wir speichernn
als die Länge vonc
- 2, was die Anzahl der Werte ist. Die Ausgabe wird als interpolierte Zeichenfolge aus Typ, Name und Länge erstellt, wobei jede Definitionszeile durch Zeilenumbrüche getrennt wird. Aus welchem Grund auch immer,c[]
ist das gleiche wiec[1]
.32 Bytes mit Hilfe von Dennis gespeichert!
quelle
Python 2, 159 Bytes
Probieren Sie es online aus
Vielen Dank an Kevin Lau für einige Golfvorschläge
quelle
Python 3, 116 Bytes
Teilt die Eingabe in den Typ, den Namen und die Liste der Nummern auf. Nachdem Sie die Array-Deklaration gedruckt haben, drucken Sie die Elemente, indem Sie die Zahlen manuell durchlaufen und dabei die überschüssige Interpunktion entfernen, die mit der ersten und der letzten verknüpft ist.
Ein anderer Ansatz in Python 2 ergab 122 Bytes:
Die Idee ist,
eval
die Liste der Zahlen als Tupel mit einem Komma am Ende zu versehen, damit eine einzelne Zahl als Typ erkannt wird. Die aufgezählte Liste der Zahlen enthält Tupel, in denen Zeichenfolgen formatiert werden können.quelle
PHP, 143 Bytes
Golf gespielt
Ungolfed
Die Eingabe erfolgt über das Befehlszeilenargument. Probe:
Ausgabe:
quelle
MATL ,
686458 BytesDies ist nicht C,
aber es verwendet die C-ähnlicheNah, die 4 Bytes verschwendete.sprintf
FunktionProbieren Sie es online!
quelle
Clojure, 115 Bytes
Ich war nicht in der Lage, schön zu verschmelzen
awful_array_name[5];
undawful_array_name[0] = 7;
Teile , so dass sie wiederverwenden Code würde: /quelle