Sprawdzanie pliku zawiera tylko bajty puste

12

Twoim celem jest napisanie programu lub funkcji, która pobiera jako dane wejściowe ciąg znaków reprezentujący ścieżkę do pliku i wyświetla prawdziwą wartość, jeśli plik nie jest pusty i nie zawiera bajtów o wartości innej niż zero - tzn. Wszystkie bity mają wartość 0 - - w przeciwnym razie wartość falsey.

Zdaję sobie sprawę, że to bardzo prosty problem i myślę, że mógłbym coś zhakować, ale podejrzewam, że musi istnieć jakiś krótki i elegancki sposób na zrobienie tego, co dało mi pomysł, aby podjąć z tego wyzwanie.

To jest , więc wygrywa najkrótszy kod w bajtach. (Moje własne preferencje dotyczyłyby najszybszego rozwiązania, ale jest to zbyt zależne od implementacji ...)

Powiązane pytania : Wypełnij plik zerami

Motywacja : tylko po to, aby dowiedzieć się, skąd pochodzi problem, na wypadek gdybyś był zainteresowany. Nie musisz go czytać.

Obrazy ISO dysków CD i DVD, skopiowane za pomocą „dd” lub w inny sposób, często kończą się ciągiem bezużytecznych bloków zawierających tylko bajty zerowe. Standardowe techniki usuwania tych bloków są znane i proste (patrz /unix/74827/ ), ale czasem mogą one usuwać niepuste przydatne dane, ponieważ nośnik może kłamać na temat swojego własnego rozmiaru. Chcę więc sprawdzić, czy usunięte bloki zawierają tylko bajty zerowe. Usunięcie tych bloków jest ważne dla zdefiniowania znormalizowanej wersji obrazów ISO.

Babou
źródło

Odpowiedzi:

5

Pyth, 6 5 bajtów

!sCM'

Wypróbuj online!

Pobiera nazwę pliku ze STDIN, otwiera i odczytuje plik, konwertuje go na listę ints (myślę, że Python ord) sums listy (zwróci 0plik iff wszystkie null bajty), i notwynik, drukuje go.


Hej,

To wygląda jak ogólne pytanie programistyczne. Należą one do przepełnienia stosu . Jednak z komentarzy pod głównym postem widzę, że nie był to twój zamiar. To powiedziawszy, czuję, że dyskusja była niepotrzebnie wroga po obu stronach, więc postanowiłem podnieść luz i przywitać cię PPCG!

Zasadniczo prosimy, aby wszelkie wyzwania były najpierw publikowane w naszej piaskownicy w celu uzyskania właściwej informacji zwrotnej. Możesz zapoznać się z bieżącymi zgłoszeniami, aby zobaczyć, jaki format preferujemy w przypadku wyzwań. Spróbuj ponownie następnym razem!

Tylko w przypadku, że wszyscy źle zrozumiany, a ty się szuka rozwiązania ogólnego, oto rozwiązanie w Pythonie 3:

def main(string):
    with open(string) as file:
        return not any(map(ord,file.read()))
hakr14
źródło
1
Nie działa to z obrazem w skali szarości składającym się tylko z czarnych pikseli (zer), ze względu na jego moc '.
user202729,
Poza tym: OP wymaga podania nazwy pliku jako danych wejściowych za pomocą argumentu wiersza poleceń i powrotu jako kodu statusu.
user202729,
2

GNU sed -zn , 5 bajtów

Plik wejściowy jest przekazywany do sed jako parametr wiersza polecenia. Wyjście jako standardowy kod powrotu powłoki - tzn. 0 to PRAWDA, 1 to FAŁSZ.

/./q1

Zwykle seddziała na rekordach wejściowych rozdzielanych znakiem nowej linii („linie” AKA). -zzmienia to na rekordy wejściowe rozdzielane wartościami nul. Jeśli jakiekolwiek rekordy wejściowe pasują do .wyrażenia regularnego, quit z kodem wyjścia 1.

Wypróbuj online!

Cyfrowa trauma
źródło
2

DOS, 37 bajtów


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

Otwiera plik o nazwie podanej w wierszu poleceń, zwraca 0, jeśli jest pusty lub zawiera niezerową wartość, w przeciwnym razie zwraca 1.

Peter Ferrie
źródło
1

Attache , 24 bajty

Zero@Max&0@Ords@FileRead

Wypróbuj online!

Wyjaśnienie

Jest to kompozycja 4 funkcji, wykonywanych jedna po drugiej:

  • FileRead - pobiera nazwę pliku jako dane wejściowe, zwraca zawartość tego pliku
  • Ords - zwraca punkty kodowe ASCII każdego znaku na liście
  • Max&0- co jest równoważne, dla argumentu x, Max[x, 0]; to z kolei oblicza maksimum wszystkich wpisów w xi 0(dając 0pustą listę)
  • Zero - jest to predykat, który sprawdza, czy ta liczba faktycznie wynosi 0, i zwraca wartość logiczną
Conor O'Brien
źródło
OP wymaga pełnego programu, wywołania z linii poleceń, weź nazwę pliku jako dane wejściowe za pomocą argumentu i zwróć jako kod statusu. ( @_@)
user202729,
Czy to nie daje fałszywego wyniku pozytywnego dla pustego pliku?
ngenisis
1
@ngenisis oryginalny problem stwierdził, co następuje: „Oznacza to, że pusty plik jest uważany za OK” - sprawdź historię zmian, wygląda na to, że pewien użytkownik edytował ten punkt bez pytania.
Conor O'Brien
1

C (platforma 32-bitowa), 65 bajtów

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

Zakłada, że ​​rozmiary wskaźników są takie same, co prawie zawsze jest prawdą. Zwraca 0kod zakończenia w przypadku powodzenia (plik zawiera tylko NULznaki), w przeciwnym razie inna wartość.

Zachowanie jest niezdefiniowane, jeśli argument wiersza poleceń nie jest ścieżką do czytelnego pliku.

Felix Palmen
źródło
Myślę, że musisz pisać int**v? Nie mogę znaleźć kompilatora, w którym to nie segfaultuje bez zrobienia tego. Możesz także trochę zaoszczędzić, celowo popełniając błędy , ale nie wiem, czy to najlepsze podejście.
FryAmTheEggman
Co? Próbowałem tego z gcc na mingw32, działa bezbłędnie. Prawdopodobnie powinienem dodać ograniczenie sizeof(void*) == sizeof(int)(lub bardziej ogólnie „platformę 32-bitową”), a następnie ... na amd64platformie, spróbuj skompilować z -m32;)
Felix Palmen
@FryAmTheEggman działa również na TIO po skompilowaniu jako kod 32-bitowy ( -m32): Wypróbuj online!
Felix Palmen
Ach, oczywiście. Dobra robota! Zapraszam do skorzystania z mojej sugestii, aby zapisać kilka bajtów :)
FryAmTheEggman
0

Narzędzia Bash + GNU, 26 bajtów

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

Nazwa pliku wejściowego jest podawana jako parametr wiersza polecenia. Wyjście jako standardowy kod powrotu powłoki - tzn. 0 to PRAWDA, 1 to FAŁSZ.

Wypróbuj online!

Cyfrowa trauma
źródło
0

Wolfram Language (Mathematica) , 30 bajtów

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

Wypróbuj online!

Wyjaśnienie

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

Alternatywne rozwiązanie, 22 bajty

Jeśli mają zostać przekazane puste pliki, można to skrócić do:

Tr@BinaryReadList@#<1&

Wypróbuj online!

ngenisis
źródło
0

Java, 149 bajtów

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
źródło
0

Perl 5, 20 bajtów

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

Pobiera nazwę pliku w argumencie wiersza poleceń i zwraca odpowiedź w kodzie wyjścia programu

faubi
źródło
0

Python 3, 59 bajtów

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

Zwraca 0 dla sukcesu (wszystkie bajty zero).

Zwraca 1 w przypadku niepowodzenia (co najmniej jeden niezerowy bajt lub plik o zerowej długości).

pizzapanty184
źródło
Jeśli plik jest pusty, musisz zwrócić Błąd.
Adám
0

APL (Dyalog Unicode) , 14 bajtów

Pełny program Monituje o nazwę pliku ze standardowego wejścia.

0=⌈/11 ¯1MAP

Wypróbuj online!

 monit o nazwę pliku

11 ¯1⎕MAP zamapuj ten plik na spakowaną tablicę bitów

⌈/ maksimum (redukcja); najmniejsza liczba zmiennoprzecinkowa, jeśli jest pusta, w przeciwnym razie 0 lub 1

0= czy zero jest równe?

Adám
źródło
0

Haskell, 49 bajtów

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

Oczywiście, jeśli import nie jest uwzględniony, to ma on 26 bajtów.

Izaak Weiss
źródło
Chyba miałeś na myśli readFilezamiast getContets. Myślę, że możesz odczytać plik jako normalny ciąg, porównać =='\0'(lub lepiej <'\1') i pozbyć się import. Jak można używać anonimową funkcję, można upuścić f x=i iść pointfree: (all(<'\1')<$>).readFile.
nimi
Jeśli jest to plik binarny, nie można go użyć readFile, co spowoduje wygenerowanie wyjątku po napotkaniu nieprawidłowej sekwencji Unicode. Dobra uwaga dotycząca bez punktów.
Izaak Weiss
0

JavaScript (ES8), 52 bajty

Pobiera adres URL jako argument i zwraca obietnicę, która rozwiązuje się, truejeśli plik nie jest pusty i nie zawiera bajtów zerowych.

async p=>!/\0|^$/.test(await(await fetch(p)).text())
kamoroso94
źródło
0

Zsh , 35 bajtów

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

Wypróbuj online! Dane wyjściowe za pośrednictwem kodu wyjścia.

Czytaj, dziel na znaki i bitowe - lub każdy kodod razem.

Jeśli plik jest pusty, ciało pętli nigdy nie jest uruchamiane, więc pętla zwraca wartość true. Jeśli wartości prawda-fałsz mogą zostać zamienione, interlinię !można usunąć dla 2-bajtowego zapisu.

Funkcja Gamma
źródło