Skittishプログラム


17

目的

n入力として(コマンドラインから)整数を受け取り、それ自体(プログラム)のnディレクトリをディレクトリツリーに埋め込むプログラムを作成します。例n=5

n = 5の例

フォルダ名はあなたが望むものなら何でもかまいません。唯一の要件は、深さが正しく、プログラムをディレクトリツリーの新しい場所から再度実行できること、および新しいソースファイルが同じファイル名を保持することです。

ボーナス:

  • スコア* 0.9すべてのディレクトリの名前が異なる場合(少なくとも深さ1 000 000に該当する必要があります)
  • スコア* 0.5ソースファイルを直接または間接的に読み取ったり移動したりしない場合、またはプログラムのソースコードにアクセスしない場合

1
ソースの読み取り」とは何ですか?ファイルですか?それとも本当のソースコード?
ジャイアントツリー

2
@unclemeatファイルを移動するには、ユーザー(またはシステム)がファイル内のデータにアクセスする必要があるためです。
-Globby

25
ポルノの隠し場所を隠そうとしているようです。
アブルー

3
@globby ln* nix のコマンドはどうですか?間違っていない場合は、ファイルiノードに別のエントリを作成しているだけで、コンテンツはまったく読み込まれていません。
hjk

7
@globby私が知っている限りでは、ファイルを移動しても、ハードドライブまたはパーティション間を移動していない限り、内容は読み込まれません。基本的には、ファイルシステム内のいくつかのポインターを変更するだけです。
マーティンエンダー

回答:


36

バッシュ、30 * 0.9 * 0.5 = 13.5

mkdir -p `seq -s/ $1`;ln $0 $_

最初の引数として深さを取ります。次のディレクトリ構造に自身へのハードリンクを作成します。

1/2/3/4/5/.../n

スクリプトはrm、古いスクリプトで実行された場合でも、新しい場所から実行できます。

説明:

seq -s/ $11から$1(最初の引数)までの数字をスラッシュで区切って出力します。

mkdir -p `seq -s` $1で指定されたディレクトリseq-p作成し、すべての中間ディレクトリを作成します。

ln $0 $_ 新しく作成されたディレクトリに現在実行中のスクリプトへのハードリンクを作成します。

古い(30 * 0.9 = 27):

mkdir -p `seq -s/ $1`;cp $0 $_

実行例(lnを使用):

$ ls -lGR
.:
total 1
-rwx------+ 1 ducks 41 Jan  5 15:00 test.sh

$ ./test.sh 4

$ ls -lgR
.:
total 1
drwxr-xr-x+ 1 ducks  0 Jan  5 15:01 1
-rwx------+ 2 ducks 41 Jan  5 15:00 test.sh

./1:
total 0
drwxr-xr-x+ 1 ducks 0 Jan  5 15:01 2

./1/2:
total 0
drwxr-xr-x+ 1 ducks 0 Jan  5 15:01 3

./1/2/3:
total 0
drwxr-xr-x+ 1 ducks 0 Jan  5 15:01 4

./1/2/3/4:
total 1
-rwx------+ 2 ducks 41 Jan  5 15:00 test.sh

$ rm ./test.sh

$ ls -lg
total 0
drwxr-xr-x+ 1 ducks 0 Jan  5 15:01 1

$ ls -lg 1/2/3/4
total 1
-rwx------+ 1 ducks 41 Jan  5 15:00 test.sh

交換する提案のための@DigitalTraumaのおかげ$(..)`..`

使用する提案をしてくれた@hjkに感謝しますln


6
の素晴らしい使用$_
-wchargin

2
使用バッククォートの代わりに-文字割引$( )codegolf.stackexchange.com/a/25572/11259
デジタルトラウマ

2
上の私のコメントへの回答に応じて質問、多分置き換えるcpln...あまりにも0.5ボーナスを得るために
HJK

2
さて、OPからのアップデートmvがあり、0.5ボーナスからの制限もあります。それはまだlnクリアのままですよね?
hjk

2
はい、ln(必要ありません-s)実際にプログラムを新しいディレクトリに配置し、元のソースを読み取ったり、移動したり、アクセスしたりすることなく、そこから実行できるようにします。FALCON PUNCHスコア13.5に行きましょう!
トビア

12

C、225 * 0.9 * 0.5 = 101.25

Cでの私のソリューション:

$ cat d.c
#define R(x)#x
#define T(x)R(x)
#define S(p)b[9];main(i,v)char**v;{for(i=atoi(v[1]);i--;sprintf(b,"%i",i),mkdir(b),chdir(b));fputs("#define R(x)#x\n#define T(x)R(x)\n#define S(p)"p"\nS(T(S(p)))",fopen("d.c","w"));}
S(T(S(p)))

ここでやや読みやすい形式で:

#define R(x) #x
#define T(x) R(x)
#define S(p) char b[9];\
             main(int i,char**v) { \
                for(i=atoi(v[1]); i--; sprintf(b,"%i",i), \
                                       mkdir(b), \
                                       chdir(b)); \
                fputs("#define R(x) #x\n" \
                      "#define T(x) R(x)\n" \
                      "#define S(p) " p "\n" \
                      "S(T(S(p)))", \
                      fopen("d.c", "w")); \
             }
S(T(S(p)))

動作するかどうかのチェック:

$ gcc -o d d.c
# a lot of warning and notes from gcc ... 
$ ./d 10
$ diff -s d.c 9/8/7/6/5/4/3/2/1/0/d.c
Files d.c and 9/8/7/6/5/4/3/2/1/0/d.c are identical

ほとんどの場合、ソースコードには多くのゴルフの可能性があります。


プリプロセッサの素晴らしい使用!
ルフォーブ

5

バッチ-48 * 0.9 = 43.2

for /l %%a in (1,1,%1)do md %%a&cd %%a&move..\%0

このスクリプトは、新しいディレクトリを作成し、ソースファイルをそのディレクトリに移動するだけです- n回。

H:\MyDocuments\uprof\top>embed.bat 5

     ...

H:\MyDocuments\uprof\top>tree /f
Folder PATH listing for volume DATA009_HOMES
Volume serial number is B88B-384C
H:.
└───1
    └───2
        └───3
            └───4
                └───5
                        embed.bat

5

Zsh、63 60 58 52 * 0.9 = 56.7 54 52.2 46.8

s=$(<$0);for i in {1..$1};{mkdir $i;cd $i};echo $s>f

例:

llama@llama:...Code/misc/foo$ zsh f 5
llama@llama:...Code/misc/foo$ ls -R
.:
d1  f

./d1:
d2

./d1/d2:
d3

./d1/d2/d3:
d4

./d1/d2/d3/d4:
d5

./d1/d2/d3/d4/d5:
f
llama@llama:...Code/misc/foo$ cat d1/d2/d3/d4/d5/f 
s=$(cat $0);for i in {1..$1};do;mkdir d$i;cd d$i;done;echo $s>f
llama@llama:...Code/misc/foo$ cat f
s=$(cat $0);for i in {1..$1};do;mkdir d$i;cd d$i;done;echo $s>f
llama@llama:...Code/misc/foo$ diff f d1/d2/d3/d4/d5/f
llama@llama:...Code/misc/foo$

UUOC s=$(<$0)(記録のためだけに、bash4.3.11 で失敗します:「予期しないトークン `; 'に近い構文エラー」。しかしzsh5.0.2では問題なく動作します)
マナトワーク

d以前を削除してキャラクターを保存できます$iか?
カナダのルークレインステートモニカ

@CanadianLukeええと、という名前のディレクトリがあることを私は知りませんでした1。ありがとう
ドアノブ

中括弧を使用できるはずです:for i in {1..$1};{mkdir $i;cd $i};echo $s>f
Ry-

@ U2744SNOWFLAKEおかげで、数バイト節約できました。編集済み。
ドアノブ

3

レボル-114 * 0.9 * 0.5 = 51.3

do b:[d: copy %./ repeat n do input[mkdir repend d[n"/"]]write join d s: system/options/script join"do b: "mold b]

ゴルフをしていない:

do b: [
    d: copy %./
    repeat n do input [
        mkdir repend d [n "/"]
    ]
    write join d s: system/options/script join "do b: " mold b
]


オリジナルの非クインバージョン-90 * 0.9 = 81

d: %./ repeat n do input[mkdir repend d[n"/"]write join d s: system/options/script read s]

ゴルフをしていない:

d: %./
repeat n do input [
    mkdir repend d [n "/"]
]
write join d s: system/options/script read s

2

バッシュ167 * 0.5 * 0.9 = 75.15

@ es1024の素晴らしい回答から大きく借りていますが、これは真のクインなので、両方のボーナスの対象となります。

b=\' c=\\ a='d=`seq -s/ $1`;mkdir -p $d;echo b=$c$b c=$c$c a=$b$a$b>>$d/$0;echo $a>>$d/$0'
d=`seq -s/ $1`;mkdir -p $d;echo b=$c$b c=$c$c a=$b$a$b>>$d/$0;echo $a>>$d/$0

また、ここからシェルクインテクニック。


1

AutoIt3、106 * 0,9 = 95,4バイト


少し長いですが、私はそれらの長い関数/変数名で助けることができません:

$f = @WorkingDir
For $i = 1 To $CmdLine[1]
    $f &= "\" & $i
Next
DirCreate($f)
FileCopy(@ScriptFullPath, $f)

単にそれを呼び出す<script/.exe name> <depth>など。script.exe 5
任意の量のディレクトリで機能します。あなたのファイルシステムが処理できる以上のものかもしれません。:D

使い方:

これは、文字列にインデックスを追加する単純なループです。次に、ディレクトリ(およびすべての親ディレクトリ)が作成され、ファイルはそのディレクトリに自分自身をコピーします。


1

Node.js、136 133 * 0.9 * 0.5 = 61.2 59.85

r=require,f=r('fs'),p=__dirname;while(i=process.argv[2]--)f.mkdirSync(p+='/'+i);f.linkSync(a=__filename,p+'/'+r('path').basename(a))

fs.linkSyncハードリンクを作成するPOSIX呼び出しリンクにマップします。引数が無効な場合、プログラムがクラッシュします。


1

J、82 * 0.9 = 73.8

これは主に、トップ投票の回答の移植版です。

exit (1!:1[1{A) 1!:2 <] (s,'/',>1{A)[fpathcreate s=:' /'charsub":1+i.".>{:A=:ARGV

名前を付けて保存するskittish.ijsか、好きなものを保存し、バージョンのを使用してコマンドラインから呼び出しますjconsole。私にシンボリックリンクされていjcます:

$ jc skittish.ijs 20
$ ls 1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/skittish.ijs 
1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/skittish.ijs

0

Zsh、55 * 0.9 * 0.5 = 24.75バイト

私は長い間この課題に目を向けていましたが、mkdirandなどの外部プログラムを呼び出さずにZshでそれを完了したかったですln(そうでなければ、bashソリューションと同じになります)。結局のところ、Zshはこれらのプログラムの独自のバージョンを提供できます!

zmodload zsh/files
mkdir -p ${(j:/:):-{1..$1}}
ln $0 $_

オンラインでお試しください!

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