Ürkek Bir Program


17

Amaç

nGirdi olarak bir tamsayı alan (komut satırından) bir program yazmanız ve ndizin programının kendisine (program) dizinlerini gömmeniz gerekir . İle örnek n=5:

N = 5 ile örnek

Klasör adları istediğiniz gibi olabilir. Tek gereksinim, derinliğin doğru olması ve programın dizin ağacındaki yeni noktasından tekrar çalıştırılabilmesi ve yeni kaynak dosyasının aynı dosya adını tutmasıdır.

Bonuslar:

  • Skor * 0.9 Dizinlerin hepsi farklı bir isme sahipse (en azından 1000 000 derinliğe kadar doğru olmalıdır)
  • Skoru * 0.5 Eğer yoksa doğrudan veya dolaylı olarak programın kaynak kodunu okumak veya kaynak dosya veya erişimi taşımak

1
" Kaynağı okumak " olarak sayılan nedir ? Dosya mı demek istiyorsun? Veya gerçek kaynak kodu?
GiantTree

2
@unclemeat Dosyayı taşımak için sizin (veya sistemin) dosyadaki verilere erişmesi gerekir.
globby

25
Görünüşe göre sadece porno saklamanı saklamaya çalışıyorsun.
Ablue

3
@globby ln* nix'teki komuta ne dersiniz ? Yanılmıyorsam, sadece dosya inode'una başka bir giriş yaratıyor ve hiçbir içerik okunmuyor.
hjk

7
@globby Bildiğim kadarıyla, sabit sürücüler veya bölümler arasında geçiş yapmadığınız sürece bir dosyayı taşımak içeriği okumaz. Temelde sadece dosya sistemindeki bazı işaretçileri değiştiriyor.
Martin Ender

Yanıtlar:


36

Bash, 30 * 0.9 * 0.5 = 13.5

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

Derinliği ilk argüman olarak alır. Aşağıdaki dizin yapısında kendisine sabit bir bağlantı oluşturur:

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

Komut dosyası daha sonra rmeski komut dosyasında çalıştırılsa bile yeni konumdan çalıştırılabilir.

Açıklama:

seq -s/ $11'den $1(ilk bağımsız değişkene) sayıları eğik çizgi ile ayırarak verir.

mkdir -p `seq -s` $1tarafından belirtilen dizini seq, -ptüm ara dizinleri oluşturarak oluşturur.

ln $0 $_ yeni oluşturulan dizinde çalışmakta olan komut dosyasına sabit bir bağlantı oluşturun.

Eski (30 * 0,9 = 27):

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

Örnek çalışma (ln ile):

$ 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

Yerine öneri için @DigitalTrauma sayesinde $(..)ile`..`

@Hjk önerisi için teşekkürler ln.


6
Mükemmel kullanımı $_!
wchargin

2
Char kaydedin - yerine backticks kullanın $( ): codegolf.stackexchange.com/a/25572/11259
Digital Trauma

2
Benim yorumum cevabını bağlı sorusuna , belki yerini cpile ln... çok 0,5 ikramiye almak için
HJK

2
Wells, şimdi OP'den güncelleme var ve mvaynı zamanda bu 0.5 bonus ile sınırlı. Bu hala lnaçık, değil mi?
hjk

2
Evet, ln(eğer gerek yok -saslında hiç okuma hareketli veya orijinal kaynağına erişmeden, oradan çalıştırılabilir, böylece, yeni dizinde programı yerleştirir). 13.5 FALCON PUNCH puanı için git!
Tobia

12

C, 225 * 0.9 * 0.5 = 101.25

C çözümüm:

$ 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)))

Burada biraz daha okunabilir bir biçimde:

#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)))

Çalışıp çalışmadığını kontrol edin:

$ 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

Büyük olasılıkla kaynak kodunda çok fazla golf potansiyeli var.


Önişlemcinin büyük kullanımı!
LeFauve

5

Parti - 48 * 0.9 = 43.2

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

Bu komut dosyası yeni bir dizin oluşturur ve kaynak dosyayı dizine taşır 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

Misal:

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) (Sadece kayıt için, bash4.3.11 ile benim için başarısız : “sözdizimi hatası beklenmedik jetona yakın; '”. Ancak zsh5.0.2 ile iyi çalışıyor )
manatwork

Eğer kaldırarak bir karakteri kurtarabilecek dönce $i?
Kanadalı Luke REINSTATE MONICA

@CanadianLuke Huh, adında bir dizininizin olabileceğini hiç bilmiyordum 1. Teşekkürler
Kapı Tokmağı

Sana süslü parantez kullanmak gerekir düşünüyorum: for i in {1..$1};{mkdir $i;cd $i};echo $s>f.
Ry-

@ U2744SNOWFLAKE Teşekkürler, bu birkaç bayt tasarruf etti. Düzenlenen.
Kapı tokmağı

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]

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
]


Orijinal non-quine versiyonu - 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

Bash 167 * 0.5 * 0.9 = 75.15

@ Es1024'ün büyük cevabından yoğun bir şekilde borçlanmak , ancak bu gerçek bir kınadır, bu yüzden her iki bonus için de yeterlidir.

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

Ayrıca, buradan kabuk quine teknikleri .


1

AutoIt3, 106 * 0,9 = 95,4 bayt


Biraz uzun ama bu uzun fonksiyon / değişken isimleri ile yardımcı olamaz:

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

Basitçe ile diyoruz <script/.exe name> <depth>mesela. script.exe 5.
Herhangi bir dizin için çalışacaktır; belki de dosya sisteminizin üstesinden gelebilir. : D

Nasıl çalışır:

Dizini bir dizeye ekleyen basit bir döngü. Ardından dizin (ve tüm üst dizinler de) oluşturulur ve dosya kendisini bu dizine kopyalar.


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.linkSyncsabit bir bağlantı oluşturan POSIX arama bağlantısıyla eşleşir . Geçersiz bir argüman programın çökmesine neden olur.


1

J, 82 * 0.9 = 73.8

Bu çoğunlukla en çok oy alan cevabın bir limanı.

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

skittish.ijsİstediğiniz veya istediğiniz gibi kaydedin ve sürümünüzü kullanarak komut satırından çağırın jconsole. Benimki şuna bağlandı 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 bayt

Gözlerimi uzun süredir bu meydan okumada gördüm, ancak Zsh'da mkdirve gibi harici programları çağırmadan tamamlamak istedim ln(aksi takdirde bash çözümü ile aynı olurdu). Anlaşılan, Zsh bu programların kendi sürümlerini sağlayabilir!

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

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.