ใช้ยูทิลิตี้ dog bash


10

dog เป็นอรรถประโยชน์บรรทัดคำสั่งที่ใช้ในจำนวนอาร์กิวเมนต์โดยพลการแรกคือข้อความที่จะเขียนและอื่น ๆ เป็นไฟล์จำนวนมากโดยพลการ

dogยูทิลิตี้จะแบ่งข้อความในส่วนเท่ากันมากกว่าไฟล์เหล่านี้ หากมีเศษเหลือไฟล์nแรกnจะได้รับไบต์เพิ่มเติม

dogอยู่ตรงข้ามของcatเช่น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
ฉันได้เรียนรู้เกี่ยวกับยูทิลิตี้ UNIX ชื่อแปลก ๆ จากเว็บไซต์นี้เมื่อไม่นานมานี้ (tac, dog, ... )
kirbyfan64sos

1
@ kirbyfan64sos และ Caridorc: เป็นเรื่องจริงtac
DLosc

คำตอบ:


4

Pyth - 12 ไบต์

.wMC,cl.zz.z

ใช้ฟังก์ชั่นแบ่ง builtin แล้วใช้ splat-map กับฟังก์ชั่นการเขียน ไม่ทำงานออนไลน์


2

Python - 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 ไบต์

รหัส golfed:

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 ไบต์ len และตัดแบ่งในการสั่งซื้อที่เหมาะสมประกอบด้วย"สุนัขแมว VS"

$> 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 ไบต์ len และครั้งสุดท้ายเพียง 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.