机智的程序


17

目的

您将要编写一个程序,该程序接收一个整数n作为输入(从命令行),并将其自身(该程序)n目录嵌入目录树下。范例n=5

n = 5的示例

文件夹名称可以是您想要的任何名称。唯一的要求是深度正确,然后可以从目录树中的新位置再次运行该程序,并且新的源文件保留相同的文件名。

奖金:

  • 得分* 0.9如果目录都具有不同的名称(至少对深度1000万为真)
  • 得分* 0.5如果您不直接或间接读取或移动源文件,或访问程序的源代码

1
什么算作“ 阅读资料 ”?你是说文件吗?还是真正的源代码?
GiantTree 2015年

2
@unclemeat这样做是因为要移动文件,您(或系统)必须访问文件中的数据。
globby 2015年

25
似乎您只是想隐藏自己的色情藏匿处。
Ablue,2015年

3
@globby ln* nix中的命令如何?如果我没有记错的话,它只是在文件inode中创建另一个条目,而根本不会读取任何内容。
hjk 2015年

7
@globby据我所知,除非在硬盘驱动器或分区之间移动,否则移动文件不会读取内容。基本上,它只是更改文件系统中的某些指针。
马丁·恩德

Answers:


36

重击,30 * 0.9 * 0.5 = 13.5

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

以深度为第一个参数。创建到以下目录结构的硬链接:

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

即使rm在旧脚本上运行,该脚本也可以从新位置运行。

说明:

seq -s/ $1输出从1到$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 2015年

2
保存字符-使用反引号代替$( )codegolf.stackexchange.com/a/25572/11259
Digital Trauma

2
根据不同的答案,我对评论的问题,也许更换cpln得到0.5奖金太...
赫尔辛基

2
威尔斯,现在有来自OP的更新,并且mv也不受0.5奖金的限制。那仍然ln是显而易见的,是吗?
hjk 2015年

2
是的,ln(您不需要-s)实际上会将程序放置在新目录中,这样就可以从那里执行该程序,而无需读取,移动或访问其原始源代码。我说FALCON PUNCH分数是13.5!
Tobia

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

在源代码中最有可能有很多高尔夫运动的潜力。


大量使用预处理器!
LeFauve 2015年

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上工作正常)
manatwork

您可以通过删除d之前的字符来保存字符$i吗?
加拿大的卢克REINSTATE MONICA 2015年

@CanadianLuke Huh,我不知道您可以有一个名为的目录1。谢谢
Doorknob

我认为您应该可以使用大括号:for i in {1..$1};{mkdir $i;cd $i};echo $s>f
Ry-

@ U2744SNOWFLAKE谢谢,节省了几个字节。编辑。
门把手

3

Rebol-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字节

我很长时间以来一直在关注这个挑战,但是我想在Zsh中完成它而不调用任何外部程序,例如mkdirand ln(否则,它将与bash解决方案相同)。事实证明,Zsh可以提供那些程序的自己的版本!

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

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.