- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
/*
Дана последовательность, содержащая от 2 до 50 слов, в каждом из которых от 1 до 8 строчных
латинских букв; между соседними словами - не менее одного пробела, за последним словом - точка.
Напечатать те слова последовательности, которые отличны от первого слова и
удовлетворяют следующему свойству: в слове нет повторяющихся букв.
*/
#include <iostream>
#include <cstring>
using namespace std;
void strComparsion(const char *str1, const char *str2, const int beginStr2, const int endStr2);
int main()
{
char arrWord[50*8+50+1] = "spros na java programmistov"
" rastet i v etom vinovat chertov android.";
int counterSpace = 0; //Счетчик пробелов
char strOneBuffer[9]; //Массив для первого слова
cout << "Na vhode: \n" << arrWord << endl;
cout << "Na vyhode: \n";
//Копируем первое слов в отдельный массив
for(int i = 0; arrWord[i-2] != ' ';i++)
{
strOneBuffer[i] = arrWord[i];
if(arrWord[i] == ' ')
{
strOneBuffer[i] = '\0';
counterSpace = i;
}
}
for(int i = counterSpace + 1, j = counterSpace + 1; arrWord[i] != '\0' ; i++)
if(arrWord[i] == ' ' || arrWord[i] =='.')
{
strComparsion(strOneBuffer, arrWord, j, i);
j = i +1;
}
return 0;
}
void strComparsion(const char *str1, const char *str2, const int beginStr2, const int endStr2)
{
//Флаги
int countSymbol = 0;
int repeatSymbol = 0;
//Сравниваем слова с первым словом
if( strlen(str1) == endStr2 - beginStr2 )
for(int i = 0, j = beginStr2; j < endStr2; i++, j++)
if(str2[j] == str1[i])
countSymbol++;
//Ищем повторяющийся буквы в слове
for(int i = beginStr2; i < endStr2; i++)
for(int j = beginStr2; j < endStr2; j++)
{
if(i == j)
continue;
if(str2[i] == str2[j])
repeatSymbol++;
}
//Выводим слово по требуеиым критериям
if(countSymbol < strlen(str1) && repeatSymbol == 0)
for(int i = beginStr2; i < endStr2; i++)
{
cout << str2[i];
if(i == endStr2 - 1)
cout << " ";
}
}
bormand 29.06.2014 21:28 # +2
> const char *, strlen
No way!
bormand 29.06.2014 21:37 # +1
О_о. Оно точно работало? Тут же явный UB из-за вылета за границу массива.
> после 6 месяцев изучения кодинга
Норм. В принципе, у всех такое было в начале изучения кодинга.
tirinox 30.06.2014 11:28 # +2
bormand 30.06.2014 11:33 # 0
Vasiliy 30.06.2014 12:48 # +2
eth0 01.07.2014 21:23 # 0
P.S. Если бы я переместился в 2001-й, то первым делом накупил/намайнил бы биткойнов. И никаких проблем с плюсами.
Qwertiy 29.06.2014 21:54 # 0
Ну, весьма маловероятно, что хотя бы один из пары байт перед началом массива равен 32 ;)
Хотя да, код весьма неожиданный)))
kegdan 29.06.2014 22:07 # 0
bormand 29.06.2014 22:22 # 0
Тут гораздо интересней, почему 50*8+50+1.
kegdan 29.06.2014 22:33 # 0
kegdan 29.06.2014 22:46 # +1
brutushafens 29.06.2014 22:22 # +1
kegdan 29.06.2014 22:32 # +1
bormand 29.06.2014 22:53 # +1
P.S. Код мутноват: далеко не сразу понятно, что вообще происходит.
kegdan 29.06.2014 23:08 # 0
bormand 29.06.2014 23:13 # +1
1) Пирфоманс важен далеко не всегда, иногда лучше поюзать Split() и получить чистый, наглядный и красивый код (хоть и более медленный, и жрущий больше памяти).
2) Если у кода нормальный интерфейс, то реализацию всегда можно превратить в байтоёбскую (если это вообще когда-нибудь понадобится).
3) Чем меньше байтоёбства в коде - тем легче его поддерживать и изменять.
> Split есть, но зачем плодить массивы?
Ну если split() не подходит (например строка многомегабайтная, или вообще какой-нибудь сокет вместо строки) - можно поюзать готовые токенизаторы, которые работают без полного массива, копируя токены по одному.
kegdan 29.06.2014 23:20 # 0
Тут задача на выброс - какая поддержка, о чем вы? Про наглядность тоже сказать нечего - нах она в этой задаче не нужна. Ну можно было и рассплитить. Я особой разницы не вижу)
bormand 29.06.2014 23:20 # +2
Тогда какой смысл вообще заморачиваться с пирфомансом? :) Split'нул, пробежался for'ом, да и дело с концом, можно чем-нибудь более интересным заняться. Для задач на выброс время разработки - решающий фактор, чем быстрее ты ее запилишь, поюзаешь и выкинешь - тем лучше. А байтоёбство этому явно не способствует.
> Про наглядность тоже сказать нечего - нах она в этой задаче не нужна.
Для учебной задачи наглядность - самый важный показатель.
> Я особой разницы не вижу)
Да похуй на самом деле, надо ж тебя как-то потроллить ;)
kegdan 29.06.2014 23:31 # +1
Мне же надо учиться байтоебить, хотя бы на кошках)
bormand 29.06.2014 23:47 # 0
Только вместо break в 26 строке я бы поставил return false, а 29ю строку заменил бы на return true. Ну и letters[word[i] - 'a'] довольно рискованная конструкция (для сишки, а в шарпе ведь будет просто исключение?).
kegdan 30.06.2014 00:58 # 0
kegdan 30.06.2014 03:03 # +2
kegdan 30.06.2014 03:18 # 0
bormand 30.06.2014 06:40 # +3
kegdan 30.06.2014 11:29 # +1
bormand 30.06.2014 11:34 # +2
http://www.haskell.org/hoogle/
Вбиваешь туда какую-нибудь сигнатурку в духе (a -> Bool) -> [a] -> Bool и получаешь все эти any, all и т.п.
kegdan 30.06.2014 12:44 # 0
bormand 30.06.2014 13:01 # 0
Ну вот представь себе конвейер, по которому передаются некие данные. Попадают на вход первой функции, ее выход попадает на вход второй и т.п. Вот так он и юзается ;)
1024-- 30.06.2014 13:09 # +1
А потом приходит функция от двух аргументов, принимающая кашу с точечками и долларами, приходится расписывать на бумажке и просто верить в результат (т.к. каждое равенство истинно), а не осознавать.
Abbath 30.06.2014 13:11 # +4
kegdan 30.06.2014 14:59 # 0
kegdan 30.06.2014 15:00 # 0
kegdan 30.06.2014 11:39 # 0
uniqLetters = all (== 1) (map (length (group id)) id)
?
roman-kashitsyn 30.06.2014 11:47 # +1
Yuuri 30.06.2014 12:53 # 0
Хотя тут два последовательных фильтра сфьюзятся, возможно.
1024-- 30.06.2014 08:36 # +1
> import Prelude
> if a==h then True else isContain a t
*trololo*
bormand 30.06.2014 08:48 # 0
Ну да, прелюдию вручную подключать необязательно, если не хочешь что-то конфликтующее из нее выкинуть или сделать import qualified.
> if a==h then True else isContain a t
А что не так? Обычный тернарничек.
1024-- 30.06.2014 09:05 # +1
Сводится к a==h || isContain a t (по крайней мере, в сишке).
defecate-plusplus 29.06.2014 23:39 # +1
единственно, в сишке можно было бы не копировать первое слово - но ведь в шарпике иммутабельные строки и субстр дешевый?
kegdan 29.06.2014 23:44 # +1
Так точно, мистер Пикард
Abbath 30.06.2014 13:03 # +1
kegdan 30.06.2014 14:58 # −1
Abbath 30.06.2014 16:11 # 0
eth0 01.07.2014 21:27 # 0
Abbath 01.07.2014 22:54 # +1
eth0 03.07.2014 21:35 # 0
bormand 29.06.2014 23:51 # 0
С перфомансом всё нормально, я к нему и не докапываюсь. Вон даже массив, для проверки на уникальность букв не пересоздается, а аккуратно юзается заново с новым wordIndex. Царь был бы доволен.
kegdan 29.06.2014 23:57 # +1
roman-kashitsyn 30.06.2014 10:58 # 0
строки иммутабельные, но субстр не дешёвый
Qwertiy 01.07.2014 00:05 # 0
kegdan 01.07.2014 01:50 # 0