Il controllo di un file contiene solo byte null


12

Il tuo obiettivo è scrivere un programma o una funzione che accetta come input una stringa che rappresenta il percorso di un file e genera un valore di verità se quel file non è vuoto e non contiene byte non nulli, ovvero tutti i bit sono 0 - - e un valore falso altrimenti.

Mi rendo conto che è un problema molto semplice e immagino di poter hackerare qualcosa, ma sospetto che ci debba essere un modo breve ed elegante per farlo, e questo mi ha dato l'idea di farne una sfida.

Questo è , quindi vince il codice più breve in byte. (La mia preferenza andrebbe alla soluzione più veloce, ma dipende troppo dall'implementazione ...)

Domande correlate : riempire un file con zeri

Motivazione : serve solo per capire da dove proviene il problema, nel caso in cui tu sia interessato. Non è necessario leggerlo.

Le immagini ISO di CD e DVD, copiate con "dd" o altri mezzi, terminano spesso con una sequenza di blocchi inutili contenenti solo byte nulli. Le tecniche standard per rimuovere questi blocchi sono conosciute e semplici (vedi /unix/74827/ ) ma a volte possono rimuovere dati non nulli utili perché il supporto può mentire sulle sue stesse dimensioni. Quindi voglio verificare che i blocchi rimossi contengano solo byte null. La rimozione di questi blocchi è importante per la definizione di una versione normalizzata di immagini ISO.

Risposte:


5

Pyth, 6 5 byte

!sCM'

Provalo online!

Prende un nome file da STDIN, apre e legge il file, lo converte in un elenco di ints (pensa Python ord) sums l'elenco (restituirà 0se il file è tutti i byte null) e notil risultato è stampandolo.


Hey,

Questo assomiglia molto a una domanda di programmazione generale. Questi appartengono allo StackTranslate.it . Tuttavia, dai commenti sotto il post principale, posso vedere che questo non era il tuo intento. Detto questo, ritengo che la discussione sia stata inutilmente ostile da entrambe le parti, quindi ho deciso di recuperare il gioco e darti il ​​giusto benvenuto a PPCG!

In generale, chiediamo che eventuali sfide vengano prima inviate alla nostra sandbox per un feedback adeguato. Puoi dare un'occhiata agli invii in corso per vedere quale formato preferiamo per le sfide. Per favore, provalo la prossima volta!

Solo nel caso che abbiamo tutti frainteso voi e stiamo cercando una soluzione generale, ecco una soluzione in Python 3:

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

1
Ciò non funzionerà con un'immagine in scala di grigi composta solo da pixel neri (zero), a causa della potenza '.
user202729

Inoltre: OP richiede di prendere il nome del file come input usando l'argomento della riga di comando e di restituirlo come codice di stato.
user202729

2

GNU sed -zn , 5 byte

Il file di input viene passato a sed come parametro della riga di comando. Output come codice di ritorno della shell standard, ovvero 0 è TRUE, 1 è FALSE.

/./q1

sedFunziona normalmente su record di input delimitati da newline ("righe" AKA). -zcambia questo in record di input delimitati da null. Se qualsiasi record di input corrisponde al .regex, quindi qutilizzare il codice di uscita 1.

Provalo 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

Apre il file denominato nella riga di comando, restituisce 0 se vuoto o contiene un valore diverso da zero, altrimenti restituisce 1.


1

Attache , 24 byte

Zero@Max&0@Ords@FileRead

Provalo online!

Spiegazione

Questa è una composizione di 4 funzioni, eseguite una dopo l'altra:

  • FileRead - accetta un nome file come input, restituisce il contenuto di quel file
  • Ords - restituisce i punti di codice ASCII di ciascun carattere in un elenco
  • Max&0- questo equivale, ad esempio x, a Max[x, 0]; questo a sua volta calcola il massimo di tutte le voci in xe 0(cedendo 0per l'elenco vuoto)
  • Zero - questo è un predicato che controlla se questo numero è effettivamente 0 e restituisce quel valore booleano.

OP richiede un programma completo, chiama dalla riga di comando, accetta il nome del file come input usando l'argomento e ritorna come codice di stato. ( @_@)
user202729

Questo non dà un falso positivo per un file vuoto?
ngenisi,

1
@ngenisis il problema originale affermava quanto segue: "Ciò significa che il file vuoto è considerato OK" - controlla la cronologia delle revisioni, sembra che un certo utente abbia modificato quel punto fuori questione.
Conor O'Brien,

1

C (piattaforma a 32 bit), 65 byte

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

Suppone che le dimensioni dei puntatori siano tutte uguali, il che è quasi sempre vero. Restituisce con 0successo un codice di uscita (il file contiene solo NULcaratteri), altrimenti un altro valore.

Il comportamento non è definito se l'argomento della riga di comando non è un percorso per un file leggibile.


Penso che devi scrivere int**v? Non riesco a trovare un compilatore in cui questo non segfault senza farlo. Inoltre, puoi risparmiare un po ' intenzionalmente , ma non so se questo sia l'approccio migliore.
FryAmTheEggman,

Eh? Ho provato questo con gcc su mingw32, funziona perfettamente. Probabilmente dovrei aggiungere il vincolo sizeof(void*) == sizeof(int)(o più in generale "piattaforma a 32 bit") quindi ... su una amd64piattaforma, prova a compilare -m32;)
Felix Palmen,

@FryAmTheEggman funziona anche su TIO quando compilato come codice a 32 bit ( -m32): provalo online!
Felix Palmen,

Ah certo. Bel lavoro, allora! Sentiti libero di usare il mio suggerimento per salvare la coppia di byte :)
FryAmTheEggman

0

Utilità Bash + GNU, 26 byte

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

Il nome file di input viene fornito come parametro della riga di comando. Output come codice di ritorno della shell standard, ovvero 0 è TRUE, 1 è FALSE.

Provalo online!


0

Wolfram Language (Mathematica) , 30 byte

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

Provalo online!

Spiegazione

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

Soluzione alternativa, 22 byte

Se si suppone che passino file vuoti, ciò può essere abbreviato in:

Tr@BinaryReadList@#<1&

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

Prende un nome file negli argomenti della riga di comando e restituisce la risposta nel codice di uscita del programma


0

Python 3, 59 byte

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

Restituisce 0 per esito positivo (tutti i byte zero).

Restituisce 1 per errore (almeno un byte diverso da zero o file di lunghezza zero).


Se il file è vuoto, è necessario restituire Failure.
Adám,

0

APL (Dyalog Unicode) , 14 byte

Programma completo. Richiede il nome file da stdin.

0=⌈/11 ¯1MAP

Provalo online!

 richiedere il nome file

11 ¯1⎕MAP mappare quel file su un array di bit compresso

⌈/ massimo (riduzione); galleggiante più piccolo se vuoto, altrimenti 0 o 1

0= zero è uguale a quello?


0

Haskell, 49 byte

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

Ovviamente se l'importazione non è inclusa, allora è di 26 byte.


Immagino volessi dire readFileinvece di getContets. Penso che puoi leggere il file come una normale stringa, confrontarlo con =='\0'(o meglio <'\1') e sbarazzarti di import. Come è possibile utilizzare una funzione anonima, è possibile eliminare l' f x=e andare pointfree: (all(<'\1')<$>).readFile.
nimi,

Se si tratta di un file binario, non è possibile utilizzare readFile, il che genererà un'eccezione quando si incontra una sequenza Unicode non valida. Un buon punto per quanto riguarda il punto.
Izaak Weiss,

0

JavaScript (ES8), 52 byte

Prende un URL come argomento e restituisce una promessa che si risolve truese il file non è vuoto e non contiene byte null.

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

0

Zsh , 35 byte

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

Provalo online! Uscite tramite codice di uscita.

Leggere, dividere i caratteri e bit-point o ciascun punto di codice insieme.

Se il file è vuoto, il corpo del ciclo non viene mai eseguito e quindi il ciclo ritorna vero. Se è possibile scambiare i valori di verità falsa, è possibile rimuovere il comando iniziale !per un salvataggio di 2 byte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.