Überblick:
Ihre Aufgabe ist es, CSV-Eingaben in einem key=value
Format zu erfassen und besser zu organisieren (siehe unten).
Eingang:
Immer über stdin . Aufzeichnungen werden immer in der folgenden Form vorliegen key=value
:
foo=bar,baz=quux
abc=123,foo=fubar
baz=qwe,abc=rty,zxc=uiop,foo=asdf
- Es wird keine Liste möglicher Schlüssel im Voraus geben, Sie müssen sie im Eingabetext finden.
- Das Ende der Eingabe wird angezeigt
EOF
, je nachdem, welche ImplementierungEOF
für Ihr Betriebssystem geeignet ist.
Ausgabe:
In der ersten Zeile Ihrer Ausgabe werden alle Tasten in alphabetischer Reihenfolge aufgelistet (auch wenn es sich bei allen Tasten um Zahlen handelt). Drucken Sie danach jeden Datensatz im selben CSV-Format mit der entsprechenden Nummernüberschrift aus, ohne die aufgelisteten Schlüssel. Für das obige Beispiel wäre die richtige Ausgabe also:
abc,baz,foo,zxc
,quux,bar,
123,,fubar,
rty,qwe,asdf,uiop
FAQ:
- Muss ich mir über falsch formatierte Eingaben Sorgen machen?
- Nein. Ihr Programm kann tun, was es will (eine Ausnahme auslösen, ignorieren usw.), wenn die Eingabe nicht korrekt formatiert ist, z. B. eine Zeile von
foo,bar,baz
- Nein. Ihr Programm kann tun, was es will (eine Ausnahme auslösen, ignorieren usw.), wenn die Eingabe nicht korrekt formatiert ist, z. B. eine Zeile von
- Wie gehe ich mit Sonderzeichen um?
- Sie können davon ausgehen, dass es keine zusätzlichen
,
oder=
in den Daten, die nicht Teil deskey=value
Formats sind."
hat in diesem Wettbewerb keine besondere Bedeutung (obwohl dies in der traditionellen CSV-Version der Fall ist).ist auch in keiner Weise speziell.
- Zeilen sollten mit dem folgenden regulären Ausdruck übereinstimmen:
^([^=,]+=[^=,]+)(,[^=,]+=[^=,]+)*$
- Daher stimmen sowohl Schlüssel als auch Werte überein
[^=,]+
- Daher stimmen sowohl Schlüssel als auch Werte überein
- Sie können davon ausgehen, dass es keine zusätzlichen
- Was ist
CRLF
gegenLF
?- Sie können das für Ihre Plattform geeignete Trennzeichen auswählen. Die meisten Sprachen behandeln dies ohne speziellen Begrenzungscode.
- Muss ich nachstehende Kommas ausgeben, wenn die letzten Spalten nicht vorhanden sind?
- Ja. Siehe das Beispiel.
- Sind CSV-Parser oder ähnliche externe Tools zulässig?
- Sie müssen die Daten selbst analysieren.
Antworten:
GolfScript, 64 Zeichen
Der Code ist eine einfache Implementierung in GolfScript. Sie können das Beispiel testen online .
Kommentierter Code:
quelle
Perl 6: 119 Zeichen, 120 Bytes
Entgolft:
quelle
perl, 129/121
129 Bytes, keine Befehlszeilenoptionen:
Wie @Dennis unten ausführt, können Sie dies mit -n auf 120 + 1 = 121 bringen:
Grundsätzlich werden wir für jede Zeile durch Kommas getrennt, um die Liste der Paare zu erhalten. Für jedes Paar teilen wir durch das Gleichheitszeichen, um den Schlüssel und den Wert zu erhalten. Wir setzen das Schlüssel / Wert-Paar in% h und eine lokale Hashref. Ersteres wird verwendet, um die Liste der Schlüssel zu bestimmen. Letzteres wird verwendet, um die Werte für diese Zeile zu speichern.
quelle
-n
Schalter anstelle von verwendenfor(<>){...}
. 2. Herumspalten[, ]
statt benutzenchomp
. 3. Lassen Sie das Semikolon hinter den geschweiften Klammern weg.while (<>) { ... }
das gesamte Skript, sodass kein END-Block erforderlich ist. Einfachfor(<>){
am Anfang und}
am Ende des Skripts entfernen .}
am Ende des Skripts entfernen , nicht das, das derfor
Schleife entspricht. Sie können auch ein Zeichen mehr sparen, indem Sie stattdessen eine aktuelle Zeile eingeben\n
.JavaScript ( ES5 )
191183179168 BytesAngenommen, der Code wird in der spidermonkey-Befehlszeile ausgeführt:
Ergebnis:
Dieses Shim kann in einem Browser verwendet werden, um Spidermonkeys zu simulieren
readline
undprint
:Ungolfed:
quelle
alert
anstelle vonconsole.log
und speichern einige somit Bytes.readline
undprint
für die tatsächliche stdin / outBash + Coreutils,
188138 BytesAusgabe:
quelle
Haskell,
357334g
Parsing - Teilt die Eingabe in Zeilen und ordnet jede Zeile einer Liste von(key,value)
Paaren zu.k
Durch Zusammenfügen aller Schlüssel zu einer Liste und Entfernen von Duplikaten wird eine Liste mit allen eindeutigen Schlüsseln erstellt, die ich später zum Sortieren verwenden kann. Dazu erstelle ich für jede Zeile ein "Set" insidemain
(m(flip(,)"").k$d == [("abc",""),("baz",""),("foo",""),("zxc","")]
) und nehme dann jedes(key,value)
Paar aus einer Zeile und setze es dort, wo es in der Liste hingehört (foldl
). Zeile 1 aus dem Beispiel ergibt[("abc",""),("baz","quux"),("foo","bar"),("zxc","")]
, was ich zu einem einzelnen String (",quux,bar,"
) verkettete, mit den anderen Zeilen verkettete und drucke.quelle
Python 2.7 - 242 Bytes
bleh
Beachten Sie, dass die zweite Ebene der Einrückung ein einzelnes Tabulatorzeichen ist und nicht vier Leerzeichen, wie sie SE darstellt.
Ungolfed:
quelle
Python 3:
200195192189187quelle
k4 (40 & le; 51 & le; 70 & le; 46 & le;)
der Grundausdruck ist
Dadurch wird eine Liste von Zeichenfolgen akzeptiert und zurückgegeben
Um der Spezifikation zu entsprechen, könnten wir dies interaktiv tun
Dieser akzeptiert die Eingabe von stdin und druckt die Ausgabe nach stdout
Für eine eigenständige App, die Eingaben von einer Pipe akzeptiert, könnten wir dies tun:
Auch wenn Sie bereit sind, meinen bereits vorhandenen k-as-Filter-Wrapper awq.k als akzeptables Werkzeug für diese Art von Rätsel zu betrachten, können wir dies tun:
Das sind entweder 46 Zeichen oder 40, je nachdem, wie Sie das Zitat-Wrangling in der Shell zählen
quelle
q
Befehl? Wirdawq.k
irgendwo veröffentlicht?C # - 369
(in LINQPAD)
Ungolfed
String Eingabe testen
Ausgabe
quelle
CRLF
vs.LF
FAQ-Frage) Leider habe ich keine Kopie von Visual Studio zum Testen.