Dlaczego programiści nie potrafią.. programować?

Oryginalny post: Why Can't Programmers.. Program?

Autor: Jeff Atwood

Popadłem w zdumienie, gdy przeczytałem następującą obserwację Reginalda Braithwaite'a:

Tak jak i ja, autor ma problemy z faktem, iż 199 na 200 aplikantów do każdej programistycznej pracy nie potrafi w ogóle pisać kodu. Powtarzam: nie potrafią pisać żadnego kodu.

Autor, do którego się odnosi, to Imran, który najwyraźniej odrzuca wielu programistów, którzy nie potrafią napisać żadnego programu:

Po stosownym okresie prób i błędów odkryłem, iż ludzie, którzy borykają się z programowaniem, nie mają problemów z wielkimi problemami, czy trochę mniejszymi (jak na przykład zaimplementowanie listy). Z trudem radzą sobie z najmniejszymi problemami.

Podjąłem się zdania, aby opracować pytania, które potrafiłyby zidentyfikować ten rodzaj programisty i otrzymałem pewną klasę pytań, które nazywam "Pytaniami FizzBuzz" po grze, w którą dzieci w Wielkiej Brytanii często grają (albo grały) w szkołach. Przykładem pytania FizzBuzz jest:

Napisz program, który wypisuje liczby od 1 do 100. Ale dla wielokrotności trójki wyświetl "Fizz" zamiast liczby oraz dla wielokrotności piątki wyświetl "Buzz". Dla liczb będących wielokrotnościami trójki oraz piątki wyświetl "FizzBuzz".

Większość dobrych programistów powinno być w stanie napisać taki program na papierze w przeciągu kilku minut. Chcesz poznać coś strasznego? Większość absolwentów informatyki nie potrafi. Widziałem również samozwańczych starszych programistów, którym napisanie rozwiązania zajęło więcej niż 10-15 minut.

Dan Kegel miał podobne doświadczenia podczas zatrudniania programistów bez stażu:

Zadziwiająco spora część aplikantów, nawet tych z tytułem magistra oraz doktora w dziedzinie informatyki, oblewała podczas rozmów kwalifikacyjnych, kiedy została poproszona o rozwiązanie prostych programistycznych zadań. Na przykład, osobiście przesłuchiwałem absolwentów, którzy nie dali sobie rady z zadaniami typu "Napisać pętlę, która liczy od 1 do 10" albo "Jaka jest następna liczba po F w systemie szesnastkowym?" Mniej trywialnie, przesłuchiwałem wielu kandydatów, którzy nie potrafili użyć rekurencji do rozwiązania prawdziwego problemu. To są podstawowe umiejętności; ktokolwiek komu ich brakuje, prawdopodobnie nie programował zbyt dużo.

Wypowiadając się w imieniu inżynierów oprogramowania, którzy muszą przesłuchiwać przyszłych pracowników, mogę śmiało powiedzieć, iż jesteśmy zmęczeni rozmowami z kandydatami, którzy nie mają programistycznej siły przebicia. Jeśli potrafisz z powodzeniem napisać pętlę za pomocą dowolnego języka programowania wymienionego w Twoim CV, która iteruje od 1 do 10 bądź potrafisz wykonywać proste operacje arytmetyczne bez pomocy kalkulatora, albo użyć rekurencji do rozwiązania prawdziwego problemu, to jesteś już na czele grupy.

Tak jak Reginald, Dan oraz Imran zaczynam się niepokoić. Jestem bardziej niż chętny, aby dawać więcej luzu świeżo upieczonym programistom na początku ich kariery. Każdy musi gdzieś zacząć. Ale jestem zaniepokojony i przerażony faktem, iż tak zwany programista mógłby starać się o pracę bez umiejętności napisania najprostszych programów. To policzek w twarz kogokolwiek kto zarabia programowaniem na życie.

Rozległy podział na tych, którzy potrafią programować i tych, którzy nie potrafią jest dobrze znany. Założyłem, iż ktokolwiek aplikujący o pracę jako programista ma już za sobą tę różnicę. Najwyraźniej nie jest to rozsądne założenie. Najwyraźniej badanie w stylu FizzBuzz jest wymagane, aby nie marnować czasu przesłuchujących na rozmowy z programistami, którzy nie potrafia programować.

Abyś nie pomyślał, że test FizzBuzz jest za prosty -- a jest absolutnie i celowo prosty -- osoba komentująca wpis Imrana odnotowuje jej skuteczność:

Nie cierpię osób przesłuchujących, którzy lekceważą [FizzBuzz] test z powodu, iż jest za łatwy - z mojego doświadczenia zdumiewającym jest, jak wielu kandydatów nie jest w stanie poradzić sobie z najprostszymi programistycznimi zadaniami.

Może rozpoczynanie rozmowy kwalifikacyjnej z programistą bez uprzedniego patrzenia na jego kod nie jest mądre. W Vertigo wymagamy kawałka kodu jeszcze przed etapem rozmowy odbywającej się przez telefon. A etap rozmowy odbywający się na miejscu, zawiera małe programistyczne ćwiczenia. Nic trudnego, bądź tego świadom, tylko podstawowe ćwiczenie na zbudowanie małej aplikacji krok po kroku w około godzinę. Mimo iż były tylko jeden czy dwa wybuchy gniewu, w większości ta strategia była dla nas dobra. Pozwala nam skupić się na inżynierii oprogramowania podczas rozmowy, bez uciekania się do nudnych, zagadkowych pytań.

To wstyd, iż musicie przeprowadzać tak wiele badań wstępnych, aby mieć luksus prowadzenia rozmów kwalifikacyjnych z programistami, którzy rzeczywiście potrafią programować. Byłoby to śmieszne, gdyby nie to, że jest cholernie załamujące. Nie jestem fanem certyfikacji, ale zastanawiam się, czy Steve McConnell miał coś w zanadrzu mówiąc o tworzeniu prawdziwej profesji inżynierii oprogramowania.

Data publikacji oryginału: 26 lutego, 2007

190 komentarze:

0x1fff pisze...

Implementacja w Perlu ;)

#!/usr/bin/perl
map {
my $p = ($_ %3)? $_ : 'Fizz'.
(($_%5)? '' : 'Buzz');
print $p."\n";
} (1..100);

Można jeszcze bardziej nieczytelnie to napisać ;).

Anonimowy pisze...

niestety źle :)
dla wielokrotności 5 nie wyświetlasz 'Buzz'

rafek pisze...

@0x1fff: Niepełna implementacja w Perlu chciałeś powiedzieć ;) Oto output z Twojego skryptu:

1
2
Fizz
4
5
Fizz
7
8
Fizz
10
11
Fizz
13
14
FizzBuzz
.
.
.

Anonimowy pisze...

Zwróciłem uwagę, więc poprawię

#!/usr/bin/perl
map {
my $p = ($_%3)? (($_%5)? $_ : 'Buzz') : 'Fizz'.(($_%5)? '' : 'Buzz');
print $p."\n";
} (1..100);

Pozdrawiam

Anonimowy pisze...

Przykładowa implementacja w c++:
for(int i = 1; i <= 100; i++) {
if(i % 3 == 0) cout << "Fizz";
if(i % 5 == 0) cout << "Buzz";
if(i % 3 && i % 5) cout << i;

cout << endl;
}

Anonimowy pisze...

@Anonimowy: Po co ten ostatni IF?

Anonimowy pisze...

Po przeczytaniu artykułu nie bardzo chciało mi się w to wierzyć no i zajrzałem do komentarzy...

rafek pisze...

@Anonimowy: Słuszna uwaga. :)

Anonimowy pisze...

Żeby przy wyniku 3 nie napisało Ci "FizzBuzz3".

essey pisze...

Implementacja w PHP:

for ($i=1; $i<100; $i++) {
$p = ($i%3)? (($i%5)? $i : 'Buzz') : 'Fizz'.(($i%5)? '' : 'Buzz');
echo $p .'
';
}

albo bardziej rozbite

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

Anonimowy pisze...

A to rozwiązanie w Ruby:

1.upto(100) do |i|
out = nil
out = out.to_s + 'Fizz' if i % 3 == 0
out = out.to_s + 'Buzz' if i % 5 == 0
puts out || i
end

0x1fff pisze...

@Rafek, ajć faktycznie chyba zapomniałem czegoś doczytać i pomyśleć że na początku miałem trzy ify (moj kod był podobny do tego w Ruby), a poźniej się zacząłem bawić żeby wyglądało skomplikowanie i zapomniałem o tym że przy 5 ma wyświetlać 'Buzz' ;P

fail z mojej strony.

Anonimowy pisze...

Wersja w Haskellu:

fizzbuzz n | n `mod` 15 == 0 = "FizzBuzz"
| n `mod` 5 == 0 = "Buzz"
| n `mod` 3 == 0 = "Fizz"
fizzbuzz n = show n

main = mapM_ (putStrLn . fizzbuzz) [1..100]

Anonimowy pisze...

Ruby one more time:

puts (1..100).map { |i|
val = ((i%3).zero? || (i%5).zero?) ? String.new : i
val << 'Fizz' if (i%3).zero?
val << 'Buzz' if (i%5).zero?
val
}

Anonimowy pisze...

to ja tez sie zabawie :)

class Something
{
private const string Fizz = "fizz";
private const string Buzz = "buzz";
private int i;

private bool IsFizz
{
get
{
return Check(i, 3);
}
}

private bool IsBuzz
{
get
{
return Check(i, 5);
}
}

private static bool Check(int i, int j)
{
return (i % j) == 0;
}

public Something(int i)
{
this.i = i;
}

public override string ToString()
{
if (IsFizz && IsBuzz) return Fizz + Buzz;
if (IsFizz) return Fizz;
if (IsBuzz) return Buzz;
return i.ToString();
}
}

class Program
{
static void Main(string[] args)
{
for (int i = 1; i <= 100; i++)
{
Console.WriteLine(new Something(i));
}
}
}

Tomasz Kowalczyk pisze...

Jeśli faktycznie jest tak, że: "jeśli potrafisz z powodzeniem napisać pętlę za pomocą dowolnego języka programowania wymienionego w Twoim CV, która iteruje od 1 do 10 bądź potrafisz wykonywać proste operacje arytmetyczne bez pomocy kalkulatora, albo użyć rekurencji do rozwiązania prawdziwego problemu, to jesteś już na czele grupy", to mam nadzieję na dobrą pracę w przyszłości. ;] Chociaż w sumie nie, nie potrafię napisać takiej pętli w HTMLu. Ech, fail... ;]

Immortal pisze...

@Tomasz: A ja potrafię zrobić nawet nieskończoną pętlę w HTML ;)

<MARQUEE LOOP=INFINITE>
Hello, world!
</MARQUEE>

Paweł pisze...

nie mogę się powstrzymać :)
poniższy fragment kody w Whitespace (http://pl.wikipedia.org/Whitespace)






:)

Anonimowy pisze...

@Tomasz Kowalczyk: jeśli HTML zaliczymy do języków programowania..

@Paweł: :D dobre

rafek pisze...

@Paweł: Nie kompiluje mi się.. ;)

paffnucy pisze...

@Anonimowy, w C++ (i nie tylko) można się ograniczyć to tylko dwóch if-ów:

for (int i = 1; i <= 100; i++) {
if (i % 3) cout << "Fizz";
else if (i % 5) cout << "Buzz";
else cout << i;
cout << "endl";
}

Anonimowy pisze...

@rafek, Twoj kod nie dziala i zawiera podstawowe i trywialne bledy - oblales test

wildcard pisze...

@rafek, a wtedy będzie "FizzBuzz" przy %3 && %5?
wersja js:
for (i=1;i<=100;i++) {
var s = "";
if (i%3==0) { s+="Fizz"; }
if (i%5==0) { s+="Buzz"; }
console.log(s||i);
}

rafek pisze...

@Anonimowy: O co chodzi? Jaki mój kod?

paffnucy pisze...

Nie czytajcie mojego kodu!! Ale dwa głupie błędy zrobiłem :| Chciałem być mądry, a wyszło jak zawsze :D

rafek pisze...

@paffnucy: Teraz na pewno wszyscy przeczytają. :]

wildcard pisze...

a tak, to paffnucy a nie rafek był autorem. skopane kompie tu. ;)

wildcard pisze...

s/kompie/komcie/

Tomasz Kowalczyk pisze...

@Anonimowy: człowiek chciał sobie zażartować a ty co ;] Wiem, że HTML jest tylko językiem opisu, aż takim laikiem nie jestem. ;]

Anonimowy pisze...

Hahaha, co za fail...
Nie wiem czy ktoś już o tym napisał bo mi się nie chciało wszystkich komentarzy czytać ale wszystkie przykłady z c++ i kilka z innych mają podstawowy błąd: do warunku przy wyświetlaniu np "fizz" trzeba dodać "&& i%5 != 0" inaczej nie wyświetli się nigdy napis "FizzBuzz!". Dowód na to, że treść tego artykułu to prawda ;<

Poprawny kod w c++:
for(int i = 1; i <= 100; i++)
{
if(i%3 == 0 && i%5 != 0)
cout << "Fizz!" << endl;
if(i%5 == 0 && i%3 != 0)
cout << "Buzz!" << endl;
if(i%3 == 0 && i%5 == 0)
cout << "FizzBuzz!" << endl;
else
cout << i << endl;
}

Poprawcie mnie jesli sie myle...

b.yisk pisze...
Ten komentarz został usunięty przez autora.
b.YISK pisze...

W Assemblerze procesora 6502 powinno to wyglądać mniej więcej tak:

ldy #100
sty savey
lda #0
clc
loop adc #1
ldy savey
dey
beq end
dec savey
jsr write
jmp loop
end jmp end
wrfizz ldx #0
jsr fbsave
rts
wrbuzz ldx #4
jsr fbsave
jsr fibuzz
rts
fibuzz lda text,x
jsr output
inx
dey
bne fibuzz
rts
fbsave lda #1
sta ram
ldy #4
rts
write pha
pha
pha
php
ldx #0
sec
count3 sbc #3
bpl count3
ifeq3 clc
adc #3
bne next
jsr wrfizz
next pla
ldx #0
sec
count5 sbc #5
bpl count5
ifeq5 clc
adc #5
bne not
jsr wrbuzz
sec
sbc #1
bne not
jsr nwline
jmp loop
not pla
ora #110000
jsr output
jsr nwline
plp
pla
rts
nwline lda #10
jsr output
rts
text asc 'FizzBuzz'
ram ds 1
savey ds 1

Co prawda nie pisałem tego kilka minut, a jakieś pół godziny, ale program korzysta tylko z dziesięciu bajtów pamięci RAM, więc jest wydajnie :)

I sorka za brak tabulatorów w kodzie.

Anonimowy pisze...

Drobny fail w kodzie, w drugim i trzecim warunku zapomniałem dodać "else" przed "if"

rv pisze...

Nie piszcie tu jakichś cyferek bo nie rozumiem ;<

epi pisze...

int main()
{
stringstream napis;
for(int i=1; i<101; i++)
{
napis.str("");
if(!(i%3))
napis << "Fizz";
if(!(i%5))
napis << "Buzz";
if(napis.str().empty())
napis << i;
cout << napis.str() << endl;

}

return 0;
}

enjoy :)

KonradKubiec.com pisze...

A ja napisze jako były praktyk oblewania ludzi w rozmowach kwalifikacyjnych.
Zazwyczaj kandydat siedząc przed osobą, która np. uśmiecha się podczas jego wypowiedzi, widzi (w znaczeniu przeczuwa), że z każdym słowem pogrąża się, bo zwiększa ilość pytań, które mogą paść. Widać to w jego oczach, głosie, itp. Całkiem niepotrzebnie tak myśli, ale to też pokazuje jak kandydat radzi sobie ze stresem. A my (osoby weryfikujące umiejętności) jednak nie gryziemy (zazwyczaj, bo też chcemy trochę rozrywki ;). Niestety większość, jeżeli dostanie zadanie typu FizzBuzz, ze stresu zapomni naprawdę wielu rzeczy. Główna przyczyna to papier - ile kodu piszecie na papierze? Literówki to minimum. Ręce latają ,zwłaszcza tym najlepszym, bo to oni czują największą presję. Jeżeli ręce nie latają, to zapala się lampka bezpieczeństwa, bo albo jest to osoba, która ciągle szuka pracy i jej nie może znaleźć, albo inna specyficzna sytuacja. Dodać do tego nie piszący długopis, kartkę nie przyjmującą tuszu i ten kontrolujący wzrok..
I jeszcze sugestia dla tych co ubijają kod, lub używają rozwiązań "nad miarę wykwintnych/optymalnych" - takie osoby są "za" osobami, które zrobią takie zadanie bez udziwniania (np. używając tylko for if else).

focal pisze...

for(int i=1; i <= 100; i++)
{
if(! ((i % 3) || (i % 5))) {cout << "FizzBuzz ";}
else if(! (i % 3)) {cout << "Fizz ";}
else if(! (i % 5)) {cout << "Buzz ";}
else {cout << i << " ";}
}

a ja tu się o dostanie się na studia boje

Immortal pisze...

Zapraszam na http://devpytania.pl/questions/126/jak-napisac-fizzbuzz-w-twoim-ulubionym-jezyku-programowania - tam można wrzucać swoje odpowiedzi i w dodatku kod powinien zostać ładnie sformatowany :]

Anonimowy pisze...

Wiele już było przykładów z C++, ale co tam :)

[...]
for ( int i = 1; i <= 100; i++ )
{
if ( i % 5 && i % 3 )
cout << i << endl;
else if ( i % 5 )
cout << "Fizz" << endl;
else if ( i % 3 )
cout << "Buzz" << endl;
else
cout << "FizzBuzz" << endl;
}
[...]

pozdro, maarten :)

Anonimowy pisze...

Joel niech sie wezmie za porawe błedów w FogBugz. Tyle w temacie.

Anonimowy pisze...

Ruby w 1 linijce

puts (1..100).map { |i| (i % 3).zero? && (i % 5).zero? ? "FizzBuzz" : (i % 3).zero? ? "Fizz" : (i % 5).zero? ? "Buzz" : i }

Anonimowy pisze...

Python:

for i in range(100):
      if not i%15: print 'FizzBuzz'
      elif not i%3: print 'Fizz'
      elif not i%5: print 'Buzz'
      else: print i

Anonimowy pisze...

Hahahha, zadanie jednak okazało się zbyt trudne.

Tomasz Kowalczyk pisze...

Jeśli naprawdę, to nie ma się z czego śmiać, tylko do nauki Panie kolego!

Gluth pisze...

Tak się tu wszyscy ładnie iteracyjnymi językami chwalą. To i ja się pochwalę, FizzBuzz w Prologu:

forall(between(1, 100, X),(
(0 is X mod 15) -> writeln('FizzBuzz');
(0 is X mod 3) -> writeln('Fizz');
(0 is X mod 5) -> writeln('Buzz');
writeln(X))).

Nie jest to może najładniejsze rozwiązanie, ale, działa.

Anonimowy pisze...

"
Napisz program, który wypisuje liczby od 1 do 100. Ale dla wielokrotności trójki wyświetl "Fizz" zamiast liczby oraz dla wielokrotności piątki wyświetl "Buzz". Dla liczb będących wielokrotnościami trójki oraz piątki wyświetl "FizzBuzz".
"

Od 1 do 100, ma być wielokrotnością 3, 5 lub 3 i 5 na raz.

Czy przypadkiem kod pythonowy nie powinien wyglądać tak:

"
for i in xrange(1, 101):
if i%15 == 0:
print 'FizzBuzz'
elif i%3 == 0:
print 'Fizz'
elif i%5 == 0:
print 'Buzz'
else:
print i
"


Hmmmm ?

Anonimowy pisze...

Coś wcięcia się popsuły. Parszywe formatowanie bloggera!

Anonimowy pisze...

Lamusy mają problem do lamusów... normalne. Programując przez ostatnie 15 lat po kilkanaście godzin dziennie 2 razy musiałem wykorzystać rekurencje w tym do stworzenia komponentu drzewa. Spolsky to przygłup wystarczy przeczytać jego książki wrażenie to on może zrobić na totalnie zielonych lamusach. A panowie są upośledzeni wystarczy spojrzeć na dokonania programisty... jakie ma programy które sam stworzył i czy ma się czym pochwalić to nie muszę go o nic pytać i nic sprawdzać. To że po studiach lamusy nic nie potrafią to co w tym nadzwyczajnego chcesz być programistą to programuj nie gadaj nie lansuj się nie bądź naiwny. A pan Jeff jest większym lamusem od tych z którymi się spotyka i w tym jest podstawowy problem.

Anonimowy pisze...

Implementacja w ARKO:

class mt:();
cc -- 3 call: 'Fizz';
cc -- 5 call: 'Buzz';
cc -- 5%*3% call: 'FizzBuzz';
classend;

Prosto i przejrzyście. Kompilować kompilatorem w wersji 1.3.3 bo starsze źle interpretują klasę "mt"

p98 pisze...

W Pascalu:
http://pastebin.ca/1741716

Anonimowy pisze...

VBA for Excel:

i = 1
For i = 1 To 100
ActiveCell.Value = i
If i Mod 3 = 0 Then ActiveCell.Value = "Fizz"
If i Mod 5 = 0 Then ActiveCell.Value = "Buzz"
If i Mod 3 = 0 And i Mod 5 = 0 Then ActiveCell.Value = "FizzBuzz"
ActiveCell.Offset(1, 0).Activate
Next i


Jestem księgowym.. Tzn że mogę zmienić branże? :)

Mchl pisze...

W pythonie wg xkcd

import fizzbuzz

Tomasz Kowalczyk pisze...

@p98: pogratulować świadomego korzystania z funkcji pakietu Office, bo większość tylko potrafi kolorować tekst w Wordzie. ;]

Tomasz Kowalczyk pisze...

Kurczę, nie zauważyłem - to był komentarz Anonimowego ;]

Anonimowy pisze...

php:
foreach(range(1,100) as $i)
echo ($i%3?"":"fizz").($i%5?"":"buzz").($i%3&&$i%5?$i:"")."
";

Anonimowy pisze...

Wg mnie, aby sprawdzić "przydatność" programisty nie trzeba go nawet zmuszać do pisania kodu -wystarczy kilka prostych, ale konkretnych pytań z cyklu "jak Pan zrobiłby coś takiego ...?". Człowiek albo wie, albo ściemnia i odpada. Potem można dać 2 tygodnie na udowodnienie "przydatności" i wtedy można pogadać o prawdziwych pieniądzach za jego pracę.

Ja skończyłem informatykę na prywatnej uczelni, a nigdy nie miałem problemów ze znalezieniem pracy, albo z jej wykonywaniem. Jeśli się coś lubi (może nawet kocha) to zawsze się znajdzie rozwiązanie problemu.

A na koniec mam pytanie:
Kto łatwiej zaliczy test kwalifikacyjny jako programista (np. .Net lub Java)? Programista z kilkuletnim doświadczeniem, czy ktoś kto przez 2 lata przeczytał 20 książek i wykonał z nich wszystkie zadania? Moim zdaniem ta 2 osoba, a to podstawowy błąd osób, które testują kandydatów (moje zdanie oczywiście). Ponieważ w pracy nie liczy się, czy wiesz co oznacza skrót WSDL, tylko uczy umiesz rozwiązywać "rzeczywiste problemy" i pisać "rzeczywiste aplikacje". Do tego czy umiesz napisać kod w taki sposób, aby inni go zrozumieli, a nie wpadali w zachwyt/zdziwienie. Kod musi być przejrzysty, prosty, krótki, elastyczny, bez udziwnień i odporny na błędy -a to czy go napiszesz w 3 czy 7 linijkach nie ma wielkiego znaczenia ;-)

P.S.
Napisałem, że nie miałem problemów ze znalezieniem pracy, więc małe sprostowanie:
...kiedyś miałem rozmowę, na której wypełniałem właśnie test składający się w większości z tłumaczenia skrótów typu WSDL oraz wypisywania „książkowych” nazewnictw. Nie mówię tu oczywiście o sprawach tak banalnych jak rekurencje, pętle, funkcje, itp., które trzeba znać jak pacierz!

Pozdrawiam wszystkich bardzo serdecznie
JacekPlacek

Anonimowy pisze...

3 miesiąc studiów i proszę:
w C

for(i=1;i<101;i++){
if (i%3==0 && i%5==0)
printf("FizzBuzz\n");
else if (i%3==0)
printf("Fizz\n");
else if (i%5==0)
printf ("Buzz\n");
else printf("%d\n", i);
}

Anonimowy pisze...

PHP w jednej linii:

foreach(range(1,100) AS $i) echo ($i%3?($i%5?$i:'Buzz'):'Fizz'.($i%5?'':'Buzz'))."\n";


Swoją drogą, ten formularz dodawania komentarzy jest beznadziejny. NoScript i już lipa...

awol pisze...

@KonradKubiec.com:
Piszesz o tym jak stres podczas interview działa na kandydatów, wg. mnie takie zachowanie dotyczy często tych którzy nie wierzą w swoje umiejętności. Do rozmowy kwalifikacyjnej warto się przygotować nie tylko pod względem technicznym, ale przede wszystkim z umiejętnej komunikacji międzyludzkiej, persfazji i negocjacji.
Nie rozumiem tylko dlaczego patrzysz podejrzliwie na tych którzy nie odczuwają stresu podczas rozmowy? Wydaje mi się że jest to bardzo pożądana umiejętność w korporacji, podobnie jak te które wymieniłem wyżej. Dzisiejszemu programiście pracującemu w teamie nie wystarczą nieskończone umiejętności techniczne, równie ważne są tzw. 'soft skills'.

hejo pisze...

NO I WYDAŁO SIĘ

Anonimowy pisze...

Uff.. jaby zrobienie FizzBuzz zajelo mi wiecej niz minutke pewnie bym juz byla bezrobotna ;-)
Az nie chce mi sie wierzyc, ze osoba ubiegajaca sie o prace programity nie potrafilaby tego zrobic. To sie w glowie nie miesci...

Anonimowy pisze...

wiec i dołożę swoje 5 groszy program w pascalu był nie poprawny może on w Delphi 2010 wyglądać np. tak:

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
s:string;
begin

i:=0;
s:='';
while i<=100 do
begin
if (i mod 3 = 0) and (i mod 5 = 0) then
begin
s:=s+'FizzBuzz; ';
i:=i+1;
Continue;
end;
if i mod 3 = 0 then
begin
s:=s+'Fizz; ';
i:=i+1;
Continue;
end;
if i mod 5 = 0 then
begin
s:=s+'Buzz; ';
i:=i+1;
continue;
end;

if (i mod 3 <> 0) and (i mod 5 <> 0) and ((i mod 3 <> 0) and (i mod 5 <> 0)) then s:=s+inttostr(i)+'; ';
i:=i+1;
end;

showmessage(s);
end;

Anonimowy pisze...

Jedno to napisanie programu, a drugie to zrozumienie specyfikacji (zadania). Większość popełnionych błędów w powyższych programach wynika z niepełnego zrozumienia pozornie prostego zadania i wszystkich niuansów.
A swoją drogą dobry programista, powinien mieć dobre umiejętności analityczne, a tego to niektórzy nie zdobędą niezależnie ile milionów lini kodu by napisali.

Anonimowy pisze...

90% komentatorów którzy podesłali kod nie zauważyło że liczby podzielne przez 3 i 5 jednocześnie dadzą print
FizzBuzzFizzBuzz

Anonimowy pisze...

@ Tomasz Kowalczyk

Niestety ponad 90% ludzi nie potrafi tak naprawdę korzystać z pakietu office.. ostatnio jedząc obiad usłyszałem ze stolika obok o "magicznej" funkcji szukaj.pionowo.. a co to mówić o VBA..

Anonimowy pisze...

Dobremu programiście nie chciałoby się tu nawet wklejać rozwiązania :-) Może wypowiedzieliby się merytorynie bez popisywania takim banalnym kodem...
Stefan21

Anonimowy pisze...

.gram_na_gitarze {
background-images:url(nie_znam_nut.jpg);
}

Anonimowy pisze...

Pascal:

uses
sysutils;


var
i: Integer;


begin
for i:=1 to 100 do begin
if ((i mod 3) = 0) and ((i mod 5) = 0) then begin
writeln('FizzBuzz');
continue;
end;

if ( (i mod 3) = 0) then begin
writeln('Fizz');
continue;
end;

if ( (i mod 5) = 0) then begin
writeln('Buzz');
continue;
end;

writeln(i);
end;
end.--

Tomasz Kowalczyk pisze...

A co tu mówić merytorycznie? Ja bym pewnie oddał ten kod, ale z bijącym sercem i szybkim oddechem, bo strasznie nie lubię sprawdzianów na czas, nigdy nie byłem dobry w konkursach, w których trzeba było coś rozwiązać np. w 5 minut. Za to mając możliwość spokojnego napisania danej rzeczy w domciu mogłem wykonać to w te 5 minut nie mając na sobie presji i oczu spoglądających na każdy ruch klawiatury / myszki / ołówka / itp.

Czy to dobry sposób? Moim zdaniem bardzo dobry. Odsiałby spory procent tych, którym się wydaje, że jak potrafią zrobić new Arraylist() albo wyklikać GUI w NetBeansie to już są programistami. Naprawdę, uważam, że programowanie powinno się zaczynać od podstaw, a nie od "wisienki na torcie", tak jak np. z frameworkami w PHP. Co z tego, że szybko wyklepiesz stronkę, skoro nie masz pojęcia jak cały FW działa pod maską? Nie interesuje Cię to? Bardzo dobrze, ale nie nazywaj się wtedy programistą. Java jest narzędziem genialnym w swojej idei. Tylko, że do tej idei trzeba dorosnąć, a nie wziąć ją jako gotową.

Anonimowy pisze...

;with fizzbuzz(n,fb) as
(select 1,cast('1' as varchar)
union all
select n+1,
cast(left(n+1,(n+1)%3*(n+1)%5*3) +
left('Fizz',-(sign((n+1)%3)-1)*4) +
left('Buzz',-(sign((n+1)%5)-1)*4)
as varchar) from fizzbuzz
where n<100)

select fb from fizzbuzz

Anonimowy pisze...

a tu przejrzuyscie bez kombinacji )

;with fizzbuzz(n,fb) as
(select 1,cast('1' as varchar)
union all
select n+1,
case
when (n+1)%15=0 then 'FizzBuzz'
when (n+1)%3=0 then 'Fizz'
when (n+1)%5=0 then 'Buzz'
else cast(n+1 as varchar)
end
from fizzbuzz
where n<100)

select fb from fizzbuzz

Anonimowy pisze...

taaa, jak to ktoś powyżej zauważył zdecydowana większość oblała, bo dla liczb podzielnych przez 3 i 5 pozwala spełnić wszystkie warunki, więc printuje wszystko. W tym świetle artykuł jest dramatycznie prawdziwy. Mało tego - nie jest sztuką rozwiązać to zadanie w sposób poprawny składniowo i funkcjonalnie ale kompletnie nieczytelny, nawet dla ludzi programujących w danym języku. W większości współczesnych języków programowania sugerowałbym rozwiązać to zadanie definiując 3 metody/funkcje, sprawdzające odpowiednie modulo, przy czym metoda dla 3 i 5 wykorzystywałaby już dwie poprzenie. A w pętli iteracyjnie sprawdzamy wyniki tych metod. Pamiętając oczywiście o tym co napisałem na początku.

W sumie więc z komentarzy powyżej do pracy przyjąłbym góra dwie osoby (a zajmuję się rekrutacją programistów zawodowo). Zgadnijcie które ;-)

Anonimowy pisze...

C#, czas pisania 90sek

for (int i = 0; i <= 100; i++)
{
if (!((i%3 == 0) || (i%5 == 0)) )
{
Console.Write(i);
}
else
{
if (i%3 == 0)
{
Console.Write("Fizz");
}
if (i%5 == 0)
{
Console.Write("Buzz");
}
}
Console.Write(Environment.NewLine);
}
Console.ReadLine();
}

Anonimowy pisze...

Do pana rekrutanta powyżej, napisz Pan w minutę na kartce kod z funkcjami i wykorzystując je w pętli, no nie przesadzajmy, można by też stworzyć klasy implementujące interfejs, do tego posiadające metodę wirtualną, ale chyba tu nie o to chodziło!

Anonimowy pisze...

W moim ukochanym asemblerze M68K na system AmigaOS:

moveq #20,d7
lea (_dos,pc),a1
movea.l (4).w,a6
moveq #0,d0
jsr (_LVOOpenLibrary,a6)
tst.l d0
beq .end
movea.l d0,a6
moveq #0,d2
moveq #101,d3
moveq #3,d4
moveq #5,d5
.loop addq.l #1,d2
cmp.l d2,d3
beq .end3
subq #1,d4
bne .skip1
lea (_fizz,pc),a0
bsr .print
moveq #3,d4
.skip1 subq.l #1,d5
bne .print1
moveq #5,d5
lea (_buzz,pc),a0
bsr .print
.ten move.l d2,-(sp)
lea (_ten,pc),a0
move.l a0,d1
jsr (_LVOVPrintf,a6)
move.l (sp)+,d2
bra .loop

.print1 moveq #3,d0
cmp.l d0,d4
beq .ten
suba.l a0,a0
bsr .print
bra .ten

.print move.l d2,-(sp)
move.l sp,d2
move.l a0,d1
bne .sk
lea (_number,pc),a0
.sk move.l a0,d1
jsr (_LVOVPrintf,a6)
move.l (sp)+,d2
rts

.end3 movea.l a6,a1
movea.l (4).w,a6
jsr (_LVOCloseLibrary,a6)
moveq #0,d7
.end move.l d7,d0
rts

_dos dc.b 'dos.library',0
_fizz dc.b 'Fizz',0
_buzz dc.b 'Buzz',0
_number dc.b '%ld',0
_ten dc.b 10,0

Anonimowy pisze...

Taki mały przykład w bashu, bo widzę że jeszcze żadnego nie ma:

#!/bin/bash
for i in `seq 1 100`; do
x=""
if [ $[i%3] -eq 0 ]; then
x=$x"Fuzz"
fi
if [ $[i%5] -eq 0 ]; then
x=$x"Buzz"
fi
if [ -z $x ]; then
x=$i
fi
echo $x
done


Nie piszę zawodowo w bashu więc zajęło mi to krótką chwilkę, bo nie pamiętałem testu na pusty string :)
Znając programistów konsolowych, zaraz pojawi się przykład udowadniający nieudolność mojego kodu :)

pozdrawiam,
chesteroni

Anonimowy pisze...

Zgadzam się, że takie sprawdzenia są BARDZO ważne. Rekrutowałem kilkudziesięciu programistów i takie sprawdzenie jest warunkiem koniecznym (acz nie dostatecznym) - potrafi momentalnie odsiać osoby, z którymi z dużym prawdopodobieństwem będą problemy.

Doświadczony programista NAJPIERW pisze test, a potem kod. Wtedy unika się głupich błędów, a wysiłek całkowity jest mniejszy.

np. tak:

def getFizzBuzzNumberString(i)
"""
>>> getFizzBuzzNumberString(1)
'1'
>>> getFizzBuzzNumberString(3)
'Fizz'

itd.
a potem to już prosta pętla.

Nie ma nic złego w tym, że popełnia się proste błędy, o ile potrafi się nad tym panować.

Z drugiej strony ten FizzBuzz to faktycznie prościutki przykład.

pozdrawiam
Tomek

Anonimowy pisze...

Zapomniałem napisać, ale oczywiście treść funkcji też trzeba napisać ;-)

Tomek

Anonimowy pisze...

ansi c

int main(void)
{
int x=1;
for(x;x<101;x++)
{
if(!(x%3)) printf("fizz");
if(!(x%5)) printf("buzz");
if(x%3 && x%5) printf("%d",x);
printf("\n");
}
}

Anonimowy pisze...

@paffnucy
2 if'y działające dla i%15==0:

{
int k=1;
for (int i = 1; i <= 100; i++)
{
if (i % 3){cout << "Fizz"; k = 0;}
if (i % 5){cout << "Buzz"; k = 0;}
cout << i*k;
k =1;
cout << "endl";
}
}

Anonimowy pisze...

aj, nie, pomyłka. zawsze i się wypisze.

Anonimowy pisze...

switch ftw

{
int k = 0;
for (int i = 1; i <= 100; i++)
{
if (i % 3) k |= 1;
if (i % 5) k |= 2;
switch(k)
{
case 0 :
cout << i;
break:
case 1 :
cout << "Fizz";
break;
default :
cout << "Buzz";
}
cout << "endl";
k = 0;
}
}

Anonimowy pisze...

Coś niewyspany jestem: 2 if'y, dwie reszty z dzielenia.

{
int k = 0;
for (int i = 1; i <= 100; i++)
{
if (i % 3) k |= 1;
if (i % 5) k |= 2;
switch(k)
{
case 0 :
cout << i << endl;
break:
case 1 :
cout << "Fizz" << endl;
break;
case 2 :
cout << "Buzz" << endl;
break;
case 3 :
cout << "FizzBuzz" << endl;
}
k = 0;
}
}

Anonimowy pisze...

Prawdziwy programista poradzi sobie nawet BEZ IF'ów, FOR'ów, itp...

#include

int count(int i)
{
(i > 1) && count(i - 1);

!((!(i % 3) && std::cout << "Fizz") +
(!(i % 5) && std::cout << "Buzz")) &&
std::cout << i;

std::cout << std::endl;

return i;
}

int main(int argc, char ** argv)
{
count(100);
}

Anonimowy pisze...

W ABAPie:

report zbuzz.
data: lv_text type string,
lv_mod3 like sy-index,
lv_mod5 like sy-index.
do 100 times.
lv_mod3 = sy-index mod 3.
lv_mod5 = sy-index mod 5.
if lv_mod3 eq 0 and lv_mod5 eq 0.
lv_text = 'FizzBuzz'.
elseif lv_mod3 eq 0.
lv_text = 'Fizz'.
elseif lv_mod5 eq 0.
lv_text = 'Buzz'.
else.
lv_text = sy-index.
endif.
write / lv_text .
enddo.

Anonimowy pisze...

Wiekszosc kodu tutaj drodzy panowie to rozwiazanie problemu bez tgz "stylu programowania" wiec nie koniecznie osoba ktora zna sie na rzeczy i pracuje jakis czas w branzy bedzie chciala zatrudnic wlasnie hardcorowych programistow...A odnosnie dobrego stylu programowania to zadna ksiazka nie nauczy bardziej jak czyste doswiadczenie zawodowe ;p

Anonimowy pisze...

Hehe... widzę, że zjadło część mojego #include - iostream przez znaczniki html pewnie.

A co do "stylu programowania" - tego nawet doświadczenie nie uczy - programowanie to rzemiosło, albo ktoś to czuje, albo nie. Wielu rzeczy można się nauczyć ale najlepsi rzemieślnicy muszą się z talentem urodzić. Ja podałem przykład jak można prostym zadaniem trochę się pobawić dodając np. nowe wymagania (w tym wypadku odnośnie kodu, ale można spróbować napisać kod najkrótszy - dokładnie najkrótszy licząc znaki - najmniej złożony, najłatwiejszy do testowania).

W rzeczywistości nie napisałbym raczej kodu zastępując instrukcje sterujące wyrażeniami a jeżeli już to musiałoby to być poważnie uzasadnione i udokumentowane (i to nie tylko w komentarzach).

I jeszcze słówko o rozmowach kwalifikacyjnych - słyszałem i widziałem takie "krzaki", że można by o tym książkę napisać...

Codility pisze...

Z podobnych doświadczeń (większość kandydatów zgłaszających się w rekrutacji na stanowiska programistów nie umie rozwiązać postawionego problemu przez napisanie skalowalnego kodu) powstało Codility, które pozwala zdalnie przetestować kandydatów (sprawdzajac automatycznie napisany kod) i na rozmowę zaprosić już tylko spełniających przyjęte kryteria.

Jeżeli chcecie się sprawdzić ;) to test demo (dostępny bez rejestracji) jest na naszej stronie - http://codility.com/

@codility

Anonimowy pisze...

Rekurencja do rozwiązywania prawdziwych problemów? Przecież rozwiązanie iteracyjne zawsze jest mniej pamieciożerne i bezpieczniejsze ...

Skowron pisze...

JS:
while(i<100) console.log(!(++i % 3) ? 'Fizz' + (!(i % 5) ? 'Buzz' : '') : !(i % 5) ? 'Buzz' : i)

Anonimowy pisze...

Zakładam, że uwaga o rekurencji to do mnie ;)

Napisałem, że założeniem (moim) było napisać kod, bez instrukcji sterujących, pętli, itp...

Anonimowy pisze...

Większość osób nie zdaje sobie sprawy jaką wartość wypluwa operator % :D ciekawe

rafek pisze...

@Anonimowy o rekurencji: Chyba, że użyjesz rekurencji ogonowej (prawostronnej), ale trzeba wiedzieć najpierw, że coś takiego istnieje..

Anonimowy pisze...

for ( int i = 1; i <= 100; i++ )
{
if ( !( i % ( 5*3 ) ) ) cout << i << endl;
else
{
if ( !( i % 3 ) ) cout << "Fizz";
if ( !( i % 5 ) ) cout << "Buzz";
cout << endl;
}
}

Anonimowy pisze...

for ( int i = 1; i <= 100; i++ )
{
if ( !( i % 5 && i % 3 ) ) ) cout << i << endl;
else
{
if ( !( i % 3 ) ) cout << "Fizz";
if ( !( i % 5 ) ) cout << "Buzz";
cout << endl;
}
}

Anonimowy pisze...

Mnie najbardziej bawi rozpatrywanie FizzBuzz jako osobnego przypadku... po tym lamera poznacie!

Anonimowy pisze...

w pythonie to chyba mniej więcej tak trzeba pisać, żeby łatwiej było modyfikacje robić:

for i in range(1, 101):
s = ''
if i % 3 == 0: s = 'Fizz'
if i % 5 == 0: s = s + 'Buzz'
print s if s else i

Al pisze...

Wszyscy, co zrobili więcej niż dwa testy na podzielność w swoich programach, oblaliby by ten teścik.

z pisze...

while($i++<100)echo($i%3?($i%5?$i:Buzz):Fizz.($i%5?'':Buzz))."\n";

Anonimowy pisze...

No cóż, niektórzy pewnie poszli na informatykę bo im mama kazała, bo modna, bo lubią grać w gry itp. Żenada.

python pisze...

for i in range(1, 101):
s = 'Fizz'[4*(i%3):]+'Buzz'[4*(i%5):]
print s if s else i

python pisze...

a jednak można jeszcze sprytniej w pythonie :)

for i in range(1, 101): print 'Fizz'[4*(i%3):] + 'Buzz'[4*(i%5)] or i

Anonimowy pisze...

Pan "rekruter" pisze tak:
"W większości współczesnych języków programowania sugerowałbym rozwiązać to zadanie definiując 3 metody/funkcje, sprawdzające odpowiednie modulo, przy czym metoda dla 3 i 5 wykorzystywałaby już dwie poprzenie. A w pętli iteracyjnie sprawdzamy wyniki tych metod."

Niby dlaczego? Czy polecenie brzmi: napisać FizzBuzz w stylu barokowym? Programista ma rozwiązywać problemy wykorzystując do tego adekwatne metody i narzędzia, a tym przypadku pisanie dodatkowych funkcji czy metod to przerost formy.

Tym, których tak bawi rozpatrywanie 'FizzBuzz' jako oddzielnego przypadku chciałbym poddać pod rozwagę taką sprawę: wziałem dwa rozwiązania w Pythonie, jeden z trzema, drugi z dwoma testami na podzielność. Zwiększyłem trochę zakres, printy zamieniłem na instrukcje przypisania i zmierzyłem czas działania.

fb1.py:

for i in range(1, 10000001):
s = ''
if i % 3 == 0: s = 'Fizz'
if i % 5 == 0: s = s + 'Buzz'
result = s if s else i

fb2.py:

for i in xrange(1, 10000001):
if i%15 == 0:
result = 'FizzBuzz'
elif i%3 == 0:
result = 'Fizz'
elif i%5 == 0:
result = 'Buzz'
else:
result = i


~/> time python fb1.py

real 0m8.014s
user 0m7.953s
sys 0m0.060s

~/> time python fb2.py

real 0m6.057s
user 0m6.056s
sys 0m0.000s

Czarodziej pisze...

BTW tak by to wyglądało w LOLcodzie
HAI
CAN HAS STDIO?
I HAZ A VAR ITZ 1
IM IN YR LOOP
IZ VAR SMALR THAN 101?
YARLY
UPZ VAR!!
NOWAI
GTFO
KTHX
IZ NOT VAR LEFTOVER 3?
YARLY
VISIBLE "fizz"
KTHX
IZ NOT VAR LEFTOVER 5?
YARLY
VISIBLE "buzz"
KTHX
IZ VAR LEFTOVER 3 AND VAR LEFTOVER 5?
YARLY
VISIBLE N VAR N
KTHX
IM OUTTA YR LOOP
KTHXBYE

KonradKubiec.com pisze...

Dwie kwestie. Popieram spostrzeżenie z powyższego posta (8 sytcznia 17:50). Często pokazanie umiejętności zagmatwania (lub popsucia) kodu nie ma nic wspólnego z zamysłem jego ptymalizacji. Uwaga dla "rekrutera": Podany przez Ciebie przykład rozwiązania jest przykładem nadmiernej finezji i nie będzie "najwyżej punktowanym" rozwiązaniem. Mrówki nie ma sensu zabijać bąbą atomową. Wspomniany zakres kompetencji testuje się w inny sposób.

Kwestia druga. Podana metoda służy do weryfikacji juniorów, lub "zwykłych" programistów o dziwnym CV (np. pisanym pod ogłoszenia). Osobiście polecam uważać na rozwiązania typu Codility - nigdy nie wiadomo kto wykona test i czy to nasz kandydat.

KonradKubiec.com pisze...

Oczywiście nie zniechęcam od używania Codility i nie neguję przydatności tego, czy innych narzędzi. Zalecam jednak rozsądek.

Michał Brzuchalski pisze...

Najkrótsza wersja PHP:

foreach(range(1,100) as $i) echo ($i % 3 ? null : 'Fizz'). ($i % 5 ? ($i % 3 ? $i : null) : 'Buzz). "\n";

Michał Brzuchalski pisze...

Zgubiłem apostrof ' za Buzz :P

Anonimowy pisze...

php czy perl to nieczytelne gówno

Anonimowy pisze...

ktoś tu kuma programowanie komputerów w języku do mlaskania? bo nie zauważyłem:

for i in range(1, 101): print 'Fizz'[4*(i%3):] + 'Buzz'[4*(i%5):] or i

Anonimowy pisze...

Nie mogłem się powstrzymać :-))
FreePascal/Delphi (kod do wklejenia w środowisku Lazarus)

program project1;

{$mode objfpc}{$H+}

uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes
{ you can add units after this };

var
i: byte;

{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}

begin
for i:=1 to 100 do
begin
if ((i mod 3) = 0) and ((i mod 5) = 0) then
writeln('FizzBuzz')
else
if ((i mod 3) =0) then
writeln('Fizz')
else
if ((i mod 5) = 0) then
writeln('Buzz')
else
writeln(i);
end;
end.

Anonimowy pisze...

for (int i = 1; i < 101; i++)
{
if ( i % 3 == 0)
{
printf ("Fizz");
if (i % 5 == 0) printf("Buzz");
}
else if (i % 5 == 0) printf("Buzz");
else printf("%d", i);
printf("\n");
}

Napisanie tego zajęło mi jakieś 3 minuty, a uczę się w liceum(2. klasa). Fakt, że C, to jedyny język w jakim narazie pisze, ale ciesze się, że skoro jest taki poziom, to mam nadzieję na dobre studia xD
Czytając komentarze widziałem, że wszyscy pisali "cout", a taka uwaga, że:
*1) trzeba do programu dołączac kolejną bibliotekę,
*2) jest dużo wolniejsze od zwykłego printfa, co nie zawsze się liczy, ale czasem jednak ...

id pisze...

C# Napisane w czasie wykładu z prawa na szybko może się nie kompilować sprawdźcie.
bool wyswietl;
public void fizbuz(int x)
{
wyswietl=true;
Console.WriteLine();
if (x%3==0)
{
Console.Write("Fizz");
wyswietl=false;
}
if (x%5==0)
{
Console.Write("Buzz");
wyswietl=false;
}
if(wyswietl)
Console.Write(x);
}
static void Main(string[] args)
{
Program a = new Program();
for (int i=1; i<100; i++)
{
if (i > 5)
a.fizbuz(i);
else
Console.Write("\n"+i);
}
Console.ReadKey();

abonament na aion pisze...

Bardzo interesujacy wysyp ekspertow od poprawiania siebie nawzajem ;)

Anonimowy pisze...

omg ile wysilku ...

Object[] obj = new Object[] {
0,
1,2,"Fizz",4,"Buzz","Fizz",7,8,"Fizz",
"Buzz",11,"Fizz",13,14,"FizzBuzz",16,17,"Fizz",19,
"Buzz","Fizz",22,23,"Fizz","Buzz",26,"Fizz",28,29,
"FizzBuzz",31,32,"Fizz",34,"Buzz","Fizz",37,38,"Fizz",
"Buzz",41,"Fizz",43,44,"FizzBuzz",46,47,"Fizz",49,
"Buzz","Fizz",52,53,"Fizz","Buzz",56,"Fizz",58,59,
"FizzBuzz",61,62,"Fizz",64,"Buzz","Fizz",67,68,"Fizz",
"Buzz",71,"Fizz",73,74,"FizzBuzz",76,77,"Fizz",79,
"Buzz","Fizz",82,83,"Fizz","Buzz",86,"Fizz",88,89,
"FizzBuzz",91,92,"Fizz",94,"Buzz","Fizz",97,98,"Fizz",
"Buzz"
};

for(int i = 1; i <= 100; i++) {
out.println(obj[i]);
}

;)

id pisze...

no i tak jak myślałem wysypałem się przy i<100 ma być i<=100

Artur pisze...

C++ Prosto bez kombinowania:
int flag;
for(int i=1; i<=100; i++) {
flag=1;
if(i%3 == 0) {
cout<<"Fizz";
flag=0;
}
if(i%5 == 0) {
cout<<"Buzz";
flag=0;
}
if(flag) {
cout<<i;
}
cout<<"\n";

}

Anonimowy pisze...

Python, chyba najprościej jak się da:

for i in range(100):
- if i%3==0:
-- sys.write("Fizz")
- if i%5==0:
-- sys.write("Buzz")
- if i%3!=0 && i%5!=0:
-- sys.write(str(i))
- sys.write("/n")

Ale co ja wiem, jestem tylko testerem :P
Pawel

Anonimowy pisze...

no nie, popatrzyłbyś wyżej to w pythonie wygląda to tak:
for i in range(1, 101): print 'Fizz'[4*(i%3):' + 'Buzz'[4*(i%5):] or i
Wzorcowe rozwiązanie jest z jawnymi if'ami. Ale w miarę czytelny jednolinijkowiec robi wrażenie :)

Anonimowy pisze...

Firma "Dynamiczna firma" lider w swojej branży poszukuje odpowiedniego kandydata na stanowisko:
"BRUDAS .NET/JAVA/PHP"

Miejsce Pracy: Warszawa

Wymagania:
- .NET, C#, VB.NET, JS.NET, ASP.NET, MVC, Java, J2EE, JBoss, PHP
- JS (JQuery, ExtJS, ASP.NET Ajax, PrototypeJS)
- SQL(Sql Server, Oracle, PostGres, MySQL)
- odporność na stres
- odporność na pracę pod presją czasu
- analityczny umysł(najlepiej członek mensy)
- wykształcenie minimum doktorat, najlepiej dwa(max. 4 rok studiów!)
- umiejętność wyklepania minimum 0.5MB smrodokodziku w miesiąc
- umiejętność modyfikowania ekstremalnej chapy w super krótkim czasie
- minimum 8 lat doświadczenia komercyjnego
- języki: angielski/niemiecki/francuski/koreański/egipski + dowolny inny
- ciekawe hobby(fajnie jak czytasz 7-10 książeczek per week)
- Sumienność, Staranność, Perfekcyjność
- Posiadanie kredytu hipotecznego na minimum 30 lat
- Nie posiadanie żadnych oszczędności + "desperacja w oczach"
- Certyfikaty: Minimum wózek widłowy i bolidy F1
- Najlepiej fanatyk gniotoklepanki zwarty i gotowy wyklepywać za darmoszkę miliardy linijeczek brudokodziku
- Znajomość metodyk: TDD + Agile
- Umiejętność zarządzania czasem (także po pracy)

Oferujemy:
- miska ryżu dziennie LUB umowa o dzieło LUB działalność charytatywna
- krzesło i biurko
- komputer
- pracę w dynamicznym i wiecznie młodym zespole
- pracę pełną wrażeń
- wieczną MOŻLIWOŚĆ ROZWOJU
- pracę w prężnie rozwijającej się firmie
- zarobki adekwatne do Twojego zaangażowania i stażu
- Mierzenie kodu wagą lub linijką
- Możliwość bezpośredniej rywalizacji z Hindusami i Chińczykami

Dołącz do nas już dziś! U nas pracują najlepsi!

Aplikacje prosimy wysyłać na adres w ciągu 3 dni od ukazania się oferty:
DynamicznaFirma@gmail.com
Zastrzegamy możliwość odpowiedzenia tylko na wybrane przez nas oferty!


PS.
1. Jeśli jeszcze nie zauważyłeś że to żart przeczytaj ofertę jeszcze raz! Jeśli zauważyłeś ale masz potrzebę podziel się swoimi przemyśleniami na temat obecnej sytuacji rynku pracy IT w Polsce i jego przyszłości.
2. Jeśli jesteś studentem informatyki a Twoja średnia ocen ze wszystkich lat studiów jest niższa niż 6.2 już wiesz co Cię czeka: zacznij szukać wolontariatu już dziś!

rafek pisze...

@Anonimowy(powyżej): Widzę kolego (koleżanko), że Czas zmienić firmę. Da się znaleźć pracę w normalnej firmie. A dopóki znajdują się ludzie, którzy decydują się na pracę w takich warunkach (które opisałeś/aś), dopóty będą istnieć takie miejsca pracy.

cojack pisze...

Przyrownania do 0 o_O tak tak jak pobierać z bazy danych wartości na podstawie warunku logicznego: WHERE "tabela"."kolumna" = TRUE, lol.


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

Anonimowy pisze...

Mylisz się kolego cojack. Programy powinny być jak najbardziej czytelne, żeby po roku ktoś się nie musiał głowić nad kodem robiąc poprawki. Badanie podzielności to sprawdzenie czy reszta z dzielenia jest równa zero i to się dobrze czyta. Wbudowane w język traktowanie zera jak fałszu umożliwia rezygnację z tego porównania, ale często kosztem czytelności jak w tym przypadku. Poza tym coś ci nie wyszło z analogią w sql'u i sam program nie działa jak powinien.

Anonimowy pisze...

Witam
nie widziałem poprawnego kodu w VBA więc wrzucę coś od siebie.


Sub Przycisk1_Kliknięcie()
Dim a
Dim i1 As Integer

Dim dzielenie(1 To 100)


For i1 = 1 To 99

a = i1

If (i1 Mod 3) + (i1 Mod 5) = 0 Then
a = "FizzBuzz"
Else

If (i1 Mod 3) = 0 Then
a = "Fizz"
End If

If (i1 Mod 5) = 0 Then
a = "Buzz"
End If

End If
dzielenie(i1) = a



Next i1
For i1 = 1 To 99

Cells(i1, 1) = dzielenie(i1)

Next i1

End Sub


mam nadzieję że nie popełniłem błędu:)

severson pisze...

for(int i=1;i<=100;i++){
bool dupa;
if(i%3==0){
dupa=TRUE;
echo "Fizz\n";
}
if(i%5==0){
echo "Buzz";
dupa=TRUE;
}
if(!dupa)
echo i,"\n";
}

severson pisze...

błąd mam, nie inicjuje zmiennej.

for(int i=1;i<=100;i++){
bool dupa;
if(dupa=(i%3==0))
echo "Fizz\n";
if(i%5==0){
echo "Buzz";
dupa=TRUE;
}
if(!dupa)
echo i,"\n";
}

t0xic pisze...

java po 3 miesiącach odkąd zacząłem programować :)

for (int i = 1; i <= 100; i++) {
if (i%3==0&&i%5==0) System.out.println("FizzBuzz");
else if (i%3==0) System.out.println("Fizz");
else if (i%5==0) System.out.println("Buzz");
else System.out.println(i);
}

Anonimowy pisze...

Ja tylko nie rozumiem jednego. Tekst jest o programistach, co nie umieją programować i pokazuje to na przykładzie banalnego problemu programistycznego.

Stado ludków się rzuciło z przykładami w różnych językach programowania. Z czego około połowy przykładów nie działa.

Co w ten sposób chcieliście pokazać? Że faktycznie nie umiecie programować i znając treść zadania nawet się wam nie chciało sprawdzić, co wysyłacie?

Żenada!

rafek pisze...

@Anonimowy: Najwyraźniej jest to wystarczający problem programistyczny do selekcji podczas rekrutacji na stanowisko programisty. ;)

Anonimowy pisze...

demo test na codility.com spustoszyłby szeregi 'programistów' doszczętnie :)

severson pisze...

Dobra, nasadziłem błędów, ale to i tak dobrze, zważywszy na to że nie programuję od dawna. Założenie (czy też opcjonalne założenie) było takie, że ma być na papierze, to dziwnym sie wydaje zarzut, że ludzie nie sprawdzają.

A teraz słuchać chłopaki, spodobał się ten program i zleceniodawca prosi o napisanie według tego samego schematu programu nie dla dwóch, tylko dla siedmiu przypadków ;)

Anonimowy pisze...

np.

jeśli przyjmiemy założenie żeby liczby były pierwsze i żeby rozmiary tablic liczby i slowa były takie same to w pythonie można np. tak

l = [3, 5, 7, 11, 13, 17, 19]
s = ['Fizz', 'Buzz', 'Muzz', 'Duzz', 'Whatever', 'Cokolwiek', 'Dizz']

for i in range(1, 1001): print ''.join([s[j][len(s[j])*(i%l[j]:] for j in range(len(l))]) or i

Anonimowy pisze...

drobny problem z wklejaniem miałem, więc poprawka z brakującym nawiasem

for i in range(1, 1001): print ''.join([s[j][len(s[j])*(i%l[j]):] for j in range(len(l))]) or i

Anonimowy pisze...

lub czytelnie:

for i in range(1, 1001): print ''.join([s[j] if i%l[j] == 0 else '' for j in range(len(l))]) or i

severson pisze...

Adresowałem raczej do tych, którzy używali konstrukcji typu

if(!(i%15)) poka("FizzBuzz"); (...)

P.S. Podobają mi się języki typu perl, python czy inny ruby, ale chyba ich się nigdy nie nauczę ;) Czasem w przybliżeniu widzę, co artysta miał na myśli, ale sam bym nie sklepał czegoś podobnego.

Anonimowy pisze...

Ogólnie z tych trzech bardzo polecam pythona. Nie jest trudny do nauki.
Oczywiście żeby dojść do rozwiązania takiego jak poniżej trzeba znać już trochę język, ale to nie jest potrzebne na początku.

for i in range(1, 101): print 'Fizz'*(i%3 == 0) + 'Buzz'*(i%5 == 0) or i

Anonimowy pisze...

swego czasu na rozmowie walifikacyjnej dostałem prote pytanie:
ile = x1*x2+x3++;
;) Doskonale znam priorytety operatorów, wiedziałem jak działa inkrementacja (post i pre). Ale popełniłem błąd ;D Nerwówka :D

Anonimowy pisze...

Czytając o tym zadaniu FizzBuzz, nie wiem dlaczego, ale pierwsze co mi przyszło do głowy to pętla do-while a nie for. Nie wiem dlaczego. Są dziesiątki sposobów na rozwiązanie tego zadania, ale głównie chodzi o to, aby osoba potrafiła wykonać zadanie na różne sposoby. Aby potrafiła myśleć.

C++ :

#include
using namespace std;
int main()
{

int i=1;
do
{
if (i%3==0 && i%5==0)
cout<<"FizzBuzz\n";
else
if( i%3==0)
cout<<"Fizz\n";
else
if( i%5==0)
cout<<"Buzz\n";
else

cout<<i<<endl;
i++;
}
while (i!=101);
cin.get();
cin.get();
return 0;
}

Anonimowy pisze...

ucina z include

Anonimowy pisze...

iostream ucina z include

Anonimowy pisze...

W HTML (no niezupełnie bo z XML/XLS)

fuzzbuzz.xml
---
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="fuzzbuzz.xsl"?>
<fuzzbuzz>
<fuzz>Fuzz</fuzz>
<buzz>Buzz</buzz>
</fuzzbuzz>

===

fuzzbuzz.xls
---
<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<body>
<h2>FuzzBuzz</h2>

<xsl:call-template name="iterator">
<xsl:with-param name="nI">
<xsl:value-of select="1"/>
</xsl:with-param>
</xsl:call-template>

</body>
</html>
</xsl:template>

<xsl:template name="iterator">
<xsl:param name="nI"/>
<xsl:if test="($nI mod 3) and ($nI mod 5)">
<xsl:value-of select="$nI"/>
</xsl:if>

<xsl:if test="($nI mod 3) = 0">
<xsl:value-of select="fuzzbuzz/fuzz"/>
</xsl:if>
<xsl:if test="($nI mod 5) = 0">
<xsl:value-of select="fuzzbuzz/buzz"/>
</xsl:if>

<br/>
<xsl:if test="$nI &lt; 100">
<xsl:call-template name="iterator">
<xsl:with-param name="nI">
<xsl:value-of select="$nI + 1"/>
</xsl:with-param>
</xsl:call-template>
</xsl:if>

</xsl:template>

</xsl:stylesheet>

Anonimowy pisze...

To jest przecież wypowiedź amerykańskiego programisty, który pisze o amerykańskim problemie. W Polsce nie jest tak źle.

Anonimowy pisze...

@Anonimowy: Nie jest tak źle? A czytałeś/aś wszystkie powyższe komentarze?

Anonimowy pisze...

Mnie to zadanie zajęło niecałe 10 minut - programuję w C++ od 7 miechów, mam szansę na robotę?

Dominik pisze...

Jestem pod wrazeniem. Wszystkich, ktorzy napisali tutaj chociaz kawalek kodu uwazam za mniej, baddz bardziej seropozytywnych :P. Na prawde 95% ludzi czytajacych ten artykul stwierdzilo, ze przedmiotem debaty nie sa zastraszajace braki w wiedzu aplikantow, tylko napsanie FizzBuzz'a i pochwalenie sie tym?

A przykro sie robi, gdy niby inteligentni ludzie, ba, pewnie czesc sie nazywa programistami, nie umie wylapac 'sedna' dyskusji i skupia sie na kompletnie nieistotnych w tym ujeciu detalach.

Anonimowy pisze...

Myślę, że przesadzasz. Dyskutować nie ma za bardzo o czym i myślę że 99% dyskutantów to zauwazyło. Natomiast spora część napisała ten test źle mimo potencjalnie dużego czasu do namysłu. Są to ludzie w sporej części programujący za pieniądze. I to jest temat na osobną dyskusję, znacznie ciekawszą niż dyskutowanie o tym, że kandydaci na programistę nie umieją progamować.

chesteroni

Anonimowy pisze...

I jeszcze się co poniektórzy denerwowali. Ciekawe czym?
Na szczęście nie umiem programować...
Żal proszę Państwa, żal...

Anonimowy pisze...

troll

Anonimowy pisze...

int i;
for(i=1;i<101;i++)
{if(i%3==0&&i%5!=0)
{cout<<"Fizz"<<endl;}
if(i%3!=0&&i%5==0)
{cout<<"Buzz"<<endl;}
if(i%3==0&&i%5==0)
{cout<<"FizzBuzz"<<endl;}
if(i%3!=0&&i%5!=0)
{cout<<i<<endl;
}

c++,jakieś 5 minut roboty, troche nieprofesjonalnie wyglada, ale wszystko dziala,i od razu wiadomo o co chodzi

Anonimowy pisze...

nieprofesjonalnie? a klauzulę else widziałeś? w każdym obrocie pętli wszystkie warunki sprawdzasz, kod jest powielony, podatny na błędy, zmiany muszą być nakładane w wielu miejscach itd. ten kod to tragedia... przykro mi ;)

Anonimowy pisze...

Rzeczywiście niepotrzebne jest sprawdzanie wszystkich warunków w każdej pętli.
A to mój kod w javie- sprwdzony i działa.

for (int i=1; i<=100; i++)
{ if (i%3==0 & i%5==0)
{
System.out.println("FizzBuzz");}
else if(i%3==0)
{System.out.println("Fizz");}
else if(i%5==0)
{System.out.println("Buzz");}
else
{System.out.println(i);}
}

Anonimowy pisze...

for (int i = 1; i <= 100; i++) {
if (i % 3 == 0 && i % 5 == 0) {
std::cout << "FizzBuzz" << std::endl;
continue;
} else if (i % 3 == 0) {
std::cout << "Fizz" << std::endl;
} else if (i % 5 == 0) {
std::cout << "Buzz" << std::endl;
} else {
std::cout << i << std::endl;
}
}

Anonimowy pisze...

załamka ludzie :/ po co mam sprawdzanie "if (i % 3 == 0 && i % 5 == 0)" ehhhhhhh

Anonimowy pisze...

a dajcie sobie spokój! to jak shootout języków - na rozmowie kwalifikacyjnej jest przede wszystkim stres wiec wielu ludzi moze zapomniec jak sie nazywa!

Mnie zwerbowano przez podstawowe pytania o środowisko + test typu "praca domowa" (i nikt mi nie bronił wspomagac sie w tym z pomocą internetu - wręcz nawet było to uważano za plus - nie mowie oczywiscie o metodzie Kopiego Pasta :-)). Czyli pytanie o to co chodzi firmie a nie jakiś zaporowe pytanko na rozmowie kwalifikacyjnej.

Wiec dajcie sobie siana z tym FizzBuzz sratatata - ludzie to nie maszyny, nie testuje sie ich profilowaniem :-)

Anonimowy pisze...

Ucze sie C++ dopiero od tygodnia (poki co czytam Symfonie C++ i probuje cos rozumiec), ale po kilku probach udalo mi sie napisac to:

#include
using namespace std;

int main()
{
for(int i = 1 ; i <= 100 ; i++) // monzter ty chuju :3
{
if (i % 3 == 0 && i % 5 == 0)
{
cout << "FizzBuzz\n";
}
else if (i % 3 == 0)
{
cout << "Fizz\n";
}
else if (i % 5 == 0)
{
cout << "Buzz\n";
}
else
{
cout << i << endl;
}
}
system ("pause");
}


Czyzbym byl lepszy od tych po studiach informatycznych? Nie wydaje mi sie :|

Anonimowy pisze...

"Tak jak i ja, autor ma problemy z faktem, iż 199 na 200 aplikantów do każdej programistycznej pracy nie potrafi w ogóle pisać kodu. Powtarzam: nie potrafią pisać żadnego kodu. "

huhuhuhu

Patrząc na Wasze posty mam wrażenie iż to zdanie jest bardzo nieprawdziwe w tej części świata jaką jest Polska:D
Sformułował bym je teraz tak:

"Tak jak i ja, autor ma problemy z faktem, iż w Polsce 5 na 200 aplikantów do każdej programistycznej pracy nie potrafi w ogóle pisać kodu. Powtarzam: nie potrafią pisać żadnego kodu. "

Anonimowy pisze...

a mnie przeraża fakt że biorąc pod uwagę tak "proste" zadanie jak FizzBuzz
wśród osób które wrzucaja tutaj swoje rozwiązanie(chcąc się pochwalić) tylko 5% dało rozwiązanie optymalne a większość dała rozwiązanie błedne.

zchpit pisze...

Kod C#, czas pisania ok. 10 sek.


using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
for (int i = 1; i <= 100; i++)
{
if (i % 3 == 0)
Console.Write("Fizz");
if (i % 5 == 0)
Console.Write("Buzz");
if (i % 3 != 0 && i % 5 != 0)
Console.Write(i);

Console.WriteLine();
}
Console.ReadKey();
}
}
}

zchpit pisze...
Ten komentarz został usunięty przez autora.
Anonimowy pisze...

Lua Rulz

for i=1,100,1 do
if math.mod(i,3) == 0 then print('Fizz') end
if math.mod(i,5) == 0 then print('Buzz') end
if math.mod(i,3) ~= 0 and math.mod(i,5) ~= 0 then print(''..i..'') end
print(' \n')
end

Anonimowy pisze...

for (int i = 1; i <= 100; i++)
{
Console.WriteLine(((i % 3) == 0) ? ((i % 5) == 0) ? "FizzBuzz" : "Fizz" : ((i % 5) == 0) ? "Buzz" : i.ToString());
}

Anonimowy pisze...

Rozwiązanie w Java:

for (int i=1; i<101; i++) {
if (i%3 == 0){
System.out.println("Fizz");
}
else if (i%5 == 0) {
System.out.println("Buzz");
}
else if (i%3 == 0 && i%5 == 0) {
System.out.println("FizzBuzz");
}
else if (i%3 != 0 && i%5 != 0) {
String wynik2 = Integer.toString(i);
System.out.println(i);
}

Anonimowy pisze...

Wróć!!!!!!!!!!!!

Poprawiam. Kłania się iloczyn logiczny:

int iloczyn = 5 * 3;

for (int i=1; i<101; i++) {
if (i%3 == 0){
System.out.println("Fizz");
}
else if (i%5 == 0) {
System.out.println("Buzz");
}
else if (i%iloczyn == 0) {
System.out.println("FizzBuzz");
}
else if (i%3 != 0 && i%5 != 0 && i%iloczyn != 0) {
Integer.toString(i);
System.out.println(i);
}

Anonimowy pisze...

Wiecie co załamuje mnie to wszystko. Co wy chcecie się pochwalić, że pętlę umiecie napisać, czy co. Szanujący się programista nawet nie pisze tutaj takiego kodu, bo jest on tak prosty, że nie ma potrzeby prezentacji za jego pomocą swoich umiejętności.

A co do wstępu, to zgadzam się, że czasami naprawdę trudno o kogoś, kto skończył studia powiązane z programowaniem i jeszcze umie programować...Znam osobiście programistę, który cztery lata programuje w c# w firmie, tymczasem nie potrafi używać delegatów, czy metod anonimowych... I co z takim począć... :p

Anonimowy pisze...

Programuję głównie w php i trochę w javie od jakichś 5 lat i nie pamiętam żeby kiedykolwiek było mi potrzebne modulo :P

Anonimowy pisze...

Właśnie, nie ma się czym chwalić.
Odnośnie pythona to ładniej wygląda ta pętla z wykrzystaniem lambdy ;)

is3=lambda x: (x%3==0 and "Fizz") or ""
is5=lambda x: (x%5==0 and "Buzz") or ""
for i in range(1,101):
toPrint=is3(i) + is5(i)
print toPrint or i

Anonimowy pisze...

void fizzbizz()
{
int i=0;
for(i = 1; i<101; i++)
{

if((i%3)==0)
{
if((i%5)==0) //jezeli jest rowniesz 5 to do dziela
{
cout<<"Fizz Bizz\n"<<i<<endl;
continue;
}

cout<<"Fizz"<<i<<endl;
continue;


}
if((i%5)==0)
{
cout<<"Buz "<<i<<endl;
continue;
}
cout<<i<<endl;
}
}

a co mozna powiedziec o tym?

ts pisze...

Do poprzednika: Można powiedzieć że nie działa.

Czytając artykuł (najpierw w oryginale) miałem wrażenie że autor robi sobie niesmaczny żart, ale po ilości błędnych przykładów jakie tutaj się pojawiły widzę że to jednak brutalna prawda.

Dodatkowo dlaczego do tak prostego zadania stosować skomplikowaną operację modulo, naprawdę jestem zawiedziony i jeszcze niektórzy się przyznają że pracują jako programiści.

Poniżej wersja z samym dodawaniem:

int main()
{
for(int i=1, fizz=1, buzz=1 ; i<=100 ; ++i)
{
if( ++fizz > 3 )
{
std::cout << "Fizz";
fizz = 1;
}

if( ++buzz > 5 )
{
std::cout << "Buzz";
buzz = 1;
}

if( fizz > 1 && buzz > 1 )
std::cout << i;

std::cout << std::endl;
}
}

Anonimowy pisze...

to ja w scali, bo chyba jeszcze nikt nie podal rozwiazania:
object zadanko{

def main(args: Array[String]){
for(i <- 1 to 100){
if(i%3==0 && i%5==0)println("FizzBuzz")
else if(i%3==0) println("Fizz")
else if(i%5==0) println("Buzz")
else println(i)
}
}
}

Sebastian Wąsik pisze...

C#
int i = 1;
while(i <= 100)
{

if (((i % 5) == 0) && ((i % 3) == 0))
{
Console.WriteLine("FizzBuzz");
}
else
{
if ((i % 3) == 0)
{
Console.WriteLine("Fizz");
}
if ((i % 5) == 0)
{
Console.WriteLine("Buzz");
}
}
i++;
}

Planista pisze...

Prawda jest taka, że poziom kształcenia studiów wyższych jest może i wysoki ale w ogóle nie przystosowany do aktualnego rynku pracy. 3/4 studiów to teoria, gdzie proporcje powinny być odwrócone na korzyść praktyki! Zanim poszedłem na studia miałem zupełnie inne wyobrażenie. Wydawało mi się, że właśnie kończąc studia będzie się miało fach w ręku - to podstawa! Niestety okazało się inaczej.

Co do zadania to myślę, że punkt widzenia zawsze zależy od punktu siedzenia. Zadanie faktycznie jest proste ale trzeba wziąć pod uwagę stres, zaskoczenie, brak praktyki. Osobiście nie jestem programistą ale z ciekawości spróbowałem i zajęło mi to co prawda ok godziny ale proszę (C#):

for (int i = 1; i <= 100; i = i + 1)
{
if ((i % 3 == 0) && (i % 5 == 0))
Console.WriteLine("FizzBuzz");
else
if (i % 3 == 0)
Console.WriteLine("Fizz");
else
if (i % 5 == 0) Console.WriteLine("Buzz");
else Console.WriteLine(i);
}
Console.Read();

Anonimowy pisze...

9 stycznia 2010 12:00 :

Do życia printfa tez trzeba biblioteki, tyle że jest dołączana niejawnie. A strumienie mogą być tak szybkie jak printf, była taka "sztuczka" z wylaczaniem synchronizowania czy cos takiego, opisane na forum spoj.pl

piotrGTX pisze...

#include
#include

int main()
{
for (float i = 1; i <= 100; i++)
{
if ((round(i/3)) == (i/3) && (round(i/5)) == (i/5))
{
std::cout << "FizzBuzz" << std::endl;
}
else if (round(i/3)==(i/3))
{
std::cout << "Fizz" << std::endl;
}
else if (round(i/5)==(i/5))
{
std::cout << "Buzz" << std::endl;
}
else
{
std::cout << i << std::endl;
}
}
}

C++ uczę się sam od kilku tygodni nie sprawiło mi to żadnego problemu.

Anonimowy pisze...

dla C# zapisal bym tak

for (byte no = 1; no <= 100; no++) {
if (no % 3 == 0)
Console.WriteLine(no % 5 == 0 ? "FizzBuzz" : "Fizz");
else if (no % 5 == 0)
Console.WriteLine("Buzz");
else
Console.WriteLine(no);
}

Zdzichu Walesa pisze...
Ten komentarz został usunięty przez autora.
Zdzichu Walesa pisze...

Obzapomniałem że ten kod miał jeszcze numerek wypisywać jak nie ma "Fizz || Buzz" xd

Javascript (aka UnityScript)

function Start (){
for (i = 0; i <= 100; i++){
if (i%3 == 0){Fizz = "Fizz";} else{Fizz = "";}
if (i%5 == 0){Buzz = "Buzz";} else{Buzz = "";}
if (Fizz !== "" || Buzz !== ""){print (Fizz+Buzz);}else{print (i);}}}

Anonimowy pisze...

nie żebym się czepiał ale nikt z was tego poprawnie nie napisał bo wielokrotnością liczby 3 wcale nie jest liczba 3 (tak jak w wiekszości przykładów 3%0). Dla 3 wielokrotność to 6, 9 itp.

kaczy pisze...

C# // działa w 100%

for (int i = 1; i <= 100; i++)
{
int c, d;
c = i % 3;
d = i % 5;


if (c == 0)
{

if (d==0)
{
Console.WriteLine("Fizz Buzz");
}

else
{

Console.WriteLine("Fizz");
}

}

else
{

if (d == 0)
{

Console.WriteLine("Buzz");
}

else
{

Console.WriteLine(i);
}

}

}

Anonimowy pisze...

Zamiast to sprawdzac wystarczy zamienic kolejnosc (mod 15 na poczatek) i zrobic else ify

Tabacca

Anonimowy pisze...

Na infie na uw pisze sie trudniejsze zadanka na czas.
Teraz wiem do czego ma to przygotowywac..

Anonimowy pisze...

int main()
{
FizzBuzz();
return 0;
}
samo sie robi :PP

Dopiero raczkuje więc pewnie obciążycie mnie za zużywanie pamięci :D
void FizzBuzz()
{
for( int i = 1; i <= 100; i++)
{
if( i%15)
{
if( i % 5)
{
if( i % 3 )
{
cout<<i<<endl;
}
else
cout<<"Fizz!\n";

}
else
cout<<"Buzz!\n";
}
else
cout<<"FizzBuzz!\n";
}
}

Anonimowy pisze...

Można też tak:

http://pastebin.com/RvPLmz2M

Kod zawiera testy jednostkowe. Ale uwaga: w funkcji FizzBuzz użyto if - elif co może być uważane za antywzorzec.

Anonimowy pisze...

static void Main(string[] args)
{
string test = string.Empty;

for (int i = 1; i <= 100; i++)
{
test = string.Empty;
if (i % 3 == 0)
test = "Fizz";
if (i % 5 == 0)
test += "Buzz";

Console.WriteLine(string.IsNullOrEmpty(test) ? i.ToString() : test);
}

Console.ReadKey();
}

Qsmiron Qsmir pisze...

C# pozdrawiam
using System;

namespace klasaon
{

class Program
{
public static void Main(string[] args)
{
for(int i=0;i<101;i++)// pętla wypisuje cyfry od 0 do 100
{
if(i % 3 == 0 && i % 5 == 0)//jeśli warunek spelniony (liczba podzielna przez 3 i 5 pisz FizzBuzz
{
Console.WriteLine("FizzBuzz");
}
else if(i % 3 == 0)//jeśli warunek spełniony (liczba podzielna przez 3 pisz fizz
{
Console.WriteLine("Fizz");
}
else if(i % 5 == 0)
{
Console.WriteLine("Buzz");
}
else
{
Console.WriteLine(i);
}
}

Console.ReadKey();
}
}
}

Jeremi Biernacki pisze...

impenetacja w python3 w jakieś 5 minut:
>>> for i in range(1, 101):
... if i%(3*5)==0:
... print("FizzBuzz")
... elif i%5 == 0:
... print("Buzz")
... elif i%3 == 0:
... print("Fizz")
... else:
... print(i)
...

Anonimowy pisze...

Hehe. Jak czytam te wszystkie komentarze, to mam wrażenie jakbym słuchał samych gimnazjalistów, którzy się wzajemnie przekrzykują mądrościami. Aby nie wyjść na gołosłownego laika również wrzucę działający kod, ale w PL/SQL Oracle, by nie wdawać się w konflikty i być choć odrobinę oryginalnym.

BEGIN
FOR nLicznik IN 1..100 LOOP
IF MOD(nLicznik, 15) = 0 THEN
Dbms_Output.put_line('FizzBuzz');
ELSIF MOD(nLicznik, 3) = 0 THEN
Dbms_Output.put_line('Fizz');
ELSIF MOD(nLicznik, 5) = 0 THEN
Dbms_Output.put_line('Buzz');
ELSE
Dbms_Output.put_line(nLicznik);
END IF;
END LOOP;
END;

Anonimowy pisze...

A to jeszcze tak w chwili nudy w pracy dorzucę zapytanie SQL dla bazy Oracle.
SELECT DECODE(MOD(ROWNUM, 15),
0,
'FizzBuzz',
DECODE(MOD(ROWNUM, 3),
0,
'Fizz',
DECODE(MOD(ROWNUM, 5), 0, 'Buzz', TO_CHAR(ROWNUM))))
FROM DUAL
CONNECT BY ROWNUM <= 100

Anonimowy pisze...

Komentarze pisane od 5 lat a nikt nie pochwialił się we wklejce w brain-fucku :P

Unknown pisze...


W napisaniu tego kodu przeszkodą może być jedynie brak umiejętności
czytania ze zrozumieniem
Jeśli przeczytamy ze zrozumieniem polecenie to pętlę z warunkami logicznymi
można dość łatwo ułożyć

Jacek Soplica pisze...

program FizzBuzz;

uses crt;

var k:byte;

begin
for k:=1 to 100 do
begin
if((k mod 3=0)and(k mod 5<>0)) then
writeln('Fizz')
else if((k mod 3<>0)and(k mod 5=0)) then
writeln('Buzz')
else if((k mod 3=0)and(k mod 5=0)) then
writeln('FizzBuzz')
else writeln(k);
delay(500);
repeat until keypressed;
end.
end.

Prześlij komentarz

Related Posts with Thumbnails