2012-02-27 12 views
6

मैं एक प्रश्नोत्तरी था और मैं इस कोड लिखा है:सी प्रोग्रामिंग। FizzBuzz कार्यक्रम

प्रिंट सीटी अगर यह 3 से विभाज्य है और यह बज़ प्रिंट अगर यह 5. से विभाज्य है यह FizzBuss प्रिंट अगर यह दोनों से विभाज्य है। अन्यथा, यह संख्या 1 और 100 के बीच मुद्रित करेगा।

लेकिन घर आने के बाद, मुझे आश्चर्य हुआ कि इसे कम कोड के साथ लिख सकता है। हालांकि, मैं एक छोटे कोड के साथ बाहर नहीं आ सकता था। क्या मैं इसे एक छोटे कोड के साथ कर सकता हूं? धन्यवाद।

यह मैंने लिखा है और मुझे लगता है कि यह अच्छी तरह से काम करता है। लेकिन क्या मैं इसे कम कोड के साथ कर सकता हूं।

#include <stdio.h> 

int main(void) 
{ 
    int i; 
    for(i=1; i<=100; i++) 
    { 
     if(((i%3)||(i%5))== 0) 
      printf("number= %d FizzBuzz\n", i); 
     else if((i%3)==0) 
      printf("number= %d Fizz\n", i); 
     else if((i%5)==0) 
      printf("number= %d Buzz\n", i); 
     else 
      printf("number= %d\n",i); 

    } 

    return 0; 
} 
+0

साथ जाना चाहते हैं इस होमवर्क है? (बीटीडब्ल्यू, क्या आप वाकई पहले कथन को अनुकूलित करने का इरादा रखते थे ?:( – Francois

+1

स्टैक एक्सचेंज में एक कोडगॉल्फ साइट है जो मुझे विश्वास है –

+0

यह प्रश्न उन लोगों को हराने के लिए प्रेरित करता है जो चालाक होने का प्रयास करते हैं। आप इसे छोटा कर सकते हैं, लेकिन फिर यह इसे गलत करने में आसान है। आपने इसे सही करने का सरल तरीका क्या किया है। – ugoren

उत्तर

7

एक नंबर 3 और 5 दोनों से विभाज्य है, तो यह 15 से विभाज्य है, तो:

for each number 1 to 100: 
    if number % 15 == 0: 
     print number, "fizzbuzz" 
    else if number % 5 == 0: 
     print number, "buzz" 
    else if number % 3 == 0: 
     print number, "fizz" 
    else: 
     print number 

उसके अलावा, आप शायद यह बहुत कम कम से कम में नहीं मिलेगा, सी जैसी पारंपरिक भाषा (और मुझे लगता है कि आप सामान्य कोड-गोल्फ शैली संशोधनों को नहीं चाहते हैं जो आपके कोड को अपठनीय बनाते हैं)।

यदि आप पूरे main फ़ंक्शन को एक बड़ी लाइन पर पैक करते हैं तो आप पूरी चीज को दो पंक्तियों में भी प्राप्त कर सकते हैं, लेकिन मुझे आशा है कि आप इस तरह की चालबाजी के बाद भी नहीं होंगे।

static const char *xyzzy[] = { 
    "",  "",  "fizz", "",  "buzz", 
    "fizz", "",  "",  "fizz", "buzz", 
    "",  "fizz", "",  "buzz", "fizzbuzz", 
    // Duplicate those last three lines to have seven copies (7x15=105). 
}; 
for (int i = 1; i <= 100; i++) 
    printf ("%d %s\n", i, xyzzy[i-1]); 

एक अलग रूप में के रूप में, चार संकेत के उस सरणी अंतरिक्ष कम होने की संभावना है:

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

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

+0

धन्यवाद। यह सच है। पहले टेस्ट के लिए मैं इसे केवल एक नंबर की अवधि में सोच सकता था। मैं भविष्य में अभ्यास के साथ इसे ध्यान में रखूंगा। धन्यवाद। – leocod

11

तुम भी कर सकता है:

#include <stdio.h> 

int main(void) 
{ 
    int i; 
    for(i=1; i<=100; ++i) 
    { 
     if (i % 3 == 0) 
      printf("Fizz"); 
     if (i % 5 == 0) 
      printf("Buzz"); 
     if ((i % 3 != 0) && (i % 5 != 0)) 
      printf("number=%d", i); 
     printf("\n"); 
    } 

    return 0; 
} 

कुछ लाइनों में कम है, और एक बहुत आसान को पढ़ने के लिए।

+0

धन्यवाद। यह छोटा दिखता है। – leocod

+0

यदि आप हमेशा संख्या नहीं चाहते हैं तो आप printf ("संख्या =% d", i) शीर्ष पर और अंतिम को हटाकर एक पंक्ति को भी पट्टी कर सकते हैं। – martiert

+0

'अगर ((i% 3! = 0) && (i% 5! = 0)) 'वास्तव में केवल' अगर (i% 3 && i% 5) 'के रूप में लिखा जा सकता है। इस मामले में 'i% 3' और' i% 5' गैर-शून्य संख्याएं लौटाएंगे, जो सत्य का मूल्यांकन करते हैं। – fbonetti

2

मैं कहूंगा कि मॉड्यूल महंगा है जबकि तुलना सस्ते हैं इसलिए केवल एक बार मॉड्यूलो करें। इससे ऐसा कुछ पैदा होगा।

int i; 
for(i = 0; i!=100; ++i) { 
    bool bModThree = !(i % 3); 
    bool bModFive = !(i % 5); 

    if(bModThree || bModFive) { 
     if(bModThree) { 
      printf("Fizz"); 
     } 
     if(bModFive) { 
      printf("Buzz"); 
     } 
    } else { 
     printf("%d", i); 
    } 

    printf("\n"); 
} 
+0

आपको हमेशा संख्या मुद्रित नहीं करना चाहिए। – franklynd

+0

@ फ्रैंकलिंड ओह डॉन। आप सही हे। मैंने एक बेहतर उदाहरण के साथ जवाब अद्यतन किया। – Kenneth

7

मुझे यकीन नहीं है कि आप इसे अपठनीय कहां शुरू करना चाहते हैं, लेकिन यह है।

#include <stdio.h> 

int main(void) 
{ 
    int i = 1; 
    for (; i<=100; ++i) { 
     printf("number= %d %s%s\n", i, i%3?"":"Fizz", i%5?"":"Buzz"); 
    } 
    return 0; 
} 
+0

यह अच्छी तरह से चलता है, और यह छोटा है। धन्यवाद। – leocod

+0

मुझे यकीन है कि पक्सडीब्लो का समाधान तेज है, और यह भी उतना लंबा नहीं है। –

+1

ठीक है, सभी ईमानदारी से, सवाल तेजी से अपेक्षाकृत कम पूछता था :-) यदि आपने 'कथन' के भीतर 'i' घोषित किया है और ब्रेसिज़ को हटा दिया है, तो यह पठनीयता को बलि किए बिना भी छोटा होगा। +1। – paxdiablo

-3

Obfuscated श्री लिस्टर के जवाब के रूप

main(int i){while(i++<100){printf("number= %d %s%s",i,i%3?"":"Fizz",i%5?"":"Buzz");}}

+2

यह obfuscated नहीं है (लाइन ब्रेक को हटाने शायद मुश्किल से obfuscation है), यह गलत है। – Davidmh

1

मैं कि

main(){ 
    if (i % 3 == 0){ 
    cout<<"Fizz"; 
    } 
    if (i % 5 == 0){ 
    cout<<"Buzz"; 
    } 
    // So if both are true, it will print “FizzBuzz” and augment the two strings 
    } 
+2

आप नंबर प्रिंट नहीं कर रहे हैं। – franklynd

+2

यह प्रश्न सी प्रोग्रामिंग के बारे में था, सी ++ प्रोग्रामिंग नहीं, इसलिए यह समाधान काम नहीं करेगा। – user530873

0
#include <stdio.h> 

char const * template[] = { 
    "%i", 
    "Buzz", 
    "Fizz", 
    "FizzBuzz" 
}; 
const int __donotuseme3[] = { 2, 0, 0 }; 
const int __donotuseme5[] = { 1, 0, 0, 0, 0 }; 
#define TEMPLATE(x) (template[__donotuseme3[(x) % 3] | __donotuseme5[(x) % 5]]) 

int 
main(void) { 
    int i; 
    for (i = 1; i <= 100; i++) { 
    printf(TEMPLATE(i), i); 
    putchar('\n'); 
    } 
    return 0; 
} 
0

यह एक तरह कुछ लिखते थे कुछ कोड पुनरावृत्ति से बचा जाता है लेकिन एक अस्थायी आवश्यकता परिवर्तनीय char t

void FizzBuzz() { 
    char t = 0; 
    for (unsigned char i = 1; i <= 100; ++i, t = 2) { 
     (i % 3) ? --t : printf("Fizz"); 
     (i % 5) ? --t : printf("Buzz"); 
     if (!t) printf("%d", i); 
     printf("\n"); 
    } 
} 
0
void main() 
{ 
    int i = 0; 
    char h[4]; 

    while (++i <= 100) 
    { 
     sprintf(h, "%d", i); 
     printf("%s%s%s\n", i%3 ? "" : "fizz", i%5 ? "" : "buzz", (i%3 && i%5) ? h: ""); 
    } 
} 
+2

हालांकि यह कोड प्रश्न का उत्तर दे सकता है, इस बारे में अतिरिक्त संदर्भ प्रदान करता है कि यह कैसे और/या समस्या का समाधान क्यों करता है, इसका उत्तर उत्तर के दीर्घकालिक मूल्य में सुधार होगा। –

0

आप एक स्ट्रिंग का उपयोग कर ऐसा कर सकते हैं:

String s=""; 
if(num%3==0) 
    s+="fizz"; 
if(num%5==0) 
    s+="buzz"; 
if(s.length()==0) 
    s+=num+""; 
+0

कृपया अपनी पोस्ट संपादित करें ताकि आपका टेक्स्ट कोड के रूप में स्वरूपित न हो। –

+0

सादे सी में "स्ट्रिंग" नामक कोई भी प्रकार नहीं है। सी ++ में 'std :: string' (लोअरकेस!) है, लेकिन यह प्रश्न टैग किया गया है सी –

+0

मैं सिर्फ अलगो पर ध्यान केंद्रित कर रहा हूं। मुझे उम्मीद है कि आप इसे प्राप्त कर सकते हैं! –

0

मैं एक सहायक समारोह :-)

#include <stdio.h> 

int fbindex(int n) { 
    int i = 0; 
    if (n % 3 == 0) i += 1; 
    if (n % 5 == 0) i += 2; 
    return i; 
} 

int main(void) {         
    const char *fb[] = {"%d\n", "Fizz\n", "Buzz\n", "FizzBuzz\n"}; 
    for (int i = 1; i <= 100; i++) printf(fb[fbindex(i)], i);     
} 
संबंधित मुद्दे