高度なコードゴルフ-ディスク操作とファイル割り当て


8

こんにちは、Golfgeneers。

これはかなり長く詳細な質問です。それが求めていることを考えると、それはそうである必要がありました。ご不明な点がございましたらお尋ねください。不明な点がありましたら、私に知らせて修正してください。これはおそらくコードゴルフのより厳しい側面にあります。

私たちは軽量のコンピュータを構築しており、できるだけ軽量なファイルシステムが必要です。最短のコードが選択されます。

私たちは最先端の65536バイトのハードドライブを提供しています。このプロトタイプのために、それは直接のイメージファイルであり、プログラムが存在すると想定でき、適切な場所にあります。つまり、ハードディスク全体を表すバイナリファイルです。この画像はすでに「フォーマット済み」であると想定できます。プログラムがファイル内の何かに依存している場合、それは可能です。初期の空の状態をすべて0以外にする必要がある場合は、その状態を説明してください。

アプリケーションが使用するRAMについては、メモリ制限はありません。

入出力コマンドには、実際のハードドライブへのインターフェースが必要です。ディスクイメージと同様に、プログラムは入力用のファイルが存在し、どこにでも置くことができると想定できます。同様に、プログラムは都合のよい場所に出力できます。ただし、入力または出力コマンドの実行後にファイルを閉じる必要があります。

ディスクイメージに使用する必要のあるフォーマットが提供されていません。独自のフォーマットを自由に作成できます。最大248個のファイルを保存できる必要があります。256バイトを超えるファイルはすべて、256バイトごとまたはその一部に対するこの制限のために、新しいファイルとしてカウントできます。ファイルは最大63488バイトです。基本的には、256バイトの248セクターのハードドライブと同じくらいの能力が必要です。

これらの見かけ上のサイズの背後にある理由は、2048バイトの「管理」を提供することです-ファイルの詳細を保存するためです。各ファイル/フォルダは、4つの英数字の名前でアクセスできる必要があります。これは、好みに応じて、大文字と小文字を区別する場合と区別しない場合があります。プログラムが4文字以下の名前をサポートしている場合、0.95乗数のボーナスがあります。

プログラムは、stdinを介して次のコマンドを受け入れる必要があります。パラメータはスペースで区切られます。コマンドは改行で終了します。

  • L-現在のすべてのファイルの標準出力する名前とそれらのサイズを改行で区切ってバイト単位でリストします。
  • C ab-ファイルaを新しいファイルbにコピーします。
  • D a-ファイルaを削除
  • R ab-ファイルaの名前を新しい名前bに変更します。
  • I a-入力ファイル(上記の注を参照)をファイルaとして追加します
  • O a-出力ファイルに出力ファイルa

コマンドの実行に失敗する正当な理由として、次のエラーがSTDOUTまたはSTDERRに報告される場合があります。ERR#のみを印刷するように選択できます。#はエラーの番号です。

  • 1-ファイルが存在しません
  • 2-ファイルはすでに存在します
  • 3-スペース不足*

*プログラムは、連続したスペースが不足しているという理由だけでこれを発行できないことに注意してください。それでも使用可能なセクターがある場合は、ディスクを最適化して機能させる必要があります。

フォルダーシステムはオプションですが、スコアに0.8乗数のボーナスが加算されます。1レベルを超えるディレクトリをサポートしている場合、(0.8に加えて)0.7乗数のボーナスを獲得します。ボーナスについては、

  • L、R、C、Dは、現在のディレクトリ内でのみ機能します。Lは、現在のディレクトリ内のフォルダとファイルを一覧表示する必要があります。
  • 新しいコマンドM abは、ファイルaをフォルダーbに移動します。bが「。」の場合、ファイルを親ディレクターに移動します
  • 新しいコマンドG aはフォルダーaに移動します。aが「。」の場合、親フォルダーに移動します
  • Rはフォルダの名前も変更する必要があります
  • Dはフォルダとその中のファイル/フォルダも削除する必要があります
  • Cはフォルダとその中のファイル/フォルダもコピーする必要があります

コマンドの実行に失敗する正当な理由として、次の追加のエラーがSTDOUTまたはSTDERRに報告される場合があります。

  • 4-フォルダーは存在しません
  • 5-フォルダーではなくファイルが必要です-ここで、IとOはファイル名を必要とし、フォルダーが指定されています

あなたのスコアは:

  • ソースコードのサイズ(バイト単位)
  • 掛ける

    • 4文字以下の名前をサポートする場合は0.95
    • 単一レベルのフォルダーをサポートする場合は0.8
    • 0.7複数のレベルのフォルダーをサポートする場合
    • 小文字または大文字のコマンド(必ずしもファイル名ではない)をサポートする場合は0.95

幸運を。


この課題で必要とされるものをサポートしていない言語を考慮に入れます。残念ながら、GolfScriptのコマンドラインパラメーターだけで機能させることはできないと思います。
lochok 2013

2
良いテストスイートを必要とするほど複雑に見えます。
Peter Taylor

私は1つに取り組んでいきますが、今日は完了しない可能性があります
lochok

スコア乗数は複合されていますか?
jdstankosky 2013

複合。ただし、単一レベルまたは複数レベルのフォルダーの1つしか取得できないことに注意してください。
lochok 2013

回答:


3

ルビー、スコア505.4(560文字)

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

ノート:

  • ファイルシステムはF、現在のディレクトリのファイルにあります。F存在している必要があり、次のコマンドで作成/フォーマットできます:IO.write('F',(([""]*248)+([0]*248)+[""]).pack('A4'*248+'s'*248+'A63488'))
  • 入力ファイルは常にI現在のディレクトリにもあり、出力ファイルはOです。
  • エラーをチェックする必要はなかったので、必ず正しいコマンドを入力してください(つまり、サポートされていないコマンド、不足している引数、ファイル名が長すぎるなど)。
  • ファイルシステムの実装は非常に簡単です。コマンドごとに、ハードドライブ全体がメモリに読み込まれ、(成功した)完了時に再構築されます。

ボーナス:

  • ファイル名は1〜4文字にすることができます
  • コマンドは大文字でも小文字でもかまいません

コードはまだ完全にはゴルフされていませんが、実質的なより良いスコアのために、私は完全に異なるアプローチを試すことをすでに示しています。

テストセッション(STDIN / STDOUTのみが表示されていますが、もちろん上記のプログラムを呼び出すことにより、各コマンドの先頭に追加されます):

> 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、スコア487,711(772バイト)

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

ボーナス(それらをすべて取得する必要があります):

  • 4バイト以下またはそれ以上のファイル名をサポートします。私は気にしません。0.95
  • マルチレベルフォルダー0.7をサポート
  • 小文字と大文字のコマンド0.95をサポート

既知の制限:

  • ファイルシステムFはすでに存在している必要があります。空または空白は問題ありません。
  • ファイルシステムのサイズはチェックしません-気にしません。
  • 入力ファイルはi、出力ファイルは、oファイルシステムはF
  • エラーはプログラムをクラッシュさせます。
  • ファイル/ディレクトリが存在するかどうかのチェックは行われません。エラーの可能性があります。
  • ファイルとディレクトリに違いはありません。はい、ディレクトリを書き込んで出力し、これをファイルシステムとして使用できます。
  • 有効なファイルシステムではないディレクトリとしてファイルを使用すると、エラーが発生します。
  • 入力検証なし。無効なコマンドはエラーをスローする場合があります。か否か:eval puts [expr 1+2]
  • ディレクトリを作成するコマンドはありませんI(私のアイデアではありGませんでした)が暗黙的に作成されます(これも私のアイデアではなく、作成されません)
  • G ディレクトリを検証しません。
  • ファイル名にはスペースを含めることができますが、インターフェースはそれらをサポートしていません。
  • 同じファイルシステムの同時変更はサポートされていません。

いくつかのハック:

  • eval puts $c ->スペースで区切られた現在のディレクトリ。
  • exit - コメント無し。
  • lappend c . ->サブディレクトリに切り替えます .

3

Python 2.7 373(413バイト)

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)

ディスクはPythonのピクル形式で保存されます。空のディスクを作成するには、これらの2バイトを挿入する必要があります '}'。最初に、そしてオプションで65534がその後にバイトを埋めます。任意の大きなファイル名(* 0.95)、大文字と小文字のコマンド(* 0.95)、ハードリンク(:-)をサポートします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.