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)
Ответ на: комментарий от Xenius

код чуток изменился (~0xFF0 сейчас, раньше было 0xFFFFF00F)

Результат ~0xFF0 чуток зависит от разрядности.

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

спасибо за вопрос!

есть целая подборка книжек по стилю (ща вокруг Python раньшее Pascal(вкл Ada) и Си - по жабе как то больше абстрактные астронавты):

Читаемый код, или Программирование как искусство. Босуэлл Д. Фаучер Т.  The Art of Readable Code
Serrão Rodrigo Girão - Pydon'ts. Write elegant Python code
DiBernardo - 500 lines Or less. Experienced programmers solve interesting problems 
Бугаенко - Наш код. Ремесло, профессия, искусство 
Joel Grus - Ten Essays on Fizz Buzz 
Stanley Gill - The Philosophy of Programming  — # // в 1960 годину CARL !
Kernighan,Plauger - Programming style
Angus Croll  - If Hemingway Wrote JavaScript
Cristina Videira Lopes - Exercises in Programming Style

читаемость это очень рефенциально групповое

upd: т.е читаемость у публики различна - цитата из ершовского согласования выступление «программирование вторая грамотность» https://ershov.iis.nsk.su/ru/second_literacy/article :

Аудитория будет довольно пестрая и не очень известная. Академическая элита, характерная для конференций по естественным наукам, будет в явном меньшинстве. Большая часть аудитории будет внушаемой, и доклад поэтому подготовлен в стиле наступательной проповеди. Доклад должен быть заведомо респектабельный, без балаганства, но достаточно острый. Однако очень хотелось бы, чтобы риторика текста была бы скомпенсирована живостью иллюстративного материала не говоря уже о двух-трех порциях юмора для разрядки аудитории".

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

С математикой и логикой у них испокон веков как было всё совсем печально, так и осталось

Вообще-то, математика — это область, с которой LLM справляются лучше всего.

Если не согласны, предлагаю решить две задачи, с которыми все state-of-the-art бесплатные LLM хорошо справляются:

1. Какой вид имеют все функции f(x) из вещественных чисел в вещественные, такие, что для любого x: f(x) = f(2x)?

2. Что делает следующий код?

#include <stdint.h>

uint32_t my_func(uint32_t x)
{
    uint32_t r = 0;
    for (; x; x /= 2) {
        r -= x;
    }
    for (int i = 0; i < 41; ++i) {
        r *= r;
    }
    return r;
}

shdown ★★
()

Во-первых, зачем здесь битовая арифметика? Это решение точно сможет сгенерировать более эффективный код, чем оптимизирующий компилятор?

В-вторых, думающий облачный DeepSeek смог восстановить условие задачи по коду:

The program reads lines from standard input, converts each to an unsigned integer, and counts how many satisfy:

The number is less than 4096 (no bits set above bit 11).

Its lowest nibble (bits 0–3) equals 12 (hex digit C).

Its third nibble (bits 8–11) is non‑zero.

In other words, it counts numbers in the range 256–4095 whose hexadecimal representation ends with C. It prints the total count.

В-третьих:

main.c:4:9: warning: a function declaration without a prototype is deprecated in all versions of C [-Wstrict-prototypes]

Потому что Си - неправильный выбор языка в качестве введения в программирование 1.

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

Сложная, поскольку требует интеграции многих областей: системы счисления, битовая арифметика, немного IO, размеры типов.

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

Принцип условия по битовой маске я быстро понял, но детали долго додумывал. Мне изначально показалось, что решение неправильное, потому что число 4380 (0x111C) не учитывается, но я не заметил, что считать требуется только трёхзначные числа.

Тут ещё были сообщения о том, что за такое решение нужно поставить 4, а не 5. Я не согласен. Здесь очевидная 5 даже не смотря на преждевременную оптимизацию. Просто за пытливость ума 5, что на этапе обучения намного важнее формального соответствия ожиданиям.

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

Cast Bfgeshka, peregrine и кого ещё из ИИ-скептиков.

Хочу заметить, что задачи специально не подбирались так, чтобы LLM хорошо решали, и они не являются «известными», в тренировочных данных они вряд ли есть.

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

В гольфе побеждает тот, у кого меньше ударов до попадания мяча в лунку. Соответственно, общий принцип таков: гольфировать — значит сокращать количество чего-либо. Символов в коде, нажатий в vim-е, и т.д.

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

Что делает следующий код?

Считает [-log₂x]^2⁴¹ в кольце вычетов по модулю 2³². Зачем не знаю, видимо какая-то хитрая битовая магия должна получиться.

  1. Какой вид имеют все функции f(x) из вещественных чисел в вещественные, такие, что для любого x: f(x) = f(2x)?

Константа?

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

Считает [-log_2(x)]^2⁴¹ в кольце вычетов по модулю 2³².

Совершенно неверно. Подставьте x=1: log_2(x) = 0, -log_2(x) = 0, 0^(2^41) = 0. А my_func(1) возвращает 1.

Подставьте x=2: log_2(x) = 1, -log_2(x) = -1, (-1)^(2^41) = 1. А my_func(2) возвращает 0.

(Заметьте, что там происходит r -= x, а не r -= 1).

Константа?

Совершенно неверно. Ну, константы, очевидно, да, но есть ещё много таких функций, кроме них.

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

думающий облачный DeepSeek смог восстановить условие задачи по коду

Что это трёхзначное не догадался. То есть всё же не до конца.

Потому что Си - неправильный выбор языка в качестве введения в программирование 1.

Столяров советует Паскаль. Причём усеченное подмножество, которое не занимает много времени на изучение, но зато сильно облегчает дальнейшее освоение Си.

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

Что это трёхзначное не догадался

“In other words, it counts numbers in the range 256–4095 …”

256-4095 — это как раз 0x100-0xFFF.

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

А ну да, нейронка сказала, что parity считает, чётность к-ва единиц в двоичной записи числа. По-моему как-то сложно. Почему бы не сделать так?

for (i=r=0; i<32; i++) {
	r ^= (x >> i) & 1;
}
Xenius ★★★★★
() автор топика
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от Xenius

Это про понимание обфусцированного кода. Если хотите математику, то вот вам ещё задача: какое минимальное натуальное число можно подставить вместо 41, чтобы код сохранил своё поведение?

А посчитать parity можно очень многими способами. Например, __builtin_popcount(x) & 1.

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

Что это трёхзначное

В восьмеричной системе?

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

Во-первых, зачем здесь битовая арифметика? Это решение точно сможет сгенерировать более эффективный код, чем оптимизирующий компилятор?

Тут вопрос скорее в том, зачем вообще оптимизировать этот код.

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

А в школьной задаче вообще смысла нет этим заниматься.

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

А также уменьшение излишнего буккипинга использованием языка в полноте

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

Тут вопрос скорее в том, зачем вообще оптимизировать этот код.

Это не оптимизация. Просто если бы я написал if (x< 0x1000 & x> 0xFF & x % 16 == 12) это было бы ужасно скучно.

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

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

Конечно необязательно. Вы там где-нибудь видите слово «непрерывных»?

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