Bir dosyayı kontrol etmek yalnızca boş bayt içerir


12

Amacınız, bir dosyanın yolunu temsil eden bir dizeyi girdi olarak alan ve bu dosya boş değilse ve boş olmayan bayt içermeyen bir doğruluk değeri veren bir program veya işlev yazmaktır - yani, tüm bitler 0'dır - - ve aksi halde bir falsey değeri.

Bunun çok basit bir sorun olduğunun farkındayım ve bir şeyi hackleyebileceğimi düşünüyorum, ama bunun kısa ve zarif bir yolu olması gerektiğinden şüpheleniyorum ve bu bana bir meydan okuma yapma fikri verdi.

Bu , bayt en kısa kod kazanır. (Kendi tercihim en hızlı çözüme giderdi, ama bu uygulamaya çok bağlı ...)

İlgili sorular : Bir dosyayı sıfırlarla doldurun

Motivasyon : Bu sadece ilgilendiğinizde sorunun nereden geldiğini anlatmak içindir. Okumanıza gerek yok.

CD'lerin ve DVD'lerin ISO görüntüleri, "dd" veya başka yollarla kopyalanır, genellikle yalnızca boş bayt içeren bir dizi gereksiz blokla sona erer. Bu blokları kaldırmak için standart teknikler bilinmektedir ve basittir (bkz. Https://unix.stackexchange.com/questions/74827/ ), ancak ortam kendi boyutu hakkında yalan söyleyebileceğinden bazen boş olmayan yararlı verileri kaldırabilir. Bu nedenle, kaldırılan blokların yalnızca boş bayt içerdiğini kontrol etmek istiyorum. Bu blokları kaldırmak, ISO görüntülerinin normalleştirilmiş bir sürümünü tanımlamak için önemlidir.

Yanıtlar:


5

Pyth, 6 5 bayt

!sCM'

Çevrimiçi deneyin!

STDIN'den bir dosya adı alır, dosyayı açar ve okur, s listesine ( intPython ord) sums listeye dönüştürür ( 0iff dosyasının tümü boş bayt olduğunu döndürür ) ve notsonucu yazdırır.


Hey,

Bu genel bir programlama sorusuna çok benziyor. Bunlar Yığın Taşmasına aittir . Ancak, ana gönderinin altındaki yorumlardan, bunun sizin niyetiniz olmadığını görebiliyorum. Bununla birlikte, tartışmanın her iki tarafta da gereksiz yere düşman olduğunu hissediyorum, bu yüzden boşluğu almaya ve size uygun PPCG karşılama vermeye karar verdim!

Genel olarak, herhangi bir zorluğun ilk önce doğru geri bildirim için sanal alanımıza gönderilmesini rica ediyoruz . Zorluklar için hangi biçimi tercih ettiğimizi görmek için oradaki mevcut gönderilere göz atabilirsiniz. Lütfen bir dahaki sefere deneyin!

Hepimizin yanlış anlaşılan sizi ettik ve sadece bu durumda olan bir genel çözüm arayan, burada Python 3'te bir çözüm:

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

1
Bu, ne kadar güçlü 'olduğu için yalnızca siyah piksellerden (sıfırlar) oluşan gri tonlamalı bir görüntüyle çalışmaz .
user202729

Ayrıca: OP, dosya adını komut satırı bağımsız değişkenini kullanarak girdi olarak almayı ve durum kodu olarak döndürmeyi gerektirir.
user202729

2

GNU sed -zn , 5 bayt

Girdi dosyası sed'e bir komut satırı parametresi olarak geçirilir. Standart kabuk dönüş kodu olarak çıktı - yani 0 DOĞRU, 1 YANLIŞ.

/./q1

Normalde sedsatırsonu sınırlandırılmış girdi kayıtları (AKA "satırları") üzerinde çalışır. -zbunu geçersiz sınırlandırılmış giriş kayıtlarıyla değiştirir. Herhangi bir giriş kaydı .normal qifadeyle eşleşiyorsa, çıkış kodu 1 ile uit.

Çevrimiçi deneyin!


2

DOS, 37 bayt


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

Komut satırında adlandırılan dosyayı açar, boşsa 0 döndürür veya sıfır içermiyorsa, aksi takdirde 1 döndürür.


1

Ataşman , 24 bayt

Zero@Max&0@Ords@FileRead

Çevrimiçi deneyin!

açıklama

Bu, birbiri ardına yürütülen 4 işlevin bir bileşimidir:

  • FileRead - bir dosya adını girdi olarak alır, o dosyanın içeriğini döndürür
  • Ords - listedeki her karakterin ASCII kod noktalarını döndürür
  • Max&0- bu eşdeğerdir için bağımsız değişkeni için x, Max[x, 0]; sırayla bu tüm kayıtların maksimum hesaplar xve 0(getirili 0boş liste için)
  • Zero - Bu, bu sayının aslında 0 olup olmadığını kontrol eden ve bu boole değerini döndüren bir yüklemdir.

OP tam program gerektirir, komut satırından çağrı yapar, argüman kullanarak dosya adını girdi olarak alır ve durum kodu olarak geri döner. ( @_@)
user202729

Bu, boş bir dosya için yanlış pozitif vermiyor mu?
ngenisis

1
@ngenisis asıl sorun aşağıdakileri belirtti: "Bu boş dosya Tamam kabul edilir anlamına gelir" - revizyon geçmişini kontrol, belli bir kullanıcı o sorunun dışında düzenlenmiş gibi görünüyor.
Conor O'Brien

1

C (32 bit platform), 65 bayt

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

İşaretçi boyutlarının hepsinin aynı olduğunu varsayar, ki bu neredeyse her zaman doğrudur. Başarı durumunda bir 0çıkış koduyla döner (dosya yalnızca NULkarakterler içerir ), aksi takdirde başka bir değer.

Komut satırı bağımsız değişkeni okunabilir bir dosyanın yolu değilse davranış tanımsızdır.


Sanırım yazman gerekiyor int**vmu? Bunu yapmadan segfault yapmadığı bir derleyici bulamıyorum. Ayrıca, kasıtlı olarak hata yaparak biraz tasarruf edebilirsiniz , ancak bunun en iyi yaklaşım olup olmadığını bilmiyorum.
FryAmTheEggman

Ha? Bunu mingw32'de gcc ile denedim, kusursuz çalışıyor. Muhtemelen kısıtlamayı eklemeliyim sizeof(void*) == sizeof(int)(veya daha genel olarak "32 bit platform") o zaman ... bir amd64platformda derlemeyi deneyin -m32;)
Felix Palmen

@FryAmTheEggman ayrıca 32 bit kod ( -m32) olarak derlendiğinde TIO üzerinde çalışır : Çevrimiçi deneyin!
Felix Palmen

Ah, elbette. Güzel iş, o zaman! Çift bayt kurtarmak için benim önerim kullanmaktan çekinmeyin :)
FryAmTheEggman

0

Bash + GNU yardımcı programları, 26 bayt

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

Girdi dosya adı bir komut satırı parametresi olarak verilir. Standart kabuk dönüş kodu olarak çıktı - yani 0 DOĞRU, 1 YANLIŞ.

Çevrimiçi deneyin!


0

Wolfram Dili (Mathematica) , 30 bayt

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

Çevrimiçi deneyin!

açıklama

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

Alternatif çözüm, 22 bayt

Boş dosyaların geçmesi gerekiyorsa, bu kısaltılabilir:

Tr@BinaryReadList@#<1&

Çevrimiçi deneyin!


0

Java, 149 bayt

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 bayt

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

Komut satırı argümanlarında bir dosya adı alır ve programın çıkış kodundaki yanıtı döndürür


0

Python 3, 59 bayt

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

Başarı için 0 döndürür (tüm baytlar sıfır).

Hata için 1 değerini döndürür (en az bir sıfır olmayan bayt veya sıfır uzunluklu dosya).


Dosya boşsa, Başarısızlığı döndürmeniz gerekir.
Adám

0

APL (Dyalog Unicode) , 14 bayt

Tam program. Stdin'den dosya adı istemi.

0=⌈/11 ¯1MAP

Çevrimiçi deneyin!

 dosya adı istemi

11 ¯1⎕MAP bu dosyayı paketlenmiş bir bit dizisiyle eşle

⌈/ maksimum (azaltma); boşsa en küçük şamandıra, aksi takdirde 0 veya 1

0= sıfır buna eşit mi?


0

Haskell, 49 bayt

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

Açıkçası içe aktarma dahil değilse, 26 bayttır.


Sanırım readFilebunun yerine demek istedin getContets. Ben normal bir Dize olarak dosyayı okuyabilir, =='\0'(veya daha iyi <'\1') karşılaştırın ve kurtulmak düşünüyorum import. Eğer isimsiz fonksiyonunu kullanabilirsiniz gibi, bırakın f x=ve pointfree gidin: (all(<'\1')<$>).readFile.
nimi

İkili bir dosyaysa, readFilegeçersiz bir Unicode sekansı ile karşılaşıldığında bir istisna atacak olan kullanamazsınız . Pointfree ile ilgili iyi bir nokta.
Izaak Weiss

0

JavaScript (ES8), 52 bayt

Bir URL'yi bağımsız değişken olarak alır ve truedosya boş değilse ve boş bayt içermediğinde çözülen bir söz verir .

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

0

Zsh , 35 bayt

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

Çevrimiçi deneyin!Çıkış kodu üzerinden çıkışlar.

Birlikte okuyun, karakterlere bölün ve bitsel olarak veya her bir kod noktasını birlikte okuyun.

Dosya boşsa, döngünün gövdesi asla çalıştırılmaz ve böylece döngü doğrulukla döner. Doğruluk-falsy değerleri değiştirilebilirse, !2 baytlık bir tasarruf için satır aralığı kaldırılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.