Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα. Θέλουμε να κάνουμε κώδικα που να εκτυπώνει όλους τους αριθμούς απο 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);
    }
}
  • Απαντ. 33
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

Δημοσ.

Να μια ιδέα... για να διαιρείται ακριβώς ταυτόχρονα με το 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);
    }
}
Δημοσ.

 

Να μια ιδέα... για να διαιρείται ακριβώς ταυτόχρονα με το 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 πιο γρήγορα το δικό σου, επειδή έχω βάλει εμφολευμένο που ανεβάζει την πολυπλοκότητα. Καλά για το μέγεθος του αλγορίθμου, νομίζω δεν κάνει κάποια διαφορά. :P

Δημοσ.

Σε άλλη γλώσσα γιατί αυτήν δεν την ξέρω καλά. Δες την λογική και την μεταφέρεις.

Κατ’αρχήν αποφεύγουμε τα πολλά 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

Δημοσ.

Σε άλλη γλώσσα γιατί αυτήν δεν την ξέρω καλά. Δες την λογική και την μεταφέρεις.

Κατ’αρχήν αποφεύγουμε τα πολλά 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 έχω επαφή και δυσκολαύομαι ιδιαίτερα να καταλάβω το ίδιο σε άλλη γλώσσα που δεν έχω επαφή με το συντακτικό της. :/

Δημοσ.

Επίσης σε C μπορείς να κάνεις κι αυτό:

	for (i = 1; i <= 20; i++) {
            !(i % 3) && printf("Fizz");
	    
	    !(i % 5) && printf("Buzz");
	    
	    (i % 5) && (i % 3) && printf("%d", i);
	}

Δες εδώ. Δε ξέρω αν μπορείς να το κάνεις και σε Javascript.

Δημοσ.

Επίσης κάτι τέτοιο:

	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 αλλά θα βγει πολύ μακροσκελές χωρίς λόγο.

Δημοσ.

το i%3 όταν δίνει 0 σου δίνει false σωστά; Και με το ! μπροστά σου δίνει true. Άρα αν το πρώτο είναι true, εμφάνισε, αν το δεύτερο είναι true, το ίδιο, κλπ. Ωραίος τρόπος. Μοιάζει πάρα πολύ με την Js σαν συντακτικό πάντως η C

Μπορείς να το εξηγήσεις λίγο; Επίσης νομίζω γίνεται και με switch αλλά θα βγει πολύ μακροσκελές χωρίς λόγο.

Σωστό το πρώτο που είπες.

 

Όσον αφορά το δεύτερο ερώτημά σου, έχοντας την παρακάτω εντολή:

!(i % 3) && printf("Fizz");

καταλαβαίνεις πως είναι μία λογική πράξη που απλά δεν αποθηκεύει πουθενα το αποτέλεσμά της, ούτε το χρησιμοποιεί σε κάποια δομή επιλογής/επανάληψης. Εκτελείται όμως:

 

Αρχικά εξετάζεται η !(i % 3). Αν δεν ισχύει, τότε λόγω short-circuiting (που έχει και η Javascript), δεν εξετάζεται καν ο δευτερος τελεσταίος του &&. Αν όμως ισχύει, πρέπει να εξεταστεί και ο δεύτερος τελεσταίος ώστε να αποφανθούμε αν η λογική συνθήκη είναι true ή false. Έτσι εκτελείται και η printf, η οποία εκτυπώνει το string και επιστρέφει έναν αριθμό, οπότε και η λογική πράξη βγάζει true (κάτι που δε μας ενδιαφέρει κιόλας). Η δουλεία μας έγινε.

  • Like 2
Δημοσ.

Σωστό το τ πρώτο που είπες.

 

Όσον αφορά το δεύτερο ερώτημά σου, έχοντας την παρακάτω εντολή:

!(i % 3) && printf("Fizz");

καταλαβαίνεις πως είναι μία λογική πράξη που απλά δεν αποθηκεύει πουθενα το αποτέλεσμά της, ούτε το χρησιμοποιεί σε κάποια δομή επιλογής/επανάληψης. Εκτελείται όμως:

 

Αρχικά εξετάζεται η !(i % 3). Αν δεν ισχύει, τότε λόγω short-circuiting (που έχει και η Javascript), δεν εξετάζεται καν ο δευτερος τελεσταίος του &&. Αν όμως ισχύει, πρέπει να εξεταστεί και ο δεύτερος τελεσταίος ώστε να αποφανθούμε αν η λογική συνθήκη είναι true ή false. Έτσι εκτελείται και η printf, η οποία εκτυπώνει το string και επιστρέφει έναν αριθμό, οπότε και η λογική πράξη βγάζει true (κάτι που δε μας ενδιαφέρει κιόλας). Η δουλεία μας έγινε.

:o Μάμησε. 

false && smth === false

true && smth === true αν το smth είναι true και false αν όχι.

Μ'άρεσε πολύ! :)

Δημοσ.

:o Μάμησε. 

false && smth === false

true && smth === true αν το smth είναι true και false αν όχι.

Μ'άρεσε πολύ! :)

Για δοκίμασε και μία αυτό που σου έγραψα σε Javascript.

 

Προφανώς, αυτός δεν είναι σωστός τρόπος να γράφει κανείς κώδικα. Σωστός με την έννοια της καλής πρακτικής. Οπότε δεν προσπαθώ να προωθήσω αυτή την πρακτική, παρά μόνον να δεις και κάτι άλλο (short-circuiting at its best :P).

  • Like 1
Δημοσ.

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

Δημοσ.

Για δες καλύτερα την ακολουθία που μόλις έγραψες στη θέση του 15. ;)

Ω δεν το πρόσεξα καλά, δεν το βγάζει σε μια λέξη. ;)

Αυτό έγινε λόγω του "%d";

Δημοσ.

επισης υπαρχει και αυτος ο τροπος να το κανεις:

 

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 συνεχεια && ...

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...