Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Симметричность диапазона байт / 13 сообщений из 13, страница 1 из 1
08.05.2014, 14:02
    #38636783
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность диапазона байт
Здравствуйте.
Между чтением теории и стандарта Си, я решил размяться и решить простую задачу. Её решил, но при решении вновь появились вопросы. Подскажите пожалуйста
Задача: Определить симметричен ли диапазон байт. Ввод строки организовать через консоль.
Примеры:
helloolleh true
hellosmthelse false
Моё решение:
Код: 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.
#include <stdio.h>

//функция проверят симметричен ли диапазон байт. На входе указатели на первый и завершащий байты
bool isMirrorString(const char* s, const char* e)
{
	//1
	if((e-s+1)%2!=0)
		return false;
	//сжимаем диапазон
	while(e>s && (*e--^*s++)==0);//2

	return (s>e)?true:false;
}

int main(int argc,char** argv)
{
	char buf[1000];//3
	char* buf_e=buf;
	//Слушаем stdin
	printf("(Input string is completed)? Press 'Enter' \n");
	int c;
	while((c=getc(stdin))!='\n')
		*buf_e++=c;
	
	printf(isMirrorString(buf,buf_e-1)?"YES \n":"NOT \n");
	return 0;
}



1. Есть ли смысл добавлять эту проверку ? Как вы считаете ? Мне кажется, что если бы эта программа принимала поток данных(на подобие 1 команда, много данных), то смысл был бы. Либо сейчас такой оптимизацией никто не занимается, и процессор сам додумает за меня про чётность и нечётность ?
2.Мне нравится одна моя строчка, она крайне симпатичная,
Код: plaintext
1.
while(e>s && (*e--^*s++)==0);//2


но я не уверен, что проверка на равенство через сумму по модулю два будет оптимальней чем обычное ==, с одной стороны, как вероятно работает ==, идёт по битам и проверяет до первого различия (8 битовых сравнений максимум, минимум 1), а сумма по модулю два, 8 битовых операций, да плюс от 1 до 8 битовых сравнений. Как лучше сравнивать ? Или мне нужно дизассемблировать, и исходя из этого смотреть ?
3.Мне не нравится как я работаю с памятью. Можно ли в Си динамически расширять массив, и можно ли это сделать в данном конкретном случае? Именно в С, не в С ++.
4. Можно ли решить эту задачу другим, более быстрым способом, за исключением комментариев по пункту 2 ?

Дальше буду читать стандарт.
...
Рейтинг: 0 / 0
08.05.2014, 14:10
    #38636799
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность диапазона байт
SashaMercury1. Есть ли смысл добавлять эту проверку ?
Нет. Строка "heh" вполне симметрична, хоть и содержит нечётное количество букв.

Второй пункт - совершенный бред, а твой способ проверки абсолютно нечитаем.

PS: Твой return абсолютно эпичен. Индус?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.05.2014, 14:14
    #38636807
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность диапазона байт
Не до конца объяснил, симметрия в данном случае должна быть с полным дублированием. Что не так в return ?
...
Рейтинг: 0 / 0
08.05.2014, 14:15
    #38636810
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность диапазона байт
Что в нём нечитаемого ??? Сжимаем отрезок, и делам сумму по модулю два с краёв.
...
Рейтинг: 0 / 0
08.05.2014, 14:25
    #38636822
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность диапазона байт
SashaMercuryЧто не так в return ?
Ты из булевого значения делаешь булево значение. "Зеленее не будет."

SashaMercuryЧто в нём нечитаемого ???
Догадаться с первой попытки, что "(*e--^*s++)==0" это сравнение на равенство сможет не
всякий. Мне, например, не удалось. А стало быть любой, кто будет после тебя читать и
править твой код, сначала тебя обматерит, а потом заменит это на вменяемое "*e-- == *s++".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.05.2014, 14:45
    #38636865
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность диапазона байт
Саш, какие цели ты преследуешь когда пишешь такие brainfucks для сообщества?

Или ты думаешь что всем разработчикам безумно нравится разбирать программу
которая записана в "одну строчку"? Как ты себе предсталвяешь хождение по ней
дебаггером? Как в нее можно подставлять переменные? Брейкпоинты?

Ведь язык, милый мой создан именно для облегчения человеко-машиинного общения!
...
Рейтинг: 0 / 0
08.05.2014, 14:47
    #38636868
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность диапазона байт
SashaMercury1. Есть ли смысл добавлять эту проверку ? Как вы считаете ? Мне кажется, что если бы эта программа принимала поток данных(на подобие 1 команда, много данных), то смысл был бы.
Это зависит только от условий задачи. Как там прописано - так и правильно.
SashaMercury Либо сейчас такой оптимизацией никто не занимается, и процессор сам додумает за меня про чётность и нечётность ?
Процессор не думает, он выполняет данные ему команды.

SashaMercury2.Мне нравится одна моя строчка, она крайне симпатичная,
Код: plaintext
1.
while(e>s && (*e--^*s++)==0);//2


но я не уверен, что проверка на равенство через сумму по модулю два будет оптимальней чем обычное ==, с одной стороны, как вероятно работает ==, идёт по битам и проверяет до первого различия (8 битовых сравнений максимум, минимум 1), а сумма по модулю два, 8 битовых операций, да плюс от 1 до 8 битовых сравнений. Как лучше сравнивать ? Или мне нужно дизассемблировать, и исходя из этого смотреть ?
Посмотри. Только без дизассемблирования видно что ты делаешь две операции (^ и ==) когда достаточно одной (==), т.е. операция ^ просто лишняя.
Процессоры не работают с потоками битов, они работают с байтами, поэтому в обоих случаях (^ и ==) процессору дается два байта с операндами, а как уж он эти операнды обрабатывает - этого даже в асмовском коде невидно, это распайку транзисторов надо смотреть :)

SashaMercury3.Мне не нравится как я работаю с памятью. Можно ли в Си динамически расширять массив, и можно ли это сделать в данном конкретном случае? Именно в С, не в С ++.
в данном случае нельзя, а в Си можно, читай про функции malloc(), calloc(), realloc(), free()
SashaMercury4. Можно ли решить эту задачу другим, более быстрым способом, за исключением комментариев по пункту 2 ?
нет
...
Рейтинг: 0 / 0
08.05.2014, 15:28
    #38636937
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность диапазона байт
Dimitry Sibiryakov Ты из булевого значения делаешь булево значение. "Зеленее не будет."
верно ведь. Не заметил даже

maytonКак в нее можно подставлять переменные? Брейкпоинты?
не думал про это (
Можно утверждать что код ниже
Код: plaintext
1.
while(e>s && (*e--^*s++)==0);


моветон, и так делать не надо ?


ДмитрийSashaMercury
4. Можно ли решить эту задачу другим, более быстрым способом, за исключением комментариев по пункту 2 ?

нет

Очень жаль..В который раз наблюдаю как сильно мы ограничены в быстродействие..Хочется быстрее
...
Рейтинг: 0 / 0
08.05.2014, 15:34
    #38636948
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность диапазона байт
SashaMercuryВ который раз наблюдаю как сильно мы ограничены в
быстродействие..Хочется быстрее
Не в том месте ты быстродействие ловишь. Твой посимвольный ввод сожрёт его больше чем
собственно проверка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.05.2014, 15:53
    #38636969
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность диапазона байт
SashaMercuryМожно утверждать что код ниже
Код: plaintext
1.
while(e>s && (*e--^*s++)==0);


моветон, и так делать не надо ?

Всё зависит от того, откуда ты его взял и что будешь делать дальше. Если это опенсорсный проект
то он должен быть дружественнен к группе девелоперов. Должен быть ясно и чётко написан и не вызывать
сложных двузначных толкований и не иметь побочных эффектов. К примеру в этом исходнике - отсутствует
тело цикла. Побочный эффект. Если я добавлю тело - то где будут пост инкременты? И что за сложение
по модулю 2. Зачем оно? Почему не сделать простое и ясное сравнение на равенство? Вобщем - лучше
эту функцию переписать так чтобы она ложилась на блок-схему 1:1.

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

Вобщем в программировании, особенно где твой код смотрят другие - нужно быть джентльненом
и не подсовывать то что-бы ты сам не хотел получить "на анализ".

Почитай также про Code Conventions. Как такие вещи делают в Google, IBM, e.t.c.
...
Рейтинг: 0 / 0
08.05.2014, 16:01
    #38636980
luislom
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность диапазона байт
SashaMercury


Как-то по C#-овски всё.
На благородных C-ях где-то так внешне.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <stdio.h>
#include <string.h>
int check(char* s){
 
 char *p=s, *pp=s+strlen(s)-1;
 while(p < pp){ if(*p++!=*pp--){ return -1; }; };
  return 0;
 } 
int main(int a, char** s){ 
  
 if(check(s[1])==0){ printf("Symmetrically even shit on\n");  }else{ printf("bummer your\n"); };
 
  
}
...
Рейтинг: 0 / 0
08.05.2014, 16:02
    #38636981
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность диапазона байт
SashaMercuryОчень жаль..В который раз наблюдаю как сильно мы ограничены в быстродействие..Хочется быстрее
Зачем быстрее? Тут и так все быстро. В реальных задачах как правило ускоряется то что реально тормозит, например расчет идет 5-10 сек и пользователь может подумать что программа "зависла", в данном случае никто не заметит разницы 1 микросекунду будет твой код работать или две.
Шаманства с использованием нестандантных операторов иногда (очень редко) могут дать выигрыш в производительности, но и то какие-то доли-единицы процентов.
Заметный эффект дает:
1. Использование алгоритмов. Поизучай алгоритмы сортировки, там хорошо расписано как разные алгоритмы дают разную скорость.
2. Распараллеливание вычислений (ядер нынче много даже в телефонах)
3. Предподготовка данных, чтобы в последний момент сделать минимум операций для получения результата. Например в твоем случае если считать после каждой введенной буквы - результат будет известен до нажатия Enter, т.е. считай мгновенно.
...
Рейтинг: 0 / 0
08.05.2014, 17:11
    #38637061
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Симметричность диапазона байт
Dimitry Sibiryakov Не в том месте ты быстродействие ловишь. Твой посимвольный ввод сожрёт его больше чем
собственно проверка.


А есть функции считывающие не посимвольно и эти функции не обёртки ?

luislom, у вас как всегда весёлый код, завтра почитаю )

maytonПочитай также про Code Conventions. Как такие вещи делают в Google, IBM, e.t.c.
Вот! Вот это я хотел давно увидеть, я ещё не гуглил, но уже понял что я найду ;)

ДмитрийШаманства с использованием нестандантных операторов иногда (очень редко)

может и так, но мне они нравится, я словно щупаю биты и байты C:
Кстати, вспоминается отличная задача на поиск единственного числа без пары в массиве(fe 7 5 9 6 5 7 9 ->6), которая очень элегантно решается через исключающее или.

Меня уже гонят..Я стал чуточку умнее. Спасибо всем C:
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Симметричность диапазона байт / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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