Golf Kode Lanjut - Operasi Disk, dan Alokasi File

8

Selamat Malam Golfgeneers.

Ini pertanyaan yang cukup panjang dan terperinci. Mengingat apa yang diminta, itu perlu. Jika Anda memiliki pertanyaan, silakan tanyakan. Jika ada sesuatu yang tidak jelas, harap beri tahu saya agar saya dapat memperbaikinya. Ini mungkin di sisi yang lebih keras dari codegolf.

Kami sedang membangun komputer yang ringan, dan kami membutuhkan sistem file seberat mungkin. Kode terpendek akan dipilih.

Kami menyediakan hard drive 65536 byte yang canggih. Demi prototipe ini, ini akan menjadi file gambar langsung, yang dapat diasumsikan oleh program Anda, dan berada di lokasi mana pun yang cocok untuk Anda - yaitu, file biner yang mewakili seluruh hard disk. Anda dapat berasumsi bahwa gambar ini sudah 'diformat' - yaitu. jika program Anda bergantung pada sesuatu yang ada di file untuk bekerja, itu bisa terjadi. Jika Anda meminta status kosong awal menjadi sesuatu selain all-zero, sebutkan apa itu.

Tidak ada batasan memori untuk RAM yang digunakan oleh aplikasi Anda.

Perintah input dan output akan membutuhkan antarmuka ke hard drive yang sebenarnya. Seperti gambar disk, program Anda dapat mengasumsikan bahwa file untuk input ada, dan di mana pun Anda inginkan. Demikian juga, program Anda dapat menampilkan di mana saja nyaman. Namun ia harus menutup file setelah menjalankan perintah input atau output.

Anda tidak diberikan format yang harus Anda gunakan untuk gambar disk - Anda bebas membuat sendiri. Itu harus mampu menyimpan hingga 248 file. File apa pun yang lebih besar dari 256 byte dapat dihitung sebagai file baru demi batas ini untuk setiap 256 byte atau bagiannya. File dapat mencapai 63488 byte. Pada dasarnya - itu harus mampu sebagai hard drive dengan 248 sektor masing-masing 256 byte.

Alasan di balik ukuran yang tampaknya ini adalah untuk memberi Anda 2.048 byte 'administrasi' - untuk menyimpan rincian file. Setiap file / folder harus dapat diakses dengan nama 4 karakter alfanumerik, yang mungkin peka huruf besar kecil atau kecil sesuai pilihan Anda. Jika program Anda mendukung nama 4 karakter atau kurang, maka ada bonus pengali 0,95.

Program Anda harus menerima, melalui stdin, perintah berikut. Parameter akan dipisahkan oleh spasi. Perintah akan diakhiri oleh baris baru.

  • L - Daftar nama untuk stdout semua file saat ini dan ukurannya dalam byte, dipisahkan oleh baris baru.
  • C ab - Salin file a ke file baru b.
  • D a - Hapus file a
  • R ab - Mengganti nama file a ke nama baru b
  • I a - Menambahkan file input (lihat catatan di atas) sebagai file a
  • O a - File Outputs ke file output

Kesalahan berikut dapat dilaporkan kepada STDOUT atau STDERR sebagai alasan yang sah untuk suatu perintah gagal dieksekusi. Anda dapat memilih untuk hanya mencetak ERR # di mana # adalah nomor kesalahan:

  • 1 - File tidak ada
  • 2 - File sudah ada
  • 3 - Di Luar Angkasa *

* Perhatikan bahwa program Anda tidak dapat mengeluarkan ini hanya karena kehabisan ruang terus menerus. Jika Anda masih memiliki sektor yang tersedia, Anda harus mendefrag hard disk untuk membuatnya berfungsi.

Sistem folder bersifat opsional - namun, akan mendapat bonus 0,8 pengali dari skor Anda. Jika mendukung lebih dari 1 level direktori, itu akan menghasilkan bonus dari pengali 0,7 (tidak di samping 0,8). Untuk bonus, Anda harus punya

  • L, R, C, dan D hanya berfungsi di dalam direktori saat ini. L harus mendaftar folder dalam direktori saat ini, serta file.
  • Perintah baru M ab memindahkan file a ke folder b. Jika b adalah '.', Pindahkan file ke direktur induk
  • Perintah baru G a pergi ke folder a. Jika a adalah '.', Buka folder induk
  • R juga harus mengganti nama folder
  • D juga harus menghapus folder, dan semua file / folder di dalamnya
  • C juga harus menyalin folder, dan semua file / folder di dalamnya

Kesalahan tambahan berikut dapat dilaporkan ke STDOUT atau STDERR sebagai alasan yang sah untuk suatu perintah gagal dieksekusi.

  • 4 - Folder tidak ada
  • 5 - File, bukan folder - di mana, I dan O memerlukan nama file, dan folder diberikan

Nilaimu adalah:

  • Ukuran, dalam byte, dari kode sumber Anda
  • Dikalikan dengan

    • 0,95 jika Anda mendukung nama 4, atau kurang karakter
    • 0.8 jika Anda mendukung satu tingkat folder
    • 0.7 jika Anda mendukung beberapa level folder
    • 0,95 jika Anda mendukung perintah (tidak harus nama file) dalam huruf kecil atau besar

Semoga berhasil.

lochok
sumber
Saya bersedia memberikan kelonggaran untuk bahasa yang tidak mendukung sesuatu yang diperlukan oleh tantangan ini. Sayangnya, saya tidak berpikir saya bisa membuatnya berfungsi hanya melalui parameter baris perintah untuk GolfScript.
lochok
2
Terlihat cukup kompleks sehingga membutuhkan test suite yang bagus.
Peter Taylor
Saya akan mulai mengerjakan satu - tetapi mungkin tidak dilakukan hari ini
lochok
Apakah pengganda skor digabungkan?
jdstankosky
Diperparah. Perhatikan bahwa Anda hanya bisa mendapatkan satu folder level tunggal atau ganda.
lochok

Jawaban:

3

Ruby, skor 505,4 (560 karakter)

x,a,b=gets.chomp.split
f=IO.read('F')
e=f[0,4*X=248].unpack 'A4'*X
s=f[4*X,2*X].unpack 's'*X
d=f[6*X..-1].unpack 'A'+s*'A'
u,v,w,y=[[N=nil,q=e.index(a),!t=e.index(""),"e[t]=a;s[t]=(d[t]=IO.binread('I')).size"],[!q,r=e.index(b),!t,"e[t]=b;d[t]=d[q];s[t]=s[q]"],[!q,N,N,"e[q]=d[q]='';s[q]=0"],[!q,r,N,"e[q]=b"],[!q,N,N,"IO.binwrite('O',d[q])"],[N,N,N,'X.times{|i|e[i]>""&&puts(e[i]+" #{s[i]}")}']]['ICDROL'=~/#{x}/i]
u&&$><<"ERR1\n"||v&&$><<"ERR2\n"||w&&$><<"ERR3\n"||eval(y)
d=d*""
d.size>63488&&$><<"ERR3\n"||IO.write('F',(e+s+[d]).pack('A4'*X+'s'*X+'A63488'))

Catatan:

  • Filesystem terletak di file Fdi direktori saat ini. Fharus ada dan dapat dibuat / diformat melalui perintah berikut: IO.write('F',(([""]*248)+([0]*248)+[""]).pack('A4'*248+'s'*248+'A63488')).
  • File input selalu Ijuga di directoy saat ini, file output O.
  • Karena itu tidak diperlukan untuk memeriksa kesalahan, pastikan untuk mengetik perintah yang benar (yaitu tidak ada perintah yang tidak didukung, tidak ada argumen yang hilang, nama file terlalu panjang).
  • Implementasi sistem file sangat sederhana - untuk setiap perintah, hard drive penuh dibaca ke dalam memori dan dibangun kembali setelah (berhasil) selesai.

Bonus:

  • Nama file mungkin 1-4 karakter
  • Perintah mungkin huruf besar atau kecil

Kode belum sepenuhnya golf tetapi sudah menunjukkan bahwa untuk skor yang lebih baik secara finansial saya akan mencoba pendekatan yang sama sekali berbeda.

Sesi tes (hanya STDIN / STDOUT yang ditampilkan tetapi tentu saja setiap perintah diawali dengan memanggil program di atas):

> L
> I F001
> L
F001 558
> I F001
ERR2
> C F002 F003
ERR1
> C F001 F003
> L
F001 558
F003 558
> C F001 F003
ERR2
> R F002 F003
ERR1
> R F001 F003
ERR2
> R F001 F002
> L
F002 558
F003 558
> O F001
ERR1
> O F002
> L
F002 558
F003 558
> D F001
ERR1
> D F002
> L
F003 558
> C F003 F001
> L
F001 558
F003 558
> D F001
> L
F003 558
> D F003
> L
Howard
sumber
3

Tcl, skor 487.711 (772 bytes)

{*}[set a {interp alias {}}] s {} dict se f
{*}$a u {} dict un f
{*}$a h {} dict g
proc 0 {} {return -level 1}
proc p {n a b} {foreach l $n {proc $l $a "global f c;$b;S"}}
p L\ l {} {puts [join [dict k [h $f {*}$c]] \n]}
p C\ c a\ b {s {*}$c $b [h $f {*}$c $b]}
p D\ d a {u {*}$c $a}
p R\ r a\ b {s {*}$c $a [h $f {*}$c $b];u {*}$c $b}
p I\ i a {set i [open i rb];s {*}$c $a [read $i];close $i}
p O\ o a {set o [open o wb];chan puts $o [h $f {*}$c $a];close $o}
p M\ m a\ b {set d $c;if {$b eq "."} {set d [lrange $c 0 end-1]};s {*}$d $a [h $f {*}$c $a];u {*}$c $a}
p G\ g a {if {$a eq "."} {set c [lrange $c 0 end-1]} {lappend c $a}}
p S {} {puts [set o [open F wb]] $f;close $o;return}
set f [read [set i [open F rb]]]
close $i
set c {}
while 1 {{*}[split [gets stdin]]}

Bonus (harus menangkap semuanya):

  • mendukung nama file dengan 4 byte atau kurang - atau lebih. Saya tidak peduli. 0,95
  • mendukung folder bertingkat 0.7
  • mendukung perintah huruf kecil dan huruf besar 0.95

Keterbatasan yang diketahui:

  • Sistem file Fharus sudah ada. Ruang kosong atau kosong tidak masalah.
  • Saya tidak memeriksa ukuran sistem file - Saya tidak peduli.
  • File input adalah i, file output adalah odan sistem file dalamF
  • Kesalahan akan merusak program.
  • Tidak ada pemeriksaan jika file / direktori ada, mungkin ada kesalahan.
  • Tidak ada perbedaan antara file dan direktori. Ya, Anda dapat menulis direktori untuk menghasilkan dan menggunakan ini sebagai sistem file.
  • Menggunakan file sebagai direktori yang bukan sistem file yang valid akan menghasilkan kesalahan.
  • Tidak ada validasi input. Perintah yang tidak valid dapat menimbulkan kesalahan. Atau tidak:eval puts [expr 1+2]
  • Tidak ada perintah untuk membuat direktori (bukan ide saya), tetapi akan dibuat implisit oleh I(juga bukan ide saya, dan Gtidak membuat)
  • G tidak memvalidasi direktori.
  • Nama file dapat berisi spasi, tetapi antarmuka tidak mendukungnya.
  • Modifikasi bersamaan dari sistem file yang sama tidak didukung.

Beberapa peretasan:

  • eval puts $c -> direktori saat ini, dipisahkan oleh spasi.
  • exit - tidak ada komentar.
  • lappend c . -> beralih ke subdirektori .
Johannes Kuhn
sumber
3

Python 2.7 373 (413 bytes)

from pickle import*
E=exit;o=open;D,I,W='DIw'
def T(i):w[i]in d and E('ERR2')
d=load(o(D))
w=raw_input().split();b=w[0].upper()
if b=='L':
 for k in d:print k,len(d[k])
elif b==I:T(1);d[w[1]]=o(I).read()
else:
 a=w[1];a in d or E('ERR1')
 if b in'RC':T(2);d[w[2]]=(b<D and d.get or d.pop)(a)
 if b==D:d.pop(a)
 if b=='O':o(I,W).write(d[a])
d=dumps(d,-1)
x=65536-len(d)
x>-1or E('ERR3')
o(D,W).write(d+I*x)

Disk disimpan dalam Python pickle-Format: untuk membuat disk kosong Anda harus meletakkan dua byte ini}}. ' di awal dan secara opsional mengisi 65534 byte setelahnya. Mendukung nama file besar yang sewenang-wenang (* 0.95), perintah huruf besar dan kecil (* 0.95) dan tautan keras (:-).

Daniel
sumber