Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=53)
-   -   Почему програмисты не умеют програмировать? (http://www.flasher.ru/forum/showthread.php?t=141504)

wvxvw 28.06.2010 21:47

А вот собственно, решение на божественном языке :)

Код:

#!/usr/bin/sbcl --script
(defun fizz-buzz (i threes fives)
        (let (result)
                (when (< i 100)
                        (setq result "")
                        (when (= i threes)
                                (setq result "Fizz")
                                (setq threes (+ threes 3))
                        )
                        (when (= i fives)
                                (setq result (concatenate 'string result "Buzz"))
                                (setq fives (+ fives 5))
                        )
                        (when (equal result "")
                                (setq result i)
                        )
                        (print result)
                        (fizz-buzz (1+ i) threes fives)
                )
        )
)

(fizz-buzz 1 3 5)


Nirth 28.06.2010 22:02

Scheme или Common Lisp ))?

wvxvw 28.06.2010 22:35

CLisp :)

lowka 29.06.2010 01:10

Код AS3:

val s = (1 to 100).foldLeft(""){(xs, x) => xs + (x match{
    case a if x % 5 == 0 && x % 3 == 0 => "FizzBuzz"
    case b if x % 5 == 0 => "Buzz"
    case c if x % 3 == 0 => "Fizz"
    case _ => x.toString
  })
}

+++
это ничего не выводит. хм. :rolleyes:
тогда так
Код AS3:

(1 to 100) foreach {x => println(x match{
    case a if a % 5 == 0 && a % 3 == 0 => "FizzBuzz"
    case b if b % 5 == 0 => "Buzz"
    case c if c % 3 == 0 => "Fizz"
    case _ => x.toString
  })
}


wvxvw 29.06.2010 05:04

Scala?

Nirth 29.06.2010 18:42

Ага ))

Котяра 30.06.2010 01:11

Раз уж пошли "божественные" языки..))
Код AS3:

-module(test).
-export([fizzBuzz/0]).
 
fizzBuzz() ->
fizzBuzz(1).
 
fizzBuzz(101)->ok.
 
fizzBuzz(A)->
if
        A rem 3 == 0 && A rem 5 == 0 ->
                io:format("FizzBuzz~n", []);
        A rem 3 == 0 ->
                io:format("Fizz~n", []);
        A rem 5 == 0 ->
                io:format("Buzz~n", []);
        true ->
                io:format("~w~n", [A])
end,
fizzBuzz(A+1).
 
 
>test:fizzBuzz().

PS:Работоспособность не проверял - могут быть косяки).

Nirth 30.06.2010 02:11

Prolog
Код AS3:

shout( fizz, 3 ).
shout( buzz, 5 ).
 
fizz_buzz( Total, Total )        :- true.
fizz_buzz( Current, Total )        :-
        shout( X, Current ),
        shout( Y, Current ),
        Current is Current + 1,
        fizz_buzz( Current, Total),
        X, Y.

Правда он не выводит данные как надо, я в Прологе со строками еще толком не работал ^_^, надо будет дописать как надо.

Добавлено через 23 минуты
Кстати, старый добрый ActionScript, тоже может тянутся на Олимп:

Код AS3:

var fizzBuzz:Function = function( count:int = 0 ):void
                        {
                                var result:String = '';
                                if( !( count % 3 ) )
                                        result += "Fizz";
                                if( !( count % 5 ) )
                                        result += "Buzz";
 
                                trace( count, result );
 
                                tail( count );
                        }
 
                        var tail:Function = function( count:int ):void
                        {
                                if( ++count <= 100 )
                                        fizzBuzz( count );
                        }
 
                        fizzBuzz();

Надо выспавшись подумать, как старину Curry сюда приделать, а то Tail-Recurssion не слишком уж божественно ^_^

Котяра 30.06.2010 13:41

практически аналог эрланговского кода на AS3 :
Код AS3:

function fizzBuzz(a:int=1,b:int=100):void
{
                if (a > b) return;
 
                if (a % 3 == 0 && a % 5 == 0)
                        trace ("FizzBuzz");
                else if (a % 3 == 0)
                        trace ("Fizz");
                else if (a % 5 == 0)
                        trace ("Buzz");
                else
                        trace(a);
                fizzBuzz(a + 1,b);       
}
 
 
fizzBuzz();

только в отличии от эрланга может произойти переполнение стека рекурсий уже на
fizzBuzz(1,256);

UPD: странно..никакого переполнения не наблюдаю)))))

UPD2: таки наблюдаю на fizzBuzz(1,5552); :)
Цитата:

Error: Error #1023: Stack overflow occurred.

Nirth 30.06.2010 16:29

Ну кстати, tail рекурсией, можно сделать вызов setTimeout ^_^ и обойти переполнение стэка


Часовой пояс GMT +4, время: 19:29.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.