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: こんにちは
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • а без 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;

      какой итератор;)
      Ответить
      • Ну это хитрые итераторы. Они там могут из произвольного места строки найти начало слова, например. Хотя жаль, конечно, что их не завернули в нормальные крестовые.
        Ответить
        • Нахуй нужны итераторы?
          Ответить
          • Не нужны. У меня в микроконтроллерах никаких итераторов нет.
            Ответить
            • отлично у тебя есть итераторы, инкремент поинтера же работает
              Ответить
              • Нет. Инкремент поинтера - не итератор.
                Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • Определение из вики:
                    Итератор (от англ. 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);

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

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

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

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

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