Няшная / Говнокод #28466 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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
// https://github.com/flipperdevices/flipperzero-firmware/blob/2a6a3a1bf7ba1ecb42b8cbfc1b1856a54f2878b7/applications/plugins/music_player/music_player.c#L74

static bool is_white_note(uint8_t semitone, uint8_t id) {
    switch(semitone) {
    case 0:
        if(id == 0) return true;
        break;
    case 2:
        if(id == 1) return true;
        break;
    case 4:
        if(id == 2) return true;
        break;
    case 5:
        if(id == 3) return true;
        break;
    case 7:
        if(id == 4) return true;
        break;
    case 9:
        if(id == 5) return true;
        break;
    case 11:
        if(id == 6) return true;
        break;
    default:
        break;
    }

    return false;
}

static bool is_black_note(uint8_t semitone, uint8_t id) {
    switch(semitone) {
    case 1:
        if(id == 0) return true;
        break;
    case 3:
        if(id == 1) return true;
        break;
    case 6:
        if(id == 3) return true;
        break;
    case 8:
        if(id == 4) return true;
        break;
    case 10:
        if(id == 5) return true;
        break;
    default:
        break;
    }

    return false;
}

Хуйня какая-то. То ли дело "паттерн матчинг".

Запостил: j123123 j123123, (Updated )

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

  • Есть кстати такая вот компилтайм-говнолиба для крестов, где есть паттерн-матчинг https://github.com/mpark/patterns

    #include <cstdio>
    
    #include <mpark/patterns.hpp>
    
    void fizzbuzz() {
      using namespace mpark::patterns;
      for (int i = 1; i <= 100; ++i) {
        match(i % 3, i % 5)(
            pattern(0, 0) = [] { std::printf("fizzbuzz\n"); },
            pattern(0, _) = [] { std::printf("fizz\n"); },
            pattern(_, 0) = [] { std::printf("buzz\n"); },
            pattern(_, _) = [i] { std::printf("%d\n", i); });
      }
    }
    
    int main() {
      fizzbuzz();
    }


    И сколько же хуйни на шаблоноговне надо написать, чтобы это реализовать?
    https://github.com/mpark/patterns/blob/master/include/mpark/patterns/match.hpp можно тут посмотреть
    Ответить
    • Походу чтобы от любой ноты гамму строить, в semitone хранится первая ступень гаммы, а в id смещение n-ной ступени.

      Хотя хз конечно, можно было просто номером ноты обойтись.
      Ответить
      • Лажа выходит. Работает только для до-мажора. На остальных гаммах будут сплошные false.
        Ответить
        • Хм, не проверял, я думал это для этого запилили.

          Тогда бред какой-то
          Ответить
          • Судя по предыдущей функции (semitone_to_note), semitone — абсолютное значение, 0 означает «до», т. е. это белая клавиша вне зависимости от второго аргумента.

            Второй же аргумент нужен исключительно ради такого цикла:
            for(size_t i = 0; i model->semitone, i)) {


            Да, 6 холостых прогонов из 7 ради получения i, которое из semitone можно было бы получить напрямую простенькой функцией (похожей на semitone_to_note).

            Как называется такой говнопаттерн программирования?
            Ответить
            • Похоже, что тут всё работает. Автор рисует рояльную клавиатуру, и ему нужно определить, какие клавиши нажаты. Но вот интерфейсы он для этого придумал чудные.
              Ответить
  • Хуня конечно, надо таблицу истинниости набубенить

    Правда, компилятор это и так сделает
    Ответить
  • static bool is_white_note(uint8_t semitone, uint8_t id) {
        static int8_t id_to_semitone[7] = {0, 2, 4, 5, 7, 9, 11};
        return id_to_semitone[id] == semitone;
    }

    INB4 нет защиты от неправильного id.
    Ответить
    • компилятор свитч в такую хуйню и превратит небось?
      Ответить
    • Пофиксил, проверь:
      static uint8_t table[65536] = {
          [0] = 1,
          [513] = 1,
          [1026] = 1,
          [1283] = 1,
          [1796] = 1,
          [2309] = 1,
          [2822] = 1,
      };
      
      uint8_t is_white_note(uint8_t semitone, uint8_t id)
      {
          return table[semitone * 256 + id];
      }

      https://gcc.godbolt.org/z/dMaY5hf1G
      Ответить
      • помоему у тебя получился малость разреженный моссив

        как его правильно хронить не проебывая место? Была же такая структура
        Ответить
        • Исправил, проверь:
          #include <stdint.h>
          #include <stdio.h>
          
          typedef struct {
              uint16_t key;
              uint8_t filled;
          } Bucket;
          
          #define SIZE 14
          
          static Bucket table[SIZE] = {};
          
          uint8_t hash(uint16_t key)
          {
              return key % SIZE;
          }
          
          uint8_t next_hash(uint8_t cur_hash)
          {
              return (cur_hash + 1) % SIZE;
          }
          
          void set(uint16_t key)
          {
              uint8_t key_hash = hash(key);
              Bucket *bucket = &table[key_hash];
              
              while (bucket->filled && bucket->key != key) {
                  key_hash = next_hash(key_hash);
                  bucket = &table[key_hash];
              }
              
              bucket->filled = 1;
              bucket->key = key;
          }
          
          uint8_t get(uint16_t key)
          {
              uint8_t key_hash = hash(key);
              uint8_t init_key_hash = key_hash;
              
              Bucket *bucket = &table[key_hash];
              while (bucket->filled && bucket->key != key) {
                  key_hash = next_hash(key_hash);
                  if (key_hash == init_key_hash) {
                      return 0;
                  }
                  bucket = &table[key_hash];
              }
              return bucket->filled && bucket->key == key;
          }
          
          static uint8_t test_table[65536] = {
              [0] = 1,
              [513] = 1,
              [1026] = 1,
              [1283] = 1,
              [1796] = 1,
              [2309] = 1,
              [2822] = 1,
          };
          void test()
          {
              uint8_t error = 0;
              for (uint32_t i = 0; i < 65535; i++) {
                  uint8_t expected = test_table[(uint16_t)i];
                  uint8_t actual = get((uint16_t)i);
                  if (actual != expected) {
                      printf("ERROR on %d: expected %d, got %d\n", i, expected, actual);
                      error |= 1;
                  }
              }
              
              if (error) {
                  puts("TESTS FAILED");
              } else {
                  puts("TESTS PASSED");
              }
          }
          
          void init()
          {
              set(0);
              set(513);
              set(1026);
              set(1283);
              set(1796);
              set(2309);
              set(2822);
          }
          
          int main()
          {
              init();
              test();
          }

          https://gcc.godbolt.org/z/WEP66YzTE
          Ответить
                • хуй знает, но вероятно гость так описывал литерал для массива

                  ну, чтобы не писать 2822 раза 0
                  Ответить
                    • Ну так гнутое расширение это стандарт через 10 лет

                      Это как бустня у крестов
                      Ответить
                    • Ещё и для структур инициализаторы. Ты чо забыл как мы писали "АЗАЗА А В КРЕЕСТАХХ ТАКОГО НЕТ"
                      Ответить
                        • Уточни, Alina_Poksenova, какой градус показывает термометр в твоем ректуме?
                          Ответить
              • И как это мешает всё это написать? На сишке даже выглядеть будет более энтерпрайзно (т.е. тонны черезжопного бройлерплейта)
                Ответить
  • C — говно. Тебе ещё какое-то объяснение нужно?
    Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8