Kiểm tra một tệp chỉ chứa byte rỗng


12

Mục tiêu của bạn là viết một chương trình hoặc hàm nhận đầu vào là một chuỗi biểu thị đường dẫn đến tệp và xuất ra một giá trị trung thực nếu tệp đó không trống và không chứa byte không null - tức là tất cả các bit đều bằng 0 - - và một giá trị falsey khác.

Tôi nhận ra đây là một vấn đề rất đơn giản và tôi đoán tôi có thể hack thứ gì đó, nhưng tôi nghi ngờ phải có một cách làm ngắn gọn và tao nhã, và điều đó đã cho tôi ý tưởng để thực hiện thử thách từ nó.

Đây là , vì vậy mã ngắn nhất tính bằng byte thắng. (Sở thích của tôi sẽ đi đến giải pháp nhanh nhất, nhưng điều đó quá phụ thuộc vào việc thực hiện ...)

Câu hỏi liên quan : Pad một tập tin với số không

Động lực : Điều này chỉ để cho biết vấn đề đến từ đâu, trong trường hợp bạn quan tâm. Bạn không cần phải đọc nó.

Hình ảnh ISO của CD và DVD, được sao chép bằng "dd" hoặc các phương tiện khác, thường kết thúc bằng một chuỗi các khối vô dụng chỉ chứa các byte rỗng. Các kỹ thuật tiêu chuẩn để loại bỏ các khối này được biết đến và đơn giản (xem /unix/74827/ ) nhưng đôi khi chúng có thể xóa dữ liệu không hữu ích vì phương tiện có thể nằm ở kích thước của chính nó. Vì vậy, tôi muốn kiểm tra xem các khối bị loại bỏ chỉ chứa byte rỗng. Loại bỏ các khối này rất quan trọng để xác định phiên bản hình ảnh ISO được chuẩn hóa.

Câu trả lời:


5

Bình thường, 6 5 byte

!sCM'

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

Lấy tên tệp từ STDIN, mở và đọc tệp, chuyển đổi nó thành danh sách ints (nghĩ Python ord) sumdanh sách (sẽ trả về 0tệp iff là tất cả các byte rỗng) vànot kết quả là in nó.


Chào,

Điều này trông rất giống như một câu hỏi lập trình chung. Chúng thuộc về Stack Overflow . Tuy nhiên, từ các bình luận dưới bài đăng chính, tôi có thể thấy rằng đây không phải là ý định của bạn. Điều đó nói rằng, tôi cảm thấy rằng cuộc thảo luận đã trở nên thù địch một cách không cần thiết ở cả hai bên, vì vậy tôi đã quyết định chọn lấy sự chậm chạp và chào đón bạn PPCG thích hợp!

Nói chung, chúng tôi yêu cầu bất kỳ thử thách nào được đăng lên hộp cát của chúng tôi để có phản hồi thích hợp. Bạn có thể xem các bài nộp hiện tại trong đó để xem chúng tôi thích định dạng nào cho các thử thách. Hãy thử lại lần sau!

Chỉ trong trường hợp tất cả chúng ta đã hiểu lầm bạn và bạn đang tìm kiếm một giải pháp chung, đây là một giải pháp trong Python 3:

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

1
Điều này sẽ không hoạt động với hình ảnh thang độ xám chỉ bao gồm các pixel đen (số 0), do mức độ mạnh mẽ của 'nó.
dùng202729

Bên cạnh đó: OP yêu cầu lấy tên tệp làm đầu vào bằng cách sử dụng đối số dòng lệnh và trả về làm mã trạng thái.
dùng202729

2

GNU sed -zn , 5 byte

Tệp đầu vào được truyền cho sed dưới dạng tham số dòng lệnh. Đầu ra dưới dạng mã trả về shell tiêu chuẩn - tức là 0 là TRUE, 1 là FALSE.

/./q1

Thông thường sedhoạt động trên các bản ghi đầu vào được phân tách bằng dòng mới ("dòng" AKA). -zthay đổi điều này thành các bản ghi đầu vào được phân định bằng nul. Nếu bất kỳ hồ sơ đầu vào phù hợp với. regex, thì quit với mã thoát 1.

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


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

Nó mở tệp có tên trên dòng lệnh, trả về 0 nếu trống hoặc chứa khác không, nếu không thì trả về 1.


1

Tùy viên , 24 byte

Zero@Max&0@Ords@FileRead

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

Giải trình

Đây là một thành phần gồm 4 hàm, được thực hiện lần lượt từng hàm:

  • FileRead - lấy tên tệp làm đầu vào, trả về nội dung của tệp đó
  • Ords - trả về các điểm mã ASCII của mỗi ký tự trong danh sách
  • Max&0- điều này tương đương với, cho đối số x, Max[x, 0]; lần lượt tính toán tối đa của tất cả các mục trong x0( 0thu được danh sách trống)
  • Zero - đây là một vị từ kiểm tra xem con số này có thực sự là 0 hay không và trả về giá trị boolean đó.

OP yêu cầu chương trình đầy đủ, gọi từ dòng lệnh, lấy tên tệp làm đầu vào bằng cách sử dụng đối số và trả về làm mã trạng thái. ( @_@)
dùng202729

Điều này không cung cấp cho một dương tính giả cho một tập tin trống?
ngenisis

1
@ngenisis vấn đề ban đầu đã nêu như sau: "Điều đó có nghĩa là tệp trống được coi là OK" - kiểm tra lịch sử sửa đổi, có vẻ như một người dùng nào đó đã chỉnh sửa câu hỏi đó.
Conor O'Brien

1

C (nền tảng 32 bit), 65 byte

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

Giả sử kích thước của con trỏ đều giống nhau, điều này gần như luôn luôn đúng. Trả về với 0mã thoát khi thành công (tệp chỉ chứa các NULký tự), một số giá trị khác.

Hành vi không được xác định nếu đối số dòng lệnh không phải là đường dẫn đến tệp có thể đọc được.


Tôi nghĩ bạn cần viết int**v? Tôi không thể tìm thấy một trình biên dịch trong đó điều này không segfault mà không làm điều đó. Ngoài ra, bạn có thể tiết kiệm một chút bằng cách cố ý lỗi , nhưng tôi không biết liệu đây có phải là cách tiếp cận tốt nhất.
FryAmTheEggman

Huh? Tôi đã thử điều này với gcc trên mingw32, hoạt động hoàn hảo. Tôi có lẽ nên thêm các ràng buộc sizeof(void*) == sizeof(int)(hay nói chung hơn là "nền tảng 32 bit") sau đó ... trên một amd64nền tảng, hãy thử biên dịch với -m32;)
Felix Palmen

@FryAmTheEggman cũng hoạt động trên TIO khi được biên dịch dưới dạng mã 32 bit ( -m32): Dùng thử trực tuyến!
Felix Palmen

À, tất nhiên rồi. NIce làm việc, sau đó! Vui lòng sử dụng đề xuất của tôi để lưu vài byte :)
FryAmTheEggman


0

Ngôn ngữ Wolfram (Mathicala) , 30 byte

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

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

Giải trình

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

Giải pháp thay thế, 22 byte

Nếu các tệp trống được cho là vượt qua, thì điều này có thể được rút ngắn thành:

Tr@BinaryReadList@#<1&

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


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+$/

Lấy tên tệp trong dòng lệnh lập luận và trả về phản hồi trong mã thoát của chương trình


0

Python 3, 59 byte

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

Trả về 0 cho thành công (tất cả các byte bằng 0).

Trả về 1 cho thất bại (ít nhất một tệp byte khác hoặc tệp có độ dài bằng 0).


Nếu tệp trống, bạn phải trả về Thất bại.
Adám

0

APL (Unicode Dy) , 14 byte

Chương trình đầy đủ. Nhắc tên tệp từ stdin.

0=⌈/11 ¯1MAP

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

 lời nhắc cho tên tệp

11 ¯1⎕MAP ánh xạ tập tin đó đến một mảng bit được đóng gói

⌈/ tối đa (giảm); Phao nhỏ nhất nếu trống, nếu không 0 hoặc 1

0= bằng không?


0

Haskell, 49 byte

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

Rõ ràng nếu nhập không được bao gồm, thì nó là 26 byte.


Tôi đoán ý bạn là readFile thay vìgetContets . Tôi nghĩ rằng bạn có thể đọc tệp dưới dạng Chuỗi bình thường, so sánh với =='\0'(hoặc tốt hơn <'\1') và thoát khỏi import. Khi bạn có thể sử dụng một chức năng ẩn danh, bạn có thể thả f x=và truy cập pointfree : (all(<'\1')<$>).readFile.
nimi

Nếu đó là tệp nhị phân, bạn không thể sử dụng readFile, tệp này sẽ đưa ra một ngoại lệ khi gặp chuỗi Unicode không hợp lệ. Điểm tốt liên quan đến điểm miễn phí.
Izaak Weiss

0

JavaScript (ES8), 52 byte

Lấy một url làm đối số và trả về một lời hứa sẽ giải quyết truenếu tệp không trống và không chứa byte rỗng.

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

0

Zsh , 35 byte

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

Hãy thử trực tuyến! Đầu ra thông qua mã thoát.

Đọc, phân tách các ký tự và bitwise - hoặc từng điểm mã với nhau.

Nếu tệp trống, phần thân của vòng lặp không bao giờ chạy và do đó vòng lặp trả về giá trị trung thực. Nếu các giá trị trung thực giả có thể được hoán đổi, hàng đầu !có thể được loại bỏ để lưu 2 byte.

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.