การตรวจสอบไฟล์มีเพียง null null


12

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

ฉันรู้ว่ามันเป็นปัญหาที่ง่ายมากและฉันคิดว่าฉันสามารถแฮ็กบางอย่างได้ แต่ฉันคิดว่าต้องมีวิธีสั้น ๆ และสง่างามในการทำเช่นนั้นและนั่นทำให้ฉันมีความคิดที่จะท้าทายมัน

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ (การตั้งค่าของฉันเองจะไปที่โซลูชันที่เร็วที่สุด แต่นั่นก็ขึ้นอยู่กับการติดตั้ง ... )

คำถามที่เกี่ยวข้อง : แพดไฟล์ด้วยเลขศูนย์

แรงจูงใจ : เพียงเพื่อบอกว่าปัญหามาจากที่ใดในกรณีที่คุณสนใจ คุณไม่จำเป็นต้องอ่าน

อิมเมจ ISO ของซีดีและดีวีดีคัดลอกด้วย "dd" หรือวิธีอื่นมักจะจบลงด้วยลำดับของบล็อกที่ไม่มีประโยชน์ที่มีเพียง null ไบต์เท่านั้น เทคนิคมาตรฐานในการลบบล็อกเหล่านี้เป็นที่รู้จักและเรียบง่าย (ดู /unix/74827/ ) แต่บางครั้งพวกเขาอาจลบข้อมูลที่ไม่เป็นประโยชน์ออกเนื่องจากสื่ออาจอยู่ในขนาดของตัวเอง ดังนั้นฉันต้องการตรวจสอบว่าบล็อกที่ลบออกมีไบต์ว่างเท่านั้น การลบบล็อคเหล่านี้มีความสำคัญต่อการกำหนด ISO อิมเมจเวอร์ชันปกติ

คำตอบ:


5

Pyth, 6 5 ไบต์

!sCM'

ลองออนไลน์!

ใช้ชื่อไฟล์จาก STDIN เปิดและอ่านไฟล์แปลงเป็นรายการของints (คิดว่า Python ord) sums รายการ (จะส่งคืน0ไฟล์ iff เป็นค่า null ทั้งหมด) และnotผลการพิมพ์


Hey,

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

โดยทั่วไปเราขอให้ความท้าทายใด ๆ ถูกโพสต์ในsandbox ของเราเป็นครั้งแรกสำหรับข้อเสนอแนะที่เหมาะสม คุณสามารถดูผลงานที่ส่งเข้ามาที่นี่เพื่อดูรูปแบบที่เราต้องการสำหรับความท้าทาย โปรดลองอีกครั้งในครั้งต่อไป!

ในกรณีที่เราทุกคนเข้าใจผิดคุณและคุณกำลังมองหาวิธีแก้ปัญหาทั่วไปต่อไปนี้เป็นวิธีแก้ปัญหาใน Python 3:

def main(string):
    with open(string) as file:
        return not any(map(ord,file.read()))

1
สิ่งนี้จะไม่ทำงานกับภาพระดับสีเทาที่ประกอบด้วยพิกเซลสีดำเท่านั้น (เลขศูนย์) เนื่องจากประสิทธิภาพของ'มัน
user202729

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

2

GNU sed -zn , 5 ไบต์

ไฟล์อินพุตถูกส่งไปยัง sed เป็นพารามิเตอร์บรรทัดคำสั่ง เอาต์พุตเป็นโค้ดส่งคืนเชลล์มาตรฐาน - นั่นคือ 0 คือ TRUE และ 1 คือ FALSE

/./q1

โดยปกติจะsedทำงานกับระเบียนที่คั่นด้วย newline (AKA "บรรทัด") -zเปลี่ยนค่านี้เป็นเรคคอร์ดอินพุตที่คั่นด้วย nul หากบันทึกการป้อนข้อมูลใด ๆ ที่ตรงกับ.regex แล้วquit กับรหัสทางออก 1

ลองออนไลน์!


2

DOS, 37 ไบต์


100:BE 80 00 MOV SI, 0080
103:AD       LODSW ;get command-line length
104:98       CBW ;only a byte
105:93       XCHG BX,AX
106:88 40 FF MOV [BX+SI-01], AL ;zero end of name
109:B4 3D    MOV AH, 3D
10B:89 F2    MOV DX, SI
10D:CD 21    INT 21 ;open file
10F:93       XCHG BX, AX ;handle into BX
110:AF       SCASW ;DI=0
111:B4 3F    MOV AH, 3F
113:B1 01    MOV CH, 01
115:CD 21    INT 21 ;read 1 byte
117:91       XCHG CX, AX
118:E3 06    JCXZ 0120 ;quit on EOF
11A:97       XCHG DI, AX ;set true for later
11B:38 2C    CMP [SI], CH
11D:74 F2    JZ 0111 ;loop while zero
11F:4F       DEC DI ;set false
120:97       XCHG DI, AX
121:B4 4C    MOV AH, 4C ;return
123:CD 21    INT 21

มันจะเปิดไฟล์ชื่อในบรรทัดคำสั่งผลตอบแทน 0 ถ้าว่างเปล่าหรือมีค่าที่ไม่ใช่ศูนย์มิฉะนั้นจะส่งกลับ 1


1

ทูตขนาด 24 ไบต์

Zero@Max&0@Ords@FileRead

ลองออนไลน์!

คำอธิบาย

นี่คือองค์ประกอบของ 4 ฟังก์ชั่นดำเนินการอย่างใดอย่างหนึ่งหลังจากที่อื่น:

  • FileRead - รับชื่อไฟล์เป็นอินพุตแล้วส่งคืนเนื้อหาของไฟล์นั้น
  • Ords - ส่งคืนคะแนนโค้ด ASCII ของแต่ละอักขระในรายการ
  • Max&0- นี้จะเทียบเท่ากับสำหรับอาร์กิวเมนต์x, Max[x, 0]; สิ่งนี้ในการคำนวณสูงสุดของรายการทั้งหมดในxและ0(ยอม0สำหรับรายการที่ว่างเปล่า)
  • Zero - นี่เป็นเพรดิเคตที่ตรวจสอบว่าตัวเลขนี้เป็นจริง 0 หรือไม่และคืนค่าบูลีนนั้น

OP ต้องการโปรแกรมเต็มรูปแบบเรียกจากบรรทัดคำสั่งใช้ชื่อไฟล์เป็นอินพุตโดยใช้อาร์กิวเมนต์และส่งคืนเป็นรหัสสถานะ ( @_@)
user202729

สิ่งนี้ไม่ได้ให้ผลบวกที่เป็นเท็จสำหรับไฟล์เปล่าหรือ
ngenisis

1
@ngenis เป็นปัญหาดั้งเดิมที่ระบุไว้ต่อไปนี้: "นั่นหมายความว่าไฟล์เปล่าถือว่าโอเค" - ตรวจสอบประวัติการแก้ไขดูเหมือนว่ามีผู้ใช้บางคนแก้ไขจุดนั้นจากคำถาม
Conor O'Brien

1

C (แพลตฟอร์ม 32 บิต) 65 ไบต์

main(x,v)int*v;{for(v=fopen(v[1],"r");!(x=fgetc(v)););return++x;}

สมมติว่าขนาดของพอยน์เตอร์นั้นเหมือนกันซึ่งเกือบจะเป็นจริงเสมอ ส่งคืนพร้อม0โค้ดออกเมื่อสำเร็จ (ไฟล์มีNULอักขระเท่านั้น) ค่าอื่น ๆ

พฤติกรรมไม่ได้ถูกกำหนดหากอาร์กิวเมนต์บรรทัดคำสั่งไม่ใช่เส้นทางไปยังไฟล์ที่อ่านได้


ฉันคิดว่าคุณต้องเขียนint**v? ฉันไม่สามารถหาคอมไพเลอร์ที่นี่ไม่ได้ segfault โดยไม่ทำอย่างนั้น นอกจากนี้คุณสามารถบันทึกได้เล็กน้อยโดยการตั้งใจผิดพลาดแต่ฉันไม่รู้ว่านี่เป็นวิธีที่ดีที่สุดหรือไม่
FryAmTheEggman

ฮะ? ฉันลองสิ่งนี้ด้วย gcc ใน mingw32 ใช้งานได้อย่างไม่มีที่ติ ฉันอาจจะเพิ่มข้อ จำกัดsizeof(void*) == sizeof(int)(หรือโดยทั่วไป "แพลตฟอร์ม 32 บิต") จากนั้น ... บนamd64แพลตฟอร์มลองรวบรวมด้วย-m32)
Felix Palmen

@FryAmTheEggman ใช้งานได้กับ TIO เมื่อรวบรวมเป็นรหัส 32 บิต ( -m32): ลองออนไลน์!
เฟลิกซ์ Palmen

อ่าแน่นอน ไม่ทำงานแล้ว! อย่าลังเลที่จะใช้คำแนะนำของฉันเพื่อช่วยประหยัดไบต์คู่ :)
FryAmTheEggman

0

ยูทิลิตีBash + GNU ขนาด 26 ไบต์

od -An $1|grep -qv [^0\ *]

ชื่อไฟล์อินพุตถูกกำหนดเป็นพารามิเตอร์บรรทัดคำสั่ง เอาต์พุตเป็นโค้ดส่งคืนเชลล์มาตรฐาน - นั่นคือ 0 คือ TRUE และ 1 คือ FALSE

ลองออนไลน์!


0

ภาษา Wolfram (Mathematica)ขนาด 30 ไบต์

BinaryReadList@#~MatchQ~{0..}&

ลองออนไลน์!

คำอธิบาย

                             & (* Function which returns whether *)
BinaryReadList                 (* the list of bytes *)
              @                (* of *)
               #               (* the input *)
                ~MatchQ~       (* matches *)
                        {0..}  (* a list of a one or more zeros *)

โซลูชันสำรอง 22 ไบต์

หากไฟล์ที่ว่างเปล่าควรจะผ่านไปสิ่งนี้สามารถย่อให้เป็น:

Tr@BinaryReadList@#<1&

ลองออนไลน์!


0

Java, 149 ไบต์

boolean b(String f)throws Exception{java.io.InputStream s=new java.io.FileInputStream(f);int i=Math.abs(s.read());while(i==0)i+=s.read();return i<0;}

0

Perl 5, 20 ไบต์

$\=0;exit<>=~/^\0+$/

ใช้ชื่อไฟล์ในบรรทัดคำสั่ง args และส่งคืนการตอบสนองในโค้ดทางออกของโปรแกรม


0

Python 3, 59 ไบต์

f=lambda s:any(open(s,'rb').read())+not len(open(s).read())

ส่งคืน 0 สำหรับความสำเร็จ (ทั้งหมดเป็นศูนย์ไบต์)

ส่งคืน 1 สำหรับความล้มเหลว (อย่างน้อยหนึ่งไบต์ที่ไม่ใช่ศูนย์หรือไฟล์ความยาวเป็นศูนย์)


หากไฟล์ว่างเปล่าคุณจะต้องส่งคืนความล้มเหลว
อดัม

0

APL (Dyalog Unicode)ขนาด 14 ไบต์

โปรแกรมเต็มรูปแบบ แจ้งชื่อไฟล์จาก stdin

0=⌈/11 ¯1MAP

ลองออนไลน์!

 พรอมต์สำหรับชื่อไฟล์

11 ¯1⎕MAP แม็พไฟล์นั้นกับอาเรย์บิตที่รวบรวมไว้

⌈/ สูงสุด (ลดลง); โฟลตที่เล็กที่สุดถ้าว่างเปล่ามิฉะนั้น 0 หรือ 1

0= ศูนย์เท่ากับว่า?


0

Haskell, 49 ไบต์

import Data.ByteString
f=(all(<1)<$>).getContents

เห็นได้ชัดว่าถ้าการนำเข้าไม่ได้รวมอยู่ก็คือ 26 ไบต์


ผมคิดว่าคุณหมายแทนreadFile getContetsฉันคิดว่าคุณสามารถอ่านแฟ้มเป็น String ปกติเปรียบเทียบกับ=='\0'(หรือดีกว่า<'\1') importและกำจัดของ ในขณะที่คุณสามารถใช้ฟังก์ชั่นที่ไม่ระบุชื่อคุณสามารถวางf x=และไป (all(<'\1')<$>).readFilepointfree:
nimi

หากเป็นไฟล์ไบนารีคุณจะไม่สามารถใช้งานได้readFileซึ่งจะทำให้เกิดข้อยกเว้นเมื่อพบลำดับ Unicode ที่ไม่ถูกต้อง จุดดีเกี่ยวกับ pointfree
Izaak Weiss

0

JavaScript (ES8), 52 ไบต์

รับ URL เป็นอาร์กิวเมนต์และส่งคืนสัญญาที่แก้ไขtrueหากไฟล์ไม่ว่างเปล่าและไม่มีไบต์ว่าง

async p=>!/\0|^$/.test(await(await fetch(p)).text())

0

Zsh , 35 ไบต์

! for c (${(s::)"$(<$1)"})((i|=#c))

ลองออนไลน์! ส่งออกผ่านรหัสทางออก

อ่านแบ่งอักขระและบิตพอยน์หรือ codepoint แต่ละตัวพร้อมกัน

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

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