Прошу сильно не пинать, это просто развлечение для вечера.
Пояснение
Кто не знает, не помнит, вот содержание задачи.
Напишите программу, которая выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем, программа должна выводить слово «Fizz», а вместо чисел, кратных пяти — слово «Buzz». Если число кратно и 3, и 5, то программа должна выводить слово «FizzBuzz».
И так я сделал для себя 4 варианта.
Вариант 1 — в лоб
&НаКлиенте
Процедура Вариант1(Команда)
Для Индекс = 1 По 100 Цикл
Если Индекс % 15 = 0 Тогда
Т = "FizzBuzz";
ИначеЕсли Индекс % 3 = 0 Тогда
Т = "Fizz";
ИначеЕсли Индекс % 5 = 0 Тогда
Т = "Buzz";
Иначе
Т = Формат(Индекс, "ЧГ=");
КонецЕсли;
Сообщить(Т);
КонецЦикла;
КонецПроцедуры
Выглядит нормально, пишется за несколько секунд на бумажке ручкой, но занимает много строчек. Скучный вариант.
Вариант 2 — сократим ИначеЕсли
&НаКлиенте
Процедура Вариант2(Команда)
Для Индекс = 1 По 100 Цикл
Т = "";
Если Индекс%3 = 0 Тогда
Т = Т + "Fizz";
КонецЕсли;
Если Индекс%5 = 0 Тогда
Т = Т + "Buzz";
КонецЕсли;
Если ПустаяСтрока(Т) Тогда
Т = Формат(Индекс, "ЧГ=");
КонецЕсли;
Сообщить(Т);
КонецЦикла;
КонецПроцедуры
И тут я подумал, ведь FizzBuzz = Fizz + Buzz. А условие для FizzBuzz это %3*5. Ну значит берем и прибавляем к строке результат проверки условия на %3 и на %5. Если ничего нет — значит это число.
Вариант 3 — заменим Если на ?
&НаКлиенте
Процедура Вариант3(Команда)
Для Индекс = 1 По 100 Цикл
Т = ?(Индекс%3 = 0, "Fizz", "") + ?(Индекс%5 = 0, "Buzz", "");
Т = ?(ПустаяСтрока(Т), Формат(Индекс, "ЧГ="), Т);
ВывестиВЛог(Т);
КонецЦикла;
КонецПроцедуры
Ну это было как бы логичное продолжение. Убираем Если … КонецЕсли, меняем на тернарный оператор ? становится короче и лучше.
Вариант 4 — короче, не значит лучше
&НаКлиенте
Процедура Вариант4(Команда)
Для Индекс = 1 По 100 Цикл
Т = ?(Индекс%15 = 0, "FizzBuzz",
?(Индекс%3 = 0, "Fizz",
?(Индекс%5 = 0, "Buzz",
Формат(Индекс, "ЧГ="))));
Сообщить(Т);
КонецЦикла;
КонецПроцедуры
Ну тут мы вообще все свели к одной строке используя только тернарный оператор ?. Однако читаемость этой строки уменьшилась, понимание (имхо) тоже стало хуже. А подсчет закрывающих скобок может заставить нажать пару раз выполнение синтаксис-контроля.
Конец
Поскольку дальше мне стало скучно, отведенное время для развлечений закончилось и пора было идти спать, я решил что продолжать не буду. Мне хватит. Написал тест ко всем 4-м вариантам, прогнал и закрыл этот вопрос. Ну, а поскольку на Инфостарт не нашел упоминания про FizzBuzz решил восполнить пробел.
Прошу ногами не пинать, помидорами не закидывать. Хотите свою интерпретацию — в комментарии. Будет интересно почитать.
после обеда, да в жару не рационально пинать ногами, а так бы я с большим удовольствием это сделал)
Вот так еще минус 1.
Сообщить(?(Индекс%15 = 0, «FizzBuzz»,
?(Индекс%3 = 0, «Fizz»,
?(Индекс%5 = 0, «Buzz»,
Формат(Индекс, «ЧГ=»)))));
Один оператор )
Кто меньше ?.
Сообщить(«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»);
(0)
Показать
Оооо! Из отпуска вернусь, обязательно напишу вариант)
(4) создано по феншую 🙂 проще для сопровождения, к примеру ежели внезапно надо добавить еще и 7
Показать
Через запрос же надо )
Показать
Замеры на каждом варианте?
Вот еще вариант
Но Вариант 4, записанный в таком стиле, еще короче
Так что пока вывод, что короче, чем Вариант 4 решить эту задачу нельзя(((
(12)
все таки ?(ё % 15=0 или ?(не ё % 15
(9)
Показать
(12)
Немного короче:
(15) И еще пару байт можно срезать, используя английские синонимы: