किसी फ़ाइल की जाँच में केवल नल बाइट्स होते हैं


12

आपका लक्ष्य एक प्रोग्राम या फ़ंक्शन लिखना है जो इनपुट के रूप में एक स्ट्रिंग को फ़ाइल में पथ का प्रतिनिधित्व करता है, और एक सत्य मान को आउटपुट करता है यदि वह फ़ाइल खाली नहीं है और इसमें कोई गैर-शून्य बाइट्स नहीं है - अर्थात, सभी बिट्स 0 हैं - - और एक गलत मूल्य।

मुझे लगता है कि यह एक बहुत ही सरल समस्या है और मुझे लगता है कि मैं कुछ हैक कर सकता हूं, लेकिन मुझे संदेह है कि ऐसा करने का कुछ छोटा और सुरुचिपूर्ण तरीका होना चाहिए, और इससे मुझे इससे बाहर एक चुनौती बनाने का विचार मिला।

यह , इसलिए बाइट्स जीत में सबसे छोटा कोड है। (मेरी खुद की प्राथमिकता सबसे तेज़ समाधान पर जाएगी, लेकिन यह बहुत अधिक कार्यान्वयन पर निर्भर है ...)

संबंधित प्रश्न : शून्य के साथ एक फ़ाइल पैड

प्रेरणा : यह केवल यह बताने के लिए है कि समस्या कहाँ से आती है, यदि आप रुचि रखते हैं। आपको इसे पढ़ने की आवश्यकता नहीं है।

सीडी और डीवीडी की आईएसओ छवियां, जिसे "dd" या अन्य माध्यमों से कॉपी किया जाता है, अक्सर बेकार ब्लॉकों के अनुक्रम के साथ समाप्त हो जाती हैं, जिसमें केवल नल बाइट्स होते हैं। इन ब्लॉकों को हटाने के लिए मानक तकनीक ज्ञात और सरल हैं ( /unix/74827/ ) देखें, लेकिन वे कभी-कभी गैर-शून्य उपयोगी डेटा निकाल सकते हैं क्योंकि माध्यम अपने स्वयं के आकार के बारे में झूठ बोल सकता है। इसलिए मैं यह जांचना चाहता हूं कि हटाए गए ब्लॉकों में केवल शून्य बाइट्स हैं। आईएसओ-छवियों के एक सामान्यीकृत संस्करण को परिभाषित करने के लिए इन ब्लॉकों को हटाना महत्वपूर्ण है।

जवाबों:


5

अजगर, 6 5 बाइट्स

!sCM'

इसे ऑनलाइन आज़माएं!

STDIN से फ़ाइल नाम लेता है, फ़ाइल खोलता है और पढ़ता है, इसे ints की सूची में परिवर्तित करता है (लगता है कि पायथन ord) sumकी सूची है ( 0यदि iff फ़ाइल सभी शून्य बाइट्स वापस आ जाएगी ), औरnot परिणाम को मुद्रित करते हुए इसे वापस करेगा।


अरे,

यह सामान्य प्रोग्रामिंग प्रश्न की तरह दिखता है। ये स्टैक ओवरफ्लो पर हैं । हालांकि, मुख्य पोस्ट के तहत टिप्पणियों से, मैं देख सकता हूं कि यह आपकी मंशा नहीं थी। उस ने कहा, मुझे लगता है कि दोनों पक्षों में चर्चा अनावश्यक रूप से शत्रुतापूर्ण रही है, इसलिए मैंने स्लैक को लेने और आपको उचित पीपीसीजी का स्वागत करने का निर्णय लिया है!

आमतौर पर, हम पूछते हैं कि किसी भी चुनौती को उचित प्रतिक्रिया के लिए पहले हमारे सैंडबॉक्स में पोस्ट किया जाता है । चुनौतियों के लिए हम क्या प्रारूप पसंद करते हैं, यह देखने के लिए आप वर्तमान प्रस्तुतियाँ देख सकते हैं। कृपया अगली बार कोशिश करें!

बस मामले में हम सब गलत समझा आपने और आप कर रहे हैं एक सामान्य समाधान के लिए देख रहा है, यहाँ अजगर 3 में एक समाधान है:

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

1
यह एक ग्रेस्केल छवि के साथ काम नहीं करेगा जिसमें केवल ब्लैक पिक्सल्स (शून्य) शामिल हैं, कितना शक्तिशाली 'है।
user202729

इसके अलावा: ओपी को कमांड-लाइन तर्क का उपयोग करके इनपुट के रूप में फ़ाइल नाम लेने की आवश्यकता होती है, और स्थिति कोड के रूप में वापस आती है।
user202729

2

GNU sed -zn , 5 बाइट्स

इनपुट फ़ाइल को कमांड-लाइन पैरामीटर के रूप में सेड करने के लिए पास किया जाता है। मानक शेल रिटर्न कोड के रूप में आउटपुट - यानी 0 TRUE है, 1 FALSE है।

/./q1

आम तौर sedपर न्यूलाइन-सीमांकित इनपुट रिकॉर्ड (AKA "लाइनें") पर काम करता है। -zइसे nul- सीमांकित इनपुट रिकॉर्ड में परिवर्तित करता है। यदि कोई इनपुट रिकॉर्ड .regex से मेल खाता है, तो qबाहर निकलें कोड 1 के साथ uit करें।

इसे ऑनलाइन आज़माएं!


2

डॉस, 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

यह कमांड-लाइन पर नामित फाइल को खोलता है, यदि रिटर्न शून्य है या गैर-शून्य है, तो रिटर्न 1 है।


1

अटैची , 24 बाइट्स

Zero@Max&0@Ords@FileRead

इसे ऑनलाइन आज़माएं!

व्याख्या

यह 4 कार्यों की एक संरचना है, एक के बाद एक निष्पादित:

  • FileRead - इनपुट के रूप में एक फ़ाइल का नाम लेता है, उस फ़ाइल की सामग्री लौटाता है
  • Ords - सूची में प्रत्येक वर्ण के ASCII कोड बिंदुओं को लौटाता है
  • Max&0- इस बराबर है करने के लिए, तर्क के लिए x, Max[x, 0]; यह बदले में सभी प्रविष्टियों की अधिकतम गणना करता है ( xऔर खाली सूची के लिए 0उपज 0)
  • Zero - यह एक विधेय है जो यह जांचता है कि क्या यह संख्या वास्तव में 0 है, और उस बूलियन को लौटाता है।

ओपी को पूर्ण कार्यक्रम की आवश्यकता है, कमांड लाइन से कॉल करें, फ़ाइल नाम का उपयोग तर्क के रूप में करें, और स्थिति कोड के रूप में लौटें। ( @_@)
user202729

क्या यह एक खाली फ़ाइल के लिए गलत सकारात्मक नहीं देता है?
ngenisis

1
@ngenisis ने मूल समस्या को निम्नलिखित कहा: "इसका मतलब है कि खाली फ़ाइल को ठीक माना जाता है" - संशोधन इतिहास की जांच करें, ऐसा लगता है कि एक निश्चित उपयोगकर्ता ने संपादित किया जो प्रश्न से बाहर है।
कॉनर ओ'ब्रायन

1

सी (32 बिट प्लेटफॉर्म), 65 बाइट्स

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

संकेत के आकार सभी समान हैं, जो लगभग हमेशा सच होता है। 0सफलता पर एक निकास कोड के साथ रिटर्न (फ़ाइल में केवल NULवर्ण शामिल हैं), कुछ अन्य मूल्य अन्यथा।

यदि कमांड लाइन तर्क एक पठनीय फ़ाइल के लिए एक रास्ता नहीं है, तो व्यवहार अपरिभाषित है।


मुझे लगता है कि आपको लिखने की आवश्यकता है int**v? मुझे ऐसा कंपाइलर नहीं मिल रहा है जहां ऐसा करने के बिना सेगफॉल्ट न हो। इसके अलावा, आप जानबूझकर गलत तरीके से थोड़ी बचत कर सकते हैं , लेकिन मुझे नहीं पता कि यह सबसे अच्छा तरीका है।
FryAmTheEggman 17

है ना? मैं mccw32 पर जीसीसी के साथ यह कोशिश की, निर्दोष रूप से काम करता है। मुझे शायद बाधा sizeof(void*) == sizeof(int)(या अधिक आम तौर पर "32-बिट प्लेटफॉर्म") को जोड़ना चाहिए ... फिर एक amd64मंच पर, साथ संकलन करने का प्रयास करें -m32;)
फेलिक्स पाम्स

@FryAmTheEggman भी TIO पर काम करता है जब 32bit कोड ( -m32) के रूप में संकलित किया जाता है : इसे ऑनलाइन आज़माएं!
फेलिक्स पालमेन

आह, बिल्कुल। NIce का काम, फिर! युगल बाइट्स को बचाने के लिए मेरे सुझाव का उपयोग करने के लिए स्वतंत्र महसूस करें :)
FryAmTheEggman

0

बैश + जीएनयू उपयोगिताओं, 26 बाइट्स

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

इनपुट फ़ाइलनाम को कमांड-लाइन पैरामीटर के रूप में दिया जाता है। मानक शेल रिटर्न कोड के रूप में आउटपुट - यानी 0 TRUE है, 1 FALSE है।

इसे ऑनलाइन आज़माएं!


0

वोल्फ्राम भाषा (गणितज्ञ) , 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

जावा, 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

पर्ल 5, 20 बाइट्स

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

कमांड लाइन आर्ग्स में एक फ़ाइल नाम लेता है और प्रोग्राम के एक्जिट कोड में प्रतिक्रिया देता है


0

पायथन 3, 59 बाइट्स

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

सफलता के लिए 0 रिटर्न (सभी बाइट्स शून्य)।

विफलता के लिए 1 रिटर्न (कम से कम एक नॉनजरो बाइट, या शून्य लंबाई फ़ाइल)।


यदि फ़ाइल खाली है, तो आपको विफलता वापस करनी होगी।
अदम

0

एपीएल (डायलॉग यूनिकोड) , 14 बाइट्स

पूरा कार्यक्रम। स्टड से फ़ाइलनाम के लिए संकेत।

0=⌈/11 ¯1MAP

इसे ऑनलाइन आज़माएं!

 फ़ाइल नाम के लिए संकेत

11 ¯1⎕MAP उस फ़ाइल को एक भरे हुए बिट सरणी में मैप करें

⌈/ अधिकतम (कमी); खाली होने पर सबसे छोटी नाव, अन्यथा 0 या 1

0= क्या शून्य उसके बराबर है?


0

हास्केल, 49 बाइट्स

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

जाहिर है अगर आयात शामिल नहीं है, तो यह 26 बाइट्स है।


मुझे लगता है कि आप के readFileबजाय मतलब था getContets। मुझे लगता है कि आप फ़ाइल को एक सामान्य स्ट्रिंग के रूप में पढ़ सकते हैं, तुलना =='\0'(या बेहतर <'\1') कर सकते हैं और छुटकारा पा सकते हैं import। आप एक गुमनाम समारोह का उपयोग कर सकते हैं, आप छोड़ सकते हैं f x=और pointfree जाना: (all(<'\1')<$>).readFile
nimi

यदि यह एक बाइनरी फ़ाइल है, तो आप उपयोग नहीं कर सकते हैं readFile, जो एक अमान्य यूनिकोड अनुक्रम का सामना करने पर एक अपवाद फेंक देगा। पॉइंटफ्री के संबंध में अच्छी बात है।
इजाक वीस

0

जावास्क्रिप्ट (ईएस 8), 52 बाइट्स

एक तर्क के रूप में एक url लेता है और एक वादा लौटाता है trueजो फ़ाइल खाली नहीं होने पर हल करता है और इसमें कोई नल बाइट्स नहीं है।

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

0

Zsh , 35 बाइट्स

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

इसे ऑनलाइन आज़माएं! निर्गम कोड के माध्यम से आउटपुट।

में पढ़ें, वर्णों पर विभाजित करें, और बिटवाइज़-या प्रत्येक कोडपॉइंट एक साथ।

यदि फ़ाइल खाली है, तो लूप का शरीर कभी नहीं चलता है और इसलिए लूप सत्य हो जाता है। यदि सत्य-झूठे मूल्यों की अदला-बदली की जा सकती है, तो !2-बाइट बचाने के लिए अग्रणी को हटाया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.