Csinálj Te is FizzBuzz-t
2012-12-15T21:35:01+01:00
2012-12-19T11:23:20+01:00
2022-07-23T17:46:18+02:00
  • Valoban ezt beneztem, nyilvan 15 helyett 0.
    Mutasd a teljes hozzászólást!
  • Ez még algoritmusnak sem jó! Ha 15-tel osztasz, a maradék sohasem lesz 15!
    Mutasd a teljes hozzászólást!
  • Egysoros Ruby-s:
    puts (1..100).map { |n| case n % 15; when 3, 6, 9, 12; 'Fizz'; when 5, 10; 'Buzz'; when 15; 'FizzBuzz'; else; n; end; }.join("\n")
    Mutasd a teljes hozzászólást!
  • Szerintem meg csak a forditas hibas, nem a feladat. Az eredeti angol szoveg:
    Write a program that prints the numbers from 1 to 100. But for multiples of three print “Fizz" instead of the number and for the multiples of five print “Buzz". For numbers which are multiples of both three and five print “FizzBuzz".


    A megoldas osszejott phpban es c-ben csak a 10000x lefuttatasra kene kicsit koncentralni.
    Mutasd a teljes hozzászólást!
  • Addig örüljünk, amíg nem kellett bizonyítani az algoritmus helyességét
    Mutasd a teljes hozzászólást!
  • Jogos, de a feladat írójának gondolom valami értelmezhetőbb/ellenőrizhetőbb megoldás kell. Pl. sortörések vagy szóközök a kiírt karaktersorok közé?
    Mutasd a teljes hozzászólást!
  • Elkezdtük a kész megoldásokkal, majd visszakanyarodtunk a feladat értelmezéséig. És milyen sokszor van ez így az életben is...
    Mutasd a teljes hozzászólást!
  • De hol van benne a hiba?
    Vagy hogy lenne helyesen?

    Mármint szerintem pont ennek a sornak kéne kijönnie...
    Mutasd a teljes hozzászólást!
  • A feladatot kiegészíteném mégegy méréssel.

    Futtató hardver: Linksys WRT54GL v1.1 (mips32)
    Futtató szoftver: Tomato Firmware 1.28.0000 MIPSR1-099 K26 MiniIPv6 (Shibby mod)
    Az eredeti 10k-s ciklust tartalmazó kódban a ciklus 1000-re lett csökkentve, fordítva a router firmware-ének forráskódjához mellékelt mipsel-uclib-gcc-vel -O3 kapcsolóval.

    Futtatva az alábbi shell scripttel:
    #!/bin/sh TEST1=`date +%s`; ./fizzbuzz_1000; TEST2=`date +%s`; echo $(($TEST2-$TEST1))sec;

    A szkriptet háromszor elindítva, majd átlagolva 152 másodperc jött ki.

    A teszt Putty-on keresztül futott. Érdekesség gyanánt a router a bedugása után közvetlenül (vagyis amikor még nem érte el az üzemi hőmérsékletet) a 10k-s tesztet 94 másodperc alatt lefuttatta, viszont gyanús, hogy rossz programot indítottam el, mert a 16x-os lassulás azért durva lenne.
    Mutasd a teljes hozzászólást!
  • "Hol van az benne hogy maradék nélkül? Mert én nem látom:)
    1-100 szám mindegyike osztható 3-al is 5-el is és bármilyen más számmal is:)"

    BRACE YOURSELVES! MATHEMATICIANS ARE COMING!
    Mutasd a teljes hozzászólást!
  • Hibás

    Ennek a kimenete az lenne, hogy "12Fizz4BuzzFizz78FizzBuzz11Fizz1314FizzBuzz1617Fizz19Buzz..."
    Mutasd a teljes hozzászólást!
  • Nem kell hozzá c/c++, hogy neked is legyen ilyen kimeneted. Egyszerű linuxos time parancs kimenete.

    A real sor jelzi, hogy ténylegesen mennyi ideig futott a program (erőforrás foglalás, üresjárat, stb, vagyis mindent beleszámol) a user, hogy ebből te, mint felhasználó, mennyit foglalkoztál a programmal (vagyis mennyit futott a te jogosultsági szinteddel). A sys sor, meg értelemszerűen, hogy a rendszer mennyi időt foglalkozott a programmal. De itt egy jobb magyarázat hozzá (5. parancs): Tíz fontos parancs, amit minden linuxos fejlesztőnek ismerni kell - Linuxvilág (pdf)
    Mutasd a teljes hozzászólást!
  • ha jól van definiálva a feladat az nem baj sosem ...:)
    Mutasd a teljes hozzászólást!
  • valóban az a helyes megoldás :)
    Mutasd a teljes hozzászólást!
  • Most mennyivel jobb az, hogy ha azt írod, hogy osztója, mint hogy osztható vele?

    Semmivel.

    Én valami hasonlót írnék, de biztos, hogy még ebbe is bele lehetne kötni:
    "Írj egy programot vagy scriptet, ami az [1,100] zárt intervallumon vizsgálja az egész számokat, az egynél kezdve és egyesével lépkedve. Ha az aktuális szám maradék nélkül osztható hárommal egész számos osztással, akkor írja ki, hogy Fizz, ha maradék nélkül osztható öttel egész számos osztással, akkor írja ki, hogy Buzz, ha mindkettő eset fennáll akkor azt, hogy FizzBuzz. Egyéb esetben írja ki magát a számot."




    ...ha már vérmatekot nyomunk :)
    Mutasd a teljes hozzászólást!
  • ...lehet de az lett volna sokkal egyértelműbb feladatkiírás hogy:

    "Írj egy programot vagy scriptet, ami 1-től 100-ig kiírja az egész számokat. Ha a számnak osztója a három, akkor írja ki a szám helyett, hogy Fizz, ha osztója az öt, akkor Buzz, ha mindkettő akkor FizzBuzz."

    ...ha már vérmatekot nyomunk :)
    Mutasd a teljes hozzászólást!
  • Not sure if trolling.

    Ha nem trolling, akkor viszont megjegyezném, hogy valós számok esetén értelemszerűen nincs értelme az oszthatóságot vizsgálni (hiszen a nullát kivéve mindegyik számnak van multiplikatív inverze).

    Ezért is van az, hogy hagyományosan az
    oszthatóság
    kifejezés egész számokra vonatkozik (vagy pl polinomokra stb, tehát olyan gyűrűkre, ahol a kérdés nem egyértelmű, azaz nem test. A valós számok is gyűrűk, de azok már egyben testek is. Itt már egyértelmű.).



    Persze mondhatod, hogy pontatlan a feladat leírása, hiszen sehol sem írja, hogy egész számmal való oszthatóságról van szó.
    Én meg azt mondom, hogy nagyot nevettem, amikor elolvastam a te megoldásodat, mert az is alapjaiban hibás.
    Hiszen sehol sem írja a feladat, hogy elég csak az egész számokat vizsgálnod...

    1-100-ig viszont végtelen sok valós szám van (még csak meg sem számlálhatóak), amiken végig kell menni.
    Mindenesetre ez sem bonyolítja be nagyon a feladatot:

    while (true) { printf("FizzBuzz\n"); }



    szerk:
    Olyan lassan írtam a hsz-t, hogy közben már páran leírták
    Mutasd a teljes hozzászólást!
  • matt383 megelőzött, de linket is adok:
    Oszthatóság - Wikipédia
    Mutasd a teljes hozzászólást!
  • Az oszthatóság egy matematikai reláció, melynek tulajdonságait a számelmélet vizsgálja. Hagyományos értelemben akkor mondjuk, hogy az
    a
    és
    b
    természetes számok között (ebben a sorrendben) fennáll az oszthatósági reláció; röviden a
    b
    szám osztója az
    a
    számnak, vagy az
    a
    szám osztható a
    b
    -vel, ha van olyan egész szám, melyet
    b
    -vel szorozva
    a
    -t kapunk.
    Mutasd a teljes hozzászólást!
  • hát nem tudom alapteszt talán ha még a feladatot sem tudja értelmezni akkor minek vegye fel? ;)
    Mutasd a teljes hozzászólást!
  • print "FizzBuzz"*100
    vagy
    print "FizzBuzz\n"*100

    De ha valaki ezt beugratós kérdésnek szánja és ezt a megoldást várja el a leírás alapján... azt jobb elkerülni, mint munkaadót.
    Mutasd a teljes hozzászólást!
  • Ezen nagyot nevettem az összes ide írt megoldás alapjaiban hibás

    megoldás főrésze egyszerüen pl. pythonban:

    ... for i in range(1, 101): print ('FizzBuzz') ...

    A feladat ez lenne:
    "Írj egy programot vagy scriptet, ami 1-től 100-ig kiírja a számokat. Ha a szám osztható hárommal, akkor írja ki a szám helyett, hogy Fizz, ha osztható öttel, akkor Buzz, ha mind a kettővel osztható, akkor FizzBuzz."

    senki nem olvasta el a feladatkiírást?:)

    Hol van az benne hogy maradék nélkül? Mert én nem látom:)
    1-100 szám mindegyike osztható 3-al is 5-el is és bármilyen más számmal is:)
    Az egyedüli kakukktojás a 0-a lenne amire nem lenne igaz ...de az pont nincs feladatban
    Mutasd a teljes hozzászólást!
  • Nem használok C/C++-t mit jelent ez a 3 érték?


    real 0m1.221s
    user 0m0.009s
    sys 0m0.319s


    ténylegesen 1221 ms alatt írja ki a 10000-et vagy 319ms alatt?
    Mutasd a teljes hozzászólást!
  • Kaszál a tesztfeladat rendesen.
    Mutasd a teljes hozzászólást!
  • Bizony, ezért szenvedtem én az ötös csoportokra való felosztással.
    Mutasd a teljes hozzászólást!
  • Már ránézésre sem jó. 105-ig ír ki.
    Mutasd a teljes hozzászólást!
  • #include <stdio.h> int main (int argc, char* argv[]) { int i = 1; while (i < 101) { fprintf ( stdout, "%d\n%d\nFizz\n%d\nBuzz\nFizz\n%d\n%d\nFizz\nBuzz\n%d\nFizz\n%d\n%d\nFizzBuzz\n", i, i+1, i+3, i+6, i+7, i+10, i+12, i+13 ); i += 15; } return (0); }
    Jogos de mi lesz a számok kiírásával?
    Mutasd a teljes hozzászólást!
  • Szerintem a 15-el oszthatóságot felesleges ellenőrizni, mert az osztható 3-al és 5-el is.


    for($i=1 ; $i<=100 ; $i++){ if ($i%3==0) { echo "Fizz"; } if ($i%5==0) { echo "Buzz"; } }

    15-el oszthatóság esetén mindkét if le fog futni.
    Mutasd a teljes hozzászólást!
  • Bevallom őszintén, hogy ezen a LOOP dolgon átsiklottam idáig, de mindig tanul az ember.
    Mutasd a teljes hozzászólást!
  • A LOOP az kerulendo, eppenhogy csak emulalva van egy uj procin.
    Az Intel ehelyett azt preferalja, hogy te magad rakod ossze a loopot, ahogy Csaboka2 irta.

    A dec + jnz ket utasitaskent van kodolva, viszont a processzor belsoleg 1 mikromuveletkent hajtja vegre (micro-op fusion).

    Az inc + cmp + jb-nel pedig a cmp es a jb olvad ossze 1 mikroutasitasba es ezzel egy idoben mar szamolodik is a kovetkezo iteracio beli inc utasitas.

    Mindkét valtozat osszesen egy orajel alat lefut, a kulonbseg annyi, hogy a dec+jnz loophoz ingyen hozzácsaphatsz még egy hasznos utasitast is (a masiknal az az inc).

    Es mivel kiszenvedték ezt a micro-op fusiont, arra már sajnálták az energiát, hogy a 'loop' utasitast is szinten tartsák. Legalabbis ezen a core2-n a loop az 4-5 cycle-t zabal.
    Mutasd a teljes hozzászólást!
abcd