November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Saturday, September 8th, 2012 07:18 pm

Любимое юмористическое сообщество ru_php подкинуло любопытную задачку. Несмотря накажущуюся простоту, оказалось, что у очень большого количества выпускников профильных (!) учебных заведений она вызывает серьёзные затруднения. Потому что не подпадает ни под один шаблон, которым учат в этих заведениях, тут надо немножечко задействовать собственный мозг.

Поэтому задача эта, как выяснилось, очень распространена на Западе в качестве средства отсеивания недопрограммистов (a.k.a. быдлокодеров). Которые как раз и отличаются неспособностью самостоятельно думать.

Для системных администраторов, пожалуй, тоже подойдёт, поскольку она не на знание конкретных языков, а чисто алгоритмическая. Итак, проверьте себя:

Напишите на любом известном вам языке программу, которая для каждого числа от 1 до 100:
если число делится на 3, печатает слово “Hello”, если число делится на 5, выводит слово “world”, если число делится и на 3, и на 5, печатает фразу “Hello world”, иначе печатает само число. Всё.

P.S. У меня эта задача затруднений не вызвала. Жена, не имеющая профильного программистского образования, её тоже довольно легко решила. А вы? ;)

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

Saturday, September 8th, 2012 08:07 pm (UTC)
$ar=range(1,100);

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];

}
Sunday, September 9th, 2012 10:34 am (UTC)
Солидно, ничего не скажешь.
Saturday, September 8th, 2012 08:57 pm (UTC)
так это же fizzbuzz (http://www.google.com/search?q=fizzbuzz)
Sunday, September 9th, 2012 02:33 pm (UTC)
да нет, все там правильно
Sunday, September 9th, 2012 03:05 pm (UTC)
это case, а не if. он находит первую ветку, которая вычисляет переданное значение (в данном случае 0): http://msdn.microsoft.com/en-us/library/cy37t14y(v=vs.80).aspx
так что все там правильно.
Sunday, September 9th, 2012 03:48 am (UTC)
я последний раз что-то программировал лет двадцать назад, так что без языков.
Идея следующая:
проверяем делимость на три, если да, то записываем в строчку вывода hello, проверяем делимость на три и на пять, если да, то записываем (добавляем) пробел, проверяем делимость на пять, если да, то записываем World, проверяем итоговую строку на пустоту, если пусто, то записываем изначальное число. Выводим строку.
Ещё можно разложить изначальные числа в три кучки -- в одной те, которые делятся на три, в другой те которые на пять, в третьей все остальные. Потом найти одинаковые в двух первых кучках, и сложить их в четвёртую кучку. Потом вывести всё. По скорости, это, наверное, будет быстрее.

А в чём подвох?
Sunday, September 9th, 2012 08:32 am (UTC)
гм. Ваш вариант мне первым пришёл в голову, но я решил, что это как-то слишком просто и очевидно, что я пропустил какой-то скрытую ловушку и пришлось придумать ещё два способа.
Sunday, September 9th, 2012 05:27 am (UTC)
Сложность не в этой конкретной задаче. Проблема только в том, что на интервью программистов приходят левые люди. Они бы не написали бы и любую другую задачу.
Sunday, September 9th, 2012 10:16 am (UTC)
Наверное, вы правы. Ничем другим "сложности" с этой задачей, на мой взгляд, объяснить невозможно.
Sunday, September 9th, 2012 10:33 am (UTC)
Ну, я вот честно говоря, вообще не понял в чем проблема и поэтому решил написать программу (у меня есть на ipad некий бейсик):

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 он тоже не воспринимает).

В чем же сложность? Нет ведь даже мало-мальски запутанного набора условий. И алгоритмы знать не надо. Ничего не надо, а поди ж ты.
Sunday, September 9th, 2012 10:43 am (UTC)
Ну там очень примитивная реализация бейсика, как языка. Это ж игрушка.

Зато там есть, например, процедуры позволяющие face recognition (полагаю их iOS предоставляет) :-)
Sunday, September 9th, 2012 02:49 pm (UTC)
Нет тут никакой сложности. То есть вообще. Человек, который придумал использовать эту задачу на интервью программистов пишет:
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/)
Sunday, September 9th, 2012 03:06 pm (UTC)
в том и идея, что деление на can code/can't code почти бинарное. кто не может писать код, не может написать ничего.
Sunday, September 9th, 2012 05:31 am (UTC)
Ну я не совсем программист, но что-то не вижу тут никаких трудностей.

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 "
";
}

Вроде работает

В чем подвох то?
Sunday, September 9th, 2012 05:35 am (UTC)
Кстати, на вопрос "почему эта задача появилась в штатах" отвечает статья http://habrahabr.ru/post/151111/
Sunday, September 9th, 2012 04:50 pm (UTC)
Да, да. http://www.amazon.com/review/R16G6MG9QILUDT
Monday, September 10th, 2012 11:54 am (UTC)







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]
Edited 2012-09-10 11:54 am (UTC)
Monday, September 10th, 2012 12:43 pm (UTC)
Я посчитал, что не имеет значения диапазон.
print i - это для контроля. Просто забыл удалить.
Зато я избавился от одного деления.