Зашел сначала в Java Collections думал будет более углубленный курс по коллециям. но в итоге спустя пару уровней сравнил данный квест и понял, что мне сначала сюда. а то там что не задача, то я ощущаю себя, как первый раз в Java зашел. Данные задачи прошел на Ура.😁
Задача "Всё гениальное просто" - вот разъяснения ИИ:
Упростим логическое выражение шаг за шагом:
Исходное выражение:
(a && b && c && !d) || (!a && c) || (!b && c) || (c && d)
Факторизуем c (вынесем его за скобки):
c && ( (a && b && !d) || !a || !b || d )
Упростим выражение в скобках:
Применим закон де Моргана к !a || !b, получим !(a && b)
Теперь выражение в скобках: (a && b && !d) || !(a && b) || d
Применим закон дистрибутивности:
(a && b && !d) || !(a && b) можно переписать как ( (a && b) && !d ) || !(a && b)
Это эквивалентно !(a && b) || !d (по правилу (x && y) || !x ≡ !x || y)
Теперь выражение в скобках:
!(a && b) || !d || d
!d || d всегда истинно (закон исключённого третьего)
!(a && b) || true всегда истинно
Исходное выражение упрощается до:
c && true
Что равно просто c
Итоговое упрощённое выражение:
public static boolean calculate(boolean a, boolean b, boolean c, boolean d) {
return c;
}
Все модификаторы в java.lang.reflect.Modifier — это целые числа (int), и все они имеют фиксированную длину в 32 бита.
Пример:
Modifier.PUBLIC = 0x0001 (0000 0000 0000 0001)
Modifier.STATIC = 0x0008 (0000 0000 0000 1000)
Modifier.FINAL = 0x0010 (0000 0000 0001 0000)
Когда ты складываешь модификаторы через |, ты получаешь просто ещё одно 32-битное число, в котором включены только те биты, которые соответствуют модификаторам.
🔍 Как работает сравнение
Пример:
int allModifiers = Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL;
Modifier.PUBLIC = 0000 0001
Modifier.STATIC = 0000 1000
Modifier.FINAL = 0001 0000
allModifiers = 0001 1001
Теперь мы хотим проверить: установлен ли Modifier.STATIC?
(allModifiers & Modifier.STATIC) != 0
Битовая операция:
allModifiers = 0001 1001
Modifier.STATIC = 0000 1000
---------
результат = 0000 1000 → не 0 → true ✅
✍️ Вывод
📌 Даже если specificModifier — это "один флаг", а allModifiers содержит много флагов, битовая маска работает корректно, потому что:
Все модификаторы — это разные биты одного int-числа.
Мы просто проверяем: включён ли нужный бит.
Все гениальное просто:
a * b * c * !d + !a * c + !b * c + c * d = c * (a * b * !d + !a + !b + d) = c * [(a * b * !d) + !(a * b * !d)] = c * (x + !x) = c * 1 = c
Гугл: дистрибутивный закон, закон исключения третьего, закон инверсии.
для всех кто только вливается и ИТ или собирается стать программистом.
друзя. если вы не ловите кайф от задачки "Все гениальное просто" , не применяете "дистрибутивный закон" и "закон исключенного третьего", а просто решаете перебором или вообще кормите ее чатуГПТ (это вообще днище кмк) - пересмотрите свои ожидания от "вливания в ИТ".
максимум - вы станете хорошими "операторами ЭВМ", и через некоторое время гарантированно выгорите (как я).
программисты за 10 000$ / мес на руки - это математики которые умеют кодить.
Кому твои грязные зелёные бумажки нужны?
Мы здесь чтоб сменить профессию и найти себе дело по душе.
Не всем суждено стать инженерами-алгоритмистами в гугл.
Если честно не понял, почему ты тут сокрушаешься.
1) задача "Все гениальное просто" совсем не сложная.
2) метод перебора интуитивно понятный и конечно его все по началу будут его юзать, но со временем паттерны решения задач расширяются и ты придешь к более оптимизированным решениям.
3) gpt(и другие ии) сегодня главный инструмент разработчика, умения им пользоваться переоценить нельзя, но да если ты тупа просишь решение даже его не читая и не понимая принципов чтобы просто пройти валидатор, то вряд ли дойдешь до первой работы
Последнюю не смог решить сам, хотя и догадывался. Кто такой же, вот вам комментарий ChatGPT
Конечно! Давайте внимательно рассмотрим оригинальное булевое выражение и шаги по его упрощению:
### Оригинальное выражение:
public static boolean calculate(boolean a, boolean b, boolean c, boolean d) {
return (a && b && c && !d) || (!a && c) || (!b && c) || (c && d);
}
### Шаги упрощения:
1. **Выделение общего фактора**:
Во всех частях выражения присутствует переменная `c`. Это означает, что если `c` равно `true`, то выражение может быть истинным независимо от значений других переменных.
2. **Рассмотрим каждую часть отдельно**:
- `(a && b && c && !d)`: Эта часть равна `true`, если `a`, `b` и `c` истинны, и `d` ложно.
- `(!a && c)`: Эта часть равна `true`, если `c` истинно, и `a` ложно.
- `(!b && c)`: Эта часть равна `true`, если `c` истинно, и `b` ложно.
- `(c && d)`: Эта часть равна `true`, если `c` и `d` истинны.
3. **Анализ условия**:
- Когда `c` равно `true`, хотя бы одно из следующих условий будет истинным:
- `(a && b && !d)`: не обязательно, но не важно, если `c` уже истинно.
- `!a`: не важно, если `c` уже истинно.
- `!b`: не важно, если `c` уже истинно.
- `d`: не важно, если `c` уже истинно.
- Таким образом, если `c` истинно, все выражение автоматически становится истинным.
4. **Обратный случай**:
- Если `c` ложно (`c == false`), то все части, содержащие `c`, будут ложными:
- `(a && b && false && !d)`: ложно, так как `false && ...` всегда ложно.
- `(!a && false)`: ложно, так как `false && ...` всегда ложно.
- `(!b && false)`: ложно, так как `false && ...` всегда ложно.
- `(false && d)`: ложно, так как `false && ...` всегда ложно.
Заключение:
Из анализа следует, что результат выражения зависит только от значения c. Если c истинно, то всё выражение истинно независимо от значений a, b и d. Если c ложно, то всё выражение ложно.
Таким образом, упрощенное выражение:
public static boolean calculate(boolean a, boolean b, boolean c, boolean d) {
return c;
}
Это правильно и логически эквивалентно оригинальному выражению.
у меня их несколько, в телеге в основном, но честно ни разу ими не пользовался за все время курса, чего и вам желаю, и готовые решения подглядывал несколько раз, по пальцам одной руки наверное, и то чтобы доработать свой алгоритм. Чего и вам желаю. И да, комментарии периодически тоже помогали идти верным путем, главное правильный код сразу не подглядывать и в комментах пропускать, а если задача несколько дней не дается, то открывать правильное решение, перечитывать комменты, глубоко вникать в правильный алгоритм, и тогда чекать правильным или своим ответом. Иначе получиться как в школе, списать, ради того что бы списать)))
и еще, когда в гпт пытаешься запихнуть нестандартную задачу, ответа на которые нет на стекОверФлоу или подобных, то он выдает неведомую хрень, которая не работает... Проверено при создании своего приложения.
вот тут ход решения, с указание математических законов, если проникнуться и перечитать законы, то можно и самому решить:
https://www.emathhelp.net/en/calculators/discrete-mathematics/boolean-algebra-calculator/?f=%28a+∧+b+∧+c+∧+~d%29+∨+%28~a+∧+c%29+∨+%28~b+∧+c%29+∨+%28c+∧+d%29&forms=on
Ну ведь можно и по другому ИИ пользовать. Например "Объясни эту тему доступнее". Или "Выдай мне 100 задач на эту тему, чтобы отработать её до автоматизма".
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ