- 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
- 74
- 75
- 76
- 77
- 78
#include <iostream>
#include <set>
#include <unicode/brkiter.h>
#include <unicode/unistr.h>
#include <unicode/coll.h>
#include <unicode/sortkey.h>
bool hasRepeatingCharacters(const icu::UnicodeString &word)
{
icu::Locale locale = icu::Locale::getDefault();
UErrorCode status = U_ZERO_ERROR;
std::unique_ptr<icu::BreakIterator> it{icu::BreakIterator::createCharacterInstance(locale, status)};
if (U_FAILURE(status)) throw 42;
it->setText(word);
std::unique_ptr<icu::Collator> collator{icu::Collator::createInstance(status)};
if (U_FAILURE(status)) throw 42;
collator->setStrength(icu::Collator::SECONDARY);
auto less = [](const icu::CollationKey &k1, const icu::CollationKey &k2){
UErrorCode status = U_ZERO_ERROR;
bool isLess = k1.compareTo(k2, status) == UCOL_LESS;
if (U_FAILURE(status)) throw 42;
return isLess;
};
std::set<icu::CollationKey, decltype(less)> cache(less);
int32_t p = it->first();
while (p != icu::BreakIterator::DONE) {
int32_t q = it->next();
if (q == icu::BreakIterator::DONE)
break;
icu::CollationKey key;
collator->getCollationKey(word.tempSubStringBetween(p, q), key, status);
if (U_FAILURE(status)) throw 42;
if (cache.find(key) != cache.end())
return true;
cache.insert(key);
p = q;
}
return false;
}
int main()
{
icu::UnicodeString words(u8"Example english Боб мир כוכב 民主主義語こんにちは", "utf-8");
icu::Locale locale = icu::Locale::getDefault();
UErrorCode status = U_ZERO_ERROR;
std::unique_ptr<icu::BreakIterator> it{icu::BreakIterator::createWordInstance(locale, status)};
if (U_FAILURE(status)) throw 42;
it->setText(words);
int32_t p = it->first();
while (p != icu::BreakIterator::DONE) {
int32_t q = it->next();
if (q == icu::BreakIterator::DONE)
break;
if (it->getRuleStatus() != UBRK_WORD_NONE)
{
icu::UnicodeString word{words.tempSubStringBetween(p, q)};
bool hasRepeats = hasRepeatingCharacters(word);
std::string wordUtf8;
word.toUTF8String(wordUtf8);
std::cout << (hasRepeats ? "Has repeats: " : "No repeats: ") << wordUtf8 << std::endl;
}
p = q;
}
return 0;
}
bormand 14.10.2020 20:42 # 0
guest8 14.10.2020 20:43 # −999
MAPTbIwKA 14.10.2020 20:44 # −1
bormand 14.10.2020 20:46 # +2
З.Ы. Там поди один словарь японских слов на мегабайт. А без него эту хуйню на слова не разбить.
MAPTbIwKA 14.10.2020 20:50 # 0
Mithun_Chakraborty 14.10.2020 21:06 # 0
Desktop 14.10.2020 21:16 # 0
guest8 14.10.2020 22:24 # −999
rotoeb 14.10.2020 20:49 # 0
MAPTbIwKA 14.10.2020 20:51 # 0
какой итератор;)
bormand 14.10.2020 20:56 # 0
rotoeb 14.10.2020 21:16 # 0
j123123 14.10.2020 23:57 # 0
DypHuu_niBEHb 15.10.2020 02:50 # 0
j123123 15.10.2020 05:14 # 0
guest8 15.10.2020 11:21 # −999
j123123 15.10.2020 12:22 # 0
Итератор (от англ. iterator ― перечислитель) — интерфейс, предоставляющий доступ к элементам коллекции (массива или контейнера) и навигацию по ним.
Мое определение:
Грубо говоря, итератор это некая абстрактная хуета для хождения по произвольной хуйне. Например, это необязательно хуйня для пропердоливания какого-то одномерного массива или списка, это может быть какой-нибудь хитровыебаный граф, и итератором можно ходить по этому графу от вершине к вершине. И инкремент поинтера тут не канает, иначе ж вообще можно докатиться до хуйни, что адресная арфметика это блядь итератор. Итератор это высокоуровневая абасракция, нехуй сюда поинтеры лепить
Perevedi_na_PHP 15.10.2020 12:24 # 0
j123123 15.10.2020 12:29 # 0
Может у тебя и в ассемблере итератор есть, там ж тоже эта адресная арифметика присутствует?
Perevedi_na_PHP 15.10.2020 12:31 # 0
В чём реальное отличие? Почему первый - итератор, а второй - нет?
j123123 15.10.2020 12:38 # +1
Указатель становится итератором только в контексте некой хуйни, а если я делаю
то этот shit - нихуя не итератор, это просто указатель на выделенную память блядь.
Посмотри мой несвежий говнокод https://govnokod.ru/23275
и полную версию кода https://wandbox.org/permlink/Ky8fnuqyE0Ahxftm
Что там итератор? А там итератором оказывается uint8_t, прикинь
Так что сам по себе указатель это нихуя не итератор, и инкремент указателя сам по себе нихуя не итератор. Итератором может быть какая попало питушня, если так подумать.
guest8 15.10.2020 12:51 # −999
guest8 15.10.2020 13:04 # −999
Mohandas_Gandhi 15.10.2020 13:10 # 0
DypHuu_niBEHb 15.10.2020 13:12 # 0
важно, что там курица
https://www.compart.com/en/unicode/U+1F414
Mohandas_Gandhi 15.10.2020 13:16 # 0
bormand 16.10.2020 02:02 # 0
guest8 16.10.2020 02:06 # +1
bormand 16.10.2020 02:07 # 0
MAKAKA 16.10.2020 02:57 # 0
Как питухи умудрились наплодить четыре (!!) однобайтовые кодировки?
Причем MS умудрился сделать две, обосравшись на ровном месте.
bormand 16.10.2020 03:03 # +1
guest8 16.10.2020 03:05 # +2
bormand 16.10.2020 03:08 # +1
Собственно в чём и прелесть wchar'ов тогда была. С ними реально можно было работать.
А сейчас разницы между utf-8 и utf-16 особо то и нет.
j123123 15.10.2020 13:12 # +2
6e3By3HbIu_nemyx 15.10.2020 12:18 # 0
guest8 14.10.2020 22:30 # −1
6e3By3HbIu_nemyx 14.10.2020 23:33 # 0
guest8 14.10.2020 23:37 # −999