Скітська програма


17

Об'єктивна

Ви повинні написати програму, яка отримує ціле число у nвигляді введення (з командного рядка) та вбудовує nкаталоги (програма) в дерево каталогів. Приклад із n=5:

Приклад з n = 5

Назви папок можуть бути якими завгодно. Єдині вимоги полягають у тому, що глибина правильна, а потім програма може бути запущена знову зі свого нового місця в дереві каталогів і щоб новий вихідний файл зберігав те саме ім’я файлу.

Бонуси:

  • Оцінка * 0,9 Якщо всі каталоги мають іншу назву (має бути правдою принаймні на глибину 1 000 000)
  • Оцінка * 0,5. Якщо ви прямо чи опосередковано не читаєте чи не переміщаєте вихідний файл, чи отримуєте доступ до вихідного коду програми

1
Що вважається " читанням джерела "? Ви маєте на увазі файл? Або реальний вихідний код?
GiantTree

2
@unclemeat Це так, оскільки для переміщення файлу ви (або система) повинні отримати доступ до даних у файлі.
глобус

25
Схоже, ви просто намагаєтесь приховати свій порно-скрипт.
Аблуї

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
В залежності від відповіді на мій коментар щодо питання , може замінити cpз , lnщоб отримати 0,5 бонус теж ...
ХІК

2
Уеллс, зараз є оновлення від ОП, а 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

Напевно, у вихідному коді багато потенціалу для гольфу.


Прекрасне використання препроцесора!
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) (Тільки для запису, мені не bashвдалося з 4.3.11: "помилка синтаксису поблизу несподіваного zsh
маркера`

Чи можете ви зберегти персонажа, видаливши dпопереднє $i?
Канадський Люк ВІДНОВЛЕНО МОНИЦА

@CanadianLuke Хм, я ніколи не знав, що ти можеш мати каталог з назвою 1. Спасибі
Дверна ручка

Я думаю , що ви повинні бути в змозі використати фігурні дужки: for i in {1..$1};{mkdir $i;cd $i};echo $s>f.
Ри-

@ 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 байт

Я довго мав очі на цьому виклику, але хотів завершити його в Zsh, не викликаючи жодних зовнішніх програм на кшталт mkdirі ln(інакше це було б ідентично баш-рішенню). Виявляється, Zsh може надати власні версії цих програм!

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

Спробуйте в Інтернеті!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.