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

2

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
2

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
2

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
2

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

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
2

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
1

#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
1

#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
1

#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
1

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
1

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
1

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
1

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
1

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
1

Python:

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

#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
1

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
1

JAVA:

for (int i=1; i<101; i++)
    System.out.println((i%3==0 ? (i%5==0 ? "FizzBuzz" : "Fizz") : (i%5==0 ? "Buzz" : i) ));

mala przerobka na C++:

char buf[5];
for (int i=1; i<101; i++)
	cout << ((i%3==0 ? (i%5==0 ? "FizzBuzz" : "Fizz") : (i%5==0 ? "Buzz" : itoa(i, buf, 10)) )) << endl;

byc moze da rade prosciej...

link|flag
show 1 more comment
1

C#, krótko (ale nie chciałbym tego debugować ;) )

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

C# dłużej:

for ( int i = 1; i < 101; i++ )
{
   if ( i % 3 == 0 )
   {
      Console.Write("Fizz");
   }

   if ( i % 5 == 0 )
   {
      Console.Write("Buzz");
   }
   else if ( i % 3 != 0 )
   {
      Console.Write(i);
   }

   Console.WriteLine();

}

swoją drogą niezła zabawa jak się widzi tak przyrastającą liczbę wpisów :)

link|flag
1

ACTIONSCRIPT wersja jednolinijkowa

for (var i:int=1; i<101; i++) trace((i%15==0)?'FIZZBAZZ':(i%3==0)?'FIZZ':(i%5==0)?'BAZZ':i);
link|flag
1

autoit:

For $x = 1 To 100
    If Mod($x, 3) = 0 And Mod($x, 5) = 0 Then
    	ConsoleWrite("fizzbuzz" & @LF)
    ElseIf Mod($x, 5) = 0 Then
    	ConsoleWrite("buzz" & @LF)
    ElseIf Mod($x, 3) = 0  Then
    	ConsoleWrite("fizz" & @LF)
    Else
    	ConsoleWrite($x & @LF)
    EndIf
Next
link|flag
1

Brzydziej w java się nie da:

public class Main { public static void main(String[] args) { for(int i = 1; i<=100; ++i) { System.out.println( (i%3==0?"Fizz":"") + (i%5==0?"Buzz":(i%3!=0?""+i:"")) ); } } }
link|flag
1

Jak wszyscy, to wszyscy :)

C/C++

char b[4];for(int i=0;++i<101;)printf("%s\n",i%15?i%5?i%3?itoa(i,b,10):"fizz":"buzz":"fizzbuzz");

97 znaków w C/C++. Kto da mniej? :)

link|flag
show 1 more comment
1

Hej.

Aua...mnie aż zabolało:)

Chciałbym zauważyć jedną rzecz, którą chyba nie do końca zauważyli wszyscy programiści. Mianowicie, jeśli wyświetlimy Fizz, potem Buzz, to nie potrzebujemy stawiać już żadnych kolejnych ifów. Nie żebym się czepiał, ale gdybym prowadził taką rozmowę od razu zadałbym kandydatowi pytanie jak dużo if-ów potrzeba, aby rozwiązać problem...wg mnie to zadanko pokazuje kluczowe rozróżnienie między osobami, które starają się od razu optymalizować kod, a tymi, którzy piszą go po prostu, żeby działał...

pozdrawiam, neino

link|flag
show 2 more comments
1

wersja rekurencyjna w C:

#include <stdio.h>

void fizzbuzz(int start, int end)
{
    if (end < start) return;
    int fb = 0;
    if (start % 3 == 0) { printf("Fizz"); fb = 1; }
    if (start % 5 == 0) { printf("Buzz"); fb = 1; }
    if (!fb) printf("%d", start);
    printf("\n");
    fizzbuzz(start+1, end);
}

int main (int argc, char** argv)
{
    fizzbuzz(1, 100);
    return 0;
}
link|flag
1

PHP

<?php
    for($index = 1; $index <= 100; $index++)
    {
        $modulo[3] = $index % 3;
        $modulo[5] = $index % 5;

        echo ! $modulo[3] ? 'Fizz' : '';
        echo ! $modulo[5] ? 'Buzz' : '';
    }
?>
link|flag
1

PL/SQL

BEGIN
    FOR idx IN 1..100 LOOP
        IF MOD(idx, 3) = 0 THEN
            DBMS_OUTPUT.PUT('Fizz');
        END IF;

        IF MOD(idx, 5) = 0 THEN
            DBMS_OUTPUT.put('Buzz');
        END IF;

        IF MOD(idx, 3) <> 0 AND MOD(idx, 5) <> 0 THEN
            DBMS_OUTPUT.PUT_LINE(idx);
        ELSE                            
            DBMS_OUTPUT.NEW_LINE();     
        END IF;
    END LOOP;
END;
link|flag
1

Visual Basic:

For i = 1 To 100
If i Mod 3 = 0 And i Mod 5 = 0 Then
a = a & "FizzBuzz" & vbNewLine
ElseIf i Mod 3 = 0 Then
a = a & "Fizz" & vbNewLine
ElseIf i Mod 5 = 0 Then
a = a & "Buzz" & vbNewLine
Else
a = a & i & vbNewLine
End If
Next i

Gdzie a to jakiś string ;-)

link|flag
1

wersja asembler x86 (@tasm)

.model small
.stack 100h
.data
    fizz db 'Fizz', 10,13,'$'
    buzz db 'Buzz', 10,13,'$'
    fizzbuzz db 'FizzBuzz', 10,13,'$'
    n db 10,13,'$'
    cnt DB 1

.code
        MOV AX, @data
        MOV DS, AX

        MOV CX, 100

    E_LOOP:
        MOV AL, cnt
        MOV AH, 00d
        MOV BH, 3d
        DIV BH
        CMP AH, 0
        JE E_F

        MOV AL, cnt
        MOV AH, 00d
        MOV BH, 5d
        DIV BH
        CMP AH, 0
        JE E_B

        MOV AL, cnt
        MOV AH, 00d
        MOV BH, 15d
        DIV BH
        CMP AH, 0
        JE E_FB

        MOV AL, cnt
        MOV AH, 00H
        MOV BH, 100     
        DIV BH
        MOV AL, AH
        MOV AH, 00H
        MOV BH, 10
        DIV BH

        CMP AL, 0
        JE E_ONES

        ADD AL, '0'
        MOV AH,02H
        MOV DL,AL
        INT 21H     

    E_ONES:
        MOV AL, cnt
        MOV AH, 00H
        MOV BH, 100     
        DIV BH

        MOV AL, AH
        MOV AH, 00H
        MOV BH, 10
        DIV BH

        MOV AL, AH
        ADD AL, '0'
        MOV AH,02H
        MOV DL,AL
        INT 21H     

        LEA DX, n
        MOV AH,09h 
        INT 21h

    E_LOOPEND:
        INC cnt
        LOOP E_LOOP

        MOV AH, 4Ch
        INT 21h

    E_FB:
        LEA DX, fizzbuzz
        JMP E_PRINT

    E_F:
        LEA DX, fizz
        JMP E_PRINT

    E_B:
        LEA DX, buzz
        JMP E_PRINT

    E_PRINT:
        MOV AH,09h 
        INT 21h
        JMP E_LOOPEND

end
link|flag
1

Visual Basic .NET:

Module Module1

Dim nowtrying

Sub Main()
    For i As Long = 1 To 100
        nowtrying = 1
        If i Mod 3 = 0 And i Mod 5 = 0 And nowtrying = 1 Then
            Console.Write("FizzBuzz, ")
            nowtrying = 0
        End If
        If i Mod 3 = 0 And nowtrying = 1 Then
            Console.Write("Fizz, ")
            nowtrying = 0
        End If
        If i Mod 5 = 0 And nowtrying = 1 Then
            Console.Write("Buzz, ")
            nowtrying = 0
        End If
        If Not i Mod 3 = 0 And Not i Mod 5 = 0 And nowtrying = 1 Then
            Console.Write(i.ToString() + ", ")
            nowtrying = 0
        End If
    Next
    Console.ReadLine()
End Sub

End Module
link|flag

Your Answer

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