m3ph1st0s की प्रोग्रामिंग पहेली 3 (C): "इज़ी बग" [बंद]


11

यह C / C ++ पहेली की मेरी श्रृंखला का तीसरा है; यदि आप पहले 2 से चूक गए तो वे यहां हैं: (1) m3ph1st0s की प्रोग्रामिंग पहेली 1 (C ++) (2) m3ph1st0s की प्रोग्रामिंग पहेली 2 (C ++): "कॉल हार्ड!"

मुझे कहना होगा कि मेरी पहेलियाँ 100% मूल हैं। यदि नहीं, तो मैं हमेशा पाठ में ऐसा लिखूंगा। मेरी तीसरी पहेली के 2 भाग हैं:

पहेली 3.1

यह हिस्सा (3.1) मेरी एक मूल पहेली नहीं है, यह कुछ इंटरनेट पेज से एकत्र किया गया है जिसे मैंने कुछ समय पहले पढ़ा है। मैं इसे एक शुरुआती बिंदु और आपके लिए एक वार्म-अप के रूप में उपयोग करता हूं। इस एक को हल करें और फिर 2 भाग पर जाएं।

कुछ लोगों ने 20 बार "+" चिन्ह छापने की कोशिश की और निम्नलिखित कार्यक्रम के साथ आए:

#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

तथ्य यह है कि यह अपेक्षित परिणाम नहीं था स्पष्ट है - कार्यक्रम कभी समाप्त नहीं होता है। इसे ठीक करो! आसान? अब केवल एक चरित्र बदलकर कार्यक्रम को ठीक करें - निश्चित रूप से गैर-अंतरिक्ष चरित्र! इस चुनौती के लिए 3 समाधान हैं। उनमें से सभी 3 खोजें। बस इसे स्पष्ट करने के लिए: कार्यक्रम को 20 "+" संकेतों का उत्पादन करना चाहिए और तेजी से समाप्त होना चाहिए। "तेज़" का मतलब क्या है, इस पर मेरी आलोचना करने से पहले, मैं कहूंगा कि इसका मतलब है कि कुछ सेकंड में (जो वैसे भी बहुत अधिक है, लेकिन सिर्फ इसे स्पष्ट करने के लिए)।

पहेली 3.2

EDITED यह मुझे पहले बताया गया था कि 3.2.2 पहेली के लिए समाधान संकलक-निर्भर हो सकता है। इस विषय पर किसी भी संभावित चर्चा को खत्म करने के लिए, मैं इस विचार को संशोधित करूंगा और अगली पहेली पर इसे सुधारूंगा जब मैं विवाद उत्पन्न नहीं करने के लिए अतिरिक्त ध्यान रखूंगा। हालाँकि, इस पहेली को जारी रखने के लिए, मैं 3.2.2 के लिए एक छोटा संशोधन करूँगा (समाधान आसान लेकिन क्लीनर होगा)।

जब मैंने पहली बार पहेली देखी तो मुझे यह बहुत बढ़िया लगा। मैंने इसे हल करने का प्रबंधन किया, लेकिन तुरंत नहीं क्योंकि इसके लिए कुछ सावधान ध्यान देने की आवश्यकता है। यदि आप यहां हैं तो इसका मतलब है कि आपने इसे भी हल कर लिया है। यदि आपने सभी संभावित मूल्यों के साथ सभी संभावित पात्रों को बदलने और हर समाधान का परीक्षण करने के लिए एक प्रोग्राम लिखकर ऐसा किया है, तो आप खो गए हैं। हालांकि कड़ी मेहनत करने वाला लड़का। अब 20 "+" संकेत लिखने वाले प्रोग्राम को ठीक कर रहा है:

३.२.१: कोड में एक भी अक्षर और कुछ भी नहीं डालें ताकि परिणाम मान्य हो और सभी ३ सही किए गए कार्यक्रमों में एक ही चीज़ का आउटपुट हो। कहने की जरूरत नहीं है, पत्र मुख्य के संलग्नक} से पहले होना चाहिए (मैं कहता हूं कि क्योंकि मैं ऐसे लोगों को नहीं सुनना चाहता जो सिर्फ कार्यक्रम के बाद एक पत्र डालते हैं और किसी तरह उनका संकलक बहुत अनुकूल था)।

EDITED (bellow देखें) - इन अंतिम प्रश्नों के लिए विचार करें कि काउंटर I 0 के बजाय -1 से शुरू होता है।

३.२.१.५: पिछली सभी समस्याओं को इस शर्त के साथ दोहराएं कि आउटपुट कम से कम १ ९ "+" संकेत (लेकिन अभी भी एक परिमित आउटपुट है)। रिक्त स्थान बदलने की अनुमति है। अब आपको पहले मामले की तुलना में अधिक समाधान मिल सकता है। इनमें से कुछ निश्चित रूप से 3.2.2 प्रश्न के लिए फिट होंगे।

3.2.2: वैरिएबल n को इनिशियलाइज़ करने के लिए एक और वैल्यू चुनें ताकि परिणामस्वरूप आउटपुट 3.2.1.5 में कम से कम एक सही प्रोग्राम के लिए समान रहे (जरूरी नहीं कि सभी के लिए)।

LAST EDIT1 : प्रोग्राम को बदलना ताकि यह 21 "+" संकेतों का उत्पादन करता है, अभी भी एक अच्छा समाधान है, क्योंकि मूल पाठ ने "बिल्कुल" 20 संकेतों को नहीं कहा था। हालांकि, अनंत उत्पादन निषिद्ध है। स्पष्ट रूप से इसका मतलब यह नहीं है कि सभी सैकड़ों "+" संकेतों का उत्पादन शुरू करते हैं क्योंकि यह निषिद्ध नहीं है। लेकिन एक सुंदर 21 आउटपुट को खत्म करना इस प्रतियोगिता की भावना में नहीं होगा।

LAST EDIT2 : LAST EDIT1 पर विचार करने और स्थान बदलने को स्वीकार करने से ऐसा लगता है कि अब हमारे पास 5 संभावित समाधान हैं, जिनमें से चार को पहले ही प्रतिक्रियाओं में इंगित किया गया है। हालांकि अंतिम चुनौती को छुआ नहीं गया है और मुझे इसे एक बार फिर स्पष्ट करना होगा : n को एक और मान सौंपा जाना चाहिए , कुछ ट्रिक्स द्वारा 20 से n असाइन करने वाले समाधान ऐसा नहीं करेंगे (जैसे n = 20L)। इसके अलावा, मैं उन 3 समाधानों को देखना पसंद करता हूं जो रिक्त स्थान नहीं बदलते हैं।

पिछले EDIT3 : मैंने पिछले प्रश्नों को संपादित किया है, कृपया पढ़ें!

पहेली के दोनों हिस्सों को हल करना चुनौती है। यह करने वाला पहला जीतता है।

मुझे आशा है कि यह सब स्पष्ट है, यदि कोई प्रश्न पोस्ट नहीं करते हैं और मैं जितनी जल्दी हो सके संपादित करूंगा। चीयर्स। पाठ पर बल दिया


मुझे लगता है कि एक चरित्र को बदलना किसी भी स्थान को गैर-अंतरिक्ष वर्णों में बदलना शामिल है? यदि हां, तो मुझे लगता है कि मुझे भाग 1 के लिए सभी 3 समाधान मिल गए हैं
— मैलामोकब

ओह..सोर्री..मैंने दिमाग से इनकार किया था कि मैं उसे समझाऊं लेकिन मैं भूल गया। मैं अब संपादित करूँगा। पूछने के लिए Thx।
— बोगडान अलेक्जेंड्रू

ओह अच्छा। क्योंकि मैं अपने वर्तमान 3 समाधानों के लिए भाग 3.2.2 के लिए कोई जवाब नहीं पा रहा हूँ ... मुझे लगता है कि इसका मतलब है कि मुझे एक और देखने की आवश्यकता है :)
— mellamokb

हाँ :) उस पर शुभकामनाएँ
— बोगडान एलेक्जेंड्रू

1
@ardnew: मुझे विश्वास नहीं है कि ओपी ने एक बार प्रश्न के मूल इरादे को बदल दिया है। मैं मानता हूं कि एडिट के एक समूह को अंत में उछालने की तुलना में प्रश्न को ठीक करने के बेहतर तरीके हैं ... लेकिन यह अभी भी मूल प्रश्न पर है, जिसमें कुछ चीजें स्पष्ट की गई हैं।
— मेलमोकब

जवाबों:


8

3.1

for( i = 0;-i < n; i-- )
for( i = 0; i < n; n-- )
for( i = 0; i + n; i-- )

इन परिवर्तनों में से कोई भी प्रोग्राम आउटपुट 20 '+' संकेत देगा। यह करीब है:

for( i = 0;~i < n; i-- )

यह 21 '+' संकेतों का उत्पादन करता है।

3.2.1

मुझे इस समस्या को हल करने के लिए कम से कम 112 तरीके मिले, जिसमें एक अक्षर सम्मिलित था। उनमें से सभी सभी संकलक पर काम नहीं कर सकते हैं।

int n = 20L;
int n = 20f;
int n = 20d;
uint n = 20;

for( i = 0L; ... )
for( i = 0f; ... )
for( i = 0d; ... )

iprintf("+");
printf("+x");
printf("x+");

पिछले दो के लिए, xआपको 104 संभावित समाधान देने के लिए किसी भी पत्र को स्थानापन्न करें । पिछली दो लाइनों में से किसी एक का उपयोग करने से आउटपुट बदल जाएगा, लेकिन आउटपुट अभी भी सभी 3 सही प्रोग्रामों के लिए समान होगा।

3.2.2

मैं सभी के साथ आया हूँ कुछ चीजें हैं जो असाइनमेंट पर 20 नंबर पर वापस डाली जाती हैं int।

int n = 20L;
int n = 20.001;
int n = 20.999;
int n = 20 + 0x100000000L;

हां, आपके पास मेरे द्वारा किए गए सटीक उत्तर हैं (मैंने पहले उन्हें पोस्ट नहीं किया था क्योंकि मेरे पास सब कुछ उत्तर नहीं था)। मुझे लगता है कि ३.२.२ का जवाब ३.१ के तीसरे समाधान में निहित है जो हम में से किसी ने भी नहीं पाया है (और स्थान को बदलने की अनुमति नहीं देने के नियम का पालन करता है)।
— मेलमोकब

3.2.1 पर, मैं के बारे में यकीन नहीं है fऔर dके लिए प्रत्ययों intप्रकार (अच्छी तरह से, dके लिए किसी भी उस बात के लिए प्रकार) है, लेकिन वहाँ कुछ अन्य लोगों से आपने छोड़ा था गए हैं: int n = 20l, int n = 20U, और int n = 20u। इसके अलावा, मेरा मानना uintहै कि C या C ++ में एक मानक प्रकार पहचानकर्ता नहीं है। वैसे भी आप इन के लिए क्या संकलक का उपयोग कर रहे हैं?
— arnnew

आपने यहाँ बहुत अच्छा काम किया है, लेकिन पूरा नहीं किया है! सबसे पहले, ~ i समाधान अभी भी अच्छा है! आवश्यकता 20 "+" संकेतों को आउटपुट करने की थी इसलिए 21 अभी भी एक अच्छा समाधान है (एकमात्र बुरा समाधान अनंत आउटपुट है)। इसका मतलब है कि आपने अब 4 समाधान ढूंढ लिए हैं! और मजेदार बात यह है कि, मेरे पास अभी भी एक और :) 3.2.2 के बारे में है, यह बुरा है क्योंकि मुझे विशेष रूप से n के VALUE को बदलने की आवश्यकता है, इसे 20 करने के लिए कुछ ट्रिक्स नहीं करने के लिए :)
— बोगदान अलेक्जेंड्रू

1
और, दोनों -i और ~ i समाधान रिक्त स्थान बदलते हैं, इसलिए मैं उन्हें "आंशिक" समाधान मानूंगा। 3 जी पूर्ण समाधान को प्रश्नोत्तरी पाठ में निर्दिष्ट गैर-अंतरिक्ष वर्ण को बदलना होगा
— बोगदान अलेक्जेंड्रू

1
आपने समस्या को नहीं समझा। मैंने कहा कि संशोधन उसी आउटपुट को उत्पन्न करेगा जो कि संशोधित संशोधित कार्यक्रम है। अर्थात्, मेरे पास सही प्रोग्राम C1, C2, C3 हैं। चरित्र सम्मिलन के बाद मेरे पास P1, P2, P3 है। आवश्यकता है: P1 में C1 के समान आउटपुट है, P2 में C2 के समान आउटपुट है, P3 में C3 के समान आउटपुट है। यह P1, P2, P3 समान आउटपुट वाला नहीं है
— बोगडान अलेक्जेंड्रू

2

3.1

फिर भी एक और पहेली। लेकिन सामान्य समाधान उबाऊ हैं, कुछ विशेष के बारे में क्या?

समाधान एक:

#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++ )
      printf("+");
   return 0;
}

मैंने केवल एक वर्ण बदलने का फैसला किया है, वह यह है कि -। के अलावा कोई भी चरित्र नहीं -बदला गया था।

समाधान दो:

#include <stdio.h>
int main() {
   int i=printf("++++++++++++++++++++");exit(0);
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

यह वास्तव में एक चरित्र - अर्धविराम int iमें बदल जाता है =printf("++++++++++++++++++++");exit(0);।

समाधान तीन:

#include <stdix.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

यह stdix.hसिस्टम हैडर को लोड करता है। सिस्टम में पथ शामिल है, निम्न फ़ाइल डालें, जिसे stdix.h कहा जाता है। इसमें निम्नलिखित सामग्री शामिल है।

static inline void printf(const char *string) {
    int i;
    for(i = 0; i < 20; i--)
        putchar('+');
    exit(0);
}

3.2

अब एक अक्षर डालना है। खैर, यह आसान है, के int main()साथ बदलें int main(a)। यह मानकों के अनुसार मान्य नहीं है, लेकिन कौन परवाह करता है?


0

पहेली 3.1 उत्तर

  1. बदलें i--करने के लिए n--(डेमो: http://ideone.com/l0Y10 )
  2. बदलें i < nकरने के लिए i + n(डेमो: http://ideone.com/CAqWO )
  3. बदलें [SPACE]i < nकरने के लिए -i < n। (डेमो: http://ideone.com/s5Z2r )

पहेली 3.2.1

बदलें int n = 20करने के लिए int n = 20L(एक जोड़ने के Lअंत करने के लिए)।

पहेली 3.2.2

अभी तक एक उत्तर नहीं मिला ...


3.1 और 3.2.1 के लिए अच्छा, मानक समाधान।
— बोगडान अलेक्जेंड्रू

0

3.1

  1. बदलें i--करने के लिएn--
  2. i<n सेवा -i<n
  3. (दुर्भाग्य से अमान्य उत्तर क्योंकि मैं अन्य उत्तरों को देखने से पहले संकलक के साथ जाँच नहीं कर रहा था)

3.2.1

int n = 20 

सेवा

uint n = 20

(कंपाइलर निर्भर ...)

3.2.2

int n =-20L;

for(i = -1; i%n; i--)

प्रिंट 19 + संकेत, साथ ही int n = 20L;। हालाँकि, मैं इसके साथ नहीं आया होता अगर मैंने 3.2.1 के अन्य उत्तर नहीं देखे होते


0
#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++  )
      printf("+");
        printf("\n");
   return 0;
}

1
अपने उत्तर में कार्यक्रम की भाषा और वर्ण गणना जोड़ना सुनिश्चित करें।
— तिमटेक

1
@Timtech चरित्र की गिनती क्यों? यह कोड-गोल्फ नहीं है
— गर्वित हैकेलर

1
@Timtech भी भाषा को शामिल करने के लिए क्यों? यह एक भाषा विशिष्ट चुनौती है।
— गौरवशाली हैकेलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.