Форум 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 26.06.2010 19:04

Почему програмисты не умеют програмировать?
 
http://www.codinghorror.com/blog/200...s-program.html

Понравилась статья. Если чесно, я с ходу не понял, в чем фишка, но когда понял, вобщем, у нас появилось два варианта:

Код AS3:

private function runFizzBuzz():void
{
        var result:String;
        var threes:int = 3;
        var fives:int = 5;
 
        for (var i:int = 1; i <= 100; i++)
        {
                result = "";
                if (i == threes)
                {
                        result = "Fizz";
                        threes += 3;
                }
                if (i == fives)
                {
                        result += "Buzz";
                        fives += 5;
                }
                if (!result) result = i.toString();
                trace(result, i);
        }
}

Код AS3:

function runFizzBuzz():void
{
        var result:String;       
        for (var i:int = 1; i <= 100; i++)
        {
                result = "";
                if (!(i % 3)) result += "Fizz";
                if (!(i % 5)) result += "Buzz";
                if (!result) result = i.toString();
                trace(result, i);
        }
}

Ваши мысли по поводу, альтернативы? :)

E-mail 26.06.2010 21:09

Аналогично второму сделал
Кстати, а в чём фишка?

koIIImarik 26.06.2010 21:38

Бегло прочитал статью, если честно, не очень понятно, как связаны 2 участка кода с указанной статьёй. На сколько я понял, там просто рассказывалось о том, что многие программисты, которые пытаются устроиться на работу не в состоянии написать простую программу.

Что касается 2-х участков кода, которые вы представили: я против записей блоков if/while/for/case с участками кода, которые выполняются после них, в одну строку, например так:

Код AS3:

if (!(i % 3)) result += "Fizz";

Поэтому, не могу сказать, что «альтернатива» гораздо лучше 1-го участка кода, хотя выглядит компактнее, согласен.

CrazyFlasher 26.06.2010 22:03

Цитата:

которые выполняются после них, в одну строку, например так
поддерживаю...хотя иногда сам этим грешу :)

udaaff 26.06.2010 22:21

Цитата:

Сообщение от wvxvw (Сообщение 918258)
Ваши мысли по поводу, альтернативы? :)

Число итераций можно примерно в два раза сократить :)

wvxvw 26.06.2010 22:23

Я всегда пишу так, и мне так больше нравится, но суть не в этом.
В самом начале статьи было написано, что большинство програмистов не способны решить примитивную задачу, и как раз эта задача решается в этом банальном на первый взгляд коде :)
Кстати, по производительности первый вариант лучше второго т.как инкремент быстрее модуло, да и при этом инкремент происходит не каждую итерацию. Но фишка не в этом, а в том, что прочитав условие задачи появляется желание найти вариант где бы использовались только два if'a или взаимоисключающие условия, а вот не находится :)

TERRORist 26.06.2010 23:46

Цитата:

Сообщение от wvxvw (Сообщение 918289)
Я всегда пишу так, и мне так больше нравится, но суть не в этом.
В самом начале статьи было написано, что большинство програмистов не способны решить примитивную задачу, и как раз эта задача решается в этом банальном на первый взгляд коде :)
Кстати, по производительности первый вариант лучше второго т.как инкремент быстрее модуло, да и при этом инкремент происходит не каждую итерацию. Но фишка не в этом, а в том, что прочитав условие задачи появляется желание найти вариант где бы использовались только два if'a или взаимоисключающие условия, а вот не находится :)


а почему вы пропустили одно из условий задачи "For numbers which are multiples of both three and five print "FizzBuzz"." ? я не наблюдаю такого трейса..

Код AS3:

                        for (var i:uint = 1; i < 101; i++)
                        {
                                var fizz:Boolean = !(i % 5);
                                var buzz:Boolean = !(i % 3);
                                trace(buzz && fizz ? "FizzBuzz" : fizz ? "Fizz" : buzz ? "Buzz" : i)
                        }

некрасиво но работает

wvxvw 27.06.2010 00:35

TERRORist:
там не = а +=

Но идея интересная, хотя тоже не ахти - тернарный оператор ни чем не лучше if-else ну только что запись немного короче, а с другой стороны - приходится использовать "FizzBuzz", которая явно собирается из двух компонентов, которые так же используются отдельно. + нужно считать модуло каждую итерацию (более накладно чем раз в несколько итераций проинкрементить). + дополнительная операция &&.

кстати, для Лиспа можно было бы по-другому и красивше решать, там есть натуральные дроби (или я не знаю, как это правильно называется), в смысле можно 1/3 + 1/3 + 1/3 = 1.

TERRORist 27.06.2010 00:36

а, точно, не заметил, сорри

wvxvw 27.06.2010 01:19

Кстати, вот еще экстримальный вариант :)
Код AS3:

function runFizzBuzz():void
{
        var result:String;
 
        for (var i:int = 1, state:int; i <= 100; i++, state++)
        {
                switch (state)
                {
                        case 2: case 5: case 8: case 11:
                                result = "Fizz";
                                break;
                        case 4: case 9:
                                result = "Buzz";
                                break;
                        case 14:
                                result = "FizzBuzz";
                                state = -1;
                                break;
                        default: result = i.toString();
                }
                trace(result, i);
        }
}



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

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