एक स्किटिश प्रोग्राम


17

उद्देश्य

आपको एक प्रोग्राम लिखना है जो nइनपुट (कमांड लाइन से) के रूप में पूर्णांक प्राप्त करता है , और nनिर्देशिका ट्री के नीचे खुद (प्रोग्राम) निर्देशिका को एम्बेड करता है । उदाहरण के साथ n=5:

N = 5 के साथ उदाहरण

फ़ोल्डर के नाम जो आप चाहते हैं हो सकता है। केवल आवश्यकताएं हैं कि गहराई सही है, और यह कि प्रोग्राम को फिर से निर्देशिका ट्री में अपने नए स्थान से चलाया जा सकता है, और यह कि नई स्रोत फ़ाइल उसी फ़ाइल नाम को बनाए रखती है।

बोनस:

  • स्कोर * 0.9 यदि निर्देशिकाओं में एक अलग नाम है (कम से कम 1 000 000 की गहराई तक सही होना चाहिए)
  • स्कोर * 0.5 यदि आप प्रत्यक्ष या अप्रत्यक्ष रूप से स्रोत फ़ाइल को नहीं पढ़ते हैं या स्थानांतरित नहीं करते हैं, या प्रोग्राम के स्रोत कोड का उपयोग कर सकते हैं

1
" स्रोत को पढ़ने " के रूप में क्या मायने रखता है ? आप फ़ाइल का मतलब? या असली स्रोत कोड?
जाइंटट्री

2
@unclemeat यह करता है, क्योंकि फ़ाइल को स्थानांतरित करने के लिए आपको (या सिस्टम) फ़ाइल में डेटा का उपयोग करना होगा।
ग्लोबबी

25
लगता है जैसे आप अपने पोर्न स्टैश को छिपाने की कोशिश कर रहे हैं।
3

3
@globby ln* nix में कमांड के बारे में कैसे ? अगर मैं गलत नहीं हूँ, तो यह फ़ाइल इनोड में एक और प्रविष्टि बना रहा है, और कोई भी सामग्री बिल्कुल नहीं पढ़ी जाती है।
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
का शानदार उपयोग $_!
3

2
इसके बजाय एक char का उपयोग करें - backticks का उपयोग करें $( ): codegolf.stackexchange.com/a/25572/11259
डिजिटल ट्रॉमा

2
पर मेरी टिप्पणी के जवाब पर निर्भर सवाल है, शायद की जगह cpके साथ ln0.5 बोनस भी प्राप्त करने के लिए ...
hjk

2
वेल्स, अब ओपी से अपडेट है, और mvउस 0.5 बोनस से भी प्रतिबंधित है। वह अभी भी lnस्पष्ट में छोड़ देता है, हाँ?
शाम

2
हां, ln(आपको इसकी आवश्यकता नहीं है -s) वास्तव में कार्यक्रम को नई निर्देशिका में रखा जाएगा, ताकि इसे वहां से निष्पादित किया जा सके, बिना कभी पढ़े, चलते हुए या अपने मूल स्रोत तक पहुंच के। मैं कहता हूं कि 13.5 के फाल्कन पंच स्कोर के लिए जाओ!
टोबिया

12

सी, 225 * 0.9 * 0.5 = 101.25

सी में मेरा समाधान:

$ 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

ज़श, 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]

Ungolfed:

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]

Ungolfed:

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

ऑटो इट 3, 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

नोड.जेएस, 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

जे, 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 बाइट्स

इस चुनौती पर मेरी नज़र लंबे समय से थी, लेकिन मैं इसे किसी भी बाहरी कार्यक्रम जैसे ( mkdirऔर ln, अन्यथा, यह बैश समाधान के समान होगा) को बुलाए बिना ज़श में पूरा करना चाहता था । पता चला, Zsh उन कार्यक्रमों के अपने संस्करण प्रदान कर सकता है!

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

इसे ऑनलाइन आज़माएं!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.