ファイルのチェックにはnullバイトのみが含まれます


12

あなたの目標は、ファイルへのパスを表す文字列を入力として受け取り、そのファイルが空でなく、null以外のバイトが含まれていない場合、つまりすべてのビットが0である場合、真偽値を出力するプログラムまたは関数を記述することです-それ以外の場合はfalsey値。

それは非常に単純な問題であり、何かをハッキングできると思いますが、短くてエレガントな方法が必要だと思うので、そこから挑戦するというアイデアが得られました。

これはなので、バイト単位の最短コードが優先されます。(私自身の好みは最速のソリューションになりますが、それは実装に依存しすぎます...)

関連する質問ファイルにゼロを埋め込む

動機これは、興味がある場合にのみ、問題の原因を伝えるためです。読む必要はありません。

「dd」またはその他の方法でコピーされたCDおよびDVDのISOイメージは、多くの場合、ヌルバイトのみを含む一連の無用なブロックで終了します。これらのブロックを削除する標準的な手法は既知で単純です(/unix/74827/を参照 )が、メディアが独自のサイズにあるため、null以外の有用なデータを削除する場合があります。したがって、削除されたブロックにヌルバイトのみが含まれていることを確認します。これらのブロックを削除することは、ISOイメージの正規化されたバージョンを定義するために重要です。

回答:


5

Pyth、6 5バイト

!sCM'

オンラインでお試しください!

STDINからファイル名を取得し、ファイルを開いて読み取り、intsのリストに変換します(Pythonを考えてくださいordsumsリスト(0ファイルがすべてnullバイトである場合にのみ返されます)、およびnot結果を出力します。


ねえ、

これは一般的なプログラミングの質問によく似ています。これらはStack Overflowに属します。ただし、メインポストのコメントから、これはあなたの意図ではないことがわかります。とはいえ、議論は双方にとって不必要に敵対的であると感じているため、スラックを取り上げて適切なPPCG歓迎を与えることにしました!

一般的に、適切なフィードバックを得るためにまずチャレンジをサンドボックスに投稿するようお願いします。そこにある現在の提出物を見て、チャレンジにどの形式を好むかを確認してください。次回もお試しください!

私たちはあなたとあなたがすべての誤解まし念のためにされている一般的な解決策を探して、ここにはPython 3での解決策があります:

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

1
これは、黒いピクセル(ゼロ)のみで構成されるグレースケールイメージでは機能しません'
user202729

その他:OPでは、コマンドライン引数を使用して入力としてファイル名を取得し、ステータスコードとして返す必要があります。
user202729

2

GNU sed -zn、5バイト

入力ファイルは、コマンドラインパラメーターとしてsedに渡されます。標準のシェルリターンコードとして出力されます。つまり、0はTRUE、1はFALSEです。

/./q1

通常sed、改行で区切られた入力レコード(別名「行」)で機能します。 -zこれをヌルで区切られた入力レコードに変更します。入力レコードが.正規表現と一致する場合、quitは終了コード1で終了します。

オンラインでお試しください!


2

DOS、37バイト


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

コマンドラインで指定されたファイルを開き、空またはゼロ以外の値を含む場合は0を返し、そうでない場合は1を返します。


1

アタッシュ、24バイト

Zero@Max&0@Ords@FileRead

オンラインでお試しください!

説明

これは、次々に実行される4つの関数の構成です。

  • FileRead -入力としてファイル名を取り、そのファイルの内容を返します
  • Ords -リスト内の各文字のASCIIコードポイントを返します
  • Max&0-これは、引数のx場合と同等Max[x, 0]です。これにより、xand 0(yieldingのすべてのエントリの最大値が計算されます0空のリスト)
  • Zero -これは、この数値が実際に0かどうかを確認する述語であり、そのブール値を返します。

OPには完全なプログラムが必要で、コマンドラインから呼び出し、引数を使用して入力としてファイル名を取り、ステータスコードとして戻ります。(@_@
user202729

これは、空のファイルに対して誤検知を与えませんか?
-ngenisis

1
@ngenisisは、元の問題が次のように述べていることを示しています:「つまり、空のファイルはOKと見なされます」-改訂履歴を確認してください。
コナーオブライエン

1

C(32ビットプラットフォーム)、65バイト

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

ポインターのサイズはすべて同じであると仮定しますが、これはほとんど常に真実です。0成功すると終了コードを返します(ファイルにはNUL文字のみが含まれます)。それ以外の場合は他の値を返します。

コマンドライン引数が読み取り可能なファイルへのパスでない場合の動作は未定義です。


書く必要があると思うint**v?これをせずにセグメンテーション違反が発生しないコンパイラは見つかりません。また、意図的にエラーを発生せることで少し節約できますが、これが最善のアプローチであるかどうかはわかりません。
FryAmTheEggman

え?私はこれをmingw32のgccで試しましたが、問題なく動作します。おそらく制約sizeof(void*) == sizeof(int)(または、より一般的には「32ビットプラットフォーム」)を追加する必要がありamd64ます。プラットフォームでコンパイルしてみてください-m32;)
Felix Palmen

@FryAmTheEggmanは、32ビットコードとしてコンパイルされたときにTIOでも動作します(-m32):オンラインで試してみてください!
フェリックスパルメン

ああ、もちろん。素敵な仕事、そして!私の提案を使用して、数バイトを保存してください:)
FryAmTheEggman


0

Wolfram言語(Mathematica)、30バイト

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

オンラインでお試しください!

説明

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

代替ソリューション、22バイト

空のファイルが渡されることになっている場合、これは次のように短縮できます。

Tr@BinaryReadList@#<1&

オンラインでお試しください!


0

Java、149バイト

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バイト

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

コマンドライン引数でファイル名を取得し、プログラムの終了コードで応答を返します


0

Python 3、59バイト

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

成功の場合は0(すべてのバイトがゼロ)を返します。

失敗の場合は1を返します(少なくとも1つの非ゼロバイト、またはゼロ長のファイル)。


ファイルが空の場合、Failureを返す必要があります。
アダム

0

APL(Dyalog Unicode)、14バイト

完全なプログラム。stdinからのファイル名のプロンプト。

0=⌈/11 ¯1MAP

オンラインでお試しください!

 ファイル名のプロンプト

11 ¯1⎕MAP そのファイルをパックされたビット配列にマップします

⌈/ 最大(削減); 空の場合は最小のフロート、それ以外の場合は0または1

0= ゼロはそれに等しいですか?


0

Haskell、49バイト

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

インポートが含まれていない場合、明らかに26バイトです。


readFile代わりにあなたが意味したと思いますgetContets。私はあなたが通常の文字列としてファイルを読み、比較する=='\0'(またはより良い<'\1')と取り除くことができると思いますimport。無名関数を使用できるため、をドロップしf x=てgo pointfree:を実行できます(all(<'\1')<$>).readFile
-nimi

バイナリファイルの場合readFile、無効なUnicodeシーケンスが発生すると例外をスローするを使用できません。ポイントフリーに関する良い点。
イザークヴァイス

0

JavaScript(ES8)、52バイト

引数としてurlを取り、trueファイルが空ではなく、nullバイトが含まれていない場合に解決するプロミスを返します。

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

0

Zsh、35バイト

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

オンラインでお試しください!終了コードを介した出力。

読み込んで、文字で分割し、ビット単位で、または各コードポイントを一緒に。

ファイルが空の場合、ループの本体は実行されないため、ループは真実を返します。真偽値を交換できる場合は、先頭!を削除して2バイト保存できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.