Advanced Code Golf - Hoạt động trên đĩa và phân bổ tệp


8

Chào buổi chiều Golfgeneers.

Đây là câu hỏi hợp lý dài và chi tiết. Cho những gì nó đã yêu cầu, nó cần phải được. Nếu bạn có bất kỳ câu hỏi, xin vui lòng hỏi họ. Nếu có bất cứ điều gì không rõ ràng, xin vui lòng thông báo cho tôi để tôi có thể sửa nó. Đây có lẽ là về phía khó khăn hơn của codegolf.

Chúng tôi đang xây dựng một máy tính nhẹ và chúng tôi cần hệ thống tập tin trọng lượng nhẹ nhất có thể. Mã ngắn nhất sẽ được chọn.

Chúng tôi đang cung cấp một ổ cứng 65536 byte tiên tiến. Vì lợi ích của nguyên mẫu này, nó sẽ là một tệp hình ảnh trực tiếp, mà chương trình của bạn có thể giả sử tồn tại và ở bất kỳ vị trí nào phù hợp với bạn - tức là một tệp nhị phân đại diện cho toàn bộ đĩa cứng. Bạn có thể cho rằng hình ảnh này đã được 'định dạng' - tức là. nếu chương trình của bạn dựa vào một cái gì đó trong tệp để hoạt động, nó có thể. Nếu bạn yêu cầu trạng thái trống ban đầu là một số khác thì tất cả đều là số không, vui lòng cho biết trạng thái đó là gì.

Không có giới hạn bộ nhớ như RAM được sử dụng bởi ứng dụng của bạn.

Các lệnh đầu vào và đầu ra sẽ yêu cầu một giao diện cho ổ cứng thực tế. Giống như hình ảnh đĩa, chương trình của bạn có thể giả sử rằng tệp cho đầu vào tồn tại và là bất cứ nơi nào bạn muốn. Tương tự như vậy, chương trình của bạn có thể xuất ra bất cứ nơi nào thuận tiện. Tuy nhiên, nó phải đóng tệp sau khi thực hiện lệnh đầu vào hoặc đầu ra.

Bạn không được cung cấp một định dạng mà bạn phải sử dụng cho hình ảnh đĩa - bạn có thể tự do phát triển. Nó phải có khả năng lưu trữ tới 248 tệp. Bất kỳ tệp nào lớn hơn 256 byte đều có thể được tính là một tệp mới vì giới hạn này cho mỗi 256 byte hoặc một phần của chúng. Một tệp có thể lên tới 63488 byte. Về cơ bản - nó phải có khả năng như một ổ cứng với 248 cung 256 byte mỗi cái.

Lý do đằng sau các kích thước dường như này là cung cấp cho bạn 2048 byte 'quản trị' - để lưu trữ chi tiết của các tệp. Mỗi tệp / thư mục phải được truy cập bằng tên gồm 4 ký tự chữ và số, có thể phân biệt chữ hoa chữ thường hoặc không nhạy cảm theo sở thích của bạn. Nếu chương trình của bạn hỗ trợ tên của 4 ký tự trở xuống, thì có phần thưởng là số nhân 0,95.

Chương trình của bạn phải chấp nhận, thông qua stdin, các lệnh sau. Các thông số sẽ được phân tách bằng một khoảng trắng. Lệnh sẽ được chấm dứt bởi một dòng mới.

  • L - Liệt kê tên của thiết bị xuất chuẩn của tất cả các tệp hiện tại và kích thước của chúng theo byte, được phân tách bằng dòng mới.
  • C ab - Sao chép tập tin a sang tập tin mới b.
  • D a - Xóa tập tin a
  • R ab - Đổi tên tập tin a thành tên mới b
  • I a - Thêm tệp đầu vào (xem ghi chú ở trên) dưới dạng tệp a
  • O a - Đầu ra tệp a đến tệp đầu ra

Các lỗi sau có thể được báo cáo cho STDOUT hoặc STDERR là lý do hợp lệ để lệnh không thực thi. Bạn có thể chọn chỉ in ERR # trong đó # là số lỗi:

  • 1 - Tệp không tồn tại
  • 2 - Tệp đã tồn tại
  • 3 - Hết dung lượng *

* Lưu ý rằng chương trình của bạn không thể phát hành điều này chỉ vì nó nằm ngoài không gian liên tục. Nếu bạn vẫn có sẵn các cung, bạn phải chống phân mảnh đĩa để làm cho nó hoạt động.

Một hệ thống thư mục là tùy chọn - tuy nhiên, sẽ lấy thêm phần thưởng 0,8 cho số điểm của bạn. Nếu nó hỗ trợ nhiều hơn 1 cấp thư mục, nó sẽ kiếm được phần thưởng là 0,7 nhân (không phải là 0,8). Để nhận tiền thưởng, bạn phải có

  • L, R, C và D chỉ hoạt động trong thư mục hiện tại. L phải liệt kê các thư mục trong thư mục hiện tại, cũng như các tệp.
  • Lệnh mới M ab di chuyển tệp a đến thư mục b. Nếu b là '.', Di chuyển tệp đến giám đốc mẹ
  • Lệnh mới G a vào thư mục a. Nếu a là '.', Chuyển đến thư mục cha
  • R cũng phải đổi tên thư mục
  • D cũng phải xóa các thư mục và mọi tệp / thư mục trong đó
  • C cũng phải sao chép các thư mục và bất kỳ tệp / thư mục nào trong đó

Các lỗi bổ sung sau đây có thể được báo cáo cho STDOUT hoặc STDERR là lý do hợp lệ để lệnh không thực thi.

  • 4 - Thư mục không tồn tại
  • 5 - Tệp, không yêu cầu thư mục - trong đó, tôi và O yêu cầu tên tệp và một thư mục đã được cung cấp

Điểm số của bạn là:

  • Kích thước, tính bằng byte, của mã nguồn của bạn
  • Nhân với

    • 0,95 nếu bạn hỗ trợ tên của 4 hoặc ít hơn các ký tự
    • 0,8 nếu bạn hỗ trợ một cấp thư mục
    • 0,7 nếu bạn hỗ trợ nhiều cấp độ thư mục
    • 0,95 nếu bạn hỗ trợ các lệnh (không nhất thiết phải là tên tệp) bằng chữ thường hoặc chữ hoa

Chúc may mắn.


Tôi sẵn sàng trợ cấp cho các ngôn ngữ không hỗ trợ điều gì theo yêu cầu của thử thách này. Thật không may, tôi không nghĩ rằng tôi có thể làm cho nó hoạt động chỉ thông qua các tham số dòng lệnh cho GolfScript.
lochok

2
Trông đủ phức tạp để cần một bộ thử nghiệm tốt.
Peter Taylor

Tôi sẽ bắt đầu làm việc trên một - nhưng có thể không được thực hiện hôm nay
lochok

Là bội số điểm gộp?
jdstankosky

Hợp chất. Lưu ý rằng bạn chỉ có thể nhận được một trong các cấp hoặc một cấp thư mục.
lochok

Câu trả lời:


3

Ruby, điểm số 505,4 (560 ký tự)

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'))

Ghi chú:

  • Hệ thống tập tin được đặt trong tập tin Ftrong thư mục hiện tại. Fphải tồn tại và có thể được tạo / định dạng thông qua lệnh sau : IO.write('F',(([""]*248)+([0]*248)+[""]).pack('A4'*248+'s'*248+'A63488')).
  • Tập tin đầu vào luôn luôn Itrong directoy hiện tại, tập tin đầu ra là O.
  • Vì không bắt buộc phải kiểm tra lỗi, hãy đảm bảo nhập các lệnh chính xác (nghĩa là không có lệnh không được hỗ trợ, không thiếu đối số, tên tệp quá dài).
  • Việc thực hiện hệ thống tệp cực kỳ đơn giản - với mỗi lệnh, toàn bộ ổ cứng được đọc vào bộ nhớ và xây dựng lại khi hoàn thành (thành công).

Tiền thưởng:

  • Tên tệp có thể là 1-4 ký tự
  • Các lệnh có thể là chữ hoa hoặc chữ thường

Mã chưa được đánh gôn hoàn toàn nhưng đã cho thấy rằng để có điểm số tài chính tốt hơn, tôi sẽ thử một cách tiếp cận hoàn toàn khác.

Phiên kiểm tra (chỉ STDIN / STDOUT được hiển thị nhưng tất nhiên mỗi lệnh được chuẩn bị trước bằng cách gọi chương trình trên):

> 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

3

Tcl, điểm 487,711 (772 byte)

{*}[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]]}

Tiền thưởng (phải nắm bắt tất cả):

  • tên tệp hỗ trợ có 4 byte trở xuống - hoặc nhiều hơn. Tôi không quan tâm. 0,95
  • hỗ trợ các thư mục đa cấp 0,7
  • hỗ trợ các lệnh viết thường và viết thường 0.95

Những hạn chế đã biết:

  • Hệ thống tập tin Fphải tồn tại. Trống hoặc khoảng trắng là tốt.
  • Tôi không kiểm tra kích thước của hệ thống tệp - Tôi không quan tâm.
  • Tệp đầu vào là i, outputfile là ovà hệ thống tệp nằm trongF
  • Lỗi sẽ làm hỏng chương trình.
  • Không kiểm tra nếu tập tin / thư mục tồn tại, có thể là một lỗi.
  • Không có sự khác biệt giữa một tập tin và một thư mục. Có, bạn có thể viết một thư mục để xuất ra và sử dụng nó làm hệ thống tập tin.
  • Sử dụng tệp làm thư mục không phải là hệ thống tệp hợp lệ sẽ dẫn đến lỗi.
  • Không có xác nhận đầu vào. Các lệnh không hợp lệ có thể gây ra lỗi. Hay không:eval puts [expr 1+2]
  • Không có lệnh để tạo một thư mục (không phải là ý tưởng của tôi), nhưng sẽ được tạo ra ẩn I(cũng không phải ý tưởng của tôi và Gkhông tạo ra)
  • G không xác nhận thư mục.
  • Tên tệp có thể chứa khoảng trắng, nhưng giao diện không hỗ trợ chúng.
  • Sửa đổi đồng thời của cùng một hệ thống tập tin không được hỗ trợ.

Một số hack:

  • eval puts $c -> thư mục hiện tại, cách nhau bởi khoảng trắng.
  • exit - miễn bình luận.
  • lappend c . -> chuyển sang thư mục con .

3

Python 2.7 373 (413 byte)

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)

Đĩa được lưu trong Định dạng dưa chua Python: để tạo một đĩa trống, bạn phải đặt hai byte này '}.' ở đầu và tùy chọn 65534 điền byte sau đó. Hỗ trợ tên tệp lớn tùy ý (* 0.95), lệnh viết hoa và viết thường (* 0.95) và liên kết cứng (:-).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.