C90 (gcc), 46 बाइट्स
r;main(c,v)int**v;{while(0<--c&*v[c])r++;c=r;}
इनपुट कमांड-लाइन तर्कों (एक पूर्णांक प्रति तर्क) के माध्यम से होता है, आउटपुट आउट कोड के माध्यम से होता है ।
इसे ऑनलाइन आज़माएं!
यह काम किस प्रकार करता है
r एक वैश्विक चर है। इसका प्रकार int के लिए डिफ़ॉल्ट है और, वैश्विक होने के कारण, यह मान को 0 से चूकता है ।
फ़ंक्शन तर्क c डिफ़ॉल्ट के साथ-साथ int । यह एन बूलियन्स की सरणियों के लिए पूर्णांक एन + 1 धारण करेगा ; मुख्य का पहला तर्क हमेशा निष्पादन योग्य का मार्ग है।
फ़ंक्शन तर्क v के रूप में घोषित किया गया है int**
। के वास्तविक प्रकार वी हो जाएगा char**
, लेकिन जब से हम केवल प्रत्येक तर्क के कम से कम महत्वपूर्ण बिट वर्ण बताने के लिए जांच करेंगे 0 (कोड बिंदु 48 ) और 1 (कोड बिंदु 49 ) के अलावा, इस पर थोड़ा-endian कोई फर्क नहीं होगा मशीनों।
जबकि लूप घटता है c और इसकी तुलना 0 से करता है । एक बार c 0 तक पहुंचने के बाद , हम लूप से बाहर निकल जाएंगे। यह केवल तभी आवश्यक है जब सरणी में कोई 0 नहीं है ।
जब तक 0<--c
रिटर्न 1 होता है , हम c वें कमांड-लाइन तर्क ( v[c]
) लेते हैं और इसके पहले अक्षर को पॉइंटर (dereferencing) करके निकालते हैं *
। हम बिटवाइज़ और बूलियन के ले 0<--c
, और चरित्र (और तीन कचरा बाइट्स है कि यह पालन) का कोड बिंदु तो हालत वापस आ जाएगी 0 बार एक 0 का सामना करना पड़ा है, लूप के बाहर तोड़ दिया।
शेष मामले में, जबकि कमांड लाइन तर्क हैं 1 , r++
वृद्धि कर देता है आर द्वारा 1 , इस प्रकार अनुगामी की संख्या की गणना 1 के।
अंत में, सी में आरc=r
के गणना मूल्य को संग्रहीत करता है । डिफ़ॉल्ट सेटिंग्स के साथ, कंपाइलर असाइनमेंट को ऑप्टिमाइज़ और हटा देता है; यह वास्तव में निर्देश उत्पन्न करता है । चूंकि EAX रजिस्टर का मूल्य लौटाता है, यह वांछित आउटपुट उत्पन्न करता है।movl %eax, -4(%rbp)
ret
ध्यान दें कि यह कोड C99 के साथ काम नहीं करता है , जो कि मुख्य के अंत तक पहुंचने पर मुख्य से 0 वापस आता है।
01100
?