Zobacz wyniki ankiety na temat zarobków programistów w Polsce. Czytaj więcej..
9

6

Jest takie oto zadanie programistyczne:

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".

Jak zakodowałbyś rozwiązanie tego "problemu" w swoim ulubionym języku programowania?

PS. Więcej na ten temat tutaj: Dlaczego programiści nie potrafią.. programować?


Zważywszy na ilość odpowiedzi, zrobił się lekki bałagan i ciężko chociażby sprawdzić czy ktoś już odpowiedział tak jak my. Stwierdziłem, że warto zrobić listę już istniejących rozwiązań. Zachęcam innych do jej uaktualniania.

(kolejność języków alfabetyczna; ilość odpowiedzi specjalnie nie podaję, żeby nikt nie spamował, bo uważa, że jego język jest najlepszy, więc musi mieć najwięcej odpowiedzi. )

  • ASM [6502]
  • ActionScript
  • AutoIt
  • Boo
  • BrainF_ck
  • C
  • C#
  • C++
  • F#
  • Google's Go
  • Groovy
  • Haskell
  • Java
  • JavaScript
  • Pascal
  • Perl
  • PHP
  • PowerShell
  • Prolog
  • Python
  • Ruby
  • SQL [T-SQL, PL/SQL]
  • Lisp [Common Lisp]
  • Lua
flag
show 1 more comment

80 Answers

1 2 3 next
7

Ruby, nieco schludniejsza wersja (połączenie dwóch wersji napisanych przez anonimów).

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

I jednolinijkowiec, skoro już się takowy pojawił ;-)

1.upto(100).each {|i| puts (i % 15).zero? ? "FizzBuzz" : (i % 5).zero? ? "Buzz" : (i % 3).zero? ? "Fizz" : i }
link|flag
6

Brainfuck:

>++++++++++[>+>+++++>++++++>+++++++>++++++++++>++++++++++++[<]>-]>>-.<+++.---.>+.<+++.---.>>>.>+++++.>++..<<<<<+++.---.>++.<+++.---.>>>----.>>-----.+++++..<<<<<+++.---.>>>++++.>.>..<<<<<+++.---.>+++.<+++.---.>>----.<<+++.---.>>>.>.>..<<<<<+++.---.>>>----.>>-----.+++++..<<<<<+++.---.>------..<+++.---.>>>++++.>.>..<<<<<+++.---.>.++.<+++.---.>--.+++.<+++.---.>>>.>.>..<<----.>>-----.+++++..<<<<<+++.---.>---.+++++.<+++.---.>-----.++++++.<+++.---.>>>++++.>.>..<<<<<+++.---.>------.>+.<<+++.---.>>>----.>>-----.+++++..<<<<<+++.---.>>>++++.>.>..<<<<<+++.---.>+..<+++.---.>.+.<+++.---.>>>.>.>..<<<<<+++.---.>>>----.>>-----.+++++..<<<<<+++.---.>-.++++.<+++.---.>>>++++.>.>..<<<<<+++.---.>----.>-.<<+++.---.>.>+.<<+++.---.>>>.>.>..<<----.>>-----.+++++..<<<<<+++.---.>+.--.<+++.---.>++.-.<+++.---.>>>++++.>.>..<<<<<+++.---.>+.+.<+++.---.>>>----.>>-----.+++++..<<<<<+++.---.>>>++++.>.>..<<<<<+++.---.>-.++++.<+++.---.>----.>-.<<+++.---.>>>.>.>..<<<<<+++.---.>>>----.>>-----.+++++..<<<<<+++.---.>+.---.<+++.---.>>>++++.>.>..<<<<<+++.---.>+++.-.<+++.---.>+..<+++.---.>>>.>.>..<<----.>>-----.+++++..<<<<<+++.---.>.++.<+++.---.>--.+++.<+++.---.>>>++++.>.>..<<<<<+++.---.>---.>+.<<+++.---.>>>----.>>-----.+++++..<<<<<+++.---.>>>++++.>.>..<<<<<+++.---.>+.---.<+++.---.>+++.--.<+++.---.>>>.>.>..<<<<<+++.---.>>>----.>>-----.+++++..<<<<<+++.---.>++.+.<+++.---.>>>++++.>.>..<<<<<+++.---.>-.>-.<<+++.---.>.>+.<<+++.---.>>>.>.>..<<----.>>-----.+++++..<<<<<+++.---.>+.-----.<+++.---.>+++++.----.<+++.---.>>>++++.>.>..<<<<<+++.---.>++++.--.<+++.---.>>>----.>>-----.+++++..<<<<<+++.---.>>>++++.>.>..<<<<<+++.---.>++.+.<+++.---.>-.>-.<<+++.---.>>>.>.>..<<<<<+++.---.>>>----.>>-----.+++++..<<<<<+++.---.>+.------.<+++.---.>>>++++.>.>..<<<<<+++.---.>++++++.----.<+++.---.>++++.---.<+++.---.>>>.>.>..<<----.>>-----.+++++..<<<<<+++.---.>+++.-.<+++.---.>+..<+++.---.>>>++++.>.>..<<<<<+++.---.>.>+.<<+++.---.>>>----.>>-----.+++++..<<<<<+++.---.>>>++++.>.>..<<<<<+++.---.>>-.<-----.<+++.---.>>.<+.<+++.---.>>>.>.>..<<<<<+++.---.>>>----.>>-----.+++++..<<<<<+++.---.>>.<+++.<+++.---.>>>++++.>.>..<<<<<+++.---.>>..<<+++.---.>>.+.<<+++.---.>>>.>.>..<<----.>>-----.+++++..<<<<<+++.---.>>.<-----.<+++.---.>>.<+.<+++.---.>>>++++.>.>..<<<<<+++.---.>>.<++.<+++.---.>>>----.>>-----.+++++..<<<<<+++.---.>>>++++.>.>..<<<<<+++.---.>>.<+++.<+++.---.>>.-.<<+++.---.>>>.>.>..<<<<<+++.---.>>>----.>>-----.+++++..

link|flag
show 3 more comments
3

A nie warto czasem zauwazyc ze wielokrotnosc 3 i 5 to inaczej wielokrotnosć 15 ?;>

link|flag
show 1 more comment
3

PowerShell:

for ($i = 1; $i -le 100; $i++)
{
    if ($i % 15 -eq 0) { Write-Output "FizzBuzz"; }
    elseif ($i % 3 -eq 0) { Write-Output "Fizz"; }
    elseif ($i % 5 -eq 0) { Write-Output "Buzz"; }
    else { Write-Output $i; }
}
link|flag
3

Odrobinę zoptymalizowany kod (zużycie pamięci RAM spadło z dziesięciu do sześciu bajtów; spadła ilość skoków do subroutines) dla mikroprocesora 6502:

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

Wpadło mi do głowy jeszcze inne rozwiązanie problemu, może później napiszę.

link|flag
show 2 more comments
3

print '\n'.join([(i%15==0 and 'FizzBuzz')or(i%5==0 and 'Buzz')or(i%3==0 and 'Fiz')or str(i) for i in range(1,101)])
link|flag
3

C#

// z pomoca "andrzejp - C#, krótko (ale nie chciałbym tego debugować ;) ) "
// using Rx;
Enumerable
 .Range(1,100)
 .Select(i => i % 3 == 0 ? ( i % 5 == 0 ? "FizzBuzz" : "Fizz" ) : ( i % 5 == 0 ? "Buzz" : i.ToString()))
 .Run(Console.WriteLine);
link|flag
show 1 more comment
3

Common Lisp:

;definicja funkcji
(defun fizz-buzz ()
  (loop
   for i from 1 to 100 do
   (when (= (mod i 3) 0) (format t "Fizz"))
   (when (= (mod i 5) 0) (format t "Buzz"))
   (when (not (or (= 0 (mod i 3)) (= 0 (mod i 5))))
     (format t "~D" i))
   (format t "~%")))

;uruchomienie
(fizz-buzz)

EDIT 10.01.2010 Zamiast skracania kodu proponuję wersję bez jawnej iteracji ;)

C++:

#include <iostream>

void fizz_buzz_tail(int arg)
{
    if(arg > 100)
    {
    	return;
    }
    else if((arg % 15) == 0)
    {
    	std::cout << "FizzBuzz" << std::endl;
    }
    else if((arg % 3) == 0)
    {
    	std::cout << "Fizz" << std::endl;
    }
    else if((arg % 5) == 0)
    {
    	std::cout << "Buzz" << std::endl;
    }
    else
    {
    	std::cout << arg << std::endl;
    }

    fizz_buzz_tail(arg+1);
}

int main()
{
    fizz_buzz_tail(1);
    return 0;
}

Common Lisp:

(defun fizz-buzz-tail (i)
  (cond ((> i 100) (return-from fizz-buzz-tail))
         ((zerop (mod i 15)) (format t "FizzBuzz~%"))
         ((zerop (mod i 3)) (format t "Fizz~%"))
         ((zerop (mod i 5)) (format t "Buzz~%"))
         (t (format t "~D~%" i)))
  (fizz-buzz-tail (1+ i)))

(fizz-buzz-tail 1)

Oba programy działają w oparciu o rekurencję ogonową, więc wykonują się tak jak iteracja :).

link|flag
3

Boo:

for i in range(1, 101):
    if i % 15 == 0:
        print "FizzBuzz"
    elif i % 3 == 0:
        print "Fizz"
    elif i % 5 == 0:
        print "Buzz"
    else:
        print i
link|flag
3

Go:

package main

import "fmt"

func main(){
        for i:=1; i<=100; i++{
                if(i%15 == 0){  
                        fmt.Printf("FizzBuzz");
                }else if (i%3 == 0){
                        fmt.Printf("Fizz");
                }else if (i%5 == 0){
                        fmt.Printf("Buzz");
                }else{
                        fmt.Printf("%d", i);
                }       
        }
}
link|flag
3

Lua:

for x = 1, 100 do

    if x % 15 == 0 then
    	print("FizzBuzz")
    elseif x % 3 == 0 then
    	print("Fizz")
    elseif x % 5 == 0 then
    	print("Buzz")
    else
    	print(x)
    end

end
link|flag
3

Smalltalk:

| x  num |
x := 1.
100 timesRepeat: [
  num := true.
  (x \\ 3 = 0) ifTrue: [num := false. Transcript show: 'Fizz'].
  (x \\ 5 = 0) ifTrue: [num := false. Transcript show: 'Buzz'].
  (num) ifTrue: [Transcript show: x].
  Transcript cr.
  x := x + 1.
].
link|flag
3

LEFT 90
MOVE 145
RIGHT 90
MOVE 145
RIGHT 90
LET F 3
LET B 5
LET I 1
LET N 0
LET D 0
LET E 0
LET Z 0
REPEAT 100
 LET N 2
COLOR GREEN
IF F = I
 IF B = I
 COLOR RED
 LET C 2
 ELSE
 LET C 7
 ENDIF
ENDIF
IF F = I 
 PRINT FIZ
 MOVE 40
 LET F F+3
 LET N 1
ENDIF
COLOR BLUE
COLOR C
IF B = I
 PRINT BUZ
 MOVE 50
 LET B B+5
 LET N 1
ENDIF
IF N = 2
 COLOR BLACK
 PRINTVAR I
 MOVE 30
 ENDIF
LET E E + 1
IF E = 6
HOME
LEFT 90
MOVE 145
RIGHT 90
MOVE 145
RIGHT 180
LET D D+17
MOVE D
LEFT 90
LET E 0
ENDIF
LET I I+1
NEXT
END
link|flag
3

PHP

print eval(unserialize(gzuncompress(base64_decode('eNp9jFELgjAURv/Kx8XEIZSrfHGuhx76H3NNHAWCU4KF/71WQougt3u45zuu2u55RW0/IEus5AKJrSUvinDkOcPd3eyou/B9glbOIAuw2kFKFAxp+sJyQVbB6K4Hnaz3x8l7whpUN8OBBJrBqIvAu/JpxJN/evmtx3VsosHZtGq6jouX2J/kPJN4AKArQs8='))));

:D

link|flag
3

fizz.erl :

-module(fizz).
-export([buzz/1]).
buzz(A)->
    if
     ((101-A) rem 15) == 0 ->
            io:format("FizzBuzz~n",[]);
     ((101-A) rem 5) == 0 ->
            io:format("Buzz~n",[]);
     ((101-A) rem 3) == 0 ->
            io:format("Fizz~n",[]);
     true ->
            io:format("~w~n",[101-A])
    end,
    if
     (101-A) < 100 ->
            fizz:buzz(A-1);
     true ->
            io:format("~n",[])
    end.

I w konsoli Erlanga:

c(fizz).
fizz:buzz(100).
link|flag
3

python

for i in range(1, 101):
    if not i % 3:
        if not i % 5:
            print "FizzBuzz"
        else:
            print "Fizz"
    elif not i % 5:
        print "Buzz"
    else:
        print i
link|flag
3

Trochę inne rozwiązanie w c:

#include <stdio.h>

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

int main()
{
    fizzbuzz();
    return 0;
}
link|flag
3

Trochę inne podejście do Powershella:

(1..100) | select @{n="n";e={$_ -as [string]}}, `
              @{n="w3";e={ "{0}" -f (($_ % 3) -as [string]).Replace("0","Fizz")}},`
              @{n="w5";e={ "{0}" -f (($_ % 5) -as [string]).Replace("0","Buzz")}} `
         | select @{n="n";e={$_.n}}, `
              @{n="w3";e={ "{0}" -f [Regex]::Replace($_.w3, "\d", [String]::Empty)}},`
              @{n="w5";e={ "{0}" -f [Regex]::Replace($_.w5, "\d", [String]::Empty)}} `
         | select @{n="n";e={$_.n}},@{n="w";e={$_.w3+$_.w5}} `
         |% { if ( $_.n -gt $_.w ) { $_.n } else { $_.w } }
link|flag
3

PHP, bez średników, 74 znaki.

foreach(range(1,100)as$i){if(print((($i%3)?(($i%5)?$i:'buzz'):'fizz'))){}}
link|flag
3

#!/usr/bin/perl
map{print$_ if$_%5and$_%3;print"fizz"unless$_%3;print"buzz"unless$_%5;print"\n"}(1..100)
link|flag
3

Mozart Oz ;)

{For 1 100 1
 proc{$ X}
    if X mod 15 == 0 then {Browse 'FizzBuzz'}
    elseif X mod 3 == 0 then {Browse 'Fizz'}
    elseif X mod 5 == 0 then {Browse 'Buzz'}
    else {Browse X}
    end
 end}
link|flag
3

C#:

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

Zaletą kodu jest to, że w każdym wypadku wykonujemy dokładnie dwa dzielenia modulo. Duża część programów powyżej dla przypadku, kiedy i nie jest podzielne ani przez 3, ani przez 5, wykonuje aż 3 dzielenia! Pamiętajmy, że dzielenie jest jedną z kosztowniejszych obliczeniowo operacji - w każdej architekturze :)

link|flag
2

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int i=1;
  while(i<=100)
  {
          if(i%3==0) printf("\nFizz");
          if((i%3!=0)&&(i%5==0)) printf("\n");
          if(i%5==0) printf("Buzz");
          if((i%3!=0)&&(i%5!=0)) printf("\n%d",i);
          i++;
  }
  system("PAUSE");  
  return 0;
}
link|flag
show 1 more comment
2

#include<cstdio>

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

#include <stdio.h>

int main()
{
    int i;
    for (i = 1; i <= 100; ++i)
    {
        if (i % 15 == 0)
            puts("FizzBuzz");
        else if (i % 3 == 0)
            puts("Fizz");
        else if (i % 5 == 0)
            puts("Buzz");
        else
            printf("%d\n", i);
    }
}
link|flag
2

Prolog:

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))).
link|flag
show 4 more comments
2

F#:

let decide x =
    if x % 15 = 0 then "FizzBuzz"
    elif x % 3 = 0 then "Fizz"
    elif x % 5 = 0 then "Buzz"
    else x.ToString()

ignore [ for i in 1..100 -> printfn "%s" (decide i) ]
link|flag
show 1 more comment
2

C#

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

namespace FizzBuzz
{
    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.Write("\n");
            }
        }
    }
}
link|flag
2

Ruby (

i=1  
100.times do |i|    
if i%15==0
	puts "FizzBuzz"
elsif i%5==0
	puts "Buzz"
elsif i%3==0
	puts "Fizz"
else
	puts i
end  

i=i+1
end
link|flag
2

Pascal:

program fizzbuzz;
uses crt;
var a,i:integer;
begin
clrscr;
for i:=1 to 100 do
 begin
  if i mod 3 = 0 then write('Fizz ');
  if i mod 5 = 0 then write('Buzz ');
  if (i mod 3 = 0) and (i mod 5 = 0) then writeln('FizzBuzz ');
  if (i mod 3 <> 0) and (i mod 5 <> 0) and ((i mod 3 <> 0) and (i mod 5 <> 0)) then write(i,' ');
  delay(100);
 end;
repeat until keypressed;
end.
link|flag
1 2 3 next

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.