Любимое юмористическое сообщество ru_php подкинуло любопытную задачку. Несмотря накажущуюся простоту, оказалось, что у очень большого количества выпускников профильных (!) учебных заведений она вызывает серьёзные затруднения. Потому что не подпадает ни под один шаблон, которым учат в этих заведениях, тут надо немножечко задействовать собственный мозг.
Поэтому задача эта, как выяснилось, очень распространена на Западе в качестве средства отсеивания недопрограммистов (a.k.a. быдлокодеров). Которые как раз и отличаются неспособностью самостоятельно думать.
Для системных администраторов, пожалуй, тоже подойдёт, поскольку она не на знание конкретных языков, а чисто алгоритмическая. Итак, проверьте себя:
Напишите на любом известном вам языке программу, которая для каждого числа от 1 до 100:
если число делится на 3, печатает слово “Hello”, если число делится на 5, выводит слово “world”, если число делится и на 3, и на 5, печатает фразу “Hello world”, иначе печатает само число. Всё.
P.S. У меня эта задача затруднений не вызвала. Жена, не имеющая профильного программистского образования, её тоже довольно легко решила. А вы? ;)
Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.
no subject
for($i=0;$i<100;$i++){
if($ar[$i]%3==0) echo 'Hello';
if($ar[$i]%5==0) echo ' world';
if(($ar[$i]%3!=0)&&($ar[$i]%5!=0)) echo $ar[$i];
}
no subject
К тому же $ar совершенно лишний, достаточно было сделать цикл
for($i=1;$i<=100;$i++)и проверять $i.no subject
no subject
no subject
no subject
no subject
no subject
Case n Mod 15вместоCase (n Mod 15) = 0, и то же самое с остальными проверками.И вдобавок зачем-то отдельно выделен случай
Case 0, хотя он подпадает под делимость на 15, да и вообще не сработает, потому что цикл начинается с 1.no subject
так что все там правильно.
no subject
no subject
Идея следующая:
проверяем делимость на три, если да, то записываем в строчку вывода hello, проверяем делимость на три и на пять, если да, то записываем (добавляем) пробел, проверяем делимость на пять, если да, то записываем World, проверяем итоговую строку на пустоту, если пусто, то записываем изначальное число. Выводим строку.
Ещё можно разложить изначальные числа в три кучки -- в одной те, которые делятся на три, в другой те которые на пять, в третьей все остальные. Потом найти одинаковые в двух первых кучках, и сложить их в четвёртую кучку. Потом вывести всё. По скорости, это, наверное, будет быстрее.
А в чём подвох?
no subject
Подвоха тут никакого нет, просто не все сразу соображают, как запрограммировать проверку всех возможных комбинаций для двух условий.
no subject
no subject
Вообще, конечно, баланс между скоростью написания кода, его быстродействием, читабельностью, лёгкостью последуюшей поддержки и модификации приходится устанавливать в каждом конкретном случае по-разному. Но тут никаких дополнительных требований не выдвигалось, поэтому простая "в лоб" реализация условия задачи оказывается вполне приемлемой.
no subject
no subject
no subject
А вот проверка двух условий сразу с четырьмя возможными исходами - рвёт шаблон напрочь. Не учили этому. У кого мозги есть, тот быстро догадается. Ну а нет - так нет..
no subject
FOR i=1 TO 100
IF (MOD(i,3)=0) AND (MOD(i,5)=0) THEN
PRINT "hello world"
GOTO 10
END IF
IF (MOD(i,3)=0) THEN
PRINT "hello"
GOTO 10
END IF
IF (MOD(i,5)=0) THEN
PRINT "world"
GOTO 10
END IF
PRINT i
10 NEXT
goto 10 -- замена отсутствующему оператору continue (и next он тоже не воспринимает).
В чем же сложность? Нет ведь даже мало-мальски запутанного набора условий. И алгоритмы знать не надо. Ничего не надо, а поди ж ты.
no subject
no subject
Зато там есть, например, процедуры позволяющие face recognition (полагаю их iOS предоставляет) :-)
no subject
I’ve come to discover that people who struggle to code don’t just struggle on big problems, or even smallish problems (i.e. write a implementation of a linked list). They struggle with tiny problems.
(http://imranontech.com/2007/01/24/using-fizzbuzz-to-find-developers-who-grok-coding/)
no subject
no subject
no subject
no subject
for ($i = 1; $i <= 100; $i++){
if ($i % 15 == 0) echo "Hello world";
elseif ($i % 5 == 0) echo "Hello";
elseif ($i % 3 == 0) echo "world";
else echo $i;
echo "
";
}
Вроде работает
В чем подвох то?
no subject
no subject
no subject
Помнится мне, они расплодились примерно в то же время.
no subject
no subject
Python
words = {} words[2] = "Hello" words[4] = "world" words[8] = "Hello world" for i in xrange(100): index = 1 print i, if i % 3 == 0: index = index*2 if i % 5 == 0: index = index*4 if index == 1: print i else: print words[index]Re: Python
xrange(1,101)Во-вторых, не просили в начале каждой строки печатать само число, поэтому первый
print i,лишний.А навороты с массивом ухудшают читабельность. Хотя и дают некоторый выигрыш в производительности по сравнению с тремя проверками делимости на 15, 3 и 5, но очень незначительный.
Re: Python
print i - это для контроля. Просто забыл удалить.
Зато я избавился от одного деления.