antylama.pl - zadajemy pytania związane z komputerami
vote up 5 vote down
star
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

73 Answers

1 2 3 next
vote up 5 vote down

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
vote up 3 vote down

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

link|flag
show 1 more comment
vote up 3 vote down

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
vote up 3 vote down

Brainfuck:

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

link|flag
show 3 more comments
vote up 2 vote down

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
vote up 2 vote down
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
vote up 2 vote down

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
vote up 2 vote down

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
vote up 2 vote down

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
vote up 2 vote down

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
vote up 2 vote down

PHP, bez średników, 74 znaki.

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

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
vote up 1 vote down

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
vote up 1 vote down

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
vote up 1 vote down

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
vote up 1 vote down

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
vote up 1 vote down

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
vote up 1 vote down

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
vote up 1 vote down

PHP:

for ($i = 1; $i <= 100; $i++)
{
    $i3 = (($i % 3) == 0);
    $i5 = (($i % 5) == 0);
    echo ($i3 && $i5) ? "FizzBuzz" : (($i3) ? "Fizz" : (($i5) ? "Buzz" : $i));
}

Lub bardziej optymalne:

for ($i = 1; $i <= 100; $i++)
{
    $echoI = true;
    if(($i % 3) == 0)
    {
        echo "Fizz";
        $echoI = false;
    }
    if(($i % 5) == 0)
    {
        echo "Buzz";
        $echoI = false;
    }
    if($echoI == true) echo $i;
}
link|flag
vote up 1 vote down

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
vote up 1 vote down

Jednolinijkowiec w php.

foreach( range(1,100) as $i ) echo $i%15 ? $i%5 ? $i%3 ? $i.PHP_EOL : 'fizz'.PHP_EOL : 'buzz'.PHP_EOL : 'fizzbuzz'.PHP_EOL;
link|flag
show 1 more comment
vote up 1 vote down

C#:

using System;

namespace FizzBuzz
{
  class Program
  {
    static void Main(string[] args)
    {
      var lookup = new string[101];

      for (int i = 3; i <= 100; i += 3)
      {
        lookup[i] = "Fizz";
      }

      for (int i = 5; i <= 100; i += 5)
      {
        lookup[i] = "Buzz";
      }

      for (int i = 15; i <= 100; i += 15)
      {
        lookup[i] = "FizzBuzz";
      }

      for (int i = 1; i <= 100; i++)
      {
        Console.WriteLine(lookup[i] ?? i.ToString());
      }
    }
  }
}
link|flag
vote up 1 vote down

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
vote up 1 vote down
#include<iostream>

using namespace std;

template<int  N> struct Print {
  Print<N>() {
    int i = N+1;
    if (i % 3 == 0) cout << "Fizz";
    if (i % 5 == 0) cout << "Buzz";
    if ((i % 3) && (i % 5)) cout << i;
    cout << endl;
    Print<N+1> p;
  }
};

template<> struct Print<100> {};

Print<0> p;

main() {}
link|flag
vote up 1 vote down

C++

#include <iostream>
using namespace std;

main()
{
 int liczba;
 for (liczba=1;liczba<=100;liczba++)
  {
     if (liczba%3==0 && liczba%5!=0) printf("Fizz\n");
     if (liczba%3!=0 && liczba%5==0) printf("Buzz\n");
     if (liczba%3==0 && liczba%5==0) printf("FizzBuzz\n");
     if (liczba%3!=0 && liczba%5!=0) printf("%d\n",liczba);
  } 
  system("PAUSE");
}
link|flag
vote up 1 vote down

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
vote up 1 vote down

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
1 2 3 next

Your Answer

Get an OpenID
or

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