Pad một tập tin với số không


12

Nhiệm vụ của bạn hôm nay sẽ là lấy một tập tin hiện có và nối các số không vào nó cho đến khi nó đạt đến một kích thước nhất định.

Bạn phải viết một chương trình hoặc hàm lấy tên của một tệp trong thư mục hiện tại fvà một số byte b. Trong khi duy trì nội dung ban đầu của f, bạn phải ghi các số 0 (null byte, không phải ascii 0s) đến cuối để kích thước mới của nó là bbyte.

Bạn có thể giả sử rằng fchỉ có ascii chữ và số trong tên của nó, rằng bạn có toàn quyền đối với nó, ban đầu nó không lớn hơn b, nhưng có thể lớn bằng b, và có không gian đĩa trống vô hạn.

Bạn có thể không cho flà không trống hoặc nó không chứa byte rỗng.

Các tệp hiện có khác không nên được sửa đổi và các tệp mới sẽ không tồn tại sau khi kết thúc thực hiện.

Các trường hợp thử nghiệm

Nội dung của f | b | Nội dung kết quả của f
12345 | 10 | 1234500000
0 | 3 | 000
[trống] | 2 | 00
[trống] | 0 | [trống]
123 | 3 | 123

@totallyhuman ban đầu nó không lớn hơnb
Adám

Chúng tôi có thể lấy nội dung của tệp làm đầu vào và đầu ra nội dung được sửa đổi không?
Shaggy

Chúng ta có thể sử dụng thư viện không?
Adám

1
@Phoenix Vấn đề là Dennis đặt thư viện vào một thư mục ở xa (không phải lựa chọn của tôi). Tôi có thể tính như thể nó có sẵn trong đường dẫn tìm kiếm không?
Adám

Chúng ta có thể giả sử tập tin sẽ không chứa byte rỗng không?
Dom Hastings

Câu trả lời:


20

Bash + coreutils, 13

truncate -s$@

Nhập từ dòng lệnh - tham số đầu tiên là kích thước tệp và thứ hai là tên tệp.

Từ man truncate:

Nếu một TẬP TIN ngắn hơn, nó được mở rộng và phần mở rộng (lỗ) đọc là byte không.

Hãy thử trực tuyến .


1
Cắt ngắn có thể kéo dài quá?
Adám

11
Một người đàn ông biết người đàn ông của mình trong một người đàn ông thực sự.
Bạch tuộc ma thuật Urn

Tôi tự hỏi nếu nó hoạt động trên một phân vùng FAT, nơi tòa nhà truncatethất bại.
Matteo Italia

1
Việc thực hiện ý tưởng tương tự của tôi sẽ là dd bs=1 of=$1 seek=$2<&-(trong đó in một thông báo lỗi có thể bỏ qua). Của bạn là ngắn hơn nhiều. Đẹp.
hvd

@hvd yep Tôi hình dung dd có thể làm điều này
Chấn thương kỹ thuật số

4

Groovy, 54 47 43 41 byte

{a,b->(c=new File(a))<<'\0'*(b-c.size())}

-6 nhờ ý tưởng của manatwork về việc loại bỏ vòng lặp; đó là ý tưởng ban đầu của tôi, không biết tại sao tôi nghĩ nó không hoạt động và đã chọn một vòng lặp ... Nó chắc chắn hoạt động, chỉ cần thử nghiệm nó.

Ung dung:

{
    a,b->                    // Two inputs: a is the File name, b is the desired size.
    File c = new File(a)     // Make and store the file.
    c << '\0'*(b-c.size())   // Append the difference between b and c.size() in nullbytes.
}
                             // Usually a close would be required, but, in Groovy,
                             // because private data isn't so protected, if a File
                             // Object goes out of scope, the attached Stream is 
                             // automatically flushed to disk.

1
Sẽ không ngắn hơn vòng lặp? {a,b->c=new File(a);c<<('\0'*(b-c.size()))}
manatwork

@manatwork vâng! Và nó thực sự có thể còn tốt hơn thế.
Bạch tuộc ma thuật Urn

@manatwork nevermind, cùng bytecount (c=new File(a))do dấu ngoặc đơn bắt buộc.
Bạch tuộc ma thuật Urn

1
Không có lý do tại sao tôi đặt dấu ngoặc đơn xung quanh toàn bộ giá trị để chắp thêm. Không cần thiết.
manatwork

@manatwork Groovy khá nóng tính về dấu ngoặc đơn, không thể đổ lỗi cho bạn haha.
Bạch tuộc ma thuật Urn


3

Python 2 , 59 57 54 byte

-5 byte nhờ chepner

def g(n,b):f=open(n,'a');f.write('\0'*b);f.truncate(b)

1
@totallyhuman \x00là một byte rỗng.
Pavel

1
@totallyhuman không, nó giống như một lá cờ hơn (không cho phép tương tác với các tệp đã đóng)
Rod

1
@Rod Tôi thích tương tác! Trò chơi tương tác thân thiện với trẻ em tốt nhất từ ​​trước đến nay
caird coinheringaahing

Bạn có thể sử dụng \0thay thế \x00.
chepner

Bạn có thể lưu ba byte khác bằng cách quá mức, sau đó cắt bớt : def g(n,b):f=open(n,'a');f.write('\0'*b);f.truncate(b).
chepner

3

PHP, 66 byte

for($p=fopen($f=$argv[1],a);filesize($f)<$argv[2];)fputs($p,"\0");

Lấy đầu vào từ các đối số dòng lệnh; chạy với -nr.


55 byte này có thể, nhưng hầu hết có thể sẽ không hoạt động:

fseek($p=fopen($argv[1],"w+"),$argv[2]);fputs($p,"\0");

2

Java (Oracle JRE), 55 byte

f->b->new java.io.RandomAccessFile(f,"rw").setLength(b)

Thông số kỹ thuật setLength(int)nói rằng các byte được nối thêm không được xác định, nhưng thực tế, Oracle JRE chỉ nối thêm 0byte (đó là lý do tại sao tôi chỉ định nó).

Tài nguyên được JVM tự động đóng lại, vì vậy chúng ta không cần phải tự làm điều đó.

Kiểm tra

public class Pcg125661 {
  interface F {
    B f(String f);
  }
  interface B {
    void b(int b) throws java.io.IOException;
  }
  public static void main(String[] args) throws java.io.IOException {
    F a = f->b->new java.io.RandomAccessFile(f,"rw").setLength(b);
    a.f("a").b(100);
  }
}

1

AHK, 48 byte

FileGetSize,s,%1%
2-=s
Loop,%2%
FileAppend,0,%1%

12là hai tham số đầu tiên trong tập lệnh AHK.
FileGetSizehoạt động theo byte theo mặc định.
Nó không thú vị, nhưng nó đơn giản: Lấy kích thước, trừ nó khỏi kích thước mong muốn và thêm nhiều số không.


1

Perl 6 , 40 byte

{$_=$^a.IO;.open(:a).put("\0"x($^b-.s))}

$^a$^blà các tham số cho hàm - tên tệp và độ dài, tương ứng.


1

Python 2 , 68 byte

def g(f,b):
 with open(f,'r+')as c:c.write('\x00'*(b-len(c.read())))

Hãy thử trực tuyến! (Khi in nội dung của tệp, mã sẽ thay thế các byte rỗng bằng ASCII 0 để hiển thị.)


1
Tôi nghĩ rằng điều này viết các số 0 ASCII chứ không phải byte rỗng
Pavel

À ... các từ số 0 đã gây hiểu nhầm ...
hoàn toàn là

Vâng, nó nói bằng chữ lớn trong thử thách chính nó.
Pavel

Bạn có thể sử dụng một chữ \ x00 trong chuỗi (không phải là một chuỗi thoát) không?
Máy

2
Bạn không thể sử dụng byte rỗng bằng chữ, nhưng \0ngắn hơn.
xnor

1

PowerShell, 69 byte

param($f,$s)@(gc $f -en by)+,[byte]0*($s-(gi $f).length)|sc $f -en by
#     ^ filename
#        ^desired size
#                 ^ get content as byte stream
#           ^force it to an array even if there's 0 or 1 byte
#                          ^append a byte array of nulls..
#                                       ^..desired size - file size
#                            write to file with -encoding byte ^

$fđối với tệp, $sđối với kích thước đích, lưu dưới dạng .ps1 và chạy

.\Add-NullBytesToFile.ps1 .\test.txt 10

Đó là một cái vỏ, vì vậy cần có một vòng lặp thực sự nhỏ thêm 1 byte với >>chuyển hướng đầu ra và nối thêm, phải không? Chà, không, bởi vì >>chỉ xuất ra mã hóa đa bào UCS2-LE nên không có cách nào để thêm một byte vào một tệp với nó .. trừ khi bạn đang sử dụng PSv5.1 và bạn có thể thay đổi điều đó nhưng điều đó quá dài để cạnh tranh :

$PSDefaultParameterValues['Out-File:Encoding']='utf8';while((gi $f).length-lt$c){[byte]0>>$f}

Có lẽ có một cách tiếp cận .Net Framework? Cần phải có, nhưng tôi không thể làm cho nó thực sự ghi bất kỳ byte hoặc lỗi nào. Nhưng dù sao nó cũng dài hơn:

param($f,$s)[io.file]::WriteAllBytes($f,[byte[]](,0)*($c-(gi $f).length), $True)

1

Toán học 50 byte

Nhập khẩu xuất khẩu

Export[#,Import[#,c="Byte"]~Join~Table[0,{#2}],c]&

Sử dụng

%["test1", 5]

1

q, 29 byte

Hàm lấy tên tệp theo định dạng :/foo/bar.bazvà độ dài làm số nguyên.

{hopen[x](0|y-hcount x)#0x00}

Thí dụ:

{hopen[x](0|y-hcount x)#0x00}[`:test.txt;100]

1

C, 56 byte

fseek(f,0,2);int i;for(;ftell(f)<b;)putc(0,f);fclose(f);

Chương trình tìm kích thước của tệp và thêm bao nhiêu byte. Các tập tin sau đó thêm fs - bbyte vào cuối.


1
Chào mừng bạn đến với PPCG! Đây là một thử thách chơi gôn , vì vậy mục tiêu của bạn là làm cho chương trình của bạn nhỏ nhất có thể. Bạn nên bắt đầu bằng cách loại bỏ khoảng trắng không cần thiết.
Pavel

4
Ngoài ra, chương trình của bạn dường như cho rằng các đầu vào đã được lưu trữ trong các giá trị fb, điều này không được phép. Bạn phải đưa i / o vào chương trình của mình, có thể từ ARGV, đầu vào giao diện điều khiển hoặc đối số cho một chức năng.
Pavel

Cảm ơn bạn, tôi nghĩ rằng các biến đã được giả định đã được đặt. Lỗi của tôi.
Garhoogin

1

C #, 90 byte

using System.IO;s=>n=>File.AppendAllText(s,new string('\0',(int)new FileInfo(s).Length-n))
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.