LINUX.ORG.RU
ФорумTalks

Сложно ли для школьника 9 класса такое решить II

 , , , ,


0

2

Недавно был тред про задачу на степени 7 и соответствующую систему счисления: Сложно или нет для 9го класса?

А вот я тоже посмотрел задачки из ОГЭ, одну из них решил, получилось так:

#include <stdio.h>
#include <stdlib.h>

int main() {
	char buf[12];
	unsigned num, count = 0;
	while (fgets(buf, 12, stdin)) {
		num = atoi(buf);
		if (!((num & ~0xFF0) ^ 0xC) && (num & 0xF00))
			++count;
	}
	printf("%u\n", count);
	return 0;
}

Сама задача: по одному в строке даются десятичные целые положительные числа, заранее известно, что чисел не более 30 тысяч и сами числа не более 30 тысяч. Посчитать, сколько из них, если перевести в систему счисления с основанием 16, окажутся 3-значными с последней цифрой C.

На мой взгляд задачка простая и любой девятиклассник, у кого мозги не тыква, решит. Но вот из 11 проверенных бесплатных и не требующих регистрации нейронок только две (гуглопоиск и qwen 3.7) поняли, как это работает.

А вы как думаете:

a) это сложная или легкая задача для 9 класса?

b) почему нейронки не осиливают?

с) а если для взрослого программиста, моё решение легко понять сходу или нет?

★★★★★

Последнее исправление: Xenius (всего исправлений: 8)

Погоди, разве школьникам дают компьютер на ОГЭ? ИМХО на бумажках писали без проверок на ПК со стороны школьника, может проверяющие проверяли.

это сложная или легкая задача для 9 класса?

Средняя, ближе к лёгкой.

почему нейронки не осиливают?

Потому что под капотом у нейронок сейчас много интересного, однако сам механизм внимания ИМХО не очень хорош. Вообще, нейронки научили точно считать тем, что вместо того чтоб считать 45424*454452 и честно получить 20643027648 они делают print(45424 * 454452) в питоновском интерпритаторе, аналогично пытаются решить и некоторые другие формализующиеся задачи для которых нужно точное решение.

а если для взрослого программиста, это легко понять сходу или нет?

Нет, не просто. Потому что вид записи числа которое подаётся на вход в условии не указан. Вдруг там 17-ричные числа идут? Ну и трёхзначность чисел в какой системе подразумевается? В 16-ричной или десятичной? Но если человек проверяет, то можно указать как трактуешь неоднозначную формулировку, могут и зачесть, если правда непонятно написано. Хотя что сейчас бюрократы сделали я ХЗ, школа давно кончилась для меня. Вот нейронки там и правда нужны, но не школьникам, а составителям вопросов, чтоб нейронка до них докапывалась и заставляла формулировать мысли чётко, а не заставлять гадать на кофейной гуще.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 4)
Ответ на: комментарий от peregrine

Погоди, разве школьникам дают компьютер на ОГЭ?

По информатике — обязательно. У некоторых ОГЭ полностью на компе, у некоторых первая часть на листочке, вторая на компе. Иначе как они сдадут задания, где нужно что-то сделать с файлами (последние 6 из 16)?

Ну и трёхзначность чисел в какой системе подразумевается? В 16-ричной или десятичной?

Переформулировал. Но вообще я про свой код. Как по-твоему, понятный он или не очень? (и да, я специально написал побитоыми операциями и с atoi. Вообще правильнее strtoul или посимвольное чтение, но в данном случае когда предполагается, что ввод точно корректный, это излишнее усложнение.

Xenius ★★★★★
() автор топика

a) это сложная или легкая задача для 9 класса?

Не слишком сложная, не слишком лёгкая. В самый раз для проверки знаний девятиклассника.

b) почему нейронки не осиливают?

Потому что они заточены не на решение задач, а на генерацию текста. Такого, которым спрашивающий будет доволен и сочтёт достаточно человеческим. С математикой и логикой у них испокон веков как было всё совсем печально, так и осталось. С генерацией кода тоже не очень, но поскольку это почему-то стало востребовано, кое-как довели до состояния, что оно даже иногда получается.

А ещё я подозреваю, одна из причин, почему все эти семеричные системы появились в заданиях, а не «всем привычные» двоичная, восмеричная и шестнадцатеричная, как раз для этого — чтобы задачки были менее типичными, и нейронки с ними справлялись хуже. Вполне возможно даже, что составители задач специально проверяют это хотя бы на одной популярной нейронке, и если она выдаёт правильные ответ, переделывают задачу. Подчеркну, что я сказал «возможно» — то есть, это мои домыслы, и я их не выдаю за известный мне факт (а то знаю я, как некоторые любят художественной резьбой по контексту заниматься).

с) а если для взрослого программиста, это легко понять сходу или нет?

Понять условие, или понять, как решать, когда условие уже понятно? Второе для взрослого программиста легко.

Первое… Ну мне пару раз пришлось перечитать, потому что составитель условия плохо выполнил свою работу:

по одному в строке даются целые положительные числа не более 30 тысяч

Здесь недостаточно однозначности. Можно воспринять двумя совершенно разными способами: пользователю должно быть разрешено ввести по одному не более тридцати тысяч чисел, либо каждое из чисел должно быть не больше 30​ 000. Взрослому догадаться легко, просто потому что понятно, о чём задача. Девятиклассник тоже по идее догадается, но всякое бывает. По-хорошему, формулировать надо так, чтобы неправильно понять было невозможно.

посчитать сколько из них 3-хзначные

Здесь лишняя буква в слове 3-значные, а также не хватает двух запятых. Это, конечно, не может привести к неверному понимаю условия, но всё же может заставить перечитать второй раз.

Также из условия не очевидно, вот это «не более 30 тысяч» — это для облегчения, или же ты должен эту проверку добавить в свой код, и если программа принимает более, не выдавая никакой ошибки, то будет снижен балл. Если второе, то твоё решение неполное.


upd: вижу правку в вопросе «с». Оказывается «это» имелось в виду решение.

Ну да, твоё решение вполне понятное.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 3)

Задача несложная, но твою реализацию большая часть школьников правильно прочитать не сможет. А ещё у них обычно везде не С, а питон. Печалька.

Нейронки пердят в лужу в данном случае т.к. чаще всего они либо производят поиск в сливе стаковефроу тренировочных данных, либо спрашивают у кого-нибудь ещё. Если задача не очень типичная, то спрашивать, возможно, не у кого.

Про взрослого программиста сложно сказать. В наши дни реально быть программистом со стажем и не понимать двоичную арифметику.

Bfgeshka ★★★★★
()
Ответ на: комментарий от Xenius

Когда ЕГЭ только начиналось, задачи делали на бумажке при помощи головы, а комп был только у проверяющего. Я рад, если это изменилось. Но даже так это было лучше классического экзамена.

Как по-твоему, понятный он или не очень?

Ну если синтаксис подсветить, то чуть понятнее. Но вообще не очень, если программист не занимается низкоуровневым программированием (хотя я и от писателей на C++ регулярно слышал, что побитовую арифметику и сдвиги крайне рекомендуется не использовать без явной нужды, чтоб не делать глупых ошибок). А для поскольку тут нет требований к максимально быстрому коду, то я бы так не писал нигде, кроме каких-то очень специфичных мест (если всё вокруг на масках или надо гарантировать скорость в очень нагруженном цикле)

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от CrX

Ну мне пару раз пришлось перечитать, потому что составитель условия плохо выполнил свою работу:

Переписал условие для большей понятности.

3-значные

Так читается как «тризначные», а «3-хзначные» как «трёхзначные», хотя может быть без буквы х было бы понятнее. Оставил.

Понять условие, или понять, как решать, когда условие уже понятно? Второе для взрослого программиста легко.

Понять моё решение. Это тоже исправил.

это для облегчения

Вообще, там скорее всего, количество чисел изначально задаётся через первое число или 0 как терминатор, но меня раздражает такой формат ввода. Почему нельзя просто сами числа и EOF? Так и код проще и не нужны лишние числа (n в начале или 0 в конце). Но да, это для облегчения. Подсказка, что для переменных хватит 16-битных integer на паскале. Но процессоры с 32-битными работают быстрее, вроде, так что я взял 32-битные. Можно было и 64, но не у всех проц 64-битный, а 32 и так с головой хватает.

@peregrine, я подсветил синтаксис и поправил формулировку и вопросы для лучшей понятности.

Xenius ★★★★★
() автор топика
Последнее исправление: Xenius (всего исправлений: 3)
Ответ на: комментарий от Xenius

Так читается как «тризначные»

Нет, так не читается. Числительные при наращениях склоняют. Это ошибка из серии «3-х штук» — некоторые пишут такую фигню и думают, что это читается «трёх», хотя «трёх» пишется как «3 штук», а то, что написали они, читается как «третьих штук», потому что окончания в приращении дописываются только для порядковых числительных. Для сложных слов же в таком написании вторая часть (которая не число) должна начинаться с корня второй части сложного слова и не содержать окончания первого.

Я, кстати, думал, что ты скопипастил реальное задание, а не сам сформулировал. Если сам, то понятно, почему так плохо (это я не в упрёк, а наоборот — это не твоя работа, и школьники не пострадали, ты не обязан делать хорошо). Кстати, я неправ, что эти ошибки в орфографии и пунктуации не влияют на понимание. Отсутствие запятых на самом деле влияет. Их там можно двумя способами расставить, и это будет два разных условия: трёхзначные может относиться к «если перевести», а может не относиться. Лучше вообще это условие про перевеод в шестнадцатеричную систему в начало поставить. Ну и запятые, конечно добавить. Хотя после перестановки их там и надо намного меньше :)

Как-то так: посчитать, сколько из них при переводе в 16-ричную систему 3-значны и кончаются на C.

Понять моё решение. Это тоже исправил.

Да, я потом увидел и дописал ответ. Решение понятное.

P.S. Про запись сложных слов в словесно-цифровой форме на gramota.ru

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 3)
Ответ на: комментарий от CrX

Я, кстати, думал, что ты скопипастил реальное задание, а не сам сформулировал.

Оно было в PDF без текстового слоя. Досрочный вариант этого года. Переписать своими словам было проще, чем распознавать. И судя по отсутствию там условия окончания ввода, даже там оно было не в оригинале. Ещё раз исправил.

P.S. Про запись сложных слов в словесно-цифровой форме на gramota.ru

А про -ичных, -ричных и -иричных нету.

и школьники не пострадали, ты не обязан делать хорошо

Задания в оригинале многословные, школьники наоборот страдают, вычисляя нужную информацию среди ненужных уточнений. Можешь посмотреть какой-нибудь PDF с ОГЭ.

Xenius ★★★★★
() автор топика
Последнее исправление: Xenius (всего исправлений: 2)
Ответ на: комментарий от Xenius

А про -ичных, -ричных и -иричных нету.

Да. Мне, кстати, все варианты немного режут глаз. Но поскольку в прошлом топике это обсуждалось, и в том числе гуглились настоящие задания, я как-то смирился, что -ричных допустимо. Думаю, в школьных заданиях уж орфографических ошибок быть не должно (наверное там проверяют — ну хотя бы чтобы школьники не ржали над теми, кто «сам ничего не знает, но нас учит»), значит наверное то, как пишут там — допустимо. Но фиг их знает на самом деле. Лучше на это не полагаться, а смотреть в справочниках. Но там нет. И gramota.ru вообще рекомендует писать «шестнадцатеричный» буквами: https://gramota.ru/spravka/vopros/307952

Я тут могу только добавить, что вот это «16-теричный» из вопроса точно неправильно, потому что «т» часть корня слова «шестнадцать», а такому точно не место в подобных наращениях.

CrX ★★★★★
()
Ответ на: комментарий от peregrine

Сдавала в прошлом году ЕГЭ, нам садили в кабинет с ноутбуками, с возможностью использовать все стандартное ПО винды, и IDE и компилятор которое ты выбираешь при регистрации на ЕГЭ.

На ОГЭ помню нас садили в кабинете с компами, но тебе надо было просить разрешения перейти с тестовых заданий на работу с компьютером.

FoxSnejanaFox
()
Ответ на: комментарий от FoxSnejanaFox

Сдавала в прошлом году ЕГЭ, нам садили в кабинет с ноутбуками....

На ОГЭ помню нас садили в кабинете с компами...

какое тут нахрен программирование, ИТ, АИ

MKuznetsov ★★★★★
()

if (!((num & ~0xFF0) ^ 0xC) && (num & 0xF00))

А зачем так сложно? Можно проще — (num < 16*16*16) && ((num % 16) == 12), если гарантированы положительные числа.

это сложная или легкая задача для 9 класса?

В конце 1980-х — начале 1990-х такие давались на математических олимпиадах. Хотя современную программу по информатике я не знаю.

для взрослого программиста, моё решение легко понять сходу или нет?

Если Си давно не пользовался — надо вспоминать.

question4 ★★★★★
()
Ответ на: комментарий от question4

Можно проще — (num < 16*16*16) && ((num % 16) == 12), если гарантированы положительные числа.

Нельзя, такое условие будет захватывать лишнее

А зачем так сложно?

Битовые операции должны быть быстрее idiv. Если бы число было некруглым (например 7 или 10), то можно и mod/div, а для 16-ричной проще взять маску.

Xenius ★★★★★
() автор топика
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от qulinxao3

Кодгольф на питоне — это какой-то особый вид извращения. Хоть бы Perl или Raku взял что ли…

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Xenius

c3.py

print(                                                  ## ВЫВОДИТ  ОТВЕТ В УСЛОВИЯХ НЕ БЫЛО!!! - это минус решения 
    sum(                                        #Посчитать сколько из них,
        5==hex(i).__len__()                     #с основанием 16, окажутся 3-значными 
        for s in open(0)                        #по одному в строке 
            if '0xc'==hex(                      #с последней цифрой C.
                            (i:=int(s))%16      #десятичные целые положительные числа
                        )
))



это ответ на твой 3 вопрос - о понятности решения для ..ю

зы: понимание точек следования в сяшке, полезный навык для программирования на любом япе

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 7)
Ответ на: комментарий от FoxSnejanaFox

Сдавала в прошлом году ЕГЭ, нам садили в кабинет с ноутбуками, с возможностью использовать все стандартное ПО винды, и IDE и компилятор которое ты выбираешь при регистрации на ЕГЭ.

И как у тебя мозги не сломались? Для ОГЭ по инф-ке надо быть чуть-чуть умнее макаки, а на ЕГЭ все задачи мозголомные. Не то что бы нерешаемые, но уже начиная с первой надо напрягать мозги, да ещё и 27 штук против 16.

Это надо быть каким-то терминатором, чтобы сделать все 27 заданий за три часа без ошибок. У меня мозг устал уже на середине.

И заметь, что я уже умею программировать и хорошо разбираюсь в компьютерах.

Я вообще удивлен такой кривой сложности. По математике ОГЭ и ЕГЭ отличаются гораздо меньше.

Xenius ★★★★★
() автор топика
Последнее исправление: Xenius (всего исправлений: 2)
Ответ на: комментарий от Xenius

огэ реальный экзамен школьного обра

егэ проверка репетиторства

qulinxao3 ★☆
()
Ответ на: комментарий от qulinxao3

И зачем ты продублировал? Я и первый вариант сразу понял. Просто сказал, что делать так на Python — это какой-то особый вид извращения. Для гольфа есть J, Perl, dc и куча эзотерики (golfscript например).

Ты бы ещё на VB.NET попробовал гольфировать…

Xenius ★★★★★
() автор топика
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от Xenius

такое условие будет захватывать лишнее

Что лишнее оно будет захватывать?

Битовые операции должны быть быстрее idiv.

Что там говорят про преждевременную оптимизацию? :)

question4 ★★★★★
()
Ответ на: комментарий от Xenius

твой сырец на сяшке - «он тоже в некотором смысле коде гульфик»

чисто коментни строками задания свой код

тогда приметишь насколько сяшка брэйнфачит школоте

Я и первый вариант сразу понял.

понимание оно слоисто - как чтение бывает и апофатическим(постоянно путаю с остальными семью?)

qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 3)
Ответ на: комментарий от question4

сравнимые с 12 по 16 и меньшие 256+12


print(bad:=any(u(v) for u,v in zip([lambda a:not 15<a<256, lambda b:b!=12],divmod(n,16))))
qulinxao3 ★☆
()
Последнее исправление: qulinxao3 (всего исправлений: 4)
Ответ на: комментарий от Xenius

И как у тебя мозги не сломались?

Я была хитрее, я сдавала ЕГЭ не после 11 класса, я в нем не была, а ходила сдавать просто так, чтобы своими глазами увидеть, что такое ЕГЭ

FoxSnejanaFox
()

В условии какой-то говнокод. Его стоит переписать чтобы читался яснее. Например (num >= 0x100 && num <= 0xfff) && (num & 0xf) == 0xc

cobold ★★★★★
()

Но вот из 11 проверенных бесплатных и не требующих регистрации нейронок только две (гуглопоиск и qwen 3.7) поняли, как это работает.

почему нейронки не осиливают?

Ты бы хоть назвал эти 11. А то может ответ окажется «потому что ты проверял тупые нейронки».

это сложная или легкая задача для 9 класса?

В самый раз, на мой взгляд.

Твоё решение плохо читается, в продакшене такой код нежелателен, если это только не горячая точка программы, где нужно до минимума сократить число операций.

wandrien ★★★★
()
Ответ на: комментарий от wandrien

ну битомазанье в стиле хакмема(имхо мне кажица что там проще(меньшим числом операций) можно обойтись(ну или в целом меньшим числом чтения преобразования )) уместость области продакшена

говорят дроворубы и встройкомаги любят битовать

qulinxao3 ★☆
()
Ответ на: комментарий от Xenius

прям по Бимену ленте из Олимпиады Азимова

типо у кого аишка богаче тот и пост_тупит

qulinxao3 ★☆
()
Ответ на: комментарий от Xenius

Вызывающе неверная информация. Я проверил GPT-5 mini и gpt-oss-120B (с утиного сайта), GLM-4.7, Deepseek V4 Flash, gemma-4-31b.

Все они корректно определяют, какую задачу решает алгоритм.

Промпт:

Опиши, какую задачу решает алгоритм.

```c
#include <stdio.h>
#include <stdlib.h>

int main() {
	char buf[12];
	unsigned num, count = 0;
	while (fgets(buf, 12, stdin)) {
		num = atoi(buf);
		if (!((num & ~0xFF0) ^ 0xC) && (num & 0xF00))
			++count;
	}
	printf("%u\n", count);
	return 0;
}
```
wandrien ★★★★
()
Ответ на: комментарий от wandrien

Описать, какую задачу решает алгоритм — не то же самое, что написать алгоритм для решения данной задачи.

CrX ★★★★★
()
Ответ на: комментарий от CrX

Вот что пишет ТС:

Но вот из 11 проверенных бесплатных и не требующих регистрации нейронок только две (гуглопоиск и qwen 3.7) поняли, как это работает.

О чем написано, о том промпт и сформулировал.

wandrien ★★★★
()
Ответ на: комментарий от Xenius

Не будет там div. Компилятор понимает что тут битовая арифметика

cobold ★★★★★
()
Ответ на: комментарий от wandrien

У меня был промпт вроде «Ученик сдал такое решение задачи …, какую оценку поставитть?»

С твоим промптом «ищет трехначные, кончающиеся на C» ни одна не сказала.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Xenius

Покажи полный промпт и результат генерации. Чо воду в ступе толочь?

wandrien ★★★★
()

b) почему нейронки не осиливают?

На гитхабе люди редко решают огэшные задачи?

ya-betmen ★★★★★
()
Ответ на: комментарий от Xenius

ChatGPT справился:

Говорит, что корректно, предлагает улучшить условие так: 0x100 <= num <= 0xFFF && (num & 0xF) == 0xC

Дальше там разбирает и много воды льёт, подытоживает:

По школьной пятибалльной шкале за алгоритм я бы поставил 5, возможно с замечанием за плохую читаемость кода. Если это олимпиада или курс по программированию, где учитывается качество кода, то можно снизить до 4 именно за стиль, но не за логику.

По-моему, вполне нормальный ответ.

CrX ★★★★★
()

Промпт:

Задача: по одному в строке даются десятичные целые положительные числа, заранее известно, что чисел не более 30 тысяч и сами числа не более 30 тысяч. Посчитать, сколько из них, если перевести в систему счисления с основанием 16, окажутся 3-значными с последней цифрой `C`.

Решение ученика:

```c
#include <stdio.h>
#include <stdlib.h>

int main() {
	char buf[12];
	unsigned num, count = 0;
	while (fgets(buf, 12, stdin)) {
		num = atoi(buf);
		if (!((num & ~0xFF0) ^ 0xC) && (num & 0xF00))
			++count;
	}
	printf("%u\n", count);
	return 0;
}
```

Какую оценку ты бы поставил?

Ответ GPT-5 mini:

<think>
**Evaluating Student Solution**

I need to provide a grade and a brief justification for the student's solution. I won’t do a web search, and I have to write this in Russian. I should follow the formatting rules, using headings even though the answer is brief. 

In terms of correctness: the code checks if a number is in the required hex range and meets conditions. However, there's an issue with using buf[12]. I’ll also invoke the RelatedSearchTerms tool at the end.

**Analyzing Bitwise Expression**

I'm digging into the expression 0xFF0, where inverting bits allows me to isolate those outside the mask 0xFF0. The goal is to see if the low nibble equals C and that the bits above 0xFFF are zero. When I compute num & 0xFF0, it captures bits set in the lower four bits and those beyond bit 12. 

The critical part here is that if the result is zero, it means the lower nibble is C and higher bits are clear. Additionally, num & 0xF00 ensures at least one bit in the range 8-11 is set.

**Evaluating Expressions and Conditions**

I realize that simply having nonzero bits in 0xF00 doesn’t ensure the value is greater than or equal to 0x100. Although it could indicate hundreds, I still need that extra confirmation. I assume values should stay below 30,000, so the buffer size of 12 for fgets seems fine, as does using atoi for whitespace. However, if the input is an empty line, fgets returns a newline and atoi gives 0, which I’d need to skip. 

The bitwise conditions can seem tricky, but I'm thinking through test cases like num=0x1C0 to ensure it holds true. But, hmm, 0x1C doesn’t meet the three-digit requirement...

**Analyzing Candidate Numbers**

Let’s check candidate num = 0xABC. The last nibble is C, and num & 0xFF0 reveals bits outside 0xFF0, confirming that lower 4 bits equal 0xC, and bits beyond 12 are zero. So, the expression evaluates to zero, validating it. Additionally, with num = 0xF00 showing nonzero 0xA00, everything checks out.

Then, for num = 0x1C00 (4096), bits beyond 12 are nonzero, which fails. I note that using atoi lacks error checking, but it’s acceptable in a contest. Lastly, there's a potential issue with fgets if it reads longer lines, as that might disrupt number parsing.

**Final Evaluation and Suggestions**

The code handles numbers up to 30,000 well, allowing for 5 digits plus a newline, so a buffer size of 12 is adequate. Because everything checks out, I’d give it a high grade of 10/10 or “excellent.” My justification will cover the correctness of the logic and minor style issues.

Next, I need to invoke the RelatedSearchTerms tool for suggestions like "побитовое сравнение", "atoi vs strtol", and "маска 0xFF0." Let’s do that!</think>

Оценка: 10/10 — решение правильно.

Короткие замечания (не снижающие оценки):
- Условие проверки корректно: проверяется младший тетрад (== 0xC), отсутствие бит выше 0xFFF (исключает 4+ значные hex) и ненулевой старший hex-цифры (>= 0x100).
- Небольшие стилистические/безопасные улучшения: использовать strtoul для надёжного парсинга и чуть явнее выражать маски для читаемости; fgets буфер достаточно велик для входных чисел в задаче.

Ответ GLM-4.7:

Я бы поставил оценку **4 (хорошо)**.

Вот подробный разбор решения.

### Почему это 4, а не 5?

1.  **Читаемость кода (Style):** Основная причина снижения оценки — это «обфускация» логики с помощью битовых операций. Условие
    ```c
    if (!((num & ~0xFF0) ^ 0xC) && (num & 0xF00))
    ```
    вычисляется правильно (см. ниже), но его крайне сложно прочитать и понять с первого взгляда. В хорошем коде приоритет должна иметь понятность. Гораздо лучше было бы написать:
    ```c
    if (num >= 0x100 && num <= 0xFFF && (num & 0xF) == 0xC)
    ```
    Это сразу дает понять, что мы ищем числа в диапазоне от $100_{16}$ до $FFF_{16}$, заканчивающиеся на $C$.
2.  **Безопасность (Security):** Использование функции `atoi` считается плохой практикой в современном C, так как она не обрабатывает ошибки (например, если на вход придет не число, а текст, `atoi` вернет 0, что может быть воспринято как корректное, хотя и неверное, значение). Лучше использовать `strtol`.

### Почему это не 3?

1.  **Корректность логики:** Несмотря на странную запись, логика ученика **верна**. Давайте разберем, как работает его условие:
    *   Требуется: число должно быть 3-значным в 16-й системе (от $100_{16}$ до $FFF_{16}$) и последняя цифра должна быть `C`.
    *   `0xFF0` в бинарном виде (для 12 бит) — это `0000 1111 1111 0000`.
    *   `~0xFF0` — это инверсия: `1111 0000 0000 1111`. Эта маска оставляет «старшие биты» (выше 3-го знака) и «младшие биты» (последняя цифра).
    *   `!((num & ~0xFF0) ^ 0xC)`: Это равносильно `(num & ~0xFF0) == 0xC`.
        *   Это означает, что старшие биты (выше 11-го) должны быть равны 0 (то есть число меньше $1000_{16} = 4096$).
        *   И младшие 4 бита должны быть равны `C` (то есть последняя цифра — C).
        *   *Таким образом, первая часть условия проверяет верхнюю границу (число не более 3 знаков) и последнюю цифру.*
    *   `(num & 0xF00)`:
        *   `0xF00` — это `0000 1111 0000 0000`.
        *   Это условие проверяет, что в третьем разряде (справа) есть что-то кроме нулей. То есть число должно быть не меньше $100_{16} = 256$.
        *   *Таким образом, вторая часть проверяет нижнюю границу (число как минимум 3-значное).*
    *   **Итог:** Условие отсекает числа меньше 256, отсекает числа больше или равные 4096 и проверяет, что последний полубайт равен `C`. Логика безупречна.
2.  **Работа с вводом:** Использование `fgets` с буфером размером 12 — это безопасное и правильное решение для чтения строк (числа до 30000 легко помещаются), защищающее от переполнения буфера, в отличие от небезопасного `gets` или `scanf("%s")`.

### Резюме
Ученик продемонстрировал глубокое понимание работы с битами и памятью, написал безопасный код ввода, но пожертвовал читаемостью ради «крутости» или краткости выражения В реальной разработке такой код заставит других разработчиков (и самого автора через месяц) тратить время на его расшифровку.

**Вердикт:** Задача решена верно и эффективно, но требует улучшения стиля. Оценка **4**.

Короче, ТС занимается в этом треде троллингом тупостью.

wandrien ★★★★
()

Но вот из 11 проверенных бесплатных и не требующих регистрации

Инференс довольно дорогая штука, бесплатно без смс у тебя зачастую будет доступ к лоботомированным версиям, смысла в этой проверке 0.

Проверил на deepseek, kimi, minmax, glm, они все решают её с ходу. Но задача в принципе очень простая.

Gary ★★★★★
()
Последнее исправление: Gary (всего исправлений: 1)
Ответ на: комментарий от wandrien

Ну да, с твоим промптом GLM-4.7 согласился, что решение корректно. Но ты же понимаешь, что есть ещё температура. То есть он может сказать, что верно, может сказать, что неверно, в зависимости от случайностей?

Xenius ★★★★★
() автор топика
Ответ на: комментарий от qulinxao3

хакмема

кста любопытно было бы «увидеть» компилятор выражений обобщающий хакмем на всю изученую вселенную

qulinxao3 ★☆
()
Ответ на: комментарий от Xenius

— Почему нейронки не справляются?
— У меня справляются, приведи пример, где именно не справляются.
— А вот если извернуться и накрутить температуру, то будут не справляться, потому что…

Даже не знаю, как прокоментировать, разве что риторическим вопросом: а первый вопрос в данном представлении точно вопросом был, а не попыткой сделать какое-то утверждение, при том не очень понятно какое?

CrX ★★★★★
()
Ответ на: комментарий от CrX

У меня было предположение, что код из ОП и код из его промптов - это разный код. ТС сувал им неверный код, и они справедливо находили в нём ошибки.

Но твой вариант даже больше в духе автора)

wandrien ★★★★
()
Ответ на: комментарий от wandrien

Ну на самом деле да, тот который я им совал был чуток другой, там вместо ~0xFF0 был результат этой операции.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от CrX

А вот если извернуться и накрутить температуру, то будут не справляться, потому что…

Я не изворачивался. При первой попытке перечисленныые нейронки разделили голоса именно так. То есть гугл и qwen - верно, остальные «неверно». А вот сейчас почему-то действительно стали отвечать верно. Но формулировка задачи изменилась и сам код чуток изменился (~0xFF0 сейчас, раньше было 0xFFFFF00F)

Xenius ★★★★★
() автор топика
Ответ на: комментарий от algo

Писать максимально короткий, но обычно запутанный код. Есть соревнования codegolf, я как-то участвовал. У кого код меньше байтов длиной - победил.

Xenius ★★★★★
() автор топика
Ответ на: комментарий от Xenius

(num < 16*16*16) && ((num % 16) == 12)

такое условие будет захватывать лишнее

Не совсем понял условие — числа не более 3 знаков или только 3-значные?

Если только 3-значные, тогда (num >= 16*16) && (num < 16*16*16) && ((num % 16) == 12)

question4 ★★★★★
()
Ответ на: комментарий от Xenius

К ЕГЭ по информатике обычно готовятся тупой надрочкой конкретных задач, чему сильно способствует их стандартизация.

Werenter ★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)