Myślisz, że zarabiasz tyle, na ile zasługujesz? Zapraszamy do wzięcia udziału w anonimowej ankiecie.
8

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

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

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

PHP, bez średników, 74 znaki.

foreach(range(1,100)as$i){if(print((($i%3)?(($i%5)?$i:'buzz'):'fizz'))){}}
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
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
2

JAVA:

public class Main {

public static void main(String[] args) {

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

#diwi pętla powinna być od 1.

link|flag
2

Haskell:

fizzbuzz = mapM_ fb [1..100]
  where
   fb n 
      | n `mod` 15 == 0 = putStrLn "FizzBuzz" 
      | n `mod` 3 == 0 = putStrLn "Fizz"
      | n `mod` 5 == 0 = putStrLn "Buzz"
      | otherwise = putStrLn $ show n
link|flag
2

tsql

;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
link|flag
2

Groovy:

for( i in 1..100 ) 
{ 
    if(i%3==0) print "Fizz"
    if(i%5==0) print "Buzz"
    if((i%3!=0)&&(i%5!=0)) print i
    println ""
}
link|flag
2

Python 3

for x in range(1, 101):
    result = ''
    if x % 3 == 0:
        result += "Fizz"
    if x % 5 == 0:
        result += "Buzz"
    print(result or x)

Prolog (bez odcięć i negacji)

fizzbuzz(N, N).
fizzbuzz(I, N) :- I < N,
           R3 is I rem 3, R5 is I rem 5,
           fizzbuzz_match(R3, R5, I, K),
           write(K), nl,
           J is I+1, fizzbuzz(J, N).

% match(reszta_z_div_3, reszta_z_div_5, liczba, napis) 
fizzbuzz_match(0,   0, _, 'FizzBuzz').
fizzbuzz_match(0,  R5, _, 'Fizz') :- R5 \= 0.
fizzbuzz_match(R3,  0, _, 'Buzz') :- R3 \= 0.
fizzbuzz_match(R3, R5, N, N) :- R3 \= 0, R5 \= 0.

:- fizzbuzz(1, 101).
link|flag
2

Pojawiły się tutaj pseudo jedno linijkowce, ale co to za linijkowce z użyciem operatora "?", to niby jest w jednej linijce, ale nie w jednym działaniu.

Przedstawiam wam prawdziwego złożonego jedno działaniowca w C++

enter code here
for(int i = 1; i <= 100; ((!((i%3==0) || (i%5==0)) && printf("%d",i)) || (((i%3==0) || (i%5==0)) && ((((i%3==0) && printf("Fizz")) && 0) || ((i%5==0) && printf("Buzz")))) || 1) && (printf("\n") && i++))
{
}
link|flag
show 1 more comment
2

js

for (var i=1;i<=100;++i) {document.writeln(i%15 ? i%5 ? i%3 ? i : 'Fizz' : 'Buzz' :'FizzBuzz' )};
link|flag
show 1 more comment
2

#!/usr/bin/perl
for ($i=0;$i<=100;$i++) {
   if (($i % 15) == 0) {
      print "FizzBuzz\n";
   } elsif (($i % 5) == 0) {
      print "Buzz\n";
   } elsif (($i % 3) == 0) {
      print "Fizz\n";
   } else {
      print "$i\n";
   }
}
link|flag
2

PLSQL

SELECT CASE
         WHEN MOD(LEVEL, 15) = 0 THEN
          'FIZZBUZZ'
         WHEN MOD(LEVEL, 3) = 0 THEN
          'FIZZ'
         WHEN MOD(LEVEL, 5) = 0 THEN
          'BUZZ'       
       END
  FROM dual
CONNECT BY LEVEL < 101;
link|flag
2

ACTIONSCRIPT

for (var i:int=1; i<101; i++){
if (i%3==0 && i%5==0) trace("FIZZBAZZ");
else{
	if (i%3==0) trace("FIZZ");
	else 
		if (i%5==0) trace("BAZZ");
		else trace(i);
    }

}

link|flag
2

Bardziej Groovy:

(1..100).each { 
    println "${it%3?'':'Fizz'}${it%5?'':'Buzz'}" ?: it
}
link|flag
show 1 more comment
2

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
2

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
2

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
2

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
2

PHP

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

:D

link|flag
1 2 3 next

Your Answer

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