Skittish 프로그램


17

객관적인

n명령 행에서 입력 으로 정수를 수신 n하고 디렉토리 트리 아래 에 자체 (프로그램) 디렉토리를 임베드하는 프로그램을 작성해야 합니다. 예 n=5:

n = 5 인 예

폴더 이름은 원하는대로 지정할 수 있습니다. 깊이가 정확하고 디렉토리 트리의 새 위치에서 프로그램을 다시 실행할 수 있어야하며 새 소스 파일의 파일 이름이 동일해야합니다.

보너스 :

  • 점수 * 0.9 디렉토리의 이름이 모두 다른 경우 (최소한도는 1 000 000이어야 함)
  • Score * 0.5 소스 파일을 직접 또는 간접적으로 읽거나 이동 하지 않거나 프로그램의 소스 코드에 액세스 하지 않는 경우

1
" 소스 읽기 "로 간주되는 것은 무엇입니까 ? 파일을 의미합니까? 아니면 실제 소스 코드?
GiantTree

2
@unclemeat 파일을 이동하려면 파일 (또는 시스템)이 파일의 데이터에 액세스해야하기 때문에 수행됩니다.
globby

25
포르노 보관함을 숨기려고하는 것 같습니다.
Ablue

3
@globby ln* nix 의 명령은 어떻습니까? 내가 실수하지 않으면 파일 inode에 다른 항목을 만드는 것이므로 내용을 전혀 읽지 않습니다.
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/ $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

2
문자를 저장하십시오. 대신 백틱을 사용하십시오 $( ). codegolf.stackexchange.com/a/25572/11259
Digital Trauma

2
온 내 댓글에 대한 대답에 따라 질문 , 아마 교체 cpln도 0.5 보너스를 얻을 ...
HJK

2
Wells, 이제 OP의 업데이트가 있으며 mv0.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

아마도 소스 코드에 많은 골프 잠재력이있을 것입니다.


전 처리기의 큰 사용!
LeFauve

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

@CanadianLuke Huh, 나는 당신이라는 디렉토리를 가질 수 있다는 것을 결코 알지 못했습니다 1. 감사합니다
Doorknob

중괄호를 사용해야한다고 생각합니다 for i in {1..$1};{mkdir $i;cd $i};echo $s>f.
Ry-

@ U2744SNOWFLAKE 감사합니다. 몇 바이트를 절약했습니다. 편집했습니다.
Doorknob

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

또한 여기 에서 쉘 quine 기술 .


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.
디렉토리의 양에 상관없이 작동합니다. 아마도 파일 시스템이 처리 할 수있는 것보다 더 많은 것일 수도 있습니다. :디

작동 방식 :

인덱스를 문자열에 추가하는 단순한 루프 일뿐입니다. 그런 다음 디렉토리 (및 모든 상위 디렉토리)가 작성되고 파일이 해당 디렉토리로 복사됩니다.


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.linkSyncPOSIX 호출 링크로 매핑하여 하드 링크를 만듭니다. 잘못된 인수는 프로그램을 중단시킵니다.


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을 그것을 완료하고 싶어 mkdir하고 ln(그렇지 않으면 bash는 솔루션과 동일 할 것). Zsh는 해당 프로그램의 자체 버전을 제공 할 수 있습니다.

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

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.