1. Куча / Говнокод #28930

    0

    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
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    import std.stdio;
    import std.conv;
    
    bool[128][128] a;
    
    int pow2(int x) { return x * x; }
    
    string GenPw(string x, string y, string r)
    {
        return "pow2("~r~") > pow2("~x~") + pow2("~y~")";
    }
    
    
    string GenPat(int x_sz, int y_sz, string x_str, string y_str, string r_str, string pat)
    {
      string GenCond = "(";
      foreach (y; 0 .. y_sz)
        foreach (x; 0 .. x_sz)
        {
          if(pat[(y) * x_sz + x] == '1')
          {
            if(GenCond == "(") GenCond ~= "\n     ";
            else GenCond ~= "  && ";
            GenCond ~= "("~GenPw(to!string(x)~"+("~x_str~")",to!string(y)~"+("~y_str~")",r_str)~")\n";
          }
        }
      return GenCond ~ ")";
    }
    
    bool checkCoordNeihb(int x, int y, int r)
    {
        if (pow2(r) > pow2(x) + pow2(y))
        {
            /// Паттерн-матчинг, если
            /// 111
            /// 101
            /// 111
            /// то пиксель 0
            if (
                mixin
                (
                  GenPat
                  (
                    3,3,
                    "x-1",
                    "y-1",
                    "r",
                    "111"~
                    "101"~
                    "111"))
            )
                return false;
            return true;
        }
        return false;
    }
    
    void drawCircle(ref bool[128][128] a, int x, int y, int r)
    {
        foreach (iy; y - r .. y + r)
        {
            foreach (ix; x - r .. x + r)
            {
                if (checkCoordNeihb(ix - x, iy - y, r))
                    a[ix][iy] = true;
            }
        }
    }
    
    void main()
    {
        drawCircle(a, 24, 24, 15);
    
        writeln("\n\n");
        foreach (ix; 0 .. 128)
        {
            foreach (iy; 0 .. 128)
            {
                write(a[ix][iy] ? '1' : '0');
            }
            writeln();
        }
    }

    Переписал на "D" https://govnokod.ru/27990#comment1183758

    Запостил: j123123, 20 Марта 2024

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

    • Инью, скорее смотри. Сюда свежих миксинов привезли!
      Ответить
    • https://wandbox.org/permlink/kxokQnOOgAH9SSCi - а примерно так это будет на крестах.
      Ответить
    • Можно еще вот так улучшить
      import std.stdio;
      import std.conv;
      
      int pow2(int x) { return x * x; }
      
      string GenPw(string x, string y, string r)
      {
          return "pow2("~r~") > pow2("~x~") + pow2("~y~")";
      }
      
      string GenPat2(string FuncName, string FuncInside)
      {
        return
      `string `~FuncName~`(int x_sz, int y_sz, string x_str, string y_str, string r_str, string pat)
      {
        string GenCond = "(";
        foreach (y; 0 .. y_sz)
          foreach (x; 0 .. x_sz)
          {
            if(pat[(y) * x_sz + x] == '1')
            {
              if(GenCond == "(") GenCond ~= "\n     ";
              else GenCond ~= "  && ";
              GenCond ~= "("~`~FuncInside~`(to!string(x)~"+("~x_str~")",to!string(y)~"+("~y_str~")",r_str)~")\n";
            }
          }
        return GenCond ~ ")";
      }`;
      }
      
      
      
      bool[128][128] a;
      
      bool checkCoord(int x, int y, int r)
      {
          return pow2(r) > pow2(x) + pow2(y);
      }
      
      bool checkCoordNeihb(int x, int y, int r)
      {
          if (pow2(r) > pow2(x) + pow2(y))
          {
              /// 111
              /// 1@1
              /// 111
              mixin(GenPat2("MyNewFunc","GenPw"));
              if (
                  mixin(MyNewFunc(
                      3,3,
                      "x-1",
                      "y-1",
                      "r",
                      "111"~
                      "101"~
                      "111"
                  ))
              )
                  return false;
              return true;
          }
          return false;
      }
      
      void drawCircle(ref bool[128][128] a, int x, int y, int r)
      {
          foreach (iy; y - r .. y + r)
          {
              foreach (ix; x - r .. x + r)
              {
                  if (checkCoordNeihb(ix - x, iy - y, r))
                      a[ix][iy] = true;
              }
          }
      }
      
      void main()
      {
          drawCircle(a, 24, 24, 15);
      
          writeln("\n\n");
          foreach (ix; 0 .. 128)
          {
              foreach (iy; 0 .. 128)
              {
                  write(a[ix][iy] ? '1' : '0');
              }
              writeln();
          }
      }
      Ответить
      • Самое тупое, что пришло в голову:

        bool checkCoordNeihb(int x, int y, int r)
        {
            int z = pow2(x) + pow2(y);
            return (pow2(r-1) < z) && (z < pow2(r+1));
        }
        
        void drawCircle(ref bool[128][128] a, int x, int y, int r)
        {
            foreach (iy; y - r - 1 .. y + r + 1)
            {
                foreach (ix; x - r - 1 .. x + r + 1)
                {
                    if (checkCoordNeihb(ix - x, iy - y, r))
                        a[ix][iy] = true;
                }
            }
        }
        Ответить
        • Тогда тут паттерн-матчинга нет такого. У меня ж там компилтайм паттерн-матчинг, можно произвольно задавать условия для значения соседних пикселей, чтобы оно матчилось.

          https://godbolt.org/z/1nM1crWW4 например

          .
                      mixin(MyNewFunc(
                          5,5,
                          "x-2",
                          "y-2",
                          "r",
                          "11111"~
                          "10001"~
                          "10001"~
                          "10001"~
                          "11111"
                      ))
          Ответить
      • это дэ?
        Ответить
    • Я перепесала http://
      Ответить
    • O6eccuHcKuu_nemyx
      Ответить

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