1. C++ / Говнокод #27029

    +5

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 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;
    }

    По мотивам https://govnokod.ru/27025

    Сформировать строку из слов исходной строки, содержащих повторяющиеся буквы.

    В 60 строк, к сожалению, не уложился :(

    Запостил: bormand, 14 Октября 2020

    Комментарии (38) RSS

    • Has repeats: Example
      No repeats: english
      Has repeats: Боб
      No repeats: мир
      Has repeats: כוכב
      Has repeats: 民主主義
      No repeats: 語
      No repeats: こんにちは
      Ответить
    • throw 42;))
      Ответить
    • а без icu можешь решить?
      Ответить
      • Ага, без icu, в 60 строк и с рекурсией. Я ещё не настолько поехавший.

        З.Ы. Там поди один словарь японских слов на мегабайт. А без него эту хуйню на слова не разбить.
        Ответить
        • Дальнему, да и ближнему Востоку нужен свой Кемаль Аттатюрк, чтобы всю эту неюзабельную поеботу поменять на латиницу.
          Ответить
    • [цензура] приде, на "PHP" переведе.
      Ответить
    • int32_t p = it->first();
          while (p != icu::BreakIterator::DONE) {
              int32_t q = it->next();
              if (q == icu::BreakIterator::DONE)
                  break;

      какой итератор;)
      Ответить
      • Ну это хитрые итераторы. Они там могут из произвольного места строки найти начало слова, например. Хотя жаль, конечно, что их не завернули в нормальные крестовые.
        Ответить
        • Нахуй нужны итераторы?
          Ответить
          • Не нужны. У меня в микроконтроллерах никаких итераторов нет.
            Ответить
            • отлично у тебя есть итераторы, инкремент поинтера же работает
              Ответить
              • Нет. Инкремент поинтера - не итератор.
                Ответить
                • define iterator тогда
                  Ответить
                  • Определение из вики:
                    Итератор (от англ. iterator ― перечислитель) — интерфейс, предоставляющий доступ к элементам коллекции (массива или контейнера) и навигацию по ним.

                    Мое определение:
                    Грубо говоря, итератор это некая абстрактная хуета для хождения по произвольной хуйне. Например, это необязательно хуйня для пропердоливания какого-то одномерного массива или списка, это может быть какой-нибудь хитровыебаный граф, и итератором можно ходить по этому графу от вершине к вершине. И инкремент поинтера тут не канает, иначе ж вообще можно докатиться до хуйни, что адресная арфметика это блядь итератор. Итератор это высокоуровневая абасракция, нехуй сюда поинтеры лепить
                    Ответить
                    • Ну а поинтер - это итератор по хуйне под названием память. Почему не подходит?
                      Ответить
                      • Поинтер сам по себе не предоставляет никакого интерфейса. Это просто адрес. У тебя нет next(), prev() чтоб там ходить в нем. Ты можешь такую хуйню конечно написать, но если ты просто в цикле for() пробегаешь какой-то массив, это нихуя не итератор. Итератор это абстракция.
                        Может у тебя и в ассемблере итератор есть, там ж тоже эта адресная арифметика присутствует?
                        Ответить
                        • vector::iterator begin = vec.begin();
                          vector::iterator end = vec.end();
                          for (vector::iterator it = begin; it != end; it++);


                          int* begin = vec;
                          int* end = vec + size;
                          for (int* it = begin; it != end; it++);


                          В чём реальное отличие? Почему первый - итератор, а второй - нет?
                          Ответить
                          • Почему кирпич вставленный в стену - часть стены, а кирпич валяющийся где-то на асфальте - не часть стены?
                            Указатель становится итератором только в контексте некой хуйни, а если я делаю
                            int *shit = malloc(100500);

                            то этот shit - нихуя не итератор, это просто указатель на выделенную память блядь.

                            Посмотри мой несвежий говнокод https://govnokod.ru/23275
                            и полную версию кода https://wandbox.org/permlink/Ky8fnuqyE0Ahxftm
                            Что там итератор? А там итератором оказывается uint8_t, прикинь
                            uint8_t pos = 0;
                              add_elem_next (&a, pos, 4);
                              pos = step_next (pos, a.arr);
                              add_elem_next (&a, pos, 8);
                              pos = step_next (pos, a.arr);
                              add_elem_next (&a, pos, 16);
                              pos = step_next (pos, a.arr);
                              add_elem_next (&a, pos, 32);
                              pos = step_next (pos, a.arr);
                              add_elem_next (&a, pos, 64);

                            Так что сам по себе указатель это нихуя не итератор, и инкремент указателя сам по себе нихуя не итератор. Итератором может быть какая попало питушня, если так подумать.
                            Ответить
                        • >
                          Поинтер сам по себе не предоставляет никакого интерфейса. Это просто адрес. У тебя нет next(), prev()


                          конечно же есть

                          //next
                          petuh++
                          //prev
                          petuh--
                          Ответить
                          • ( О ШАМО ХОРОЗ УЗБЕКИСТОН _ТОШКЕНТ _ВОДИЙ_N--1_ХОРОЗ_ИШКИБОЗЛАР_ГУРИППАСИ)
                            АССАЛОМУ АЛЕЙКУМ, ХУРМАТЛИ ЮРТДОШЛАР ГУРИППАМИЗГА ХУШ КЕЛИПСИЗЛАР. БУ ГУРУППА ХОРОЗ ИШКИБОЗЛАРИ УЧУН ОЛДИ СОТДИ КИЛИНАДИ.СИЗЛАРНИ ТЕЛЕГРАМ ГУРУППАМИЗГА ТАКЛИФ КИЛАМИЗ КИРИБ БИЗГА КОШИЛИНГ,АЗИЗ ЮРТДОШЛАР БИР БИРИМИЗ БИЛАН ЧИРОЙЛИ МУОМИЛАДА БОЛАЙЛИК ..
                            Ответить
                            • Из всей фразы понял только слова ШАМО, ХОРОЗ, УЗБЕКИСТОН, ТОШКЕНТ, АССАЛОМУ АЛЕЙКУМ, ГУРУППА и ТЕЛЕГРАМ. Ну ещё слово БИР (один, употребляется также в качестве артикля).
                              Ответить
                              • это всё не важно
                                важно, что там курица
                                https://www.compart.com/en/unicode/U+1F414
                                Ответить
                                • U+1F414 > U+FFFF, т. е. за пределами BMP, в «UTF-8» занимает 4 октета.
                                  Ответить
                                  • Символы за пределами BMP нинужны.
                                    Ответить
                                    • COBEPwEHHO BEPHO!
                                      Ответить
                                      • Кириллица то в BMP. Там даже китайских большинство есть.
                                        Ответить
                                        • керилица все равно в 1 байт нормально не ложится.

                                          Как питухи умудрились наплодить четыре (!!) однобайтовые кодировки?
                                          Причем MS умудрился сделать две, обосравшись на ровном месте.
                                          Ответить
                                          • Дык бмп это джва байта, оригинальный юникод. Это потом его уже раздули всяким говном и обосрали винде всю концепцию с wchar_t.
                                            Ответить
                                            • БМП это символы, которые можно вместить в два байта.
                                              Но можно реализовать их и методов UTF-8, а можно всегда брать 2 байта (как делает джава например или какой-нить там wchar) нет?
                                              Ответить
                                              • Да. BMP - утф8 на 1-3 байта или один wchar.

                                                Собственно в чём и прелесть wchar'ов тогда была. С ними реально можно было работать.

                                                А сейчас разницы между utf-8 и utf-16 особо то и нет.
                                                Ответить
                          • У void указателя нет никаких ++ и -- (только в GNU расширении есть)
                            Ответить
                • Итератор.
                  Ответить
    • чтобы итерироваться
      Ответить

    Добавить комментарий