FizzBuzz на 1С. Чем короче, тем веселее. Варианты принимаются...

24.07.19

Разработка - Математика и алгоритмы

Мне было скучно, я не мог себя заставить написать ничего полезного. И читал статью на Хабре. Потом я читал комментарии, а потом... нет я не ушел смотреть котиков на ютюбе. Я решил сделать несколько решений задачки FizzBuzz на 1С, с целью "чем короче, тем лучше". Прошу сильно не пинать, это просто развлечение для вечера.

Пояснение

Кто не знает, не помнит, вот содержание задачи.

Напишите программу, которая выводит на экран числа от 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 решил восполнить пробел.

Прошу ногами не пинать, помидорами не закидывать. Хотите свою интерпретацию - в комментарии. Будет интересно почитать.

См. также

Математика и алгоритмы Программист Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    3162    stopa85    12    

38

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    7550    user1959478    51    

36

Математика и алгоритмы Разное Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3107    maksa2005    8    

26

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    10902    7    SpaceOfMyHead    18    

61

Математика и алгоритмы Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    4357    RustIG    9    

25

Механизмы платформы 1С Математика и алгоритмы Программист Платформа 1С v8.3 Россия Бесплатно (free)

В статье анализируются средства платформы для решения системы линейных уравнений в 1С. Приводятся доводы в пользу некорректной работы встроенных алгоритмов, а значит потенциально некорректного расчета себестоимости в типовых конфигурациях.

23.11.2022    3527    gzharkoj    14    

25

Математика и алгоритмы Программист Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    9041    7    kalyaka    11    

44
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. VmvLer 24.07.19 12:51 Сейчас в теме
после обеда, да в жару не рационально пинать ногами, а так бы я с большим удовольствием это сделал)
2. chipazawra 24.07.19 12:53 Сейчас в теме
Вот так еще минус 1.

Сообщить(?(Индекс%15 = 0, "FizzBuzz",
?(Индекс%3 = 0, "Fizz",
?(Индекс%5 = 0, "Buzz",
Формат(Индекс, "ЧГ=")))));
3. chipazawra 24.07.19 12:59 Сейчас в теме
Один оператор )
Кто меньше ?.
Сообщить("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");
DrAku1a; Hatson; nixel; Tavalik; PowerBoy; Shamil Kulahmetov; JohnyDeath; +7 Ответить
17. Hatson 536 03.02.21 12:29 Сейчас в теме
Так же просто решил задачу генерации случайных чисел , написал простую функцию

Функция ПолучитьСлучайноеЧисло()

    Возврат 133; // это случайное число, я проверял!

КонецФункции

(3)
4. Fox-trot 163 24.07.19 13:13 Сейчас в теме
(0)
Процедура ПриНачалеРаботыСистемы()
	СписокШиндлера = Делители();
	Для Индекс = 1 По 100 Цикл
		Вывод = Формат(Индекс, "ЧГ=0");
		Для Каждого Шаг Из СписокШиндлера Цикл
			Если Индекс % Шаг.Значение = 0 Тогда
				Вывод = Шаг.Представление;
				Прервать;
			КонецЕсли;
		КонецЦикла;
		Сообщить(Вывод);
	КонецЦикла;
КонецПроцедуры

Функция Делители()
	СписокШиндлера = Новый СписокЗначений;
	СписокШиндлера.Добавить(15, "FizzBuzz");
	СписокШиндлера.Добавить(3, "Fizz");
	СписокШиндлера.Добавить(5, "Buzz");
	Возврат СписокШиндлера;
КонецФункции
Показать
eden_gmail; +1 1 Ответить
6. Fox-trot 163 24.07.19 20:50 Сейчас в теме
(4) создано по феншую :-) проще для сопровождения, к примеру ежели внезапно надо добавить еще и 7
user720385; +1 Ответить
5. Serj1C 483 24.07.19 20:33 Сейчас в теме
Оооо! Из отпуска вернусь, обязательно напишу вариант)
7. Неопределено 91 25.07.19 05:42 Сейчас в теме
Для Счетчик = 1 по 100 Цикл
    fizz = (Счетчик % 3 = 0);
    buzz = (Счетчик % 5 = 0);
    Если (fizz или buzz) Тогда
        Сообщить(?(fizz, "Fizz", "") +?(buzz , "Buzz ", ""));
    Иначе
        Сообщить(Счетчик);
    КонецЕсли;
КонецЦикла;
Показать
8. Stref75 25.07.19 07:41 Сейчас в теме
    т=1;
    п=1;
    Для й=1 По 100 Цикл
        Сообщить(?(т=3 и п=5, "ФуззБузз", ?(т=3, "Фузз", ?(п=5, "Буз", й))));
        т=?(т=3, 1, т+1);    		
        п=?(п=5, 1, п+1);
    КонецЦикла; 
vandalsvq; +1 Ответить
9. muskul 25.07.19 10:19 Сейчас в теме
Через запрос же надо )
user720385; acanta; +2 Ответить
14. Неопределено 91 26.07.19 07:34 Сейчас в теме
(9)
"ВЫБРАТЬ
|	0 КАК Числа
|ПОМЕСТИТЬ РядЧисел
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|	1
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|	2
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|	3
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|	4
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|	5
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|	6
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|	7
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|	8
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|	9
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	РядЧисел1.Числа * 10 + РядЧисел.Числа + 1 КАК Число
|ПОМЕСТИТЬ ВТ_Числа
|ИЗ
|	РядЧисел КАК РядЧисел,
|	РядЧисел КАК РядЧисел1
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ВЫБОР
|		КОГДА ВТ_Числа.Число - (ВЫРАЗИТЬ(ВТ_Числа.Число / 15 КАК ЧИСЛО(3, 0))) * 15 = 0
|			ТОГДА ""FizzBuzz""
|		ИНАЧЕ ВЫБОР
|				КОГДА ВТ_Числа.Число - (ВЫРАЗИТЬ(ВТ_Числа.Число / 5 КАК ЧИСЛО(3, 0))) * 5 = 0
|					ТОГДА ""Buzz""
|				ИНАЧЕ ВЫБОР
|						КОГДА ВТ_Числа.Число - (ВЫРАЗИТЬ(ВТ_Числа.Число / 3 КАК ЧИСЛО(3, 0))) * 3 = 0
|							ТОГДА ""Fizz""
|						ИНАЧЕ ВТ_Числа.Число
|					КОНЕЦ
|			КОНЕЦ
|	КОНЕЦ КАК Результат
|ИЗ
|	ВТ_Числа КАК ВТ_Числа";
Показать
user1537184; +1 Ответить
10. targetis_ru 25.07.19 11:39 Сейчас в теме
	// Массив из 15 значений для остатка от деления на 15.
	// Так как остаток от деления 15,30,45... на 15 равун нулю то первым элементом ставим FizzBuzz.
	Мас15 = СтрРазделить("FIzzBuzz,,,Fizz,,Buzz,Fizz,,,Fizz,Buzz,,Fizz,,",",",Ложь);
	
	Для Н = 1 По 100 Цикл
		Врем = Мас15[Н % 15];
		Сообщить(?(ЗначениеЗаполнено(Врем),Врем,Н));
	КонецЦикла;

Показать
lelbraun; +1 Ответить
11. acanta 25.07.19 12:13 Сейчас в теме
Замеры на каждом варианте?
12. ildarovich 7930 25.07.19 13:01 Сейчас в теме
Вот еще вариант
Для ё = 1 По 100 Цикл		
	Сообщить(Сред("FizzBuzz" + ё, ?(ё % 3, ?(ё % 5, 9, 5), 1), ?(ё % 15, 4, 8)))		
КонецЦикла

Но Вариант 4, записанный в таком стиле, еще короче
Для ё = 1 По 100 Цикл		
	Сообщить(?(ё % 15, "FizzBuzz", ?(ё % 5, "Fizz", ?(ё % 3, "Buzz", ё)))		
КонецЦикла
Так что пока вывод, что короче, чем Вариант 4 решить эту задачу нельзя(((
Serg O.; vandalsvq; +2 Ответить
13. pm74 203 25.07.19 21:59 Сейчас в теме
(12)
Сообщить(?(ё % 15, "FizzBuzz", ..

все таки ?(ё % 15=0 или ?(не ё % 15
Для ё = 1 По 100 Цикл 
 Сообщить(?( ё % 5=0, "Fizz","")+ ?(ё % 3=0, "Buzz","")+?(ё % 3*ё % 5, ё,""));
КонецЦикла;
15. Serj1C 483 02.08.19 14:01 Сейчас в теме
(12)
Немного короче:
Для ё = 1 по 100 Цикл
	Сообщить(?(ё%3*ё%5, ё, ?(ё%3, "", "Fizz")+?(ё%5, "", "Buzz")));
КонецЦикла;
user1537184; ivv1970; ildarovich; Sashares; +4 Ответить
16. Serj1C 483 02.08.19 14:06 Сейчас в теме
(15) И еще пару байт можно срезать, используя английские синонимы:
Для ё = 1 по 100 Do
	Message(?(ё%3*ё%5, ё, ?(ё%3, "", "Fizz")+?(ё%5, "", "Buzz")))
EndDo
18. artbear 1563 03.02.21 12:32 Сейчас в теме
(0) На хабре появилась замечательная статья в продолжение этой темы
FizzBuzz по-сениорски https://habr.com/ru/post/540136/

у нас продолжение будет? )
zaic; ardn; +2 Ответить
19. vandalsvq 1587 03.02.21 23:46 Сейчас в теме
Оставьте свое сообщение