Dinos_12345 Δημοσ. 19 Σεπτεμβρίου 2015 Δημοσ. 19 Σεπτεμβρίου 2015 Καλησπέρα. Θέλουμε να κάνουμε κώδικα που να εκτυπώνει όλους τους αριθμούς απο 1 μέχρι 20 αλλά όχι αυτούς που διαιρούνται ακριβώς με το 3, το 5 ή και με τα δύο. Αν διαιρείται μόνο με το 3 εκτυπώνουμε Fizz, αν μόνο με το 5 Buzz, αν και με τα δύο FizzBuzz. Πολύ απλός αλγόριθμος αλλά από περιέργεια, υπάρχει καλύτερη εκδοχή από αυτή που σκέφτηκα; for (var i=1;i<21;i++){ if (i % 3 === 0){ if (i % 5 === 0){ console.log ("FizzBuzz"); } else{ console.log ("Fizz"); } } else if (i % 5 === 0){ console.log("Buzz") } else{ console.log (i); } }
Technology fan Δημοσ. 19 Σεπτεμβρίου 2015 Δημοσ. 19 Σεπτεμβρίου 2015 Να μια ιδέα... για να διαιρείται ακριβώς ταυτόχρονα με το 3 και το 5 πρέπει να διαιρείται ακριβώς με το 15 αλλά δεν έχει καποια τεράστια διαφορά σε σχέση με αυτό που έγραψες εσύ... for (var i=1;i<21;i++){ if (i % 15 === 0){ console.log ("FizzBuzz"); else if (i % 3 ===0){ console.log ("Fizz"); } else if (i % 5 === 0){ console.log("Buzz") } else{ console.log (i); } }
Dinos_12345 Δημοσ. 19 Σεπτεμβρίου 2015 Μέλος Δημοσ. 19 Σεπτεμβρίου 2015 Να μια ιδέα... για να διαιρείται ακριβώς ταυτόχρονα με το 3 και το 5 πρέπει να διαιρείται ακριβώς με το 15 αλλά δεν έχει καποια τεράστια διαφορά σε σχέση με αυτό που έγραψες εσύ... for (var i=1;i<21;i++){ if (i % 15 === 0){ console.log ("FizzBuzz"); else if (i % 3 ===0){ console.log ("Fizz"); } else if (i % 5 === 0){ console.log("Buzz") } else{ console.log (i); } } Νομίζω ότι τρέχει κάτι ms πιο γρήγορα το δικό σου, επειδή έχω βάλει εμφολευμένο που ανεβάζει την πολυπλοκότητα. Καλά για το μέγεθος του αλγορίθμου, νομίζω δεν κάνει κάποια διαφορά.
Sheogorath Δημοσ. 19 Σεπτεμβρίου 2015 Δημοσ. 19 Σεπτεμβρίου 2015 Σε άλλη γλώσσα γιατί αυτήν δεν την ξέρω καλά. Δες την λογική και την μεταφέρεις. Κατ’αρχήν αποφεύγουμε τα πολλά if πχ Μαtlab z=zeros(20,1); k=1; for i:0:(floor(20/3)-2) z(k)=i*3+1; z(k+1)=i*3+2; k=k+2; if (z(k)mod5=0 || z(k+1)mod5=0) disp "Buzz"; end end Ο πίνακας δεν έχει πολ 3 μέσα. Μπορείς να τα κατασκευάσεις απο έξω. Δεν ξέρω αν σε ενδιαφέρει η σειρά. end
gon1332 Δημοσ. 19 Σεπτεμβρίου 2015 Δημοσ. 19 Σεπτεμβρίου 2015 Επίσης κάτι τέτοιο: for (i = 1; i <= 20; i++) { if (!(i % 3)) printf("Fizz"); if (!(i % 5)) printf("Buzz"); if ((i % 5) && (i % 3)) printf("%d", i); } Εδώ για τρέξιμο. 3
Dinos_12345 Δημοσ. 19 Σεπτεμβρίου 2015 Μέλος Δημοσ. 19 Σεπτεμβρίου 2015 Σε άλλη γλώσσα γιατί αυτήν δεν την ξέρω καλά. Δες την λογική και την μεταφέρεις. Κατ’αρχήν αποφεύγουμε τα πολλά if πχ Μαtlab z=zeros(20,1); k=1; for i:0:(floor(20/3)-2) z(k)=i*3+1; z(k+1)=i*3+2; k=k+2; if (z(k)mod5=0 || z(k+1)mod5=0) disp "Buzz"; end end Ο πίνακας δεν έχει πολ 3 μέσα. Μπορείς να τα κατασκευάσεις απο έξω. Δεν ξέρω αν σε ενδιαφέρει η σειρά. end Δεν καταλαβαίνω τίποτα, ειλικρινά. Μέχρι στιγμής μόνο με js έχω επαφή και δυσκολαύομαι ιδιαίτερα να καταλάβω το ίδιο σε άλλη γλώσσα που δεν έχω επαφή με το συντακτικό της. :/
gon1332 Δημοσ. 19 Σεπτεμβρίου 2015 Δημοσ. 19 Σεπτεμβρίου 2015 Επίσης σε C μπορείς να κάνεις κι αυτό: for (i = 1; i <= 20; i++) { !(i % 3) && printf("Fizz"); !(i % 5) && printf("Buzz"); (i % 5) && (i % 3) && printf("%d", i); } Δες εδώ. Δε ξέρω αν μπορείς να το κάνεις και σε Javascript.
Dinos_12345 Δημοσ. 19 Σεπτεμβρίου 2015 Μέλος Δημοσ. 19 Σεπτεμβρίου 2015 Επίσης κάτι τέτοιο: for (i = 1; i <= 20; i++) { if (!(i % 3)) printf("Fizz"); if (!(i % 5)) printf("Buzz"); if ((i % 5) && (i % 3)) printf("%d", i); } Εδώ για τρέξιμο. το i%3 όταν δίνει 0 σου δίνει false σωστά; Και με το ! μπροστά σου δίνει true. Άρα αν το πρώτο είναι true, εμφάνισε, αν το δεύτερο είναι true, το ίδιο, κλπ. Ωραίος τρόπος. Μοιάζει πάρα πολύ με την Js σαν συντακτικό πάντως η C Επίσης σε C μπορείς να κάνεις κι αυτό: for (i = 1; i <= 20; i++) { !(i % 3) && printf("Fizz"); !(i % 5) && printf("Buzz"); (i % 5) && (i % 3) && printf("%d", i); } Δες εδώ. Δε ξέρω αν μπορείς να το κάνεις και σε Javascript. Μπορείς να το εξηγήσεις λίγο; Επίσης νομίζω γίνεται και με switch αλλά θα βγει πολύ μακροσκελές χωρίς λόγο.
gon1332 Δημοσ. 19 Σεπτεμβρίου 2015 Δημοσ. 19 Σεπτεμβρίου 2015 το i%3 όταν δίνει 0 σου δίνει false σωστά; Και με το ! μπροστά σου δίνει true. Άρα αν το πρώτο είναι true, εμφάνισε, αν το δεύτερο είναι true, το ίδιο, κλπ. Ωραίος τρόπος. Μοιάζει πάρα πολύ με την Js σαν συντακτικό πάντως η C Μπορείς να το εξηγήσεις λίγο; Επίσης νομίζω γίνεται και με switch αλλά θα βγει πολύ μακροσκελές χωρίς λόγο. Σωστό το πρώτο που είπες. Όσον αφορά το δεύτερο ερώτημά σου, έχοντας την παρακάτω εντολή: !(i % 3) && printf("Fizz"); καταλαβαίνεις πως είναι μία λογική πράξη που απλά δεν αποθηκεύει πουθενα το αποτέλεσμά της, ούτε το χρησιμοποιεί σε κάποια δομή επιλογής/επανάληψης. Εκτελείται όμως: Αρχικά εξετάζεται η !(i % 3). Αν δεν ισχύει, τότε λόγω short-circuiting (που έχει και η Javascript), δεν εξετάζεται καν ο δευτερος τελεσταίος του &&. Αν όμως ισχύει, πρέπει να εξεταστεί και ο δεύτερος τελεσταίος ώστε να αποφανθούμε αν η λογική συνθήκη είναι true ή false. Έτσι εκτελείται και η printf, η οποία εκτυπώνει το string και επιστρέφει έναν αριθμό, οπότε και η λογική πράξη βγάζει true (κάτι που δε μας ενδιαφέρει κιόλας). Η δουλεία μας έγινε. 2
Dinos_12345 Δημοσ. 19 Σεπτεμβρίου 2015 Μέλος Δημοσ. 19 Σεπτεμβρίου 2015 Σωστό το τ πρώτο που είπες. Όσον αφορά το δεύτερο ερώτημά σου, έχοντας την παρακάτω εντολή: !(i % 3) && printf("Fizz"); καταλαβαίνεις πως είναι μία λογική πράξη που απλά δεν αποθηκεύει πουθενα το αποτέλεσμά της, ούτε το χρησιμοποιεί σε κάποια δομή επιλογής/επανάληψης. Εκτελείται όμως: Αρχικά εξετάζεται η !(i % 3). Αν δεν ισχύει, τότε λόγω short-circuiting (που έχει και η Javascript), δεν εξετάζεται καν ο δευτερος τελεσταίος του &&. Αν όμως ισχύει, πρέπει να εξεταστεί και ο δεύτερος τελεσταίος ώστε να αποφανθούμε αν η λογική συνθήκη είναι true ή false. Έτσι εκτελείται και η printf, η οποία εκτυπώνει το string και επιστρέφει έναν αριθμό, οπότε και η λογική πράξη βγάζει true (κάτι που δε μας ενδιαφέρει κιόλας). Η δουλεία μας έγινε. Μάμησε. false && smth === false true && smth === true αν το smth είναι true και false αν όχι. Μ'άρεσε πολύ!
gon1332 Δημοσ. 19 Σεπτεμβρίου 2015 Δημοσ. 19 Σεπτεμβρίου 2015 Μάμησε. false && smth === false true && smth === true αν το smth είναι true και false αν όχι. Μ'άρεσε πολύ! Για δοκίμασε και μία αυτό που σου έγραψα σε Javascript. Προφανώς, αυτός δεν είναι σωστός τρόπος να γράφει κανείς κώδικα. Σωστός με την έννοια της καλής πρακτικής. Οπότε δεν προσπαθώ να προωθήσω αυτή την πρακτική, παρά μόνον να δεις και κάτι άλλο (short-circuiting at its best ). 1
Dinos_12345 Δημοσ. 19 Σεπτεμβρίου 2015 Μέλος Δημοσ. 19 Σεπτεμβρίου 2015 for (var i = 1; i <= 20; i++) { !(i % 3) && console.log("Fizz"); !(i % 5) && console.log("Buzz"); (i % 5) && (i % 3) && console.log("%d", i); } result: 1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 Fizz Buzz 16 17 Fizz 19 Buzz Ξέχασες την περίπτωση fizzbuzz
gon1332 Δημοσ. 19 Σεπτεμβρίου 2015 Δημοσ. 19 Σεπτεμβρίου 2015 Για δες καλύτερα την ακολουθία που μόλις έγραψες στη θέση του 15.
Dinos_12345 Δημοσ. 19 Σεπτεμβρίου 2015 Μέλος Δημοσ. 19 Σεπτεμβρίου 2015 Για δες καλύτερα την ακολουθία που μόλις έγραψες στη θέση του 15. Ω δεν το πρόσεξα καλά, δεν το βγάζει σε μια λέξη. Αυτό έγινε λόγω του "%d";
Giorgos65ert Δημοσ. 19 Σεπτεμβρίου 2015 Δημοσ. 19 Σεπτεμβρίου 2015 επισης υπαρχει και αυτος ο τροπος να το κανεις: for(int i=1; i<=20; i++) { !(i % 3) && ({ printf("Fizz\n"); }); !(i % 5) && ({ printf("Buzz\n"); }); !(i % 15) && ({ printf("FizzBuzz\n"); }); (i % 3) && (i % 5) && ({ printf("%i\n",i); }); } οπου μεσα στα {} μπορεις να βαλεις ολοκληρα blocks απο code και να μην κανεις use συνεχεια && ...
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα