Gambaran:
Tugas Anda adalah mengambil input CSV dalam key=value
format dan mengaturnya dengan cara yang lebih terorganisir (lihat di bawah).
Memasukkan:
Selalu via stdin . Rekaman akan selalu dalam bentuk berikut key=value
:
foo=bar,baz=quux
abc=123,foo=fubar
baz=qwe,abc=rty,zxc=uiop,foo=asdf
- Tidak akan ada daftar kunci yang mungkin di muka, Anda harus menemukannya di teks input.
- Akhir input akan ditandai oleh
EOF
, implementasi apa punEOF
yang sesuai untuk OS Anda.
Keluaran:
Baris pertama dari output Anda akan menjadi daftar semua kunci, dalam urutan abjad (bahkan jika kunci semua angka). Setelah itu, cetak setiap catatan dalam format CSV yang sama dengan judul nomor yang sesuai, tanpa kunci yang tercantum. Jadi, untuk contoh di atas, output yang benar adalah:
abc,baz,foo,zxc
,quux,bar,
123,,fubar,
rty,qwe,asdf,uiop
Faq:
- Apakah saya harus khawatir tentang input yang diformat dengan tidak benar?
- Tidak. Program Anda dapat melakukan apa pun yang diinginkan (melemparkan pengecualian, mengabaikan, dll.) Jika input tidak diformat dengan benar, misalnya garis
foo,bar,baz
- Tidak. Program Anda dapat melakukan apa pun yang diinginkan (melemparkan pengecualian, mengabaikan, dll.) Jika input tidak diformat dengan benar, misalnya garis
- Bagaimana cara saya menangani pelolosan karakter khusus?
- Anda dapat berasumsi bahwa tidak akan ada tambahan
,
atau=
dalam data yang bukan bagian darikey=value
format."
tidak memiliki arti khusus dalam kontes ini (meskipun dalam CSV tradisional).juga tidak istimewa dengan cara apa pun.
- Baris harus cocok dengan regex berikut:
^([^=,]+=[^=,]+)(,[^=,]+=[^=,]+)*$
- Karenanya, baik kunci dan nilai akan cocok
[^=,]+
- Karenanya, baik kunci dan nilai akan cocok
- Anda dapat berasumsi bahwa tidak akan ada tambahan
- Bagaimana dengan
CRLF
vs.LF
?- Anda dapat memilih pembatas apa pun yang sesuai untuk platform Anda. Sebagian besar bahasa menangani ini tanpa kode pembatas khusus.
- Apakah saya perlu mencetak koma tertinggal jika beberapa kolom terakhir tidak ada?
- Iya. Lihat contohnya.
- Apakah parser CSV atau alat eksternal serupa lainnya diizinkan?
- Tidak. Anda harus mengurai data sendiri.
Jawaban:
GolfScript, 64 karakter
Kode ini merupakan implementasi langsung dalam GolfScript, Anda dapat menguji contoh online .
Kode beranotasi:
sumber
Perl 6: 119 karakter, 120 byte
De-golf:
sumber
perl, 129/121
129 byte, tidak ada saklar baris perintah:
Seperti @Dennis tunjukkan di bawah, Anda bisa mendapatkan ini menjadi 120 + 1 = 121 dengan menggunakan -n:
Pada dasarnya, untuk setiap baris, kami membaginya dengan koma untuk mendapatkan daftar pasangan. Untuk setiap pasangan, kami membaginya dengan tanda sama dengan untuk mendapatkan kunci dan nilainya. Kami menetapkan pasangan kunci / nilai dalam% h dan hashref lokal. Yang pertama digunakan untuk menentukan daftar kunci. Yang terakhir digunakan untuk mengingat nilai untuk baris ini.
sumber
-n
sakelar alih-alihfor(<>){...}
. 2. Memisahkan[, ]
daripada menggunakanchomp
. 3. Menghilangkan titik koma setelah kurung keriting.while (<>) { ... }
seluruh skrip, jadi tidak perlu untuk blok END. Hapus sajafor(<>){
di awal dan}
di akhir skrip.}
di akhir skrip, bukan yang sesuai denganfor
loop. Selain itu, Anda dapat menyimpan satu char lagi dengan menggunakan baris baru yang sebenarnya\n
.JavaScript ( ES5 )
191183179168 byteDengan asumsi kode dijalankan di spidermonkey command line:
Hasil:
Shim ini dapat digunakan di browser untuk mensimulasikan spidermonkey's
readline
danprint
:Tidak Disatukan:
sumber
alert
di tempatconsole.log
dan menyimpan beberapa byte sehingga.readline
danprint
untuk stdin / out yang sebenarnyaBash + coreutils,
188138 byteKeluaran:
sumber
Haskell,
357334g
melakukan parsing - itu membagi input menjadi garis dan memetakan setiap baris ke daftar(key,value)
pasangan.k
, dengan menggabungkan semua kunci menjadi daftar dan menghapus duplikat, membuat daftar dengan semua kunci unik yang nantinya dapat saya gunakan untuk mengurutkan. Saya melakukan ini dengan membuat "Set" di dalammain
(m(flip(,)"").k$d == [("abc",""),("baz",""),("foo",""),("zxc","")]
) untuk setiap baris, dan kemudian mengambil setiap(key,value)
pasangan dari suatu garis dan meletakkannya di tempatnya di dalam daftar (foldl
). Baris 1 dari contoh menghasilkan[("abc",""),("baz","quux"),("foo","bar"),("zxc","")]
, yang saya gabungkan menjadi satu String (",quux,bar,"
), digabungkan dengan baris lain, dan cetak.sumber
Python 2.7 - 242 byte
bleh
Perhatikan bahwa lekukan lapisan kedua adalah karakter tab tunggal, bukan empat spasi seperti yang dirender SE.
Tidak Disatukan:
sumber
Python 3:
200195192189187sumber
k4 (40? 51? 70? 46?)
ekspresi dasarnya adalah
ini menerima dan mengembalikan daftar string
untuk mencocokkan spec, kita bisa lakukan secara interaktif
yang menerima input dari stdin dan mencetak output ke stdout
untuk aplikasi mandiri yang menerima input dari pipa, kita bisa melakukan ini:
juga jika Anda bersedia menganggap pembungkus k-as-filter saya yang sudah ada, awq.k, sebagai alat yang dapat diterima untuk jenis puzzle ini, maka kita dapat melakukan ini:
yang merupakan 46 karakter atau 40, tergantung pada bagaimana Anda menghitung perselisihan kutipan shell
sumber
q
perintah? Apakahawq.k
diterbitkan di suatu tempat?C # - 369
(dalam LINQPAD)
Tidak disatukan
Uji input string
Keluaran
sumber
CRLF
vs.LF
FAQ) Sayangnya saya tidak memiliki salinan Visual Studio untuk diuji.