Comments 140
Надо было делать на brainfuck. Тогда бы взяли
Задача решается в два if. Если число делится на 3 и на 5, значит оно делится и на 15. Написать в два if не так просто, учитывая output. Но надо сделать именно в два if (else стейтмент можно вводить).
Именно так задача давалась в оригинале.
Попробуйте решить строго в два if
Вы это серьёзно? (Или ваш комментарий настолько тонок, что я не понимаю?)
есть понятие пробы. Проба позволяет узнать значение.
есть if () — в скобках мы пробируем значение.
нам надо написать программу, которая:
1. если число делится на 3 выводит «fizz»
2. если число делится на 5 выводит «buzz»
3. если число делится на 3 и на 5 выводит «fizzbuzz».
4. если число не делится на 3, на 5, на 3 и на 5 НЕ выводит ни fizz, ни buzz, а выводит само число
Example output:
1 2 fizz 4 buzz 6 7… 14 fizzbuzz 16 17
Попробуйте Randl, не знаю С++, что у вас выведется на экране.
Можно написать
for { if else; if else }
можно
for { if; if }
можно
for { if else; if}
и т.п.
оператор print()
Попробуйте честно решить
Example output:
… 6 ....
ну что же так, массив, числа какие-то: только рекурсия темплейтов, только хардкор
а я тряхнул стариной и зафигачил на дефайнах, раскрывающихся в сто тернарных операторов (каждый из которых может быть вычислен компилятором): http://codepad.org/5t1na6Rs
я встречно предложу вам решить эту задачку вообще без проб, проверок и условий.
// Достаточно подготовить массив и обращаться по индексу.
#include
#include
char *arr[]={«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»};
void echo(int i)
{
printf("%i -> %s\n", i, arr[i-1]);
}
int main(void) {
echo(rand()%100 + 1);
return 0;
}
// жаль, за мой ответ голосовать нельзя ))
// 0,1,2… 14
string array a[15]={«fizzbuzz»,«num»,«num»,«fizz»,«num»,«buzz»,«fizz»,«num»,«num»,«fizz»,«buzz»,«num»,«buzz»,«num»,«num»};
string func(int n){
int i=n%15;
if (a[i]==«num») then return string(n);
else return a[i];
}
язык описания немного намешан, но думаю что принцип ясен, если использовать подмену (скрытая проверка условия)
можно избавиться от явного условия «if». Необходимо только на вход подавать целое число больше нуля.
Вам ставят минусы не потому, что с вами не согласны или не поняли условие задачи, а потому, что пост совсем не о том, как решать FizzBuzz. Вообще.
import math
def fizzbuzz(i):
return [str(i), 'fizz', 'buzz', 'fizzbuzz'][3 — math.ceil((i % 3) / 2) * 2 — math.ceil((i % 5) / 4)]
for i in range(1, 100):
print(fizzbuzz(i))
Моё почтение, Михаил Илларионович!
Идея FizzBuzz — отсеять совсем неумеющих программировать совсем.
Написать его даже в 2 if без else несложно.
for (uint8_t i = 1; i <= 100; ++i) {
std::string s = std::to_string(i);
if (!(i%3)) {
std::cout << "fizz";
s = "";
}
if (!(i%5)) {
std::cout << "buzz";
s= "";
}
std::cout << s << std::endl;
}
Ключевой момент вашего решения — операция s = ""
Обычно схема fizzbuzz идет следующим образом:
1. Напишите fizzbuzz — написал в 3 if.
2. Напишите fizzbuzz в 2 if. Пишут что и вы.
3. Избавьтесь от изменения переменных. Тут продолжите свои размышления.
Если вы считаете, что в условиях 3 задача не решается — докажите что решений нет. Если решается — решите.
Неумеющий программировать — уходит на пункте 1
Умеющий программировать — решает пункт 2
Математик — решает пункт 3.
Правило следующие:
if { block } then { block } else { block}; if {block} then {block} else {block} — два if
if; if — два if
if then else if; if — недопустимо. Три if
промежуточные результаты можно сохранить в неизменяюю переменную.
Нельзя менять переменную, в вашем случае s = "" недопустимо для пункта 3.
можно вычислять любые выражения, битовые сдвиги, числа — все допустимо.
Обрамляющий цикл — классический for или while.
максимум два раза можно узнать результат — это значит пробу сделать.
if (i mod 3 = 0) — опробировали 1 раз
if (i mod 3 = 0 && i mod 5 = 0) — опробировали 1 раз.
Результат первой пробы можно использовать во второй пробе.
i == 3:
i mod 3 = 0 == true
i mod 3 = 0 && i mod 5 = 0 == true
i == 15
i mod 3 = 0 == true
i mod 3 = 0 && i mod 5 = 0 == true
>…
> i mod 3 = 0 && i mod 5 = 0 == true
это неверно
Тогда тот же вопрос про n vs buzz: 2 — false, false; 5 — false, false. Суть не изменилась.
Я подозреваю, что в задаче подразумевается ответ «решения нет», который доказывается как-нибудь через то, что у нас грубо говоря есть только три листа в дереве ветвлений, а надо четыре. Но задачу надо очень сильно формализовать, чтобы убить всякие решения с масками, индексами в массивы итд.
if (i mod 3 = 0 && i mod 5 = 0) — fizzbuzz
buzz?
Вот вам вариант вообще без if-ов.
object FizzBuzz {
def main(args: Array[String]) = {
val fb = Array[String](
"fizzbuzz", "fizz", "fizz", "fizz", "fizz",
"buzz", "a", "a", "a", "a",
"buzz", "a", "a", "a", "a")
for (i <- 1 to 100) {
println(fb(5 * (i % 3) + i % 5).replace("a", i.toString))
}
}
}
variants = ('', 'fizz', 'buzz', 'fizzbuzz')
for i in range(101):
v = variants[(i % 3 == 0) + (i % 5 == 0) * 2]
if v != '':
print("{0}: {1}".format(i, v))
Какие такие пустые строки? Мой вариант пустрых строк не выводит…
Но про неявную конверсию bool -> int — хорошая идея.
Соответственно решение с поправкой будет еще короче:
variants = ('{}', 'fizz', 'buzz', 'fizzbuzz')
print("\n".join([variants[(i % 3 == 0) + (i % 5 == 0) * 2].format(i) for i in range(101)]))
Да Вы — гений, товарисч.
Только я бы приводил типы явно.
И не стоит, думаю, гнаться за краткостью, если она идет во вред читаемости.
def fizzbuzz_iter():
variants = ('{}',
'{} делится без остатка на 3',
'{} делится без остатка на 5',
'{} делится без остатка и на 3, и на 5')
for i in range(1, 101):
yield variants[int(i % 3 == 0) + (int(i % 5 == 0) * 2)].format(i)
for fb in fizzbuzz_iter():
print(fb)
К тому же, небольшая оптимизация работы с памятью — использование генератора. Если задача — тест для приема на работу… Думаю, это будет неплохим дополнением к такой реализации.
О, совсем забыл — в скале нет имплиситных конвертаций булеана в инт. Не С++ все же.
var test=(e)=>{
var q={
3: 'fizz',
5: 'buzz',
15: 'fizzbuzz'
};
var result=e;
for(var i in q){
if(e%i==0){
result=q[i];
}
}
return result;
};
var t=[];
for(var i=0; i<100; i++) t.push(test(i));
console.log(t.join(' '))
Вот без — изящно.
console.clear();
// что бы совсем без if'ов и пустых строк...
var a = [
function(){},
console.log.bind(null, 'fizz'),
console.log.bind(null, 'buzz'),
console.log.bind(null, 'fizz buzz'),
];
for(var i=1; i<=100; ++i){
// получаем в виде битов, через черную магию -> складываем a+b*2 -> и соотвественно выводим [ничего,1е,2е,оба]
a[Math.floor(((i-1)%3)/2) + Math.floor(((i-1)%5)/4)*2](i);
}
Без if'ов вообще:
for (uint8_t i = 1; i <= 100; ++i) {
std::array<std::string, 4> print = {std::to_string(i), "fizz", "buzz", "fizzbuzz"};
bool three = i % 3 == 0, five = i % 5 == 0;
std::cout << print[three +five * 2] << std::endl;
}
Я принят? ;)
Или будет следующий этап — отказаться от массивов? Мы играем в игру "найди мое решение", а она мне не нравится, особенно в программировании.
На fizzbuzz как раз всплывают такие случаи, когда человек вместо двух аккуратных ифов, которые он делает с первого раза, возникают монстры типа нейросети.
Но статья очень смешная.
и вообще-то задачка-то нужна только для того, чтобы выяснить умеет ли человек код писать.
Вспомнилось:
Мужик в лесу заблудился, орёт "Ау! Ау!"
Подходит медведь: "Мужик, чего орешь?"
Мужик: "Заблудился, может кто услышит."
Медведь: "Ну я услышал. Тебе легче стало?"
Человек явно умеет решать задачи при помощи TensorFlow. Вам легче стало? ;)
del
for(let s, i = 0; i < 100; i++) s = '', (i % 3 || (s += 'Fizz')), (i % 5 || (s += 'Buzz')), console.log(s || i);
и незачем мудрить
Статья кстати была не про это, в интернете и так вариантов куча, от красивых до производительных.
Вы пробелы убрать забыли.
Ваш код не соответствует вашему же призыву ("и незачем мудрить").
input([ "FizzBuzz" if not x%3 and not x%5 else "Fizz" if not x%3 else "Buzz" if not x%5 else x for x in range(1, 101)])
как то писал и C++ однострочник, но там настоящий ужас
Я пару раз встречался с людьми, которые обнаруживали ошибки и неточности в моих вопросах и задачах. Было неудобно, да, но на оценку и шансы принятия на работу это влияет только положительно.
А вот когда кандидат сознательно манкирует вопросами интервьюера и вместо решения задачи, о которой его просили, демонстрирует какой он умный и хороший, но не порождает решения, которого от него ждут… это чистый «No Hire».
Ну представьте себе: вы приняли такого на работу, попросили написать что-нибудь… ну мелочь какую-нибудь, но такую, без которой у вас убытков на миллионы, а он вместо этого проделал массу бессмысленной работы, но задачу не решил и в убытки вы таки влетели… зачем оно вам?
ИМХО давать FizzBuzz на интервью — это дурной тон. Ещё б спросили сколько настройщиков пианино в мире.
Вы недооцениваете количество людей, которые эту задачу не решат. В моей практике собеседований сложные вопросы просто не нужны — достаточно послушать, что кандидат расскажет про свой проект и поспрашивать основы + простейшие задачки типа "найти максимальную глубину двоичного дерева".
Во первых, вопрос в том, на какую позицию интервью. Одно дело джуниор, другое — миддл или сениор.
Во вторых, я имел ввиду не сложность задачи, а её разрекламированность. Ну серьёно, о FizzBuzz знают все. Имейте совесть придумать аналогичную простую задачу если это то, что вам нужно. Сам факт вопроса "вам знакома задача "fizz buzz"?" означает, что интервьюер ожидает, что задача мне знакома.
Сам факт вопроса «вам знакома задача „fizz buzz“?» означает, что интервьюер ожидает, что задача мне знакома.И что? Вам теперь сложно её написать?
Задача может быть сколько угодно «широко разрекламированной», но даже при всём при этом соискатели, в большинстве своём — неспособны её написать. Вы можете? Отлично — возьмите и напишите, а не ломайте комедию.
Во первых, вопрос в том, на какую позицию интервью. Одно дело джуниор, другое — миддл или сениор.Вот как раз для сениора — эта задачка в самый раз.
Ибо встречал я таких «сениоров»: могут часами песни петь про всякие разные супер-пупер технологии (я и словей-то таких не знаю), рассказывать как у них команда «бороздит просторы Большого театра»… написать FuzzBuzz — не могут. Вот никак.
Обычно дальнейший разговор показывает, что человек последние N лет код не пишет от слова совсем и только «руководит проектами». Ну и на что он претендует, пытаясь устроиться на инженерную должность? Что? У нас не было вакансий «чистого менеджера?»… Действительно не было — потому что подобных должностей у нас нет, извините.
P.S. Я был бы счастлив перенестись как-нибудь ночью в мир где FuzzBuzz на собеседовании реально смысла не имеет ибо все соискатели способны его написать за 2 минуты. В нашем, реальном, мире — всё не так. Увы.
И что? Вам теперь сложно её написать?
Не сложно. Но я ожидаю задачи своего уровня на собеседовании. И уровня потенциальной работы. И ожидаю, что интервью будет не с первой строчки гугла. И допускаю, что такая задача вкупе с поведением интервьюра может вызвать желание немного над ним поиздеваться.
Вот как раз для сениора — эта задачка в самый раз.
Так дайте ему сложную задачу. Кто не разбирается — одинаково обе не решит.
Сложные задачи требуют много времени для решения, а зачем мучать и кандидата, и интервьювера, если все нужные выводы можно сделать на основе простой задачи, которую решат за 5 минут?
Ну серьезно, практика показывает, что кандидат, который а) написал на бумажке сортировку пузырьком и б) внятно рассказал, чем хорошо и плохо делать очереди на основе таблицы в оракле, будет неплохо и архитектуру проектировать, и сложные задачи решать.
Но я ожидаю задачи своего уровня на собеседовании.
Это вы знаете свой уровень (думаете, что знаете). Его задача — объективно его выяснить/проверить. Поэтому начинается от простого к сложному. Можно и наоборот, можно и методом дихотомии, не суть важно.
Нет, его задача не выяснить мой уровень, а проверить, соответствует ли он должности, на которую я претендую. Если нужен доктор математики, нет смысла начинать с 7*8. Тем более, что доктор математики может в уме и не посчитать :)
Нет, его задача не выяснить мой уровень, а проверить, соответствует ли он должности, на которую я претендую
Его задача — объективно его выяснить/проверить
Бывает, что в компании открыто несколько вакансий для специалистов разного уровня. И не подошедший на должность с более высокими требованиями окажется компетентным для занятия другой должности с более низкими требованиями.
Если нужен доктор математики, нет смысла начинать с 7*8.
Если человек — «доктор математики», он ответит на этот вопрос без истерик. А вот гражданин, начинающий брызгать слюной и бить себя в грудь на тему «да как вы смеете, да вы знаете, кто я такой» — подозрителен. Да, он может быть просто слишком впечатлительным, а может быть и пустышкой.
А вот гражданин, начинающий брызгать слюной и бить себя в грудь на тему «да как вы смеете, да вы знаете, кто я такой» — подозрителен.
Никто и не спорит. Я только говорю, что
И ожидаю, что интервью будет не с первой строчки гугла. И допускаю, что такая задача вкупе с поведением интервьюра может вызвать желание немного над ним поиздеваться.
и
Разработчики особенно толковые, могут позволить себе выбирать. И издеваясь так над интервьюером человек обычно отдает себе отчёт, что это no hire.
package main
import "fmt"
func main() {
for i := 1; i <= 100; i++ {
if i % 3 == 0 && i % 5 > 0 {
fmt.Println("Fizz")
} else if i % 3 > 0 && i % 5 == 0 {
fmt.Println("Buzz")
} else if i % 3 == 0 && i % 5 == 0 {
fmt.Println("FizzBuzz")
} else {
fmt.Println(i)
}
}
}
Писал два года назад, и, вроде, сразу без ошибок получилось…
Как-то не верится, что такое не может сделать опытный разработчик. Я же вообще ничего не программирую, просто для развлечения иногда занимаюсь.
Всё просто: хороший разработчик, после увольнения, пройдёт собеседование в 2-3 компании, выберет подходящую и всё. «Опытный разработчик» не умеющий написать FuzzBuzz сходу будет подавать заявления в 10, 20, 100 компаний — пока, наконец, не «проскочит» и не попадёт на кого-то, что не проверит банальное умение писать тривиальный код.
Потому-то уровень «неадекватов» приходящих на собеседование резко повышен по сравнению со «средней температурой по больнице» и потому-то FuzzBuzz на собеседовании имеет смысл…
Ну да, как можно нанимать человека, который делает модель без кросс-валидации и сразу ей показывает весь датасет и оверфитит.
интервьюер: Отлично, отлично. Как вы относитесь к написанию кода на доске?
я: Я только так код и пишу!
Порадовали, отличный пост!
А на точке
интервьюер: [смотрит на доску с минуту]
бедный интервьюер понял, что либо он идиот, либо его тролят )))
Выводы:
- Либо ищут человека способного рубить леса пилочкой для ногтей, везде лепят популярные решения, без понимания их ограничений и целевых задач
- Либо задача давалась для того что бы соискатель сказал пару ласковых интервьюеру, написал саму простую реализацию на питоне, и не пытался гнуть ель резинкой от трусов
и не пытался гнуть ель резинкой от трусов
Но согнул ведь! А победителей не судят.
Он мне так понравился, что я его Вам (и остальным хабравчанам) художественно перевёл
Ну и про дизайн велосипеда для слепых тоже отлично придумано (в самом низу, где про вентилятор):
http://thedailywtf.com/articles/Riddle-Me-An-Interview
seq 0 30 | sed -r 's/^(([0369]|[147][0369]*[258 ]|([258]|[147][0369]*[147])([0369]|[258][0369]*[147])*([147]|[258][0369]*[258]))*(([147]|[258][0369]*[258])([0369]|[147 ][0369]*[258])*5|0))$/\1\tFizzBuzz/; s/^(([0369]|[147][0369]*[258]|([258]|[147][0369]*[147])([0369]|[258][0369]*[147])* ([147]|[258][0369]*[258]))*)$/\1\tFizz/; s/^([0-9]*[05])$/\1\tBuzz/'
Где-то ошибка — должно быть 21 Fizz, а регулярка выводит просто 21.
sed (GNU sed) 4.2.2
seq 0 30 | sed -r 's/^(([0369]|[147][0369]*[258]|([258]|[147][0369]*[147])([0369]|[258][0369]*[147])*([147]|[258][0369]*[258]))*(([147]|[258][0369]*[258])([0369]|[147][0369]*[258])*5|0))$/\1\tFizzBuzz/; s/^(([0369]|[147][0369]*[258]|([258]|[147][0369]*[147])([0369]|[258][0369]*[147])*([147]|[258][0369]*[258]))*)$/\1\tFizz/; s/^([0-9]*[05])$/\1\tBuzz/'
это должно работать
А вот тут проблема: а почему числа от 1 до 100 должны генериться? А как же постулат о атомарности и сохранности данных? По хорошему, эту последовательность лучше хранить в таблице базы данных. Соответственно, на доске надо бы еще привести скрипты для генерации таблицы. А для чего? Ну для SQL Server конечно, мы ж взрослы люди, в конце концов. Но мы же в 2016-ом? Поэтому нужна человеческие вьюшка. А куда ж без нее? Затем, раз мы все уж храним в базе, то автору б не мешало все его коды оформить в виде CLR модуля, написать команду компиляции оного куда? В какую-то dll, наверное. Дальше на доске скрипты разрешения CLR, подключения dll. Ну и конечно, создать пользовательские функцией с вызовом всего обвяза из ранее подключенной сборки (обучение, выводы — вот это все). И только потом, как написал коллега выше — go, nodejs и микросервисы.
Где это всё, автор? Почему архитектуру не продумал? Почему сразу стал код писать? Что это? Вопиющая некомпетентность? Спешка? Слабость характера?
Правильно сделали, что не взяли.
;)
Собственно говоря одна из причин, почему в России не могут решить проблемы с импортозамещением или проще — осуществить новую ре — индустриализацию, состоит как раз в том, что в стране тех. специалистов (согласно статистике) только 10%, при этом специалистов занимающихся железом возможно сотые доли процента среди всех специалистов…
При этом сама конструкция перцептрона вызывает сомнение. На вход нет нужды подавать весь этот мусор. Это создает лишние шумы. Лучше подавать сразу остаток от деления на 3 и 5. Только 2 инпута.
Ну и использовать softmax тоже нет нужды. Он хорош для multi-class аутпута. А это не тот случай. Правильнее было бы просто linear.
Может тогда взяли бы на работу? А точность уж наверняка была бы 100% :)
for (int i = 1; i < 101; i++)
{
Console.WriteLine((«fizzbuzz» + i.ToString())
.Replace((i%3 != 0)? «fizz»: i.ToString(), "")
.Replace((i%5 != 0)? «buzz»: i.ToString(), ""));
}
Мопед не мой, попросили разместить)))
FizzBuzz на TensorFlow