Sistem file Microsoft FAT memiliki tabel direktori untuk mewakili "file" mana di mana "folder" pada disk. Untuk saat ini, entri-entri ini menjejalkan banyak informasi menjadi sejumlah kecil bit. Ada banyak spesifikasi teknis di Wiki untuk yang penasaran, tetapi tantangan di sini adalah fokus pada decoding entri yang "sederhana".
Setiap entri terdiri dari kata biner 32 byte, dipecah menjadi beberapa bagian. Untuk konsistensi dalam tantangan ini, kita akan menggunakan versi MS-DOS 5.0, byte dipesan sebagai big endian , dan kami menyebut byte 0x00
sebagai yang paling kiri, dan byte 0x1F
sebagai yang paling kanan.
Di bawah ini adalah skema singkat dari bagian yang relevan, dan apa yang harus menjadi output untuk setiap bagian ( dicetak tebal ).
- 11 byte pertama adalah nama file dalam format ASCII (ini adalah asal nama file 8.3 yang terkenal - 8 byte untuk nama file, 3 byte untuk ekstensi). Ini adalah pengkodean ASCII lurus, dan harus menjadi keluaran ASCII dengan titik (.) Di antaranya .
- Catatan: bagian 8 dan 3 diisi dengan spasi untuk membuat entri panjang penuh. Outputnya harus mengabaikan spasi (yaitu, jangan outputnya).
- Ekstensi file mungkin kosong (yaitu, semua spasi), dalam hal ini output tidak boleh menampilkan titik .
- Karena ASCII hanya menggunakan 7 bit yang lebih rendah, byte akan memiliki yang terdepan
0
.
- Byte berikutnya (0x0b) adalah bitmask dari berikut ini:
- 0x01 Hanya Baca - RO output
- 0x02 Tersembunyi - keluaran H
- 0x04 Sistem - output S
- 0x08 Volume Label - output VL . Ukuran file (di bawah) harus berupa 0 , terlepas dari entri yang sebenarnya.
- Subdirektori 0x10 - output SD . Ukuran file (di bawah) harus berupa 0 , terlepas dari entri yang sebenarnya.
- 0x20 Archive - output A
- 0x40 Device - diabaikan untuk tantangan ini.
- 0x80 Dicadangkan - diabaikan untuk tantangan ini.
- Karena ini adalah bitmask, beberapa flag dimungkinkan - semua output yang berlaku harus disatukan bersama dalam urutan apa pun. Misalnya,
0xff
bisa jadiROHSVLSDA
(atau kombinasi lainnya).
- Dua byte berikutnya (0x0c dan 0x0d) tidak digunakan di bawah MS-DOS 5.0.
- Dua byte berikutnya (0x0e dan 0x0f) adalah waktu pembuatan sebagai berikut:
- Bit 15 hingga 11 adalah jam dalam format 24 jam - output 00 hingga 23
- Bit 10 hingga 5 adalah menit - output 00 hingga 59
- Bit 4 hingga 0 adalah detik / 2 - output 00 hingga 58 (perhatikan bahwa detik hanya dalam resolusi dua detik)
- Untuk klarifikasi:
hhhhhmmmmmmsssss
ketika ditulis big-endian.
- Dua byte berikutnya (0x10 dan 0x11) adalah tanggal pembuatan sebagai berikut:
- Bit 15-9 adalah tahun - output 1980 untuk
0
hingga 2107 untuk127
- Bit 8 hingga 5 adalah bulan - output 1 hingga 12 (dengan atau tanpa nol)
- Bit 4 hingga 0 adalah hari - output 0 hingga 31 (dengan atau tanpa nol di depan)
- Untuk klarifikasi:
yyyyyyymmmmddddd
ketika ditulis big-endian.
- Bit 15-9 adalah tahun - output 1980 untuk
- Dua byte berikutnya (0x12 dan 0x13) adalah tanggal akses terakhir. Saat digunakan dalam MS-DOS 5.0, kami mengabaikan bagian ini untuk tantangan ini.
- Dua byte berikutnya (0x14 dan 0x15) tidak digunakan oleh MS-DOS 5.0.
- Dua byte berikutnya (0x16 dan 0x17) adalah waktu yang dimodifikasi terakhir, mengikuti format yang sama dengan waktu pembuatan, di atas.
- Dua byte berikutnya (0x18 dan 0x19) adalah tanggal terakhir yang dimodifikasi, mengikuti format yang sama dengan tanggal pembuatan, di atas.
- Dua byte berikutnya (0x1a dan 0x1b) adalah lokasi cluster dari file pada disk. Kami mengabaikan bagian ini untuk tantangan ini.
- Empat byte terakhir (0x1c, 0x1d, 0x1e, dan 0x1f) adalah ukuran file - output sebagai integer yang tidak ditandai , kecuali jika flag VL atau SD diatur (di atas), dalam hal ini output
0
.
Representasi visual
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/
Memasukkan
- Satu kata 32-byte (yaitu, 256 bit), dalam format apa pun yang nyaman.
- Ini bisa berupa string
1
dan0
, seperti beberapa unsignedint
, array nilai Boolean, dll. - Silakan tentukan dalam jawaban Anda format apa yang Anda gunakan untuk input.
- Anda tidak dapat mengambil beberapa input (yaitu, array yang dipecah sebelumnya ke ukuran byte yang relevan) kecuali jika itu satu - satunya cara bahasa Anda untuk mengambil input. Mengurai input adalah bagian dari tantangan.
- Ini bisa berupa string
- Anda dapat menganggap input valid (misalnya, Anda tidak perlu melakukan pengecekan tanggal untuk memverifikasi bahwa tanggal tersebut valid).
- Bytes yang tidak digunakan bisa semuanya
0
, semua1
, dll., Asalkan ada. Dalam contoh di bawah ini, saya menggunakan semua0
byte yang tidak digunakan.
Keluaran
Baik dicetak ke layar atau dikembalikan, berikut ini:
- Nama file sebagai string ASCII
- Atribut file sebagai string ASCII
- Waktu pembuatan dan tanggal pembuatan, dengan pemisah yang sesuai (titik dua, garis miring, sesuatu untuk membedakan komponen)
- Waktu yang dimodifikasi dan tanggal yang dimodifikasi, sekali lagi dengan pemisah yang sesuai
- Ukuran file
Outputnya dapat berupa string tunggal yang dipisahkan oleh spasi atau dipisahkan oleh baris baru, elemen yang terpisah dalam array, dll. Silakan tentukan dalam jawaban Anda bagaimana output Anda diformat.
Aturan
- Format I / O standar dapat diterima.
- Program lengkap atau fungsi dapat diterima.
- Celah standar dilarang.
- Ini adalah kode-golf , jadi semua aturan golf biasa berlaku, dan kode terpendek menang.
- Built-in yang melakukan fungsi ini persis dilarang.
Contohnya
0111000001110010011011110110011101110010011000010110110101101101011010010110111001100111000001100000000000000000101000100100010001001000110101000000000000000000000000000000000010100010010001000100100011010100000000000000000000000000000000001101000000000000
programm.ing HS 20:18:08 2016/06/20 20:18:08 2016/06/20 53248
0010000000100000001000000010000001110000011100000110001101100111001000000010000000100000000101000000000000000000010111010110110000111101100111110000000000000000000000000000000010100010010001000100100011010100000000000000000011110000000100111111001011100001
ppcg SDS 11:43:24 2010/12/31 20:18:08 2016/06/20 0
sumber
SD S
set bendera yang valid?Jawaban:
Verilog,
513670617 byteBerjalan menggunakan IVerilog. Tidak diperlukan flag kompilasi khusus.
Ini adalah monster definisi bertingkat, bit-twiddling, dan gangguan karena harus membalik urutan bit karena endianness (jika string tidak dicetak, atau urutan bit nomor salah). Input diambil melalui
i
port, yang merupakan cara biasa mengambil input ke modul Verilog.$display
digunakan untuk mencetak ke standar keluar. 6 byte dapat disimpan jika nol di depan tidak diperlukan untuk cap waktu.Demo
Testbench (Tidak diberi skor):
Contoh dijalankan:
sumber
Python,
485, 479, 442, 438, 431, 429, 418, 402, 395, 391, 370 byte.Disimpan 19 byte, terima kasih kepada Cᴏɴᴏʀ O'Bʀɪᴇɴ yang mengingatkan saya bahwa saya dapat menetapkan fungsi ke sebuah surat.
Disimpan 6 byte berkat saran FryAmTheEggman untuk membersihkan filter bitmask.
Disimpan 21 byte berkat jawaban Ruby yang luar biasa dari W0lf yang memaksa saya untuk memainkan golf ini lagi. ;)
Ini adalah monster absolut. Cukup yakin saya bisa mengurangi sedikit lebih banyak, tetapi sudah hampir menjadi golf.
sumber
int
ke char? atau mungkin membuat fungsi yang berkinerjastr int
.or 'SD'
bisa dihilangkan, saya pikirHaskell,
781710 byteBerkat BlackCap untuk penyederhanaan
Ini juga memungkinkan sampah (seperti karakter baris baru) muncul setelah input.
sumber
Java,
17211587157315601511 byte:Mengambil input dalam format string biner 32 byte. Output dalam format string yang dipisahkan spasi. Ini mungkin jawaban yang sangat panjang, tapi saya masih belum kecewa. Saya senang saya bisa menerapkan ini di Jawa. Saya masih akan mencoba bermain golf sebanyak yang saya bisa.
Cobalah secara Online! (Ideone)
sumber
Ruby, 344 byte
Versi yang sedikit lebih mudah dibaca tersedia di sini .
Tes online: http://ideone.com/Fww1Rw
sumber
JavaScript (ES6), 369
Kurang golf
Uji
sumber
Script error.
. Tetapi untuk beberapa alasan di Firefox tampaknya berfungsi dengan baik. Saya heran mengapa ...PHP ,
301288 byteCobalah online!
Input adalah string kata 32 byte via
STDIN
, output keSTDOUT
.-13 byte sebagai program mandiri.
sumber
Stax , 111 byte
Jalankan dan debug itu
sumber
Perl, 249 byte
Mengambil 32 byte sebagai input, output dipisahkan oleh baris baru.
unpack
sangat cocok untuk parsing struktur biner jenis ini.Beberapa hal penting:
unpack
.@{[]}
memungkinkan untuk menginterpolasi kode dalam sebuah string. Ini sebenarnya membuat referensi array yang kemudian direferensikan."$str1"x!!$str2
adalah cara yang bagus untuk mengembalikan$str1
hanya jika$str2
string tidak kosong.Di bawah ini adalah versi yang berfungsi pada entri direktori nyata, dengan bidang little-endian, dan hanya mengabaikan bantalan kanan pada nama file dan ekstensi (jadi, mis.
" ppcg"
Spasi putih awalnya tidak dihapus) (254 byte)sumber