powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Обход прямоугольника по спирали. Поиск более подходящего алгоритма
25 сообщений из 88, страница 3 из 4
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38769153
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurymaytonМне не нравится что ты синус используешь для углов кратных четверти.
В этой задаче - он вырожденный и заменяется на более примитивную функцию.

крайне рад критике, может быть кто-нибудь ещё подскажет альтернативу лучше ?) А также подскажет как уйти от нотации Айверсона и чисел Фибоначчи ?
Саш я тоже поднаторел в научных дискурсах и могу кидать софизмы и парадоксы.
Скажи пожалуйста. Это ты у Кнута прочитал про нотацию Айверсона? Ты уверен
что она ДЕЙСТВИТЕЛЬНО необходима для решения задачи Вини-Пуха. Или это
уже новая ветка дискурса с новой задачей?
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38769288
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, про нее я узнал у своего наставника. 8 лет назад. А когда начал изучать Си понял, что вот же она тут :) А у Кнута недавно встретил, он хорошо объясняет. Интернет я не очень люблю, потому не стал рекомендовать гуглить, как это любит Анатолий.

Мне захотелось оптимизировать его код, уйти от ветвлений, потому я предложил такую формулу, но тем не менее в ней ещё есть два ветвления. Разве это не интересно ? Разве задача про ферзей не кажется на первый взгляд такой-же простой как задача про медвежонка ?;)

Меня гонят.. доброго времени суток
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38769536
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

218 кб - выделяемая память приложению. 123 байта - размер исходного кода файла
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38769539
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADmayton,

218 кб - выделяемая память приложению. 123 байта - размер исходного кода файла
Как они меряют? Так точно. Не реально мне интересно.
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38769631
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Для меня это останется большой загадкой...
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38769827
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, Количество символов (кроме пробелов и переносов строк) и есть размер исходного кода. Вот так меряют. А объём памяти получается исходя из операций аллоцирования(исходя из моих личных наблюдений).




Sharahov, если бы я был неправ, меня бы поправили другие участники. Вы не смогли обосновать свою точку зрения на данную проблему и чётко ответить на поставленный вопрос, и перешли на личные оскорбления. Ваши насмешки мне неинтересны, они только подчёркивают низкие качества вашей личности.



авторОно и не влезло. Все вычисления выполнены по модулю 2^32. Можно вообще получить отрицательный результат, т.к. старший бит - знаковый. Есть int64, если надо больше бит.


Тогда к чему вы приводили мне ответ, если его не было. Я вас спросил, откуда эта цифра (ибо я думал что вы приводите правильный ответ)? Как вообще программа работает ? Вы мне должны были ответить
-эта цифра неправильная, тк переполнение. А не нести ерунду, и устраивать дискут на пустом месте. Всё это время я думал что вы как-то уходите от переполнения и эта цифра, вполне реальная. И я просто не понимал как у вас получается якобы правильный ответ, которого быть не могло. И об этом я вам и талдычил постоянно-"Как ваша функция нашла этот правильный ответ". блаблабла . куча времени потраченного впустую.


И я практически уверен что код не ваш. Вы плаваете в элементарных вопросах.
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38769858
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более понятный код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
int get_count(int m, int n, int x, int y)
{
	//Distance between point and sides of rectangle {top,right,bottom,left}
	int delta[4] = { y - 1, m - x, n - y, x - 1 }; 
	
	//Find minimum distance
	int k = 0;
	for (int i = 1; i < 4; ++i)
		delta[i]<delta[k] ? k = i: false;
	
	//Characteristics of the inner rectangle
	int n2 = n - 2 * delta[k];
	int m2 = m - 2 * delta[k];
	int sh[4] = { x - delta[k], y - delta[k], m - x - delta[k], n - y - delta[k] };
	//Main 
	int res = m*n-n2*m2;
	switch (k)
	{
	case 0:
		res += sh[0];
		break;
	case 1:
		res += m2 + sh[1] - 1;
		break;
	case 2:
		res += m2 + n2 + sh[2] - 1;
		break;
	case 3:
		res += 2 * m2 + n2 + sh[3] - 2;
		break;
	}
	return res;
}
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38769859
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более понятный код после рефакторинга
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
int get_count2(int m, int n, int x, int y)
{
	//Distance between point and sides of rectangle {top,right,bottom,left}
	int delta[4] = { y - 1, m - x, n - y, x - 1 };

	//Find minimum distance
	int k = 0;
	for (int i = 1; i < 4; ++i)
		delta[i]<delta[k] ? k = i : false;

	//Characteristics of the inner rectangle
	int n2 = n - 2 * delta[k];
	int m2 = m - 2 * delta[k];
	int sh[4] = { x - delta[k], y - delta[k], m - x - delta[k], n - y - delta[k] };
	//Main 
	int t = (k>1);
	int res = m*n - n2*m2 + m2*(k - t) + n2*t + sh[k] - (k - t);
	return res;
}



Единственное что мне тут не нравится, это использование вспомогательной переменной
Код: plaintext
1.
int t = (k>1);
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38769921
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я-бы не стал так писать.

Код: plaintext
1.
int t = (k>1);



Лучше-бы так.

Код: plaintext
1.
int t = (k>1)?1:0



или

Код: plaintext
1.
BOOLEAN t = (k>1)?true:false
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38769971
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему так писать не стоит?
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38769990
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... в случае если (k>1) дает FALSE - будет (int)0. Для значения true думаю
что возможны варианты ненулевых констант.
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38769993
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, вы правы, согласен.
Спасибо :)
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38769998
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Код: plaintext
1.
BOOLEAN t = (k>1)?true:false


зачем хвост после вопроса? Чем тебе так не нравится:
Код: sql
1.
bool t = (k>1);


в переменную логического типа сохраняем результат логического выражения. Глазами читается нормально.
Если кто-то захочет переменную в арифметический расчет засунуть - это его проблемы.
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38769999
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercurySharahov, если бы я был неправ, меня бы поправили другие участники. Вы не смогли обосновать свою точку зрения на данную проблему и чётко ответить на поставленный вопрос,

Возможно, другие участники, как, впрочем, и я, не собираются учить Вас программированию за 21 день?

Как-то не хочется всерьез объяснять, что термин "разность" служит для обозначения результата, а сама соответствующая операция называется вычитанием. Устройство ЭВМ, системы счисления, битовые операции и т.п. базовые вещи обязан знать назубок любой начинающий программист. Начните с этого, и, может быть, тогда найдется больше желающих вас поправить.

И еще одно. На форуме вы можете задавать сколько угодно вопросов, но требовать на них ответа вы не можете. Какие задачи мне решать и на какие вопросы мне отвечать, решаете не вы.



SashaMercuryи перешли на личные оскорбления. Ваши насмешки мне неинтересны, они только подчёркивают низкие качества вашей личности.

Где именно вы увидели личные оскорбления в ваш адрес? Ссылку. Вы параноик?



SashaMercuryавторОно и не влезло. Все вычисления выполнены по модулю 2^32. Можно вообще получить отрицательный результат, т.к. старший бит - знаковый. Есть int64, если надо больше бит.

Тогда к чему вы приводили мне ответ, если его не было. Я вас спросил, откуда эта цифра (ибо я думал что вы приводите правильный ответ)? Как вообще программа работает ?
Вы мне должны были ответить-эта цифра неправильная, тк переполнение. А не нести ерунду, и устраивать дискут на пустом месте. Всё это время я думал что вы как-то уходите от переполнения и эта цифра, вполне реальная. И я просто не понимал как у вас получается якобы правильный ответ, которого быть не могло. И об этом я вам и талдычил постоянно-"Как ваша функция нашла этот правильный ответ". блаблабла . куча времени потраченного впустую.


Не совсем так. Даже ребенку очевидно, что ваши исходные данные заставляют программу считать площадь квадрата со стороной 10^5. Правильный ответ, как вам должно быть известно равен 10^10. И само собой разумеется, ни одна программа в мире не сможет поместить его в результат типа integer. Результат вычислений получен в полном соответствии с известным принципом "мякину заложишь - мякину получишь". Правильный ли он? Вы этот вопрос не задавали, и я на него не отвечал. Я отметил лишь, что при вычислениях обязательно было переполнение. Если вы программист, то должны понимать, что в данном случае это означает неверный результат.



SashaMercuryИ я практически уверен что код не ваш. Вы плаваете в элементарных вопросах.

Дайте угадаю. Наверно, он ваш?

Теперь уже похоже на то, что вы успешно окончили курсы "Жизнь за 21 день".
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38770299
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте.... в конструктивное русло. Без личностей.
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38770646
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tmayton
Код: plaintext
1.
BOOLEAN t = (k>1)?true:false


зачем хвост после вопроса? Чем тебе так не нравится:
Код: sql
1.
bool t = (k>1);


в переменную логического типа сохраняем результат логического выражения. Глазами читается нормально.
Если кто-то захочет переменную в арифметический расчет засунуть - это его проблемы.
bool не нравится. Нету у нас общего понимания что такое этот бул.
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38771066
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovSashaMercurySharahov, если бы я был неправ, меня бы поправили другие участники. Вы не смогли обосновать свою точку зрения на данную проблему и чётко ответить на поставленный вопрос,

Возможно, другие участники, как, впрочем, и я, не собираются учить Вас программированию за 21 день?



очевидно не собираются.

Aleksandr SharahovКак-то не хочется всерьез объяснять, что термин "разность" служит для обозначения результата, а сама соответствующая операция называется вычитанием. Устройство ЭВМ, системы счисления, битовые операции и т.п. базовые вещи обязан знать назубок любой начинающий программист. Начните с этого, и, может быть, тогда найдется больше желающих вас поправить.

И еще одно. На форуме вы можете задавать сколько угодно вопросов, но требовать на них ответа вы не можете. Какие задачи мне решать и на какие вопросы мне отвечать, решаете не вы.

в этой теме, получалось, что решал я. Правда отвечали вы хреново.


Aleksandr Sharahov
SashaMercuryи перешли на личные оскорбления. Ваши насмешки мне неинтересны, они только подчёркивают низкие качества вашей личности.

Где именно вы увидели личные оскорбления в ваш адрес? Ссылку. Вы параноик?

вы прекрасно понимаете о чём я . ваше сообщение видимо уже удалено.


Aleksandr Sharahov
SashaMercuryпропущено...


Тогда к чему вы приводили мне ответ, если его не было. Я вас спросил, откуда эта цифра (ибо я думал что вы приводите правильный ответ)? Как вообще программа работает ?
Вы мне должны были ответить-эта цифра неправильная, тк переполнение. А не нести ерунду, и устраивать дискут на пустом месте. Всё это время я думал что вы как-то уходите от переполнения и эта цифра, вполне реальная. И я просто не понимал как у вас получается якобы правильный ответ, которого быть не могло. И об этом я вам и талдычил постоянно-"Как ваша функция нашла этот правильный ответ". блаблабла . куча времени потраченного впустую.


Не совсем так. Даже ребенку очевидно, что ваши исходные данные заставляют программу считать площадь квадрата со стороной 10^5. Правильный ответ, как вам должно быть известно равен 10^10. И само собой разумеется, ни одна программа в мире не сможет поместить его в результат типа integer. Результат вычислений получен в полном соответствии с известным принципом "мякину заложишь - мякину получишь". Правильный ли он? Вы этот вопрос не задавали, и я на него не отвечал. Я отметил лишь, что при вычислениях обязательно было переполнение. Если вы программист, то должны понимать, что в данном случае это означает неверный результат.




Когда я давал вам пример, я не подумал что он выйдет за пределы 4Б. Когда прочитал от вас якобы правильный ответ, мне показалось странным, и я решил проверить, корректные ли входные данные я дал.( В целом они были бы корректные, если бы точка находилась ближе к краю, ибо вы не используете M*N в коде.) Оказалось что не корректные. Но ответ вы мне дали ! И я просто пытался узнать откуда он. Вам нужно было написать что он неверный. и всё.
Aleksandr Sharahov
SashaMercuryИ я практически уверен что код не ваш. Вы плаваете в элементарных вопросах.

Дайте угадаю. Наверно, он ваш?

Теперь уже похоже на то, что вы успешно окончили курсы "Жизнь за 21 день".

нет. не мой, но автору спасибо.


PS
Крайне не люблю с кем то ругаться по таким глупым и пустым поводам, вы даже не представляете насколько мне это неприятно. Вы меня не понимаете или я вас не понимаю, в общем-то я сомневаюсь что мы друг другу что-то докажем.(и у меня нет желания). Потому я не буду больше вам отвечать и читать ваши сообщения. Слишком много нехороших настроений. Со своей стороны я себя так не вел по отношению к вам.
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38771075
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С точки зрения логики я написал неверный функции, так будет лучше
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
int get_count(int m, int n, int x, int y)
{
	//Distance between point and sides of rectangle {top,right,bottom,left}
	int delta[4] = { y - 1, m - x, n - y, x - 1 }; 
	
	//Find minimum distance
	int k = 0;
	for (int i = 1; i < 4; ++i)
		delta[i]<delta[k] ? k = i: false;
	
	//Characteristics of the inner rectangle
	int n2 = n - 2 * delta[k];
	int m2 = m - 2 * delta[k];
	int sh[4] = { x - delta[k], y - delta[k], m - x - delta[k]+1, n - y - delta[k]+1 };
	//Main 
	int res = m*n-n2*m2;
	switch (k)
	{
	case 0:
		res += sh[0];
		break;
	case 1:
		res += m2 + sh[1] - 1;
		break;
	case 2:
		res += m2 + n2 + sh[2] - 2;
		break;
	case 3:
		res += 2 * m2 + n2 + sh[3] - 3;
		break;
	}
	return res;
}

int get_count2(int m, int n, int x, int y)
{
	//Distance between point and sides of rectangle {top,right,bottom,left}
	int delta[4] = { y - 1, m - x, n - y, x - 1 };

	//Find minimum distance
	int k = 0;
	for (int i = 1; i < 4; ++i)
		delta[i]<delta[k] ? k = i : false;

	//Characteristics of the inner rectangle
	int n2 = n - 2 * delta[k];
	int m2 = m - 2 * delta[k];
	int sh[4] = { x - delta[k], y - delta[k], m - x - delta[k]+1, n - y - delta[k]+1 };
	//Main 
	int t = (k>1) ? 1 : 0;
	int res = m*n - n2*m2 + m2*(k - t) + n2*t + sh[k] - k;
	return res;
}



Изменил массив shift
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38771091
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подумал, что если кто-нибудь не до конца понял алгоритм, лучше добавить рисунок
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38771092
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38771111
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас листки убирал, заметил опечатку у себя. От каждого сдвига на границе внутреннего прямоугольника нужно отнять i, это количество углов внутреннего прямоугольника входящих в этот сдвиг(отнять нужно потому что эта точка дублируется).
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38771294
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot SashaMercury]в этой теме, получалось, что решал я. Правда отвечали вы хреново./quot]

У меня совершенно противоположное мнение. Не умеете ни решать, ни вести себя.



SashaMercuryКогда я давал вам пример, я не подумал что он выйдет за пределы 4Б пропущено... Но ответ вы мне дали ! И я просто пытался узнать откуда он. Вам нужно было написать что он неверный. и всё.


Зачем давать тестовый пример, не зная ответа?

Я рассуждал как программист. То что вы дали 2 теста, причем второе значение находится явно вне области допустимых значений параметра меня нисколько не смутило. Вы спросили, что выдает программа в обоих случаях. Я ответил. Какие тут претензии?

Или каждый раз, когда у вас в программе возникает переполнение, вы ищете виновника на стороне?



SashaMercuryнет. не мой, но автору спасибо.

Не стоит благодарности. Код писал больше для себя. Надо же иногда немного расслабиться.



SashaMercuryя не буду больше вам отвечать и читать ваши сообщения.

Правильно, берите только код!
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38772116
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСейчас листки убирал, заметил опечатку у себя. От каждого сдвига на границе внутреннего прямоугольника нужно отнять i, это количество углов внутреннего прямоугольника входящих в этот сдвиг(отнять нужно потому что эта точка дублируется).
Саш. А как ты себе понимаешь площадь прямоугольника на дискретной поверхности?
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38772518
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercuryСейчас листки убирал, заметил опечатку у себя. От каждого сдвига на границе внутреннего прямоугольника нужно отнять i, это количество углов внутреннего прямоугольника входящих в этот сдвиг(отнять нужно потому что эта точка дублируется).
Саш. А как ты себе понимаешь площадь прямоугольника на дискретной поверхности?

Как мощность элементов принадлежащих данному прямоугольнику
...
Рейтинг: 0 / 0
Обход прямоугольника по спирали. Поиск более подходящего алгоритма
    #38772985
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... ты ответил умно, но ниочём. Я не то имел в виду.

Представь себе дискретную поверхность пикселов (ячеек, квадратиков e.t.c)
Как ты думаешь, какую площадь должен иметь следующий прямоугольник?

Код: plaintext
1.
Rectangle *rect = new Rectangle(1,1,7,11);



Конструктор задаёт левый верхний и правый нижний угол.
...
Рейтинг: 0 / 0
25 сообщений из 88, страница 3 из 4
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Обход прямоугольника по спирали. Поиск более подходящего алгоритма
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]