Comments 13
я бы сделал проверку на ноль и убрал бы часть из формулы, мне лично одно ветвление кажется небольшой платой за сокращение вычислений.
на C# можно так:
string getRouletteColor(int color) =>
return n == 0 ? "Green" : (((int)(((n-1) % 18 + 1)/11) + n%2) % 2) == 0 ? "Black" : "Red";
0: Green
1: Red
2: Black
3: Red
4: Black
5: Red
6: Black
7: Red
8: Black
9: Red
10: Black
11: Black
12: Red
13: Black
14: Red
15: Black
16: Red
17: Black
18: Red
19: Red
20: Black
21: Red
22: Black
23: Red
24: Black
25: Red
26: Black
27: Red
28: Black
29: Black
30: Red
31: Black
32: Red
33: Black
34: Red
35: Black
36: Red
А еще можно написать в дипсик: "Напиши программу как бы ты решил эту задачу?"
Deepseek
Я бы решил эту задачу немного по-другому, чтобы сделать код более понятным и поддерживаемым. Вот мой вариант:
using System;
class RouletteColorPrinter
{
static void Main()
{
Console.WriteLine("Roulette numbers and their colors:");
Console.WriteLine("-----------------------------------");
for (int number = 0; number <= 36; number++)
{
string color = DetermineRouletteColor(number);
Console.WriteLine($"{number,2}: {color}");
}
}
static string DetermineRouletteColor(int number)
{
if (number == 0)
return "Green";
int group = (number - 1) / 18; // 0 for 1-18, 1 for 19-36
int positionInGroup = (number - 1) % 18 + 1;
bool isFirstHalfOfGroup = positionInGroup <= 9;
bool isEven = number % 2 == 0;
// Определяем цвет на основе положения в группе и чётности
return (isFirstHalfOfGroup == isEven) ? "Red" : "Black";
}
}
Ключевые отличия моего решения:
Более понятное именование:
DetermineRouletteColor
вместоgetRouletteColor
number
вместоn
илиcolor
Осмысленные имена промежуточных переменных
Логика разбита на понятные шаги:
Сначала определяем группу числа (1-18 или 19-36)
Затем позицию в группе
Проверяем, в первой ли половине группы находится число
Проверяем чётность
Более читаемая логика определения цвета:
Вместо сложной формулы с несколькими операциями использую логические сравнения
Правило: если число находится в первой половине группы и чётное ИЛИ во второй половине и нечётное → Красное, иначе Чёрное
Улучшенный вывод:
Заголовок для ясности
Форматирование чисел с выравниванием
Разделительная линия
Отсутствие "магических чисел":
Все константы (18, 9) логически вытекают из структуры рулетки
Такой код легче понимать, отлаживать и модифицировать в будущем, хотя он и делает то же самое, что и оригинальная формула.
еще попросил гигачат написать с нуля:
Давай упростим решение, убрав лишние проверки и применяя одну простую формулу, которая определяет цвет ячейки на основании её номера. Вот оптимизированная версия без операторов if
и лишних проверок:
public string GetRouletteColor(int number)
{
if (number == 0) return "Зелёный";
return ((((number - 1) % 18) < 10) ^ ((number % 2) == 0)) ? "Красное" : "Чёрное";
}
Объяснение формулы:
Формула
(number - 1) % 18
:Вычисляет остаток от деления уменьшенного на единицу номера ячейки на 18. Это помогает разбить диапазон ячеек (1–36) на две группы по 18 элементов каждая.
Например, числа от 1 до 18 будут иметь остатки от 0 до 17, а числа от 19 до 36 — снова от 0 до 17.
Проверка условия
< 10
:Используется для разделения каждой половины на красные и черные ячейки. Первые десять клеток первой и второй половинок окрашены красным, остальные — черным.
Операция XOR (
^
):Применяется для того, чтобы изменить порядок окраски между первой половиной (1–18) и второй половиной (19–36). Таким образом, чётные и нечётные номера правильно распределяются по красному и чёрному цвету.
Результат вычисления будет однозначно определять цвет каждого номера без избыточных условий и циклов.
Так что эта реализация делает решение компактнее и эффективнее, сокращая количество ветвлений программы.
Ага, я так изначально и сделал. Действительно проще 0 (и еще 00 в американской) просто по умолчанию красить в зеленый. Просто для статьи захотелось охватить все случаи)
Любопытно. Даже не задумывался, как они раскрашены.
Для полноты картины не хватает только теста, что и насколько быстрее работает: условия или такая формула.
А мне кажется, что это идеальная задача проверяющая способность кандидата набросать маааленькую нейросеть.
Смотрим самый последний код в статье
Использование в коде python
Делаем в нём color_name от 0 до 36 и выкидываем формулу вообще!
Шутка, если что... :)
спросил нейросетку, поржал
color = "зеленый" if n == 0 else ("красный" if n in [1, 3, 5, 7, 9, 12, 14, 16, 18, 19, 21, 23, 25, 27, 30, 32, 34, 36] else "черный")
color = {"З":"зеленый","К":"красный","Ч":"черный"}["ЗКЧКЧКЧКЧКЧЧКЧКЧКЧККЧКЧКЧКЧКЧЧКЧКЧКЧК"[n]]
color = (["⬛","🟥"][(457007909941>>(n-1))&1],"🟩")[n==0]
color = "🟩⬛🟥"[(n>0)*(((457007909941>>(n-1))&1)+1)]
color = n?`⬛🟥`[(457007909941>>--n)&1]:`🟩`
все python, последняя js
не проверял
uint64_t color = ((0x154AAD52AAul >> pos) & 1) + ((0xFFFFFFFFFFFFFFFEul >> pos) & 1);
Должно возвращать (если не ошибся с битовой маской): 0 - Зелёный, 1 - Чёрный, 2 - Красный.
Как одной математической формулой определить цвет ячейки на рулетке?