FizzBuzz

Пока у меня в черновиках и замыслах варятся мега важные мега статьи, которые неприменно выйдут через N дней, или N недель, или еще когда-нибудь, я тут развлекусь пустяком.

Предистория: какое-то время назад мне попалась на глаза статья о том, что сильно дофига людей, приходящих на собеседование, попросту не умеют программировать. Даже не могут реализовать элементарную задачу:

Напишите программу, которая выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем, программа должна выводить слово "Fizz", а вместо чисел, кратных пяти — слово "Buzz". Если число кратно и 3, и 5, то программа должна выводить слово "FizzBuzz".

Вот та статья в переводе http://habrahabr.ru/blogs/htranslations/111843/.

Это меня позабавило, но я особо не поверил.

Сегодня та же история попалась мне на глаза еще раз http://habrahabr.ru/blogs/htranslations/112561/. И я подумал, неужто это правда? Спросил у народа, говорят, что правда. Действительно многие на собеседовании не могут написать FizzBuzz.

Ну что ж, методика полезная. Теперь на собеседованиях буду давать эту задачу, или аналогичные по сложности.

Однако эта штука еще полезна при знакомстве с новыми языками программирования. Вместо тупого "Hello World" можно сразу пробовать писать FizzBuzz. Это интереснее :)

Ну и вот FizzBuzz на некоторых экзотических языках, с которыми я более-менее знаком (ну не писать же его на ActionScript или Java, это мне как-то даже и не к лицу :)

Erlang


-module(fizzbuzz).

-export([start/0]).

start() ->
  lists:reverse(loop(1, [])).

loop(100, Acc) -> Acc;

loop(N, Acc) ->
  Res = case N of
    NN when (NN rem 3 =:= 0) and (NN rem 5 =:= 0) -> "FizzBuzz";
    NN when (NN rem 3 =:= 0) -> "Fizz";
    NN when (NN rem 5 =:= 0) -> "Buzz";
    NN -> NN
  end,
  loop(N + 1, [Res|Acc]).

запускаем:

Eshell V5.7.5  (abort with ^G)
1> c(fizzbuzz).
{ok,fizzbuzz}
2> io:format("~p~n", [fizzbuzz:start()]).
[1,2,"Fizz",4,"Buzz","Fizz",7,8,"Fizz","Buzz",11,"Fizz",13,14,"FizzBuzz",16,
 17,"Fizz",19,"Buzz","Fizz",22,23,"Fizz","Buzz",26,"Fizz",28,29,"FizzBuzz",31,
 32,"Fizz",34,"Buzz","Fizz",37,38,"Fizz","Buzz",41,"Fizz",43,44,"FizzBuzz",46,
 47,"Fizz",49,"Buzz","Fizz",52,53,"Fizz","Buzz",56,"Fizz",58,59,"FizzBuzz",61,
 62,"Fizz",64,"Buzz","Fizz",67,68,"Fizz","Buzz",71,"Fizz",73,74,"FizzBuzz",76,
 77,"Fizz",79,"Buzz","Fizz",82,83,"Fizz","Buzz",86,"Fizz",88,89,"FizzBuzz",91,
 92,"Fizz",94,"Buzz","Fizz",97,98,"Fizz"]
ok
3> 

Bash


#!/bin/bash

for i in {1..100}
do
  item=""
  rem3=$(($i % 3))
  rem5=$(($i % 5))
  if [ $rem3 -eq 0 ]; then 
    item="Fizz"
    if [ $rem5 -eq 0 ]; then 
      item="FizzBuzz" 
    fi  
  elif [ $rem5 -eq 0 ]; then 
    item="Buzz" 
  else
    item=$i
  fi  
  echo $item
done

Scala, примитивный вариант


#!/bin/sh
exec scala "$0" "$@"
!#

object FizzBuzz 
{
  def main(args: Array[String]) 
  {
    for(i <- (0 to 100).toList)
    {   
      var res = ""
      if(i % 3 == 0) res = "Fizz"
      if(i % 5 == 0) res = res + "Buzz"
      if(res == "") res = i.toString
      println(res)
    }   
  }
}

FizzBuzz.main(args)

Scala, вариант с pattern matching


#!/bin/sh
exec scala "$0" "$@"
!#

object FizzBuzz 
{
  def main(args: Array[String]) 
  {
    var res = for(i <- (1 to 100).toList) yield eval(i)
    println(res)
  }

  def eval(i : Int) : String = 
    i match 
    {   
      case n:Int if (n % 3 == 0) && (n % 5 == 0) => "FizzBuzz"
      case n:Int if (n % 3 == 0) => "Fizz"
      case n:Int if (n % 5 == 0) => "Buzz"
      case n:Int => n.toString
    }   
}

FizzBuzz.main(args)

Ну вот, 15 минут веселья. Заодно вспомнил, что там к чему в Scala. А то уже все как-то подзабылось :)

Add new comment

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.
CAPTCHA
question for bots )
Image CAPTCHA
Enter the characters shown in the image.