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 1C:Бухгалтерия Россия Абонемент ($m)

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

1 стартмани

30.01.2024    11988    stopa85    12    

42

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

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

19.10.2023    18915    user1959478    57    

39

Математика и алгоритмы Разное 1С v8.3 1C:Бухгалтерия Россия Абонемент ($m)

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

2 стартмани

29.09.2023    11485    maksa2005    8    

27

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

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

1 стартмани

09.06.2023    18949    11    SpaceOfMyHead    20    

64

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

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

03.04.2023    12983    RustIG    9    

30

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

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

23.11.2022    12081    gzharkoj    15    

27

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

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

1 стартмани

21.03.2022    11157    8    kalyaka    11    

45

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

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

16.12.2021    14240    fishca    12    

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

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

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

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

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

Функция Делители()
	СписокШиндлера = Новый СписокЗначений;
	СписокШиндлера.Добавить(15, "FizzBuzz");
	СписокШиндлера.Добавить(3, "Fizz");
	СписокШиндлера.Добавить(5, "Buzz");
	Возврат СписокШиндлера;
КонецФункции
Показать
eden_gmail; +1 1 Ответить
6. Fox-trot 166 24.07.19 20:50 Сейчас в теме
(4) создано по феншую :-) проще для сопровождения, к примеру ежели внезапно надо добавить еще и 7
user720385; +1 Ответить
5. Serj1C 484 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 8041 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 174 25.07.19 21:59 Сейчас в теме
(12)
Сообщить(?(ё % 15, "FizzBuzz", ..

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

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