Dalam xkcd-nya tentang format tanggal standar ISO 8601 Randall menyelinap di notasi alternatif yang agak aneh:
Angka-angka besar adalah semua digit yang muncul pada tanggal saat ini dalam urutan yang biasa, dan angka-angka kecil adalah indeks berbasis 1 dari kemunculan digit itu. Jadi contoh di atas mewakili 2013-02-27
.
Mari kita mendefinisikan representasi ASCII untuk tanggal seperti itu. Baris pertama berisi indeks 1 hingga 4. Baris kedua berisi angka "besar". Baris ketiga berisi indeks 5 hingga 8. Jika ada beberapa indeks dalam satu slot, mereka terdaftar bersebelahan dari yang terkecil hingga yang terbesar. Jika ada paling banyak m
indeks dalam slot tunggal (yaitu pada digit yang sama, dan di baris yang sama), maka setiap kolom harus memiliki m+1
karakter lebar dan rata kiri:
2 3 1 4
0 1 2 3 7
5 67 8
Lihat juga tantangan rekan untuk pertobatan yang berlawanan.
Tantangan
Diberi tanggal dalam notasi xkcd, mengeluarkan tanggal ISO 8601 yang sesuai ( YYYY-MM-DD
).
Anda dapat menulis sebuah program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengeluarkan hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi atau parameter function (out).
Anda dapat berasumsi bahwa input adalah tanggal yang valid antara tahun 0000
dan 9999
, termasuk.
Tidak akan ada spasi utama di input, tetapi Anda dapat mengasumsikan bahwa garis-garisnya diisi dengan spasi ke persegi panjang, yang berisi paling banyak satu kolom spasi tambahan.
Aturan standar kode-golf berlaku.
Uji Kasus
2 3 1 4
0 1 2 3 7
5 67 8
2013-02-27
2 3 1 4
0 1 2 4 5
5 67 8
2015-12-24
1234
1 2
5678
2222-11-11
1 3 24
0 1 2 7 8
57 6 8
1878-02-08
2 4 1 3
0 1 2 6
5 678
2061-02-22
1 4 2 3
0 1 2 3 4 5 6 8
6 5 7 8
3564-10-28
1234
1
5678
1111-11-11
1 2 3 4
0 1 2 3
8 5 6 7
0123-12-30
1
atas2
, jadi digit pertama adalah2
.2
di atas0
, jadi digit kedua adalah0
.3
di atas1
, di4
atas3
, jadi kita dapatkan2013
sebagai empat digit pertama. Sekarang di5
bawah0
, jadi digit kelima adalah0
,6
dan7
keduanya di bawah2
, jadi keduanya adalah digit2
. Dan akhirnya,8
ada di bawah7
, jadi digit terakhir adalah8
, dan kita berakhir dengan2013-02-27
. (Tanda hubung tersirat dalam notasi xkcd karena kita tahu pada posisi apa mereka muncul.)Jawaban:
CJam, 35 byte
Coba di sini . Ini mengharapkan garis input diisi dengan spasi.
Penjelasan
ll
membaca dua baris input, dan{1$e>}*
melakukan "pemindaian" pada baris kedua: ia mengambil semua awalan inputnya dan menghitung maksimum setiap awalan. Untuk jalur input"0 1 2 7 8"
, ini mendorong"0001112227778"
. Tumpukan kami sekarang terlihat seperti ini:Kita perlu menangkap kembali nilai-nilai ke dalam daftar sendiri menggunakan
]
; ini menangkap baris pertama kami juga, jadi kami pop kembali menggunakan(
, untuk mendapatkanseperti yang diharapkan.
eelee+
menghitung baris ini, kemudian melakukan hal yang sama untuk baris input ketiga, dan menggabungkan hasilnya, meninggalkan sesuatu seperti ini di atas tumpukan:Sekarang tumpukan kami adalah
["0001112227778" X]
tempatX
daftar yang disebutkan di atas.Kami membalik setiap pasangan dalam
X
(Wf%
), mengurutkan pasangan secara leksikografis ($
), dan meninggalkan 8 pasangan terakhir-8>
. Ini memberi kita sesuatu seperti:Ini berfungsi, karena pengurutan menempatkan semua pasangan dengan kunci
'
(spasi) sebelum semua digit dalam urutan menaik.Ini adalah "posisi- x " dari karakter
12345678
pada baris pertama dan ketiga: kita hanya perlu mengambil karakter dari baris kedua (modifikasi) kita yang secara vertikal sejajar dengannya.Untuk melakukan ini, kita ambil setiap posisi (
Wf=
), indeks ke dalam string yang kita buat sebelumnya (\f=
). Kami ada"20610222"
di tumpukan sekarang: untuk menambahkan tanda hubung, pertama-tama kami membaginya menjadi segmen dengan panjang dua (2/
), mencetak segmen pertama tanpa baris baru ((o
) dan bergabung dengan segmen yang tersisa dengan tanda hubung ('-*
).EDIT : trik pemindaian keren, Martin! Disimpan empat byte.
EDIT 2 : menyimpan dua byte lagi dengan mengganti
eelee+
denganl+ee
; karya ini, karena garis semua memiliki panjang yang sama, dan daftar indeks di CJam secara otomatis modulo panjang daftar, sehingga indeksn+0
,n+1
,n+2
... baik peta untuk0
,1
,2
...EDIT 3 : Martin menyimpan byte lain pada langkah terakhir proses. Bagus!
sumber
Pyth,
4843Test Suite
Membutuhkan bantalan dengan spasi menjadi persegi panjang.
Saya tidak berpikir ini adalah pendekatan terbaik, tetapi pada dasarnya ini menulis nilai tengah ke indeks dalam sebuah string yang ditunjukkan oleh nilai atas atau bawah. Yah saya kira saya punya cukup waktu untuk bermain golf sebagian besar hal-hal yang jelas saya lihat. : P
sumber
JavaScript (ES7), 115
Fungsi anonim. Menggunakan string template, ada baris baru yang signifikan dan termasuk dalam jumlah byte.
Persyaratan: jalur input tengah tidak boleh lebih pendek dari yang pertama atau yang terakhir. Persyaratan ini dipenuhi ketika input diisi dengan spasi untuk membentuk persegi panjang.
ES6 versi 117 menggunakan .map alih-alih pemahaman array
Kurang golf
Cuplikan tes
sumber
Haskell,
125106103 byteMembutuhkan bantalan dengan ruang hingga persegi panjang penuh.
Contoh penggunaan:
f " 1 3 24\n0 1 2 7 8 \n57 6 8 "
->"1878-02-08"
.Bagaimana itu bekerja:
sumber
JavaScript ES6, 231
Uji kasus .
sumber
Perl, 154 byte
Tidak digabungkan & dijelaskan
sumber
JavaScript (ES6), 131 byte
Penjelasan
Membutuhkan input untuk diisi dengan spasi untuk membentuk persegi panjang.
Uji
Tampilkan cuplikan kode
sumber
Powershell, 119 byte
Script tes tidak digabungkan:
Keluaran:
sumber
Jelly , 38 byte
Cobalah online!
Helper hanya ada di sana untuk memudahkan input; ini sebenarnya adalah program lengkap. Pastikan untuk merawat :
'''
), serta baris di sebelahnya (kosong, ada untuk kejelasan).sumber