LINUX.ORG.RU

[FizzBuzz] Тестовое задание на пять минут


1

1

Автор задачи утверждает, что большинство программистов не напишут решение этой задачи на бумажке быстрее, чем за пять минут.

Задача FizzBuzz

Напишите программу, которая выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем, программа должна выводить слово «Fizz», а вместо чисел, кратных пяти — слово «Buzz». Если число кратно и 3, и 5, то программа должна выводить слово «FizzBuzz»

А как с этим дела обстоят на ЛОРе?

Ответ на: комментарий от Raving_Zealot

Ну и в guard-ах пишут otherwise обычно, вместо True. Хотя первое является всего лишь синонимом для второго.

anonymous
()
program main

 	character*8 str

do i=1,100
	write(str(1:8),'(i8.1)') i

	If (mod(i,3).eq.0) then
		write(str(1:8),'(A8)') "Fizz    "
	endif
	If (mod(i,5).eq.0) then
		write(str(1:8),'(A8)') "Buzz    "
	endif

	If (mod(i,15).eq.0) then
		write(str(1:8),'(A8)') "FizzBuzz"
	endif

	write(*,*) str
enddo

fool_anon
()

не однострочник конечно, но всё же…

#include <stdio.h>

int main() {
    for (int i = 1; i <= 100; ++i)
        printf("%d\n\0Fizz\n\0FizzBuzz\n"+4*(!(i%3)^!(i%5))+10*!(i%5), i);
    return 0;
}
arsi ★★★★★
()

пилять. Все так и бросились постить сюда решение задачки =(. ЛОР окончательо падает в моих глазах. Прощено только решение на брейнфаке.

Waterlaz ★★★★★
()
Ответ на: комментарий от anonymous

putStrLn . toString

если это то, о чём я думаю, то можно было просто print

jtootf ★★★★★
()
Ответ на: однострочник на пейтоне от anon1984

Вы ошиблись, условие задачи не будет выполнено.

for i in ("FizzBuzz" if not x % 15 else "Fizz" if not x % 3 else "Buzz" if not x % 5 else x for x in xrange(1,101)): print i
Если использовать функцию print из третьего Python
map( print, ( "FizzBuzz" if not x % 15 else "Fizz" if not x % 3 else "Buzz" if not x % 5 else x for x in xrange(1,101)) )
Один из немногих случаев где map ещё по-прежнему рулит.

anonymous
()

Забавно, данная задача пробежала по всей сети всего за 2 дня. На скольки сайтах не посмотрю, везде очень грязные решения. Пока понял несколько вещей: 1) люди разучились писать что-то с нуля 2) люди забыли свой язык 3) мало кто умеет думать логически так, чтобы использовать язык «на полную» и писать хороший код 4) люди не знают о том, как использовать ветвление в их языке(мало кто использует else)

Мой вариант:

for i in xrange(1, 101):
   if (i % 3) == 0 and (i % 5) == 0:
      print "FizzBuzz"
   elif (i % 3) == 0:
      print "Fizz"
   elif (i % 5) == 0:
      print "Buzz"
   else:
      print i
Около минуты. В интерпретаторе запустил после написания, всё ок.

tia
()
Ответ на: комментарий от anonymous

Когда человек пишет такой код, он не понимает сути питона.
Не главное как коротко записан код, как умно ты заюзал какие то фишки. Главное чтобы ты мог легко его прочитать и понять не разбирая сильно этот код. Нужно сохранять логику и алгоритм в коде.
Именно поэтому лямбды в питоне однострочные. Много строчные лямбды и их нагромождение убивает логику работы, очевидность, оригинальный алгоритм.
И map, на самом деле, много где рулит, как и другая функицональщина в рамках питона.

tia
()
Ответ на: комментарий от anonymous

Половина здесь демонстрировало как можно извратиться чтобы выполнить простую задачу. Некоторые ухитрились даже сделать так, чтобы программа не выполняла все задачи по «ТЗ».

tia
()
Ответ на: комментарий от tia

> Половина здесь демонстрировало как можно извратиться чтобы выполнить простую задачу.

Всего один или двое.

Некоторые ухитрились даже сделать так

Невнимательность же. Мало кто на деле проверял.

anonymous
()
Ответ на: комментарий от anonymous

>Всего один или двое.
Не буду считать, но их многовато. «Прогреммеры» всё такие не умеют программировать. Везде видно что люди использовали одну идею, которая пришла в голову, её и имплементировали. В некоторых случаях - перемудрили. Но никто не позаботился о чистоте алгоритма.
Конечно, на питоне у меня тоже не получился идеальный вариант(первое условие должно быть пред-последним, если смотреть оригинальный алгоритм).

Невнимательность же. Мало кто на деле проверял.

Кто забыл что-то сделать в коде, а кто не увидел этого в задании. Разные проблемы, но обе присутствуют и проявляются на таких простых задачах. Самое обидное, что это допускают профессиональные программисты.

tia
()

Индусская армия на марше.

#include <iostream>

using std::cout;
using std::endl;


int buzz(int i)
{
	if(!(i%5))
	{
		cout << "Buzz";
		return 1;
	}
	return 0;
}

int fizz(int i)
{
	int r = 0;
	if(!(i%3))
	{
		cout << "Fizz";
		r++;
	}
	r+=buzz(i);
	return r;
}

void next(int i)
{
	if(i > 100)
		return;
	if(!fizz(i))
		cout << i;
	cout << endl;
	next(i+1);
}

int main(void)
{
	next(1);
	return 0;
}
unikoid ★★★
()

Common Lisp, меньше минуты

(loop for i from 1 to 100 do
  (print (cond ((zerop (mod i (* 3 5))) "FizzBuzz")
               ((zerop (mod i 3)) "Fizz")
               ((zerop (mod i 5)) "Buzz")
	       (t i))))
anonymous
()

Большинство программистов напишут решение этой задачи на бумаге. Большинство тех, кто приходят на собеседование - не напишут.

Legioner ★★★★★
()
Ответ на: комментарий от anonymous

> не в одну строчку

потому что читаемость кода — наше все.

pierre
()
Ответ на: комментарий от pierre

v2

#include <stdio.h>

int main() {int i=0;for(i=1;i<101;i++)
  printf((i%3||!printf("Fizz"))&(i%5||!printf("Buzz"))?"%d\n":"\n",i);} 
pierre
()
Ответ на: комментарий от anonymous

> не в одну строчку

int main(){int printf(const char*fmt,...);for(int i=0;++i<101;printf("\n"))printf("%s%s","\0Fizz"+!(i%3),"\0Buzz"+!(i%5))||printf("%d",i);}

зы: ждём однострочник на ассемблере ;)

arsi ★★★★★
()
Ответ на: комментарий от Waterlaz

re: ЛОР окончательо падает в моих глазах

Держите: // // Процедура ПриНачалеРаботыСистемы() Для Сч = 1 По 100 Цикл Если Сч % 15 = 0 Тогда Сообщить(«FizzBuzz») ИначеЕсли Сч % 3 = 0 Тогда Сообщить(«Fizz») ИначеЕсли Сч % 3 = 0 Тогда Сообщить(«Buzz») Иначе Сообщить(Сч) КонецЕсли; КонецЦикла; КонецПроцедуры

anonymous
()
Ответ на: re: ЛОР окончательо падает в моих глазах от anonymous

то есть:

Процедура ПриНачалеРаботыСистемы()
  Для Сч = 1 По 100 Цикл
    Если Сч % 15 = 0 Тогда
      Сообщить("FizzBuzz")
    ИначеЕсли Сч % 3 = 0 Тогда
      Сообщить("Fizz")
    ИначеЕсли Сч % 3 = 0 Тогда
      Сообщить("Buzz")
    Иначе
      Сообщить(Сч)
    КонецЕсли;
 КонецЦикла;
КонецПроцедуры

anonymous
()
Ответ на: комментарий от tia

+1 тем более никакого выигрыша по скорости не даёт и лишь зря запутывает код. Кстати можно написать так:

 
for x in xrange(1,101): 
    s = [] 
    if x % 3 == 0: s.append("Fizz") 
    if x % 5 == 0: s.append("Buzz") 
    if s: print "".join(s) 
    else: print x 

и по скорости выше, и понятнее.

chinarulezzz ★★
()
Ответ на: комментарий от tia

>Много строчные лямбды и их нагромождение убивает логику работы, очевидность, оригинальный алгоритм.

Ты просто не знаешь всей фичастости многострочных лямбд. Лямбды не только что-бы в фолды и мапы пихать.

Waterlaz ★★★★★
()
Ответ на: комментарий от backbone

>2 минуты

Тебя в школе не учили, что задание надо делать в первую очередь правильно и только потом быстро? Ты не справился даже с диапазоном 1..100. Рекомендую пока не поздно начать стажироваться на дворника.

anonymous
()
Ответ на: комментарий от anonymous

> > зы: ждём однострочник на ассемблере ;)

Невозможно же.

man ';' - работает как разделитель строк в gas/x86_64, например

Можно писать, например, вот так:

.text; .globl main; main: ret

anonymous
()
Ответ на: комментарий от anonymous

>И откуда вы только берете такое написание?

пальцы сами херню всякую пишут =(

Waterlaz ★★★★★
()
Ответ на: комментарий от chinarulezzz

Наивные люди. Ну давайте немного усовершенствуем задание. Пусть, если делится и на 3 и на 5, то надо напечатать 'foobar'. Сколько вы изменений внесете, конкатенаторы блин?

anonymous
()

Правильное решение приведено на PHP:

echo '1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14
FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29
FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44
FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59
FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74
FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89
FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz ';

Karapuz ★★★★★
()
Ответ на: комментарий от RADO

> разница в наглядности есть

Ну, наглядность здесь особо не теряется, но на одну проверку меньше выходит.

anonymous
()
Ответ на: комментарий от tia

вам не кажется, что в духе питона было бы использовать float.is_integer() а не смотреть чему равен остаток от деления?

for i in xrange(1,101):
    devide_by_three=float(i)/3
    devide_by_five=float(i)/5
    output_line=''
    if devide_by_three.is_integer():
        output_line+="Fizz"
    if devide_by_five.is_integer():
        output_line+="Buzz"
    if not devide_by_five.is_integer() and not devide_by_three.is_integer():
        output_line+=str(i)
    print output_line

~2 минуты

xhat
()
Ответ на: комментарий от anonymous

Если на код посмотрит человек не знакомый с ТЗ он будет считать что там проверяется кратность 15-и, а не кратность и 3-м и 5-и как было в ТЗ. Программы-то пишутся для людей, а не для компьютеров ;-)

RADO
()

#!/bin/bash

for number in `seq 1 100`; do
[ $(($number%3)) -eq 0 ] && str=«Fizz»
[ $(($number%5)) -eq 0 ] && str=«${str}Buzz»
echo $str
done

полторы минуты

snoopcat ★★★★★
()
Ответ на: комментарий от arsi

упс, не до конца условия прочитал -_-
4 минуты ушло <>

snoopcat ★★★★★
()
Ответ на: комментарий от xhat

Через is_integer мы проверяем, грубо говоря, тип, а не значение(что нам, по всей логике, и нужно).
Используя такие, дальние от задачи, функции, ты разрабатываешь решение неверно, не важно на каком языке.
С чего ты решил что это в духе питоне? Что в этом есть «такого»?

Через остаток от деления - более логичный по всем меркам вариант. Более красивый и очевидный.

Кроме того, последние условие лишне.

tia
()
for i in $(seq 100); do
  [ $(($i%3)) -eq 0 ] && echo -n Fizz
  [ $(($i%5)) -eq 0 ] && echo -n Buzz
  [ $(($i%3)) -ne 0 ] && [ $(($i%5)) -ne 0 ] && echo $i || echo
done
F
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.