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    1754    stopa85    12    

33

Алгоритм симплекс-метода для решения задачи раскроя

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

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

19.10.2023    4420    user1959478    50    

34

Регулярные выражения на 1С

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

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

1 стартмани

09.06.2023    7464    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

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

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

1 стартмани

21.03.2022    7855    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

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

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4446    fishca    13    

36

Интересная задача на Yandex cup 2021

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

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8839    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

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

31.08.2021    7806    dusha0020    8    

70
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 528 03.02.21 12:29 Сейчас в теме
Так же просто решил задачу генерации случайных чисел , написал простую функцию

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

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

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

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

Функция Делители()
	СписокШиндлера = Новый СписокЗначений;
	СписокШиндлера.Добавить(15, "FizzBuzz");
	СписокШиндлера.Добавить(3, "Fizz");
	СписокШиндлера.Добавить(5, "Buzz");
	Возврат СписокШиндлера;
КонецФункции
Показать
eden_gmail; +1 1 Ответить
6. Fox-trot 156 24.07.19 20:50 Сейчас в теме
(4) создано по феншую :-) проще для сопровождения, к примеру ежели внезапно надо добавить еще и 7
user720385; +1 Ответить
5. Serj1C 483 24.07.19 20:33 Сейчас в теме
Оооо! Из отпуска вернусь, обязательно напишу вариант)
7. Неопределено 90 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. Неопределено 90 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 7850 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 199 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 1448 03.02.21 12:32 Сейчас в теме
(0) На хабре появилась замечательная статья в продолжение этой темы
FizzBuzz по-сениорски https://habr.com/ru/post/540136/

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