dil: (Default)
dil ([personal profile] dil) wrote2012-09-08 07:18 pm

Простенькая задачка по программированию…

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

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

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

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

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

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

[identity profile] kosenko-danila.livejournal.com 2012-09-08 08:07 pm (UTC)(link)
$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];

}

[personal profile] slapsh 2012-09-09 10:34 am (UTC)(link)
Солидно, ничего не скажешь.
ext_659502: (Default)

[identity profile] some41.livejournal.com 2012-09-08 08:57 pm (UTC)(link)
так это же fizzbuzz (http://www.google.com/search?q=fizzbuzz)
ext_659502: (Default)

[identity profile] some41.livejournal.com 2012-09-09 02:33 pm (UTC)(link)
да нет, все там правильно
ext_659502: (Default)

[identity profile] some41.livejournal.com 2012-09-09 03:05 pm (UTC)(link)
это case, а не if. он находит первую ветку, которая вычисляет переданное значение (в данном случае 0): http://msdn.microsoft.com/en-us/library/cy37t14y(v=vs.80).aspx
так что все там правильно.

[identity profile] leonid-smetanin.livejournal.com 2012-09-09 03:48 am (UTC)(link)
я последний раз что-то программировал лет двадцать назад, так что без языков.
Идея следующая:
проверяем делимость на три, если да, то записываем в строчку вывода hello, проверяем делимость на три и на пять, если да, то записываем (добавляем) пробел, проверяем делимость на пять, если да, то записываем World, проверяем итоговую строку на пустоту, если пусто, то записываем изначальное число. Выводим строку.
Ещё можно разложить изначальные числа в три кучки -- в одной те, которые делятся на три, в другой те которые на пять, в третьей все остальные. Потом найти одинаковые в двух первых кучках, и сложить их в четвёртую кучку. Потом вывести всё. По скорости, это, наверное, будет быстрее.

А в чём подвох?

[identity profile] leonid-smetanin.livejournal.com 2012-09-09 08:32 am (UTC)(link)
гм. Ваш вариант мне первым пришёл в голову, но я решил, что это как-то слишком просто и очевидно, что я пропустил какой-то скрытую ловушку и пришлось придумать ещё два способа.

[identity profile] jerom.livejournal.com 2012-09-09 05:27 am (UTC)(link)
Сложность не в этой конкретной задаче. Проблема только в том, что на интервью программистов приходят левые люди. Они бы не написали бы и любую другую задачу.

[personal profile] slapsh 2012-09-09 10:16 am (UTC)(link)
Наверное, вы правы. Ничем другим "сложности" с этой задачей, на мой взгляд, объяснить невозможно.

[personal profile] slapsh 2012-09-09 10:33 am (UTC)(link)
Ну, я вот честно говоря, вообще не понял в чем проблема и поэтому решил написать программу (у меня есть на 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 он тоже не воспринимает).

В чем же сложность? Нет ведь даже мало-мальски запутанного набора условий. И алгоритмы знать не надо. Ничего не надо, а поди ж ты.

[personal profile] slapsh 2012-09-09 10:43 am (UTC)(link)
Ну там очень примитивная реализация бейсика, как языка. Это ж игрушка.

Зато там есть, например, процедуры позволяющие face recognition (полагаю их iOS предоставляет) :-)
ext_659502: (Default)

[identity profile] some41.livejournal.com 2012-09-09 02:49 pm (UTC)(link)
Нет тут никакой сложности. То есть вообще. Человек, который придумал использовать эту задачу на интервью программистов пишет:
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/)
ext_659502: (Default)

[identity profile] some41.livejournal.com 2012-09-09 03:06 pm (UTC)(link)
в том и идея, что деление на can code/can't code почти бинарное. кто не может писать код, не может написать ничего.
okapy: (Default)

[personal profile] okapy 2012-09-09 05:31 am (UTC)(link)
Ну я не совсем программист, но что-то не вижу тут никаких трудностей.

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

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

В чем подвох то?

[identity profile] jerom.livejournal.com 2012-09-09 05:35 am (UTC)(link)
Кстати, на вопрос "почему эта задача появилась в штатах" отвечает статья http://habrahabr.ru/post/151111/
ext_659502: (Default)

[identity profile] some41.livejournal.com 2012-09-09 04:50 pm (UTC)(link)
Да, да. http://www.amazon.com/review/R16G6MG9QILUDT
voldimar: (Default)

Python

[personal profile] voldimar 2012-09-10 11:54 am (UTC)(link)







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 (UTC)
voldimar: (Default)

Re: Python

[personal profile] voldimar 2012-09-10 12:43 pm (UTC)(link)
Я посчитал, что не имеет значения диапазон.
print i - это для контроля. Просто забыл удалить.
Зато я избавился от одного деления.