Memeriksa file hanya berisi null byte


12

Tujuan Anda adalah untuk menulis sebuah program atau fungsi yang memasukkan input string yang mewakili path ke file, dan menampilkan nilai yang sebenarnya jika file itu tidak kosong dan tidak mengandung byte yang bukan nol - yaitu, semua bit 0 - - dan nilai falsey sebaliknya.

Saya menyadari ini adalah masalah yang sangat sederhana dan saya kira saya bisa meretas sesuatu, tetapi saya curiga pasti ada cara yang pendek dan elegan untuk melakukannya, dan itu memberi saya ide untuk membuat tantangan dari itu.

Ini adalah , jadi kode terpendek dalam byte menang. (Preferensi saya sendiri akan pergi ke solusi tercepat, tapi itu terlalu tergantung implementasi ...)

Pertanyaan terkait : Pad file dengan nol

Motivasi : Ini hanya untuk mengetahui dari mana masalah itu berasal, jika Anda tertarik. Anda tidak perlu membacanya.

Gambar ISO dari CD dan DVD, disalin dengan "dd" atau cara lain, sering berakhir dengan urutan blok tidak berguna yang hanya berisi byte nol. Teknik standar untuk menghapus blok ini diketahui dan sederhana (lihat /unix/74827/ ) tetapi kadang-kadang mereka dapat menghapus data yang tidak berguna karena media dapat berbohong tentang ukurannya sendiri. Jadi saya ingin memeriksa bahwa blok yang dihapus hanya berisi byte nol. Menghapus blok ini penting untuk menentukan versi ISO-gambar yang dinormalisasi.

Jawaban:


5

Pyth, 6 5 byte

!sCM'

Cobalah online!

Mengambil nama file dari STDIN, membuka dan membaca file, mengubahnya menjadi daftar ints (pikirkan Python ord) sumdaftar (akan mengembalikan 0jika file semua null byte), dan nothasilnya, mencetaknya.


Hei,

Ini sangat mirip dengan pertanyaan pemrograman umum. Ini milik Stack Overflow . Namun, dari komentar di bawah posting utama, saya dapat melihat bahwa ini bukan maksud Anda. Yang mengatakan, saya merasa bahwa diskusi itu tidak perlu bermusuhan di kedua sisi, jadi saya telah memutuskan untuk mengambil kendur dan memberi Anda sambutan PPCG yang tepat!

Secara umum, kami meminta setiap tantangan yang pertama diposting ke bak pasir kami untuk umpan balik yang tepat. Anda dapat melihat kiriman saat ini di sana untuk melihat format apa yang kami sukai untuk tantangan. Tolong, coba lagi lain kali!

Hanya jika kita semua telah disalahpahami Anda dan Anda sedang mencari solusi umum, inilah solusi di Python 3:

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

1
Ini tidak akan berfungsi dengan gambar skala abu-abu yang hanya terdiri dari piksel hitam (nol), karena seberapa kuatnya '.
user202729

Selain itu: OP mengharuskan mengambil nama file sebagai input menggunakan argumen baris perintah, dan kembali sebagai kode status.
user202729

2

GNU sed -zn , 5 byte

File input dilewatkan ke sed sebagai parameter baris perintah. Output sebagai kode pengembalian shell standar - yaitu 0 adalah BENAR, 1 adalah SALAH.

/./q1

Biasanya sedbekerja pada catatan input yang dibatasi-baris baru (AKA "baris"). -zmengubahnya menjadi catatan input yang dibatasi-nul. Jika ada catatan input yang cocok dengan .regex, maka quit dengan kode keluar 1.

Cobalah online!


2

DOS, 37 byte


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

Ini membuka file bernama pada command-line, mengembalikan 0 jika kosong atau mengandung non-nol, jika tidak mengembalikan 1.


1

Attache , 24 byte

Zero@Max&0@Ords@FileRead

Cobalah online!

Penjelasan

Ini adalah komposisi 4 fungsi, dieksekusi satu demi satu:

  • FileRead - mengambil nama file sebagai input, mengembalikan konten file itu
  • Ords - mengembalikan poin kode ASCII dari setiap karakter dalam daftar
  • Max&0- ini setara dengan, untuk argumen x, Max[x, 0]; ini pada gilirannya menghitung maksimum semua entri dalam xdan 0(menghasilkan 0daftar kosong)
  • Zero - ini adalah predikat yang memeriksa apakah angka ini sebenarnya 0, dan mengembalikan boolean itu.

OP memerlukan program lengkap, panggilan dari baris perintah, ambil nama file sebagai input menggunakan argumen, dan kembali sebagai kode status. ( @_@)
user202729

Bukankah ini memberikan hasil positif palsu untuk file kosong?
ngenisis

1
@ngenisis masalah asli menyatakan sebagai berikut: "Itu berarti file kosong dianggap OK" - periksa riwayat revisi, tampaknya pengguna tertentu yang diedit yang menunjukkan pertanyaan.
Conor O'Brien

1

C (platform 32bit), 65 byte

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

Asumsikan ukuran pointer semuanya sama, yang hampir selalu benar. Kembali dengan 0kode keluar jika berhasil (file hanya berisi NULkarakter), beberapa nilai lain sebaliknya.

Perilaku tidak terdefinisi jika argumen baris perintah bukan jalur ke file yang dapat dibaca.


Saya pikir Anda perlu menulis int**v? Saya tidak dapat menemukan kompiler di mana ini tidak segfault tanpa melakukan itu. Juga, Anda dapat menghemat sedikit dengan sengaja melakukan kesalahan , tetapi saya tidak tahu apakah ini pendekatan terbaik.
FryAmTheEggman

Hah? Saya mencoba ini dengan gcc di mingw32, bekerja dengan sempurna. Saya mungkin harus menambahkan kendala sizeof(void*) == sizeof(int)(atau lebih umum "platform 32-bit") kemudian ... pada amd64platform, coba kompilasi dengan -m32;)
Felix Palmen

@FryAmTheEggman juga berfungsi di TIO ketika dikompilasi sebagai kode 32bit ( -m32): Coba online!
Felix Palmen

Ah, tentu saja. Kerja bagus, kalau begitu! Jangan ragu untuk menggunakan saran saya untuk menyimpan pasangan byte :)
FryAmTheEggman

0

Utilitas Bash + GNU, 26 byte

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

Nama file input diberikan sebagai parameter baris perintah. Output sebagai kode pengembalian shell standar - yaitu 0 adalah BENAR, 1 adalah SALAH.

Cobalah online!


0

Bahasa Wolfram (Mathematica) , 30 byte

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

Cobalah online!

Penjelasan

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

Solusi alternatif, 22 byte

Jika file kosong seharusnya lewat, maka ini dapat disingkat menjadi:

Tr@BinaryReadList@#<1&

Cobalah online!


0

Java, 149 byte

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 byte

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

Mengambil nama file dalam args baris perintah dan mengembalikan respons dalam kode keluar dari program


0

Python 3, 59 byte

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

Mengembalikan 0 untuk kesuksesan (semua byte nol).

Mengembalikan 1 untuk kegagalan (setidaknya satu byte nol, atau file nol panjang).


Jika file kosong, Anda harus mengembalikan Kegagalan.
Adám

0

APL (Dyalog Unicode) , 14 byte

Program lengkap. Meminta nama file dari stdin.

0=⌈/11 ¯1MAP

Cobalah online!

 meminta nama file

11 ¯1⎕MAP memetakan file itu ke array bit yang dikemas

⌈/ maksimum (reduksi); float terkecil jika kosong, jika tidak 0 atau 1

0= adalah nol sama dengan itu?


0

Haskell, 49 byte

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

Tentunya jika impor tidak termasuk, maka itu adalah 26 byte.


Saya kira Anda maksudnya readFilebukan getContets. Saya pikir Anda dapat membaca file sebagai String normal, bandingkan dengan =='\0'(atau lebih baik <'\1') dan singkirkan import. Seperti yang dapat Anda gunakan fungsi anonim, Anda bisa drop f x=dan pergi pointfree: (all(<'\1')<$>).readFile.
nimi

Jika ini file biner, Anda tidak bisa menggunakan readFile, yang akan mengeluarkan pengecualian setelah menemukan urutan Unicode yang tidak valid. Poin bagus tentang pointfree.
Izaak Weiss

0

JavaScript (ES8), 52 byte

Mengambil url sebagai argumen dan mengembalikan janji yang diselesaikan truejika file tidak kosong dan tidak mengandung byte nol.

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

0

Zsh , 35 byte

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

Cobalah online! Keluaran melalui kode keluar.

Baca, pisahkan karakter, dan bitwise-atau masing-masing codepoint bersama.

Jika file kosong, badan loop tidak pernah berjalan dan loop mengembalikan kebenaran. Jika nilai true-falsy dapat ditukar, yang terdepan !dapat dihapus untuk menyimpan 2-byte.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.