Thực hiện tiện ích bash chó


10

dog là một tiện ích dòng lệnh có số lượng đối số tùy ý, đầu tiên là văn bản được viết và các đối số khác là nhiều tệp tùy ý.

Các dogtiện ích sẽ chia văn bản trong nhiều phần bằng nhau trên những tập tin này. Nếu có phần còn lại n, các ntệp đầu tiên sẽ nhận được một byte bổ sung

doglà ngược lại cat, như vậy, forall x, sau đây nên giữ.

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

Trường hợp ...chỉ ra nhiều tập tin tùy ý.

Một ví dụ (12 byte, 3 tệp, có thể được chia đều):

$> ./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$> 

Một ví dụ với phần còn lại (13 byte, 5 tệp, phần còn lại 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$>

Điều đó ngụ ý, nhưng chỉ cần kiểm tra lại: 1) Các đối số có phải đi qua dòng lệnh không? 2) Chúng ta có luôn phải xuất ra tệp không?
Sp3000

@ Sp3000 có, đến 1 và 2
Caridorc

1
@DigitalTrauma đã có câu trả lời, tôi sẽ cảm thấy tồi tệ khi vô hiệu hóa nó bằng một thay đổi quy tắc
Caridorc

2
Gần đây tôi đã tìm hiểu về một số tiện ích UNIX có tên kỳ lạ từ trang web này (tac, dog, ...).
kirbyfan64sos

1
@ kirbyfan64sos và Caridorc: taclà có thật .
DLosc

Câu trả lời:


4

Pyth - 12 byte

.wMC,cl.zz.z

Sử dụng chức năng phân tách dựng sẵn và sau đó sử dụng bản đồ splat trên chức năng ghi. Không hoạt động trực tuyến.


2

Python - 181 byte

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 byte

Mã đánh gôn:

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

Mã chi tiết:

$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

Bash tinh khiết: 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};}

Là một hàm: ( p=chỉ được yêu cầu cho lần chạy thứ hai)

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};}
}

Xét nghiệm

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

Tất cả các tệp là 4 byte len và được nối theo đúng thứ tự, chứa "Chó vs Mèo" .

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

Các tệp đầu tiên là 3 byte len và chỉ tồn tại 2, được nối theo thứ tự chữ cái, chứa "0123456789abc" .

Giải thích (vô ý):

Nếu bạn nhấn : declare -f dog, sẽ trả lời:

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

Điều này có thể được viết:

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

Ruby, 93 87 byte

Chương trình đầy đủ sử dụng đối số dòng lệnh.

Nếu tôi có thể sử dụng s.slice!để biến đổi chuỗi, tôi sẽ làm điều đó thay vì cần sử dụng s[c..-1], nhưng Ruby không cho phép bạn thay đổi chuỗi từ argv mà không cần sao chép chúng trước

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]}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.