แพดไฟล์ด้วยค่าศูนย์


12

งานของคุณในวันนี้คือการใช้ไฟล์ที่มีอยู่และต่อท้ายศูนย์จนถึงขนาดที่กำหนด

คุณต้องเขียนโปรแกรมหรือฟังก์ชั่นซึ่งใช้ชื่อของไฟล์ในไดเรกทอรีปัจจุบันที่และจำนวนของไบต์f bในขณะที่รักษาเนื้อหาต้นฉบับของfคุณจะต้องเขียนเลขศูนย์(null null ไม่ใช่ ascii 0s)ไปยังจุดสิ้นสุดเพื่อให้ขนาดใหม่เป็นbไบต์

คุณอาจคิดว่าfมีเพียงตัวอักษรและตัวเลขในชื่อที่คุณได้รับอนุญาตเต็มรูปแบบว่าในตอนแรกมันไม่ใหญ่กว่าbแต่อาจจะมีขนาดใหญ่เท่าbและมีพื้นที่ว่างที่ไม่มีที่สิ้นสุด

คุณอาจไม่ถือว่าfไม่ว่างเปล่าหรือไม่มีไบต์เป็นศูนย์อยู่

ไม่ควรแก้ไขไฟล์ที่มีอยู่อื่นและไฟล์ใหม่ไม่ควรมีอยู่หลังจากสิ้นสุดการประมวลผล

กรณีทดสอบ

เนื้อหาของ f | b | ส่งผลให้เนื้อหาของ f
12345 | 10 | 1234500000
0 | 3 | 000
[ว่าง] | 2 | 00
[ว่าง] | 0 | [ว่าง]
123 | 3 | 123

@totallyhuman มันในตอนแรกไม่ได้มีขนาดใหญ่กว่าb
Adám

เราสามารถนำเนื้อหาของไฟล์นั้นไปเป็นอินพุทและเอาท์พุทของเนื้อหาที่ถูกแก้ไขได้หรือไม่?
Shaggy

เราจะใช้ห้องสมุดได้ไหม
อดัม

1
@ ฟีนิกซ์ปัญหาคือเดนนิสวางห้องสมุดในโฟลเดอร์ที่อยู่ไกล (ไม่ใช่ตัวเลือกของฉัน) ฉันสามารถนับราวกับว่ามันมีอยู่ในเส้นทางการค้นหาหรือไม่
อดัม

เราสามารถสันนิษฐานได้ว่าไฟล์นั้นจะไม่มีข้อมูลเป็นโมฆะ?
Dom Hastings

คำตอบ:


20

Bash + coreutils, 13

truncate -s$@

อินพุตจากบรรทัดคำสั่ง - พารามิเตอร์แรกคือขนาดไฟล์และที่สองคือชื่อไฟล์

จากman truncate:

หากไฟล์สั้นกว่าไฟล์จะถูกขยายและส่วนที่ขยาย (รู) จะอ่านเป็นศูนย์ไบต์

ลองมันออนไลน์


1
สามารถตัดส่วนขยายออกได้ด้วยหรือไม่
อดัม

11
คนที่รู้จักชายของเขาในผู้ชายที่เป็นลูกผู้ชายแน่นอน
Magic Octopus Urn

ฉันสงสัยว่ามันใช้งานได้กับพาร์ทิชัน FAT หรือไม่ซึ่งtruncatesyscall ล้มเหลว
Matteo Italia

1
การดำเนินการตามแนวคิดเดียวกันของฉันน่าจะเป็นdd bs=1 of=$1 seek=$2<&-(ซึ่งพิมพ์ข้อความแสดงข้อผิดพลาดที่สามารถละเว้นได้) ของคุณสั้นกว่ามาก ดี
hvd

@hvd yep ฉันคิดว่า dd อาจทำสิ่งนี้ได้
Digital Trauma

4

Groovy, 54 47 43 41 ไบต์

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

-6 ขอบคุณที่ไอเดียของ manatwork เอาลูปออก นั่นเป็นความคิดดั้งเดิมของฉันไม่รู้ว่าทำไมฉันจึงคิดว่ามันใช้งานไม่ได้และเลือกใช้การวนซ้ำ ... ใช้งานได้จริงแค่ทดสอบ

Ungolfed:

{
    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
จะไม่วนซ้ำแบบสั้นกว่านี้หรือ {a,b->c=new File(a);c<<('\0'*(b-c.size()))}
จัดการ

@ จัดการงานใช่! และมันอาจจะดีกว่านั้นอีก
Magic Octopus Urn

@ manatwork ไม่เป็นไร bytecount เดียวกัน(c=new File(a))เนื่องจากมีวงเล็บที่ต้องการ
Magic Octopus Urn

1
ไม่รู้เลยว่าทำไมฉันจึงใส่เครื่องหมายวงเล็บไว้รอบค่าทั้งหมดเพื่อต่อท้าย ไม่ต้องการ.
จัดการ

@ manatwork Groovy ค่อนข้างเจ้าอารมณ์เกี่ยวกับวงเล็บไม่สามารถตำหนิคุณได้ฮ่าฮ่า
Magic Octopus Urn


3

Python 2 , 59 57 54 ไบต์

-5 ไบต์ขอบคุณ chepner

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

1
@totallyhuman \x00เป็นไบต์ว่าง
Pavel

1
@totallyhuman no มันเป็นเหมือนสิ่งที่มีค่าสถานะ (ไม่อนุญาตให้มีการโต้ตอบกับไฟล์ที่ปิด)
Rod

1
@ พระเจ้าฉันรัก interactino! เกม
ตอบโต้ที่

คุณสามารถใช้ในสถานที่ของ\0 \x00
chepner

คุณสามารถบันทึกอีกสามไบต์โดย overextending def g(n,b):f=open(n,'a');f.write('\0'*b);f.truncate(b)แล้วตัดทอน:
chepner

3

PHP, 66 ไบต์

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

รับอินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่ง -nrทำงานด้วย


55 ไบต์เหล่านี้อาจ แต่ส่วนใหญ่จะไม่ทำงาน:

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

2

Java (Oracle JRE) ขนาด 55 ไบต์

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

ข้อมูลจำเพาะsetLength(int)บอกว่าไบต์ต่อท้ายไม่ได้ถูกกำหนด แต่ในทางปฏิบัติ Oracle JRE จะเพิ่มเฉพาะ0ไบต์เท่านั้น(นั่นคือเหตุผลที่ฉันระบุไว้)

ทรัพยากรถูกปิดโดยอัตโนมัติโดย JVM ดังนั้นเราจึงไม่จำเป็นต้องทำเอง

ทดสอบ

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

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

1และ2เป็นสองพารามิเตอร์แรกในสคริปต์ AHK
FileGetSizeทำงานเป็นไบต์ตามค่าเริ่มต้น
มันไม่ได้น่าตื่นเต้น แต่มันง่าย: รับขนาดลบมันออกจากขนาดที่ต้องการและเพิ่มเลขศูนย์


1

Perl 6 , 40 ไบต์

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

$^aและ$^bเป็นพารามิเตอร์ของฟังก์ชั่น - ชื่อไฟล์และความยาวตามลำดับ


1

Python 2 , 68 ไบต์

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

ลองออนไลน์! (เมื่อพิมพ์เนื้อหาของไฟล์รหัสจะแทนที่ null null ด้วย ASCII 0's เพื่อให้มองเห็นได้)


1
ฉันคิดว่านี่เขียนเลขศูนย์ ASCII และไม่ใช่ค่า null ไบต์
Pavel

อา ... คำว่า zeroes ทำให้เข้าใจผิด ...
สิ้นเชิงมนุษย์

มันพูดด้วยตัวอักษรขนาดใหญ่ในการท้าทาย
Pavel

คุณสามารถใช้ตัวอักษร \ x00 ในสตริง (ไม่ใช่ลำดับ escape)
CalculatorFeline

2
คุณไม่สามารถใช้ไบต์ว่างตามตัวอักษรได้ แต่\0จะสั้นกว่า
xnor

1

PowerShell, 69 ไบต์

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สำหรับไฟล์$sสำหรับขนาดปลายทางให้บันทึกเป็น. ps1 และเรียกใช้

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

มันเป็นเชลล์ดังนั้นควรมีการวนซ้ำขนาดเล็กมากที่เพิ่ม 1 ไบต์ด้วยการ>>เปลี่ยนทิศทางเอาต์พุตและผนวกใช่มั้ย ไม่เพราะ>>เพียงแค่การเข้ารหัสมัลติไบต์ UCS2-LE ดังนั้นจึงไม่มีวิธีเพิ่มไบต์เดียวในไฟล์ด้วย .. เว้นแต่คุณจะใช้ PSv5.1 และคุณสามารถเปลี่ยนได้ แต่นั่นทำให้การแข่งขันนานเกินไป :

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

อาจมีวิธี. Net Framework ควรมี แต่ฉันไม่สามารถเขียนไบต์หรือข้อผิดพลาดได้ แต่อีกต่อไป:

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


1

q, 29 ไบต์

ฟังก์ชั่นซึ่งใช้ชื่อไฟล์ในรูปแบบ:/foo/bar.bazและความยาวเป็นจำนวนเต็ม

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

ตัวอย่าง:

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

1

C, 56 ไบต์

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

โปรแกรมค้นหาขนาดของไฟล์และจำนวนไบต์ที่ต้องการต่อท้าย จากนั้นไฟล์จะเพิ่มfs - bไบต์พิเศษต่อท้าย


1
ยินดีต้อนรับสู่ PPCG! นี่คือความท้าทายของรหัส - กอล์ฟดังนั้นเป้าหมายของคุณคือทำให้โปรแกรมของคุณมีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้ คุณควรเริ่มต้นด้วยการลบช่องว่างที่ไม่จำเป็นออกไป
Pavel

4
นอกจากนี้โปรแกรมของคุณดูเหมือนจะสมมติว่าอินพุตถูกเก็บไว้ในค่าfแล้วและbไม่ได้รับอนุญาต คุณต้องรวม i / o ไว้ในโปรแกรมซึ่งอาจมาจากARGVอินพุตคอนโซลหรืออาร์กิวเมนต์ของฟังก์ชัน
Pavel

ขอบคุณฉันคิดว่าตัวแปรจะถูกตั้งค่าไว้แล้ว ความผิดฉันเอง.
Garhoogin

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.