Das Prüfen einer Datei enthält nur null Bytes

12

Ihr Ziel ist es, ein Programm oder eine Funktion zu schreiben, die als Eingabe eine Zeichenfolge verwendet, die den Pfad zu einer Datei darstellt, und einen Wahrheitswert ausgibt, wenn diese Datei nicht leer ist und keine Nicht-Null-Bytes enthält - dh alle Bits sind 0 - - und ein falscher Wert sonst.

Mir ist klar, dass es ein sehr einfaches Problem ist und ich denke, ich könnte etwas hacken, aber ich vermute, dass es eine kurze und elegante Art gibt, dies zu tun, und das brachte mich auf die Idee, eine Herausforderung daraus zu machen.

Das ist , also gewinnt der kürzeste Code in Bytes. (Meine Präferenz würde zur schnellsten Lösung gehen, aber das ist zu implementierungsabhängig ...)

Verwandte Fragen : Füllen Sie eine Datei mit Nullen auf

Motivation : Dies ist nur zu sagen, wo das Problem herkommt, falls Sie interessiert sind. Sie müssen es nicht lesen.

ISO-Images von CDs und DVDs, die mit "dd" oder anderen Mitteln kopiert wurden, enden häufig mit einer Folge von unnötigen Blöcken, die nur Null-Bytes enthalten. Standardtechniken zum Entfernen dieser Blöcke sind bekannt und einfach (siehe /unix/74827/ ), sie können jedoch manchmal nützliche Daten entfernen, die nicht null sind, da das Medium etwa seine eigene Größe haben kann. Ich möchte also überprüfen, dass die entfernten Blöcke nur null Bytes enthalten. Das Entfernen dieser Blöcke ist wichtig, um eine normalisierte Version von ISO-Images zu definieren.

babou
quelle

Antworten:

5

Pyth, 6 5 Bytes

!sCM'

Probieren Sie es online!

Übernimmt einen Dateinamen aus STDIN, öffnet und liest die Datei, konvertiert sie in eine Liste von ints (denke, Python ord) sums der Liste (gibt zurück, 0wenn die Datei alle Null-Bytes enthält) und gibt notdas Ergebnis aus und druckt es aus.


Hallo,

Das sieht nach einer allgemeinen Programmierfrage aus. Diese gehören zum Stack Overflow . Aus den Kommentaren unter dem Hauptbeitrag kann ich jedoch ersehen, dass dies nicht Ihre Absicht war. Trotzdem habe ich das Gefühl, dass die Diskussion auf beiden Seiten unnötig feindselig war. Ich habe mich daher entschlossen, die Lücke zu schließen und Ihnen das richtige PPCG zukommen zu lassen!

Im Allgemeinen bitten wir Sie, etwaige Herausforderungen zunächst in unserer Sandbox zu veröffentlichen, um ein angemessenes Feedback zu erhalten. Sehen Sie sich die aktuellen Beiträge an, um herauszufinden, welches Format wir für Herausforderungen bevorzugen. Bitte probieren Sie es das nächste Mal!

Nur für den Fall , dass hierbei alle falsch verstanden Sie haben , und Sie sind für eine allgemeine Lösung suchen, ist hier eine Lösung in Python 3:

def main(string):
    with open(string) as file:
        return not any(map(ord,file.read()))
hakr14
quelle
1
Dies funktioniert bei einem Graustufenbild, das nur aus schwarzen Pixeln (Nullen) besteht, aufgrund der Stärke nicht '.
user202729
Außerdem: Für OP muss der Dateiname als Eingabe mit dem Befehlszeilenargument verwendet und als Statuscode zurückgegeben werden.
User202729
2

GNU sed -zn , 5 Bytes

Die Eingabedatei wird als Befehlszeilenparameter an sed übergeben. Ausgabe als Standard-Shell-Returncode - dh 0 ist TRUE, 1 ist FALSE.

/./q1

sedArbeitet normalerweise mit durch neue Zeilen getrennten Eingabedatensätzen (AKA "lines"). -zÄndert dies in durch Nullen getrennte Eingabedatensätze. Wenn Eingabedatensätze mit dem .regulären Ausdruck übereinstimmen , qbeenden Sie mit Exit-Code 1.

Probieren Sie es online!

Digitales Trauma
quelle
2

DOS, 37 Bytes


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

Es öffnet die in der Befehlszeile angegebene Datei, gibt 0 zurück, wenn sie leer ist oder eine andere als Null enthält, andernfalls 1.

Peter Ferrie
quelle
1

Attache , 24 Bytes

Zero@Max&0@Ords@FileRead

Probieren Sie es online!

Erläuterung

Dies ist eine Komposition von 4 Funktionen, die nacheinander ausgeführt werden:

  • FileRead - Verwendet einen Dateinamen als Eingabe und gibt den Inhalt dieser Datei zurück
  • Ords - Gibt die ASCII-Codepunkte jedes Zeichens in einer Liste zurück
  • Max&0- das entspricht, zum Argument x, Max[x, 0]; dies berechnet wiederum das Maximum aller Einträge in xund 0(ergibt 0die leere Liste)
  • Zero - Dies ist ein Prädikat, das überprüft, ob diese Zahl tatsächlich 0 ist, und diesen Booleschen Wert zurückgibt.
Conor O'Brien
quelle
OP erfordert ein vollständiges Programm, einen Aufruf über die Befehlszeile, die Eingabe des Dateinamens mit dem Argument und die Rückgabe als Statuscode. ( @_@)
user202729
Gibt dies nicht ein falsches Positiv für eine leere Datei?
Genisis
1
@ngenisis das ursprüngliche Problem lautete wie folgt: "Das heißt, die leere Datei wird als OK betrachtet."
Conor O'Brien
1

C (32-Bit-Plattform), 65 Byte

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

Angenommen, die Zeigergrößen sind alle gleich, was fast immer zutrifft. Gibt bei 0Erfolg einen Exit-Code zurück (Datei enthält nur NULZeichen), andernfalls einen anderen Wert.

Das Verhalten ist nicht definiert, wenn das Befehlszeilenargument kein Pfad zu einer lesbaren Datei ist.

Felix Palmen
quelle
Ich denke du musst schreiben int**v? Ich kann keinen Compiler finden, bei dem dies nicht fehlschlägt, ohne dies zu tun. Sie können auch ein wenig sparen, indem Sie absichtlich einen Fehler machen , aber ich weiß nicht, ob dies der beste Ansatz ist.
FryAmTheEggman
Huh? Ich habe das mit gcc auf mingw32 versucht, funktioniert einwandfrei. Ich sollte wahrscheinlich die Einschränkung sizeof(void*) == sizeof(int)(oder allgemeiner "32-Bit-Plattform") dann hinzufügen ... auf einer amd64Plattform, versuchen Sie es mit kompilieren -m32;)
Felix Palmen
@FryAmTheEggman funktioniert auch mit TIO, wenn es als 32-Bit-Code kompiliert wurde ( -m32): Probieren Sie es online aus!
Felix Palmen
Ah, natürlich. Schöne Arbeit also! Fühlen Sie sich frei, meinen Vorschlag zu verwenden, um die paar Bytes zu speichern :)
FryAmTheEggman
0

Bash + GNU-Dienstprogramme, 26 Bytes

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

Der eingegebene Dateiname wird als Befehlszeilenparameter angegeben. Ausgabe als Standard-Shell-Returncode - dh 0 ist TRUE, 1 ist FALSE.

Probieren Sie es online!

Digitales Trauma
quelle
0

Wolfram Language (Mathematica) , 30 Byte

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

Probieren Sie es online!

Erläuterung

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

Alternative Lösung, 22 Byte

Wenn leere Dateien übergeben werden sollen, kann dies verkürzt werden auf:

Tr@BinaryReadList@#<1&

Probieren Sie es online!

Genisis
quelle
0

Java, 149 Bytes

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;}
SuperJedi224
quelle
0

Perl 5, 20 Bytes

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

Übernimmt einen Dateinamen in Befehlszeilenargumenten und gibt die Antwort im Exit-Code des Programms zurück

faubi
quelle
0

Python 3, 59 Bytes

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

Gibt bei Erfolg 0 zurück (alle Bytes Null).

Gibt 1 für einen Fehler zurück (mindestens eine Datei mit einer Länge ungleich Null Byte oder Null).

Pizzapants184
quelle
Wenn die Datei leer ist, müssen Sie Failure zurückgeben.
Adám
0

APL (Dyalog Unicode) , 14 Byte

Volles Programm. Fordert zur Eingabe des Dateinamens von stdin auf.

0=⌈/11 ¯1MAP

Probieren Sie es online!

 Aufforderung zur Eingabe des Dateinamens

11 ¯1⎕MAP Ordnen Sie diese Datei einem gepackten Bit-Array zu

⌈/ Maximum (Reduzierung); kleinster Schwimmer wenn leer, sonst 0 oder 1

0= Ist Null gleich?

Adam
quelle
0

Haskell, 49 Bytes

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

Wenn der Import nicht enthalten ist, sind es offensichtlich 26 Bytes.

Izaak Weiss
quelle
Ich denke du meintest readFilestatt getContets. Ich denke, man kann die Datei als normalen String lesen, mit =='\0'(oder besser <'\1') vergleichen und den loswerden import. Wie Sie eine anonyme Funktion verwenden können, können Sie die Drop f x=und gehen pointfree: (all(<'\1')<$>).readFile.
Nimi
Wenn es sich um eine Binärdatei handelt, können Sie diese nicht verwenden. readFileBei Auftreten einer ungültigen Unicode-Sequenz wird eine Ausnahme ausgelöst. Guter Punkt in Bezug auf die Pointfree.
Izaak Weiss
0

JavaScript (ES8), 52 Byte

Nimmt eine URL als Argument und gibt ein Versprechen zurück, das auflöst, truewenn die Datei nicht leer ist und keine Null-Bytes enthält.

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

Zsh , 35 Bytes

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

Probieren Sie es online! Ausgänge über Exit-Code.

Lesen Sie die Zeichen ein, teilen Sie sie auf und setzen Sie sie bitweise oder für jeden Codepunkt zusammen.

Wenn die Datei leer ist, wird der Hauptteil der Schleife niemals ausgeführt, und die Schleife gibt die Wahrheit zurück. Wenn die Wahrheits-Falsch-Werte vertauscht werden können, kann der führende Wert !für eine 2-Byte-Sicherung entfernt werden.

GammaFunktion
quelle