Куча говна / Говнокод #28930 Ссылка на оригинал

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
  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 j123123, (Updated )

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

  • Инью, скорее смотри. Сюда свежих миксинов привезли!
    Ответить
      • — А вы миксинов продаёте?
        — Нет, только показываем.
        — Красивое.
        Ответить
  • Можно еще вот так улучшить
    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"
                    ))
        Ответить

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

Из-за тебя ушел bormand, guest!

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


    8