Pull to refresh

Comments 140

Надо было делать на brainfuck. Тогда бы взяли

Идея fizz buzz — проверить умение логически мыслить и читать тело задачи.
Задача решается в два 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()
Попробуйте честно решить
Вангую, что вам опять посыпятся минусы, но вместо этого я встречно предложу вам решить эту задачку вообще без проб, проверок и условий. Раз уж вы так настаиваете. Попробуйте честно решить (С).
алгоритм под спойлером :)
Заводим мутабельный массив, заполняем числами, потом пробегаемся по нему с 3 с шагом 3 — пишем в значение элемента физз, вторая пробежка — с 5 с шагом 5 — пишем базз, третья — с 15 с шагом 15 — пишем физзбазз.
ЗЫ и похоже, ваш алгоритм как и у героя статьи, тоже эвристический :)
Example output:
… 6 ....
Формально будут проверки на выход из цикла. Ну и третья пробежка излишняя, если инициировать значения пустой строкой, а на второй и третьей не устанавливать новые значения, а конкатенировать с имеющимися.
Если заполнять пустой строкой, то потом все равно придется делать проверку — на пустоту строки, и выводить индекс. А у нас надо же без проверок :) Ну, кроме проверки на прекращение цикла — но ее и постановщик ограничений за проверку не считает. А так, я уже под впечатлением от обсуждения создал тему на одном форуме — с ограничениями без единого if, switch / case, тернарного оператора, любых циклов for, while, do, goto, foreach и прочих функциональных мапов, фолдов и фильтров (допустим, на С++) — решить эту задачку.
print(«1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz ...»);
так сойдет?

Хм, а если делать на шаблонах? Работа компилятора считается? =)

Чуть упростил принтер https://gist.github.com/k06a/f3cbc6533dec54bb301a880c8f231aa4

а я тряхнул стариной и зафигачил на дефайнах, раскрывающихся в сто тернарных операторов (каждый из которых может быть вычислен компилятором): http://codepad.org/5t1na6Rs

UFO just landed and posted this here
я встречно предложу вам решить эту задачку вообще без проб, проверок и условий.
Так если уж есть переменная цикла («пробегаемся»), то можно в теле цикла посчитать 3-4 производных (от неё) индекса.
let a = [];
for(let i = 0; i < 105; i++){
  a[i] = i;
  a[i*3%102] = 'fizz';
  a[i*5%105] = 'buzz';
  a[i*15%90] = 'fizzbuzz';
}
console.log(a.slice(1,101));
// Могу решить вообще без if-else!

// Достаточно подготовить массив и обращаться по индексу.

#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». Необходимо только на вход подавать целое число больше нуля.
Чуть позже дошло что нужно в первом присваивании получать сразу строку из массива для того чтобы второй раз по массиву не елозить.
*
string s=a[n%15];
if(s==«num») then return string(n);
else return s;
*

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

пост совсем не о том, как решать FizzBuzz. Вообще.

Это-то понятно, но дело в том, что настоящий программист просто физически не способен пройти мимо интересной задачи!

Без if

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;
  }
По-моему тут куда лучше было бы условие написать честно, i%3 == 0. Читаемость значительно повысится, а символов печатать всего на два пробела больше.
Да вообще эти сишные хаки в стиле «я знаю, что 0 это тоже самое, что NULL и тоже самое что false» — раздражают. if тестирует условие, так будьте добры — пишите в if условия!

Верно. Просто сначала написал i%3, а потом изменил на противоположное условие и добавил !. Вот и вышло не очень красиво

Задача давалась Джоном Холландом отцом генетических алгоритмов, в 70-х годах.

Ключевой момент вашего решения — операция 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.
Ну у нас максимум два if. Задача Холланда, не моя.
максимум два раза можно узнать результат — это значит пробу сделать.
if (i mod 3 = 0) — опробировали 1 раз
if (i mod 3 = 0 && i mod 5 = 0) — опробировали 1 раз.
Результат первой пробы можно использовать во второй пробе.
но результат первой пробы — надо сохранить в переменную, разве нет?
И как вы с такими if отличите fizz от fizzbuzz?
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 == 3:
>…
> i mod 3 = 0 && i mod 5 = 0 == true

это неверно
Действительно. Там же &&, а не || — перепутал.
Тогда тот же вопрос про n vs buzz: 2 — false, false; 5 — false, false. Суть не изменилась.
Ну да, автор комментария показывал пример того, что он понимает под двумя if-ами, он не предлагал рабочее решение для задачи.
Я подозреваю, что в задаче подразумевается ответ «решения нет», который доказывается как-нибудь через то, что у нас грубо говоря есть только три листа в дереве ветвлений, а надо четыре. Но задачу надо очень сильно формализовать, чтобы убить всякие решения с масками, индексами в массивы итд.
На самом деле gena_glot просто несет что-то странное. Выше решение с 2 if привели. Убрать из него изменяемые переменные — задача чисто механическая (просто понадобится переменная s2): тыц, тыц.
if (i mod 3 = 0) — fizz
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))
    }
  }
}
очень плохой ответ. Элегантный, хакерский, но такой код должен идти с нормальным текстом в комментарии и объяснении, зачем был выбран такой сложный алгоритм
Можно добавить один if чтобы не выводить пустые строки, и сократить массив.
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)

К тому же, небольшая оптимизация работы с памятью — использование генератора. Если задача — тест для приема на работу… Думаю, это будет неплохим дополнением к такой реализации.

О, совсем забыл — в скале нет имплиситных конвертаций булеана в инт. Не С++ все же.

C 1 if'ом можно вообще без хитрых алгоритмов:

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

Я принят? ;)
Или будет следующий этап — отказаться от массивов? Мы играем в игру "найди мое решение", а она мне не нравится, особенно в программировании.

идея fizz buzz прежде всего в том, что бы проверить, способен ли программист услышать менеджера и сделать минимально и достаточно необходимое количество действий, что бы решить задачу так, как его попросили. Без tensorflow.

На fizzbuzz как раз всплывают такие случаи, когда человек вместо двух аккуратных ифов, которые он делает с первого раза, возникают монстры типа нейросети.

Но статья очень смешная.
А если человека берут работать с нейросетями? Тогда логично ведь делать описанным в статье способом.
Даже если человека берут работать с нейросетями, ему придётся решать вот такие физзбаззы, а человек, который на такие физзбаззы будет городить нейросети, нахрен не нужен.
Проблема в том, что статья-то совсем не про физзбазз, это такое введение в тензорфлоу. Да и вообще-то задачка-то нужна только для того, чтобы выяснить умеет ли человек код писать.
и вообще-то задачка-то нужна только для того, чтобы выяснить умеет ли человек код писать.

Вспомнилось:


Мужик в лесу заблудился, орёт "Ау! Ау!"
Подходит медведь: "Мужик, чего орешь?"
Мужик: "Заблудился, может кто услышит."
Медведь: "Ну я услышал. Тебе легче стало?"

Человек явно умеет решать задачи при помощи TensorFlow. Вам легче стало? ;)

Без go, nodejs и микросервисов — не тру ;)
Это была великолепная статья. Чаще бы такое попадалось:(
Правильно, что не взяли на работу — требовался детерминированный алгоритм, а не эвристика, которая в результате ошиблась :)
на js в одну строку
for(let s, i = 0; i < 100; i++) s = '', (i % 3 || (s += 'Fizz')), (i % 5 || (s += 'Buzz')), console.log(s || i);

и незачем мудрить
У вас он с нуля считает ;)
Статья кстати была не про это, в интернете и так вариантов куча, от красивых до производительных.
нужно напечатать числа от 1 до 100

Вы пробелы убрать забыли.

Ваш код не соответствует вашему же призыву ("и незачем мудрить").

Раз уж на то пошло, то почему бы и нет…
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++ однострочник, но там настоящий ужас
И да, у вас тело на одной строке с условием цикла — это не совсем кошерный однострочник
Не, на самом деле герой статьи молодец :) За мой опыт устройства на работу меня тоже далеко не во все места брали, но как я потом радовался, что меня не взяли в те места! Если это реальная история, то все закончилось лучшим исходом — и для героя, и для компании :)
UFO just landed and posted this here
Правда, но не совсем. Тут немного другое. Не «покажи интервьюеру, что он ламер», а «покажи интервьюеру, что ты на него плевать хотел».

Я пару раз встречался с людьми, которые обнаруживали ошибки и неточности в моих вопросах и задачах. Было неудобно, да, но на оценку и шансы принятия на работу это влияет только положительно.

А вот когда кандидат сознательно манкирует вопросами интервьюера и вместо решения задачи, о которой его просили, демонстрирует какой он умный и хороший, но не порождает решения, которого от него ждут… это чистый «No Hire».

Ну представьте себе: вы приняли такого на работу, попросили написать что-нибудь… ну мелочь какую-нибудь, но такую, без которой у вас убытков на миллионы, а он вместо этого проделал массу бессмысленной работы, но задачу не решил и в убытки вы таки влетели… зачем оно вам?

ИМХО давать FizzBuzz на интервью — это дурной тон. Ещё б спросили сколько настройщиков пианино в мире.

Вы недооцениваете количество людей, которые эту задачу не решат. В моей практике собеседований сложные вопросы просто не нужны — достаточно послушать, что кандидат расскажет про свой проект и поспрашивать основы + простейшие задачки типа "найти максимальную глубину двоичного дерева".

Во первых, вопрос в том, на какую позицию интервью. Одно дело джуниор, другое — миддл или сениор.
Во вторых, я имел ввиду не сложность задачи, а её разрекламированность. Ну серьёно, о FizzBuzz знают все. Имейте совесть придумать аналогичную простую задачу если это то, что вам нужно. Сам факт вопроса "вам знакома задача "fizz buzz"?" означает, что интервьюер ожидает, что задача мне знакома.

Сам факт вопроса «вам знакома задача „fizz buzz“?» означает, что интервьюер ожидает, что задача мне знакома.
И что? Вам теперь сложно её написать?

Задача может быть сколько угодно «широко разрекламированной», но даже при всём при этом соискатели, в большинстве своём — неспособны её написать. Вы можете? Отлично — возьмите и напишите, а не ломайте комедию.

Во первых, вопрос в том, на какую позицию интервью. Одно дело джуниор, другое — миддл или сениор.
Вот как раз для сениора — эта задачка в самый раз.

Ибо встречал я таких «сениоров»: могут часами песни петь про всякие разные супер-пупер технологии (я и словей-то таких не знаю), рассказывать как у них команда «бороздит просторы Большого театра»… написать FuzzBuzz — не могут. Вот никак.

Обычно дальнейший разговор показывает, что человек последние N лет код не пишет от слова совсем и только «руководит проектами». Ну и на что он претендует, пытаясь устроиться на инженерную должность? Что? У нас не было вакансий «чистого менеджера?»… Действительно не было — потому что подобных должностей у нас нет, извините.

P.S. Я был бы счастлив перенестись как-нибудь ночью в мир где FuzzBuzz на собеседовании реально смысла не имеет ибо все соискатели способны его написать за 2 минуты. В нашем, реальном, мире — всё не так. Увы.
И что? Вам теперь сложно её написать?

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


Вот как раз для сениора — эта задачка в самый раз.

Так дайте ему сложную задачу. Кто не разбирается — одинаково обе не решит.

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


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

Но я ожидаю задачи своего уровня на собеседовании.

Это вы знаете свой уровень (думаете, что знаете). Его задача — объективно его выяснить/проверить. Поэтому начинается от простого к сложному. Можно и наоборот, можно и методом дихотомии, не суть важно.

Нет, его задача не выяснить мой уровень, а проверить, соответствует ли он должности, на которую я претендую. Если нужен доктор математики, нет смысла начинать с 7*8. Тем более, что доктор математики может в уме и не посчитать :)

Нет, его задача не выяснить мой уровень, а проверить, соответствует ли он должности, на которую я претендую


Его задача — объективно его выяснить/проверить

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

Если нужен доктор математики, нет смысла начинать с 7*8.

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

Никто и не спорит. Я только говорю, что


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

и


Разработчики особенно толковые, могут позволить себе выбирать. И издеваясь так над интервьюером человек обычно отдает себе отчёт, что это no hire.
Я дизайнер интерфейсов и могу написать FizzBuzz (go):

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 на собеседовании имеет смысл…
Вы много людей собеседовали? Я вот достаточно, и обычно как раз миддл и сеньор. Минимум две трети людей, прошедших даже через скайп интервтью, на очном такую задачу адекватно решить не могут. Серьёзно, об этой задаче знает подавляюще малое число миддлов даже. И если человек не понимает, почему его такое спрашивает и начинает строить сильно умного — это no hire, неумение общаться. Нам с ним не по пути (по крайней мере, в крупных и уважаемых компаниях ему врядли работать).

Я собеседования только проходил.
Разработчики особенно толковые, могут позволить себе выбирать. И издеваясь так над интервьюером человек обычно отдает себе отчёт, что это no hire.

А общаться-то придется. Это же найм в команду, а не интервью фрилансера с сами собой перед зеркалом.
Не люблю эту задачу. Зато у меня тоже есть свое «аналогичное решение» — на SQL…
Интересная статья! О том как нужно ввести себя, если компания разочаровала:)
UFO just landed and posted this here

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

Да и вообще: нужно было обогатить тестовые данные остатками от деления на 3 и 5 да делать решающее дерево. Работать быстрее будет! Ох уж эти любители перцептронов…
Уоу уоу, полегче! Он тренирует на 101-1024, а тестирует на 1-100. Как можно оферфититься на примеры, которые никогда не видел?

О, кто-то прочитал внимательно, круто!

За это отдельное спасибо:
интервьюер: Отлично, отлично. Как вы относитесь к написанию кода на доске?
я: Я только так код и пишу!

Порадовали, отличный пост!
А на точке
интервьюер: [смотрит на доску с минуту]

бедный интервьюер понял, что либо он идиот, либо его тролят )))
Если кто не понял, эта замечательная статья — про введение в TensorFlow, а не про то, на каком языке круче писать FizzBuzz'ы.
Странно что я не заметил у статьи тега «Юмор».
Да, он необходим.
Так же как закадровый смех в американских ситкомах.
А то непонятно, что пост — это сарказм
Я оценил Ваш сарказм.
Тег — это не указатель на эмоции, какие должен вызывать пост, а инструмент поиска и организации.

Выводы:


  • Либо ищут человека способного рубить леса пилочкой для ногтей, везде лепят популярные решения, без понимания их ограничений и целевых задач
  • Либо задача давалась для того что бы соискатель сказал пару ласковых интервьюеру, написал саму простую реализацию на питоне, и не пытался гнуть ель резинкой от трусов
и не пытался гнуть ель резинкой от трусов

Но согнул ведь! А победителей не судят.

Не согнул, его алгоритм ошибался.

Это не NP полная задача, соответственно нейросети — неуместны.

Сеть недостаточно натренировалась, чо. :)

Вывод здесь другой совершенно. А именно — ещё никогда не было так просто замутить нейронную сеть…
Спасибо, автор! Возьму на вооружение. А то реально бесит, когда суют всякие олимпиадно-школьные задачки на интервью (не смотря на то, на какую позицию ты идешь).
Начало было замечательным. Но видимо интервьюер расколол любителя нейросетей, найдя у него ошибку)
UFO just landed and posted this here
Старая шутка про программиста, проблему и регулярные выражения обретает новое дыхание с появлением TensorFlow.
Впрочем, до Нильса Бора, измеряющего высоту дома барометром, всё равно далеко.

Во-первых не Бор, а Паскаль. Во-вторых — метод до сих пор много где применяется (навскидку — авиация, измерение глубины пещер).

Неправильно понял, что имел ввиду forgotten. Спасибо, это кошернее чем просто барометрическое нивелирование ,)

ты вдохновил меня написать fizzbuzz на регулярных выражениях :) (см ниже)
и все же… для не умеющих сходу решать задачу в два if(готов яростно ловить минусы, но я не кодер от природы) статья была про красивый троллинг или про ксрасивый кейс нейросети?
Сразу вспоминается поговорка «Когда у тебя есть только молоток, все похоже на гвоздь» :)
Вот еще мне нравится интервью с кандидатом на должность бизнес-аналитика о том, как передвинуть гору Фудзи: https://angryaussie.wordpress.com/2007/11/01/pointless-interview-questions/

Ну и про дизайн велосипеда для слепых тоже отлично придумано (в самом низу, где про вентилятор):
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

А вот тут проблема: а почему числа от 1 до 100 должны генериться? А как же постулат о атомарности и сохранности данных? По хорошему, эту последовательность лучше хранить в таблице базы данных. Соответственно, на доске надо бы еще привести скрипты для генерации таблицы. А для чего? Ну для SQL Server конечно, мы ж взрослы люди, в конце концов. Но мы же в 2016-ом? Поэтому нужна человеческие вьюшка. А куда ж без нее? Затем, раз мы все уж храним в базе, то автору б не мешало все его коды оформить в виде CLR модуля, написать команду компиляции оного куда? В какую-то dll, наверное. Дальше на доске скрипты разрешения CLR, подключения dll. Ну и конечно, создать пользовательские функцией с вызовом всего обвяза из ранее подключенной сборки (обучение, выводы — вот это все). И только потом, как написал коллега выше — go, nodejs и микросервисы.

Где это всё, автор? Почему архитектуру не продумал? Почему сразу стал код писать? Что это? Вопиющая некомпетентность? Спешка? Слабость характера?

Правильно сделали, что не взяли.

;)
проблема в том, что на РЕАЛЬНОМ производстве, к которому интернет имеет косвенное отношение и задачи там совсем другие, проблем в том, что там такие вопросы для школьников не задают, так ценятся люди совсем другие — умеющие проектировать и реализовывать до уровня железа стенды, системы управления оборудованием и т.д.

Собственно говоря одна из причин, почему в России не могут решить проблемы с импортозамещением или проще — осуществить новую ре — индустриализацию, состоит как раз в том, что в стране тех. специалистов (согласно статистике) только 10%, при этом специалистов занимающихся железом возможно сотые доли процента среди всех специалистов…
Даже такой замудреный вариант решения задачи — через перцептрон, можно было решить куда проще — в первую очередь используя используя sklearn, вместо tensorflow. Он лаконичнее решает простые задачи по машинному обучению.

При этом сама конструкция перцептрона вызывает сомнение. На вход нет нужды подавать весь этот мусор. Это создает лишние шумы. Лучше подавать сразу остаток от деления на 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(), ""));
}

Мопед не мой, попросили разместить)))
Правильно не взяли, он неправильно использует инструмент. 100 слоев на такой маленькой выборке не обучить. При том, что деление на пять тривиально проверяется двухслойной сеткой, да и деление на три наверняка можно сделать при помощи двухслойной-трехслойной рекуррентной сети.
Где Вы 100 слоёв усмотрели? Скрытый слой там всего один. Если речь про нейроны, то мне не очевидно, как в 2 нейрона проверить число в двоичной записи на делимость на 5 или 3.
Да, вы правы. Читать не умею, прочитал толщину слоя 100 как 100 слоев.
Нет, не в два нейрона, а в два слоя, конечно. В два нейрона не выйдет, вероятно.
осознал, что не пособен быть программистом, даже если бы из кожи вон вылез. грёбаный гуманитарий (
Sign up to leave a comment.

Articles