Artikkelit yllättävän hankalasta FizzBuzz-haasteesta alkavat olla jo taivasta vanhempia, mutta nostetaan Halloweenin kunniaksi CodingHorroriin linkaten kissa13 pöydälle:
Write a program that prints the numbers from 1 to 100. But for multiples of three print "Fizz" instead of the number and for the multiples of five print "Buzz". For numbers which are multiples of both three and five print "FizzBuzz".
Horroria haasteessa oli Internetin mukaan lopulta se, että osa tutkinnolla palkituista ja ohjelmoitsinnasta jo vieraantuneista tietoteknikoista olivat tämän kanssa ihan pinteessä. Kuuluu tätä Jyväskylässäkin käytetyn työhaastattelutehtävänä.
Kuis monella eri kielellä tähän löydetään ratkaisut? Valinnan varaa on. Törkkikää välillä kissakuvien selailun sijaan ratkaisuja kommenteiksi. :-) Muotoiluksi varmaan valikosta kantsii napata Preformatted, ja alkuun ainaski tieto kielestä.
Halloweenin kunniaksi myös ällöttävät ja kauhistuttavat ratkaisut ovat tervetulleita. Brainfuck, anyone?










-- FizzBuzz Haskellilla -- (C) ane 2011 <ane@iki.fi> module Main where fizzBuzzes :: [Either String Int] fizzBuzzes = map fizzBuzz [1..] where fizzBuzz x | x `rem` 3 == 0 && x `rem` 5 == 0 = Left "FizzBuzz" | x `rem` 3 == 0 = Left "Fizz" | x `rem` 5 == 0 = Left "Buzz" | otherwise = Right x printFizzBuzz :: Either String Int -> IO () printFizzBuzz fb = case fb of Left s -> putStrLn s Right x -> print x main = mapM printFizzBuzz (take 50 fizzBuzzes)ainakin gcc 4.5.2:n mielestä tämä on C:tä:
main(){int i=0;for(;i++<100;)(i%3&&i%5)?printf("%i ",i):printf("%s%s ",i%3?"":"Fizz",i%5?"":"Buzz");}
public class FizzBuzz { public static void main(String[] args){ System.out.println("1"); System.out.println("2"); System.out.println("Fizz"); System.out.println("4"); System.out.println("Buzz"); System.out.println("Fizz"); System.out.println("7"); System.out.println("8"); System.out.println("Fizz"); System.out.println("Buzz"); System.out.println("11"); System.out.println("Fizz"); System.out.println("13"); System.out.println("14"); System.out.println("FizzBuzz"); System.out.println("16"); System.out.println("17"); System.out.println("Fizz"); System.out.println("19"); System.out.println("Buzz"); System.out.println("Fizz"); System.out.println("22"); System.out.println("23"); System.out.println("Fizz"); System.out.println("Buzz"); System.out.println("26"); System.out.println("Fizz"); System.out.println("28"); System.out.println("29"); System.out.println("FizzBuzz"); System.out.println("31"); System.out.println("32"); System.out.println("Fizz"); System.out.println("34"); System.out.println("Buzz"); System.out.println("Fizz"); System.out.println("37"); System.out.println("38"); System.out.println("Fizz"); System.out.println("Buzz"); System.out.println("41"); System.out.println("Fizz"); System.out.println("43"); System.out.println("44"); System.out.println("FizzBuzz"); System.out.println("46"); System.out.println("47"); System.out.println("Fizz"); System.out.println("49"); System.out.println("Buzz"); System.out.println("Fizz"); System.out.println("52"); System.out.println("53"); System.out.println("Fizz"); System.out.println("Buzz"); System.out.println("56"); System.out.println("Fizz"); System.out.println("58"); System.out.println("59"); System.out.println("FizzBuzz"); System.out.println("61"); System.out.println("62"); System.out.println("Fizz"); System.out.println("64"); System.out.println("Buzz"); System.out.println("Fizz"); System.out.println("67"); System.out.println("68"); System.out.println("Fizz"); System.out.println("Buzz"); System.out.println("71"); System.out.println("Fizz"); System.out.println("73"); System.out.println("74"); System.out.println("FizzBuzz"); System.out.println("76"); System.out.println("77"); System.out.println("Fizz"); System.out.println("79"); System.out.println("Buzz"); System.out.println("Fizz"); System.out.println("82"); System.out.println("83"); System.out.println("Fizz"); System.out.println("Buzz"); System.out.println("86"); System.out.println("Fizz"); System.out.println("88"); System.out.println("89"); System.out.println("FizzBuzz"); System.out.println("91"); System.out.println("92"); System.out.println("Fizz"); System.out.println("94"); System.out.println("Buzz"); System.out.println("Fizz"); System.out.println("97"); System.out.println("98"); System.out.println("Fizz"); System.out.println("Buzz"); } }// C# // Ziticca class FizzBuzz { static void Main(string[] args) { for (int i = 1; i <= 100; i++) { System.Console.WriteLine(( i % 5 == 0 && i % 3 == 0 ) ? "FizzBuzz" : (i % 3 == 0) ? "Fizz" : ( i % 5 == 0) ? "Buzz" : i.ToString()); } } }CoffeeScript
C FIZZBUZZ && FORTRAN77 C CAPS LOCK IS CRUISE CONTROL FOR COOL 8-) IMPLICIT INTEGER(I,N) N=100 I=0 10 IF(MOD(I,15).EQ.0) THEN PRINT *, "FIZZBUZZ" ELSE IF(MOD(I,3).EQ.0) THEN PRINT *, "FIZZ" ELSE IF(MOD(I,5).EQ.0) THEN PRINT *, "BUZZ" ELSE PRINT *, I END IF IF(I.LT.100) THEN I=I+1 GOTO 10 END IF STOP ENDAi että, Snjoo kerkes ensin! Pistän silti oman Matlab implementaationi, joka alkaa lupaavasti vektorisaatiolla mutta sitten tuleekin for-luuppi...
C++ ja boost
Tulipas siitä ruma Python-versio näin aamukahvia nenän kautta ryystäessä.
#!/usr/bin/env python # coding: utf-8 # # FizzBuzz Python # (C) 2011 Jorer def fizzBuzz(n): for i in range(1,n+1): str = '' if i % 3 == 0: str += 'Fizz' if i % 5 == 0: str += 'Buzz' if str: print str else: print i fizzBuzz(100)Riittääks jos vaan tulostaa kahteenkymppiin asti
brainfuck tosiaan
Pikaisesti Groovylla :)
(1..100).each { println "${it % 3 ? '' : 'Fizz' + (it % 5 ? '' : 'Buzz')}" ?: it }Javascriptin voimaa
http://www.dartlang.org/
Aiemmat toteutukset Haskellilla eivät miellyttäneet koodisilmääni. Osallistun siis itse tällä:
-- Joel
Tai, jos tykkää, että olisi aito funktio johon ei ole sotkettu IO-monadia, niin tällainen:
Yet Another Haskell FizzBuzz. Veikkaan, ettei jää viimeiseksi.
module Main where import Control.Monad main = mapM_ fizzB [1..100] fizzB i = do let (f,b) = (i%3, i%5) when f $ putStr "Fizz" when b $ putStr "Buzz" unless (f||b) $ putStr . show $ i putStr "\n" i % d = i `rem` d == 0Vähemmän proseduraalinen, enemmän lonkeroita.
module Main where import Control.Applicative import Data.Monoid import Data.Maybe main = mapM_ (putStrLn.fromJust.fizzB) [1..100] fizzB i = let f p v = if p then Just v else Nothing i % d = i `rem` d == 0 in f (i%3) "Fizz" `mappend` f (i%5) "Buzz" <|> Just (show i)Aah, löytyhän tuo yks värkki jostaki. Nyt on golffailtu kirjastoilla.
module Main where import Control.Applicative import Control.Monad import Data.Monoid import Data.Maybe main = mapM_ (putStrLn.fromJust.fizzB) [1..100] fizzB i = (guard (i%3) >> Just "Fizz") `mappend` (guard (i%5) >> Just "Buzz") <|> Just (show i) i % d = i `rem` d == 0Ei kukaan käytä vuotta vanhaa kääntäjää, siispä variantti GHC 7.2:lle:
<?php
$str = 'FizzBuzz';
$int = (int)$str;
while('FizzBuzz')
{
($int==intval('1100100',2)) ? exit : $int++;
$out = ($int%3==0) ? substr($str,0,4):'';
$out.= ($int%5==0) ? substr($str,4,4):'';
echo ($out!=false) ? $out."\n":$int."\n";
}
?>
php is lotsa fun.
1.upto(100) do |i|
s = ""
s += "Fizz" if i%3==0
s += "Buzz" if i%5==0
puts i if s.empty?
puts s if !s.empty?
end
ruby
nasm
edit: luettavampi versio
Rumahan siitä tuli.
#!/bin/bash for i in `seq 1 100`; do if [ $(expr "$i" % 15) = 0 ]; then echo FizzBuzz else if [ $(expr "$i" % 3) = 0 ]; then echo Fizz else if [ $(expr "$i" % 5) = 0 ]; then echo Buzz else echo $i fi fi fi doneTällä kertaa täysin vektoroitu Matlab -kikkare! Vielä kun pääsis eroon hitaasta cell -tietotyypistä...
lol = 1:100; isfizz = rem(lol,3)==0; isbuzz = rem(lol,5)==0; isboth = isfizz & isbuzz; asd = cellstr(num2str(lol')); asd(isfizz) = cellstr('fizz'); asd(isbuzz) = cellstr('buzz'); asd(isboth) = cellstr('fizzbuzz'); disp(char(asd))Kasvatin tulostattavien määrää sadasta kymmeneentuhanteen ja pistin vähän aikoja ylös.
Aikasempi postaus (http://linkkijkl.fi/blog/fizzbuzz-horror#comment-306)
100: 0.01
1000: 0.105
10000: 1.05
100000: 10.02
Uusi postaus (http://linkkijkl.fi/blog/fizzbuzz-horror#comment-327)
100: 0.006
1000: 0.045
10000: 0.398
100000: 4.05
Oikeesti tämmönen aikavertailu ei oo järkevää koska Matlab käyttää enemmä aikaa tuohon tulostamiseen ku varsinaiseen laskemiseen.
FizzBuzz SharePoint web part, by JannuMies *** Elements.xml *** <?xml version="1.0" encoding="utf-8"?> <Elements xmlns="http://schemas.microsoft.com/sharepoint/" > <Module Name="FizzBuzz" List="113" Url="_catalogs/wp"> <File Path="FizzBuzz\FizzBuzz.webpart" Url="FizzBuzz.webpart" Type="GhostableInLibrary" > <Property Name="Group" Value="Linkki JKL" /> </File> </Module> </Elements> *** FizzBuzzUserControl.ascx.designer.cs *** //------------------------------------------------------------------------------ // <auto-generated> // This code was generated by a tool. // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // </auto-generated> //------------------------------------------------------------------------------ namespace FizBuzz.FizzBuzz { public partial class FizzBuzzUserControl { /// <summary> /// FizzBuzz control. /// </summary> /// <remarks> /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// </remarks> protected global::System.Web.UI.WebControls.Panel FizzBuzz; } } *** FizzBuzz.cs *** using System; using System.ComponentModel; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using Microsoft.SharePoint; using Microsoft.SharePoint.WebControls; namespace FizBuzz.FizzBuzz { [ToolboxItemAttribute(false)] public class FizzBuzz : WebPart { // Visual Studio might automatically update this path when you change the Visual Web Part project item. private const string _ascxPath = @"~/_CONTROLTEMPLATES/FizBuzz/FizzBuzz/FizzBuzzUserControl.ascx"; protected override void CreateChildControls() { Control control = Page.LoadControl(_ascxPath); Controls.Add(control); } } } *** FizzBuzz.webpart *** <?xml version="1.0" encoding="utf-8"?> <webParts> <webPart xmlns="http://schemas.microsoft.com/WebPart/v3"> <metaData> <type name="FizBuzz.FizzBuzz.FizzBuzz, $SharePoint.Project.AssemblyFullName$" /> <importErrorMessage>$Resources:core,ImportErrorMessage;</importErrorMessage> </metaData> <data> <properties> <property name="Title" type="string">FizzBuzz</property> <property name="Description" type="string">FizzBuzz web part</property> </properties> </data> </webPart> </webParts> *** FizzBuzzUserControl.ascx *** <%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %> <%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %> <%@ Import Namespace="Microsoft.SharePoint" %> <%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="FizzBuzzUserControl.ascx.cs" Inherits="FizBuzz.FizzBuzz.FizzBuzzUserControl" %> <asp:Panel runat="server" ID="FizzBuzz"> <%=GetFizzBuzz()%> </asp:Panel> *** FizzBuzzUserControl.ascx.cs *** using System; using System.Text; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; namespace FizBuzz.FizzBuzz { public partial class FizzBuzzUserControl : UserControl { protected void Page_Load(object sender, EventArgs e) { } public static string GetFizzBuzz() { StringBuilder sb = new StringBuilder(); for (int i = 1; i <= 100;i++ ) { sb.Append("<p>"); if(i%3 == 0) { sb.Append("Fizz"); } if(i%5== 0) { sb.Append("Buzz"); } if(i%3 != 0 && i%5 != 0) { sb.Append(i); } sb.Append("</p>"); } return sb.ToString(); } } }Fizzbuzz-tiedostojärjestelmä käyttäen 9P:tä. Linux sisältää tuen protokollalle versiosta 2.6.14 alkaen, kuvassa kuitenkin Plan 9. Käyttö omalla vastuulla.
Seuraavaksi pikainen tulkinta protokollaspeksistä:
Learn you some Erlang!
-module(fizzbuzz). -export([start/0]). show_fizzezz({ 0, 0, _ }) -> io:format("FizzBuzz~n"); show_fizzezz({ _, 0, _ }) -> io:format("Fizz~n"); show_fizzezz({ 0, _, _ }) -> io:format("Buzz~n"); show_fizzezz({ _, _, Num }) -> io:format("~w~n", [Num]). loop_numz([Num|Rest]) -> show_fizzezz({ Num rem 5, Num rem 3, Num }), loop_numz(Rest); loop_numz([]) -> done_with_thiz_shiz. start() -> loop_numz(lists:seq(1,100)).Lainaten ideaa Joelin Haskell versiosta :)
-- Esa-Matti Suuronen, Epeli@IRCnet
Funktio ja pattern match vaikutteinen Kahviratkaisu:
op = "0": -> "FizzBuzz" "0_": -> "Fizz" "_0": -> "Buzz" "__": (i) -> i [1..100].forEach (i) -> console.log op[(i % 3 and "_") + (i % 5 and "_")] i-- Esa-Matti Suuronen, Epeli@IRCnet