개 배쉬 유틸리티 구현


10

dog 임의의 수의 인수를 취하는 명령 행 유틸리티입니다. 첫 번째는 작성 될 텍스트이고 다른 하나는 임의로 많은 파일입니다.

dog유틸리티는 텍스트를이 파일들에 대해 동일한 부분으로 나눕니다. 나머지가 있으면 n첫 번째 n파일은 추가 바이트를 얻습니다.

dogcatforall과 반대되는 x것은 다음과 같습니다.

$> dog x a.txt b.txt ...
$> cat a.txt b.txt ...
x$>

여기서 ...임의로 많은 파일을 나타냅니다.

예 (12 바이트, 3 개 파일을 균등하게 분할 할 수 있음) :

$> ./dog.py "Dogs vs Cats" a.txt b.txt c.txt
$> cat a.txt
Dogs$> cat b.txt
 vs $> cat c.txt
Cats$> cat a.txt b.txt c.txt
Dogs vs Cats$> 

나머지가있는 예 (13 바이트, 5 개 파일, 나머지 3 개) :

9$>./dog.py "0123456789abc" a.txt b.txt c.txt d.txt e.txt
$> cat a.txt
012$> cat b.txt
345$> cat c.txt
678$> cat d.txt
9a$> cat e.txt
bc$> cat a.txt b.txt c.txt d.txt e.txt
0123456789abc$>

묵시적이지만, 다시 한 번 확인해야합니다. 1) 인수는 명령 줄을 통해 입력해야합니까? 2) 항상 파일로 출력해야합니까?
Sp3000

@ Sp3000 예, 1과 2
Caridorc

1
@DigitalTrauma 이미 답변이 있습니다. 규칙 변경으로 무효화 한 것에 대해 기분이 나쁠 것입니다.
Caridorc

2
최근에이 사이트에서 이상한 이름의 유닉스 유틸리티에 대해 배웠습니다 (tac, dog, ...).
kirbyfan64sos

1
@ kirbyfan64sos와 Caridorc : tac는 진짜 입니다.
DLosc

답변:


4

Pyth-12 바이트

.wMC,cl.zz.z

내장 분할 기능을 사용한 다음 쓰기 기능에서 splat-map을 사용합니다. 온라인에서 작동하지 않습니다.


2

파이썬-181 바이트

import sys
a=sys.argv
l=len
d=a[2:]
s=a[1]
n,r=divmod(l(s),l(d))
p=0
for i in range(l(d)):
    with open(d[i],'w') as f:
        o=n+int(i<=n)
        f.write(s[p:p+o])
        p+=o

1

PHP, 107 바이트

골프 코드 :

for($i=1;++$i<$argc;fputs(fopen($argv[$i],w),substr($s=$argv[1],($i-2)*$l=ceil(strlen($s)/($argc-2)),$l)));

자세한 코드 :

$len = ceil(strlen($argv[1])/($argc - 2));
for ($i = 2; $i < $argc; $i ++) {
    $fh = fopen($argv[$i], 'w');
    fputs($fh, substr($argv[1], ($i - 2) * $len, $len));
    fclose($fh);          // omitted in the golfed version
}

0

순수한 배쉬 : 97

s=$1;shift;for((l=${#s}/$#,m=${#s}-l*$#,i=1;i<=$#;p+=q,i++)){
printf "${s:p:q=i>m?l:l+1}">${!i};}

기능으로 : ( p=두 번째 실행에만 필요)

dog() { p=
    s=$1;shift;for((l=${#s}/$#,m=${#s}-l*$#,i=1;i<=$#;p+=q,i++)){
    printf "${s:p:q=i>m?l:l+1}">${!i};}
}

테스트

$> rm *
$> dog "Dogs vs Cats" a.txt b.txt c.txt
$> ls -l
total 12
-rw-r--r-- 1 user user 4 May 13 22:09 a.txt
-rw-r--r-- 1 user user 4 May 13 22:09 b.txt
-rw-r--r-- 1 user user 4 May 13 22:09 c.txt
$> cat {a,b,c}.txt;echo
Dogs vs Cats
$> 

모든 파일은 4 바이트 길이이며 올바른 순서로 연결되며 "Dogs vs Cats"를 포함 합니다.

$> rm *
$> dog "$(printf "%s" {0..9} {a..c})" {a..e}.txt 
$> ls -l
total 20
-rw-r--r-- 1 user user 3 May 13 22:09 a.txt
-rw-r--r-- 1 user user 3 May 13 22:09 b.txt
-rw-r--r-- 1 user user 3 May 13 22:09 c.txt
-rw-r--r-- 1 user user 2 May 13 22:09 d.txt
-rw-r--r-- 1 user user 2 May 13 22:09 e.txt
$> cat *;echo
0123456789abc
$> 

첫 번째 파일은 3 바이트이며 마지막 2 개는 알파벳 순서로 연결되며 "0123456789abc"를 포함합니다 .

설명 (ungolfing) :

당신이 히트 경우 declare -f dog, 대답한다 :

$> declare -f dog
dog () 
{ 
    p=;
    s=$1;
    shift;
    for ((l=${#s}/$#,m=${#s}-l*$#,i=1; i<=$#; p+=q,i++))
    do
        printf "${s:p:q=i>m?l:l+1}" > ${!i};
    done
}

이것은 쓸 수 있습니다 :

dog2 () 
{ 
    position=0;
    string=$1;
    shift;
    partLen=$((${#string}/$#));
    oneMore=$((${#string}-partLen*$#));
    for ((i=1; i<=$#; i++))
    do
        if ((i<=oneMore)); then
            partQuant=$((partLen+1));
        else
            partQuant=$partLen;
        fi;
        printf "${string:position:partQuant}" > ${!i};
        ((position+=partQuant));
    done
}

0

루비, 93 87 바이트

명령 줄 인수를 사용하는 전체 프로그램.

s.slice!문자열을 변경하는 데 사용할 수 있다면을 사용해야 하는 대신에 할 s[c..-1]것이지만 Ruby는 문자열을 먼저 복제하지 않고 argv에서 문자열을 변경하도록 허용하지 않습니다.

s,*t=$*
d,r=s.size.divmod t.size
t.map{|e|open(e,?w)<<s[0,c=(0>r-=1)?d:d+1];s=s[c..-1]}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.