Search
Write a publication
Pull to refresh

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";
    }
}

Ключевые отличия моего решения:

  1. Более понятное именование:

    • DetermineRouletteColor вместо getRouletteColor

    • number вместо n или color

    • Осмысленные имена промежуточных переменных

  2. Логика разбита на понятные шаги:

    • Сначала определяем группу числа (1-18 или 19-36)

    • Затем позицию в группе

    • Проверяем, в первой ли половине группы находится число

    • Проверяем чётность

  3. Более читаемая логика определения цвета:

    • Вместо сложной формулы с несколькими операциями использую логические сравнения

    • Правило: если число находится в первой половине группы и чётное ИЛИ во второй половине и нечётное → Красное, иначе Чёрное

  4. Улучшенный вывод:

    • Заголовок для ясности

    • Форматирование чисел с выравниванием

    • Разделительная линия

  5. Отсутствие "магических чисел":

    • Все константы (18, 9) логически вытекают из структуры рулетки

Такой код легче понимать, отлаживать и модифицировать в будущем, хотя он и делает то же самое, что и оригинальная формула.

еще попросил гигачат написать с нуля:

Давай упростим решение, убрав лишние проверки и применяя одну простую формулу, которая определяет цвет ячейки на основании её номера. Вот оптимизированная версия без операторов if и лишних проверок:

public string GetRouletteColor(int number)
{
    if (number == 0) return "Зелёный";
    return ((((number - 1) % 18) < 10) ^ ((number % 2) == 0)) ? "Красное" : "Чёрное";
}

Объяснение формулы:

  1. Формула (number - 1) % 18:

    • Вычисляет остаток от деления уменьшенного на единицу номера ячейки на 18. Это помогает разбить диапазон ячеек (1–36) на две группы по 18 элементов каждая.

    • Например, числа от 1 до 18 будут иметь остатки от 0 до 17, а числа от 19 до 36 — снова от 0 до 17.

  2. Проверка условия < 10:

    • Используется для разделения каждой половины на красные и черные ячейки. Первые десять клеток первой и второй половинок окрашены красным, остальные — черным.

  3. Операция XOR (^):

    • Применяется для того, чтобы изменить порядок окраски между первой половиной (1–18) и второй половиной (19–36). Таким образом, чётные и нечётные номера правильно распределяются по красному и чёрному цвету.

Результат вычисления будет однозначно определять цвет каждого номера без избыточных условий и циклов.

Так что эта реализация делает решение компактнее и эффективнее, сокращая количество ветвлений программы.

Знак меньше уже как-будто кажется логическим условием (от которых мы избавляемся), а вот использование XOR мне нравится!

Ага, я так изначально и сделал. Действительно проще 0 (и еще 00 в американской) просто по умолчанию красить в зеленый. Просто для статьи захотелось охватить все случаи)

Любопытно. Даже не задумывался, как они раскрашены.

Для полноты картины не хватает только теста, что и насколько быстрее работает: условия или такая формула.

А мне кажется, что это идеальная задача проверяющая способность кандидата набросать маааленькую нейросеть.

Смотрим самый последний код в статье

Использование в коде python

Делаем в нём color_name от 0 до 36 и выкидываем формулу вообще!

Шутка, если что... :)

const color = (n)=>(n == 0 ? "green" : ["black","red"][!!(91447186090n&(1n<<BigInt(n)))])

Я не знаю питон, я знаю JS )))

спросил нейросетку, поржал

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

не проверял

ну и вишенка, хоть и длиннее

зато число вычислим через кода цветов

color = n?`⬛🟥`[('⬛'.codePointAt(0)*'🟥'.codePointAt(0)>>--n)&1]:`🟩`

тоже не проверял и спешил, сорри

наверняка хрень, но идея прикольная

color = "🟩🟥⬛️🟥⬛️🟥⬛️🟥⬛️⬛️🟥⬛️🟥⬛️🟥⬛️🟥🟥⬛️🟥⬛️🟥⬛️🟥⬛️⬛️🟥⬛️🟥⬛️🟥⬛️🟥"[n]

тоже прикольно

uint64_t color = ((0x154AAD52AAul >> pos) & 1) + ((0xFFFFFFFFFFFFFFFEul >> pos) & 1);

Должно возвращать (если не ошибся с битовой маской): 0 - Зелёный, 1 - Чёрный, 2 - Красный.

Sign up to leave a comment.

Articles