Przegląd:
Twoim zadaniem jest pobranie formatu CSV key=value
i ułożenie go w bardziej uporządkowany sposób (patrz poniżej).
Wejście:
Zawsze za pośrednictwem standardowego wejścia . Zapisy będą zawsze miały następującą formę key=value
:
foo=bar,baz=quux
abc=123,foo=fubar
baz=qwe,abc=rty,zxc=uiop,foo=asdf
- Nie będzie z góry listy możliwych kluczy, musisz je znaleźć w tekście wejściowym.
- Koniec wejścia zostanie zasygnalizowany przez
EOF
dowolną implementacjęEOF
odpowiednią dla twojego systemu operacyjnego.
Wynik:
Pierwszy wiersz wyniku będzie listą wszystkich klawiszy, w kolejności alfabetycznej (nawet jeśli wszystkie klawisze są cyframi). Następnie wydrukuj każdy rekord w tym samym formacie CSV z odpowiednim nagłówkiem numeru, bez wymienionych kluczy. Tak więc w powyższym przykładzie poprawne dane wyjściowe to:
abc,baz,foo,zxc
,quux,bar,
123,,fubar,
rty,qwe,asdf,uiop
FAQ:
- Czy muszę się martwić o niewłaściwie sformatowane dane wejściowe?
- Nie. Twój program może zrobić, co chce (wyrzucić wyjątek, zignorować itp.), Jeśli dane wejściowe nie są poprawnie sformatowane, np. Wiersz
foo,bar,baz
- Nie. Twój program może zrobić, co chce (wyrzucić wyjątek, zignorować itp.), Jeśli dane wejściowe nie są poprawnie sformatowane, np. Wiersz
- Jak radzić sobie z uciekającymi postaciami specjalnymi?
- Możesz założyć, że nie będzie żadnych dodatkowych danych
,
ani=
danych, które nie są częściąkey=value
formatu."
nie ma żadnego specjalnego znaczenia w tym konkursie (chociaż ma to miejsce w tradycyjnym CSV).nie jest też w żaden sposób wyjątkowy.
- Linie powinny pasować do następującego wyrażenia regularnego:
^([^=,]+=[^=,]+)(,[^=,]+=[^=,]+)*$
- Dlatego oba klucze i wartości będą do siebie pasować
[^=,]+
- Dlatego oba klucze i wartości będą do siebie pasować
- Możesz założyć, że nie będzie żadnych dodatkowych danych
- Co o
CRLF
wersetachLF
?- Możesz wybrać dowolny separator odpowiedni dla Twojej platformy. Większość języków obsługuje to bez specjalnego kodu ograniczającego.
- Czy muszę drukować przecinki końcowe, jeśli kilka ostatnich kolumn nie istnieje?
- Tak. Zobacz przykład.
- Czy parsery CSV lub inne podobne narzędzia zewnętrzne są dozwolone?
- Nie. Musisz samodzielnie przeanalizować dane.
Odpowiedzi:
GolfScript, 64 znaki
Kod jest prostą implementacją w GolfScript, możesz przetestować przykład online .
Kod z adnotacjami:
źródło
Perl 6: 119 znaków, 120 bajtów
Gra w golfa:
źródło
perl, 129/121
129 bajtów, brak przełączników wiersza poleceń:
Jak wskazuje @Dennis poniżej, możesz uzyskać to do 120 + 1 = 121, używając -n:
Zasadniczo dla każdej linii dzielimy przecinki, aby uzyskać listę par. Dla każdej pary dzielimy według znaku równości, aby uzyskać klucz i wartość. Ustawiamy parę klucz / wartość w% h i lokalny skrót. Pierwszy służy do ustalenia listy kluczy. Ten ostatni służy do zapamiętywania wartości dla tego wiersza.
źródło
-n
przełącznika zamiastfor(<>){...}
. 2. Dzielenie się[, ]
zamiast używaniachomp
. 3. Pominięcie średnika po nawiasach klamrowych.while (<>) { ... }
cały skrypt, więc nie ma potrzeby blokowania END. Po prostu usuńfor(<>){
na początku i}
na końcu skryptu.}
koniec skryptu, a nie ten odpowiadającyfor
pętli. Możesz także zapisać jeszcze jeden znak, używając rzeczywistej nowej linii zamiast\n
.JavaScript ( ES5 )
191183179168 bajtówZakładając, że kod jest uruchamiany w linii poleceń spidermonkey:
Wynik:
Tej podkładki można użyć w przeglądarce do symulacji spidermonkey
readline
iprint
:Nie golfowany:
źródło
alert
zamiast tegoconsole.log
i zapisać niektóre bajty.readline
iprint
do rzeczywistego wejścia / wyjściaBash + coreutils,
188138 bajtówWynik:
źródło
Haskell,
357334g
wykonuje parsowanie - dzieli dane wejściowe na linie i mapuje każdą linię na listę(key,value)
par.k
, łącząc wszystkie klucze w listę i usuwając duplikaty, tworzy listę ze wszystkimi unikalnymi kluczami, których mogę później użyć do sortowania. Robię to, tworząc „Set” insidemain
(m(flip(,)"").k$d == [("abc",""),("baz",""),("foo",""),("zxc","")]
) dla każdej linii, a następnie pobierając każdą(key,value)
parę z linii i umieszczając ją tam, gdzie należy na liście (foldl
). Wiersz 1 z przykładu zwraca[("abc",""),("baz","quux"),("foo","bar"),("zxc","")]
, które konkatenuję w pojedynczy String (",quux,bar,"
), konkatenuję z innymi liniami i drukuję.źródło
Python 2.7 - 242 bajty
bleh
Zauważ, że druga warstwa wcięcia jest pojedynczym znakiem tabulacji, a nie czterema spacjami takimi jak SE.
Nie golfowany:
źródło
Python 3:
200195192189187źródło
k4 (40? 51? 70? 46?)
podstawowym wyrażeniem jest
to zarówno przyjmuje, jak i zwraca listę ciągów
aby dopasować specyfikację, moglibyśmy zrobić interaktywnie
który akceptuje dane wejściowe ze standardowego wejścia i wypisuje dane wyjściowe na standardowe wyjście
w przypadku samodzielnej aplikacji akceptującej dane wejściowe z potoku możemy to zrobić:
choć jeśli chcesz rozważyć moje istniejące wcześniej opakowanie k-as-filter, awq.k, jako akceptowalne narzędzie dla tego rodzaju układanek, możemy to zrobić:
który ma albo 46 znaków, albo 40, w zależności od tego, jak policzysz cytowanie muszli
źródło
q
Komenda? Jestawq.k
gdzieś opublikowany?C # - 369
(w LINQPAD)
Nie golfił
Wprowadzanie ciągu testowego
Wynik
źródło
CRLF
vs.LF
często zadawane pytania) Niestety nie mam kopii programu Visual Studio do przetestowania.