पृष्ठभूमि
C में परिवर्तनीय घोषणा विवरण में तीन भाग होते हैं: चर का नाम , इसका आधार प्रकार और प्रकार संशोधक ।
तीन प्रकार के संशोधक हैं:
- सूचक
*
(उपसर्ग) - सरणी
[N]
(पोस्टफ़िक्स) - फ़ंक्शन
()
(पोस्टफ़िक्स)- आप पार्न्स के अंदर फ़ंक्शन तर्कों की एक सूची निर्दिष्ट कर सकते हैं, लेकिन इस चुनौती के लिए, आइए इसे अनदेखा करें और बस उपयोग करें
()
(जिसका तकनीकी अर्थ है "फ़ंक्शन किसी भी तरह के तर्क ले सकता है")।
- आप पार्न्स के अंदर फ़ंक्शन तर्कों की एक सूची निर्दिष्ट कर सकते हैं, लेकिन इस चुनौती के लिए, आइए इसे अनदेखा करें और बस उपयोग करें
और नोटेशन पढ़ने का एक तरीका इस प्रकार है:
int i; // i is an int
float *f; // f is a pointer to a float
my_struct_t s[10]; // s is an array of 10 my_struct_t
int func(); // func is a function returning an int
पकड़ यह है कि हम इन सभी को मिला सकते हैं ताकि अधिक जटिल प्रकार का निर्माण किया जा सके, जैसे कि सरणी का सरणी या फ़ंक्शन पॉइंटर्स का पॉइंटर या पॉइंटर्स से व्यूअर का सरणी :
int arr[3][4];
// arr is an array of 3 arrays of 4 ints
int (*fptrs[10])();
// fptrs is an array of 10 pointers to functions returning an int
float *(*p)[16];
// p is a pointer to an array of 16 pointers to float
मैंने इन जटिल कथनों को कैसे पढ़ा?
- चर नाम से प्रारंभ करें।
(name) is ...
- उच्चतम वरीयता वाले संशोधक का चयन करें।
- इसे पढ़ें:
* -> pointer to ...
[N] -> array of N ...
() -> function returning ...
- 2 और 3 को दोहराएं जब तक संशोधक समाप्त नहीं हो जाते।
- अंत में, आधार प्रकार पढ़ें।
... (base type).
C में, उपसर्ग ऑपरेटर उपसर्ग ऑपरेटरों पर पूर्वता लेते हैं, और प्रकार संशोधक कोई अपवाद नहीं हैं। इसलिए, []
और ()
पहले बांधें, फिर *
। Parens की एक जोड़ी के अंदर कुछ भी (...)
(फ़ंक्शन ऑपरेटर के साथ भ्रमित नहीं होना) पहले कुछ भी बाहर से बांधता है।
सचित्र उदाहरण:
int (*fptrs[10])();
fptrs fptrs is ...
[10] array of 10 ... // [] takes precedence over *
(* ) pointer to ...
() function returning ...
int int
कार्य
सी में लिखे गए वेरिएबल डिक्लेरेशन स्टेटमेंट की एक लाइन को देखते हुए, ऊपर बताए गए तरीके का उपयोग करके, लाइन का वर्णन करने वाले अंग्रेजी एक्सप्रेशन को आउटपुट करें।
इनपुट
इनपुट एकल सी स्टेटमेंट है जिसमें एकल आधार प्रकार, एकल चर नाम, शून्य या अधिक प्रकार के संशोधक और अंतिम अर्धविराम शामिल हैं। आपको ऊपर दिए गए सभी सिंटैक्स तत्वों को लागू करना होगा, साथ ही:
- आधार प्रकार और चर नाम दोनों नियमित अभिव्यक्ति से मेल खाते हैं
[A-Za-z_][A-Za-z0-9_]*
। - सैद्धांतिक रूप से, आपके कार्यक्रम को असीमित संख्या में संशोधक का समर्थन करना चाहिए।
आप निम्नलिखित तरीकों से अन्य सी सिंटैक्स तत्वों को सरल कर सकते हैं (पूर्ण कार्यान्वयन भी स्वागत है):
- आधार प्रकार हमेशा एक शब्द है, जैसे
int
,float
,uint32_t
,myStruct
। जैसे कुछunsigned long long
परीक्षण नहीं किया जाएगा। - सरणी संकेतन के लिए
[N]
, संख्याN
हमेशा आधार 10 में लिखा गया एक एकल धनात्मक पूर्णांक होगा । चीजों की तरहint a[5+5]
,int a[SIZE]
याint a[0x0f]
परीक्षण नहीं किया जाएगा। - फ़ंक्शन संकेतन के लिए
()
, कोई भी पैरामीटर निर्दिष्ट नहीं किया जाएगा, जैसा कि ऊपर बताया गया है। - व्हाट्सएप के लिए, केवल स्पेस कैरेक्टर
0x20
का उपयोग किया जाएगा। आप अपने कार्यक्रम को व्हॉट्सएप के विशिष्ट उपयोग के लिए प्रतिबंधित कर सकते हैं, जैसे- आधार प्रकार के बाद केवल एक स्थान का उपयोग करें
- टोकन के बीच हर जगह एक जगह का उपयोग करें
- हालाँकि, आप एक टोकन विभाजक होने की तुलना में अधिक जानकारी देने के लिए दो या अधिक लगातार रिक्त स्थान का उपयोग नहीं कर सकते हैं।
सी सिंटैक्स के अनुसार, निम्नलिखित तीन संयोजन अमान्य हैं, और इस प्रकार इसका परीक्षण नहीं किया जाएगा:
f()()
समारोह वापसी समारोहf()[]
समारोह रिटर्निंग सरणीa[]()
एन कार्यों का सरणी
सी डेवलपर्स इसके बजाय इन समकक्ष रूपों का उपयोग करते हैं (और ये सभी परीक्षण मामलों में शामिल हैं):
(*f())()
कार्य करने के लिए रिटर्निंग पॉइंटर*f()
सरणी के पहले तत्व के लिए रिटर्निंग पॉइंटर(*a[])()
कार्य करने के लिए एन संकेत की सरणी
उत्पादन
आउटपुट एक अंग्रेजी वाक्य है। आपको अंग्रेजी व्याकरण का सम्मान करने की आवश्यकता नहीं है (लेकिन यदि आप चाहें तो) अंग्रेजी, जैसे a, an, the
, एकवचन / बहुवचन रूपों और अंतिम बिंदु (अवधि) का उपयोग कर सकते हैं। प्रत्येक शब्द को एक या अधिक व्हाट्सएप (स्पेस, टैब, न्यूलाइन) द्वारा अलग किया जाना चाहिए ताकि परिणाम मानव-पठनीय हो।
फिर, यहाँ रूपांतरण प्रक्रिया है:
- चर नाम से प्रारंभ करें।
(name) is ...
- उच्चतम वरीयता वाले संशोधक का चयन करें।
- इसे पढ़ें:
* -> pointer to ...
[N] -> array of N ...
() -> function returning ...
- 2 और 3 को दोहराएं जब तक संशोधक समाप्त नहीं हो जाते।
- अंत में, आधार प्रकार पढ़ें।
... (base type).
परीक्षण के मामलों
int i; // i is int
float *f; // f is pointer to float
my_struct_t s[10]; // s is array of 10 my_struct_t
int func(); // func is function returning int
int arr[3][4]; // arr is array of 3 array of 4 int
int (*fptrs[10])(); // fptrs is array of 10 pointer to function returning int
float *(*p)[16]; // p is pointer to array of 16 pointer to float
_RANdom_TYPE_123 (**(*_WTH_is_TH15)())[1234][567];
/* _WTH_is_TH15 is pointer to function returning pointer to pointer to array of
1234 array of 567 _RANdom_TYPE_123 */
uint32_t **(*(**(*(***p)[2])())[123])[4][5];
/* p is pointer to pointer to pointer to array of 2 pointer to function returning
pointer to pointer to array of 123 pointer to array of 4 array of 5 pointer to
pointer to uint32_t */
uint32_t (**((*(**(((*(((**(*p)))[2]))())))[123])[4])[5]);
// Same as above, just more redundant parens
some_type (*(*(*(*(*curried_func())())())())())();
/* curried_func is function returning pointer to function returning pointer to
function returning pointer to function returning pointer to
function returning pointer to function returning some_type */
स्कोरिंग और जीत मानदंड
यह एक कोड-गोल्फ चुनौती है। सबसे कम संख्या के बाइट्स वाला कार्यक्रम जीतता है।
int arr[3][4];
है an array of 3 arrays of 4 ints
(जैसा कि आप कहते हैं), या an array of 4 arrays of 3 ints
?
;
लाइन के अंत में होता है?