1. Java / Говнокод #27325

    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
    84. 84
    85. 85
    86. 86
    public static boolean isMagicSquare(int[][] a) {
        boolean isMagic = true;
        boolean isSquare = true;
        
        //square? checking here.
        for(int i = 0; i < a.length; i++) {
                if(a.length != a[i].length) {
                        isSquare = false;
                }
        }
        
        if(isSquare) {
            int sum = 0;
            int nextSum = 0;
            
            //first row
            for(int i = 0; i < a.length; i++) {
                    sum += a[0][i]; 
            }
            
            
            //rows
            for(int i = 1; i < a.length; i++) {
                    for(int j = 0; j < a.length; j++) {
                            nextSum += a[i][j];
                    }
                
                    if(nextSum != sum) {
                            isMagic = false;
                            break;
                    } else {
                            nextSum = 0;
                    }
            }
            
            //columns
            if(isMagic) {
                    for(int i = 0; i < a.length; i++) {
                            for(int j = 0; j < a.length; j++) {
                                    nextSum += a[j][i];
                            }
                        
                            if(nextSum != sum) {
                                    isMagic = false;
                                    break;
                            } else {
                                    nextSum = 0;
                            }
                    }
                
                    //diagonals
                    if(isMagic) {
                            for(int i = 0; i < a.length; i++) {
                                    nextSum += a[i][i];
                            }
                            
                            if(nextSum != sum) {
                                    isMagic = false;
                            } else {
                                    nextSum = 0;
                            }
                        
                            if(isMagic) {
                                    int j = a.length - 1;
                                
                                    for(int i = 0; i < a.length; i++) {
                                            nextSum += a[i][j];
                                            
                                            if(j > 0) {
                                                    j--;
                                            }
                                    }
                                
                                    if(nextSum != sum) {
                                            isMagic = false;
                                    }
                            }
                    }
            }
            
        } else {
                isMagic = false;
        }
    
        return isMagic;
    }

    Write a method called isMagicSquare that accepts a two-dimensional array of integers as a parameter and returns true if it is a magic square. A square matrix is a magic square if it is square in shape (same number of rows as columns, and every row the same length), and all of its row, column, and diagonal sums are equal. For example, [[2, 7, 6], [9, 5, 1], [4, 3, 8]] is a magic square because all eight of the sums are exactly 15.

    (https://practiceit.cs.washington.edu/problem/view/bjp3/chapter7/e20%2DisMagicSquare)

    Работает, но код нечитаемый. Как сократить? Понятия не имею.

    Запостил: imrnccc, 28 Марта 2021

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

    • C++ здесть отсутствует(((
      Ответить
    • > Как сократить?
      Для нячаля выкинуть книжку, в которой написано про один return. Тут как с попом на пляже: либо одновозврат снять, либо длинный код нядеть.
      Ответить
    • > Как сократить?

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

          Я так в «2048» сделал из четырёх циклов для четырёх свайпов – один цикл. Это моё самое большое достижение в жизни, я им очень горжусь.
          Ответить
    • Выкинь массив массивов, и используй массив N*M. Суммирование вынеси в функцию, принимающую на вход начальный индекс и stride. Обход по горизонтали и вертикали тогда станет одной функцией, которую можно использовать джважды.
      Ответить
      • Да и диагонали по сути x=0, y=0, dx=1, dy=1. Т.е. той же функцией можно посчитать.

        З.Ы. Жаль я жабий linq не знаю.
        Ответить
    • Компилятор — не человек, и сегодня ему предстояла трудная компиляция...
      template<typename... Rows>
      constexpr bool isMagic(Matrix<Rows...> mat)
      {
          if constexpr (mat.rows <= 0) {
              return false;
          }
      
          if constexpr (!isSquare(mat)) {
              return false;
          } else {
              constexpr int targetSum = mat.template sum_row<0>();
              bool res = true;
              for_each<1, mat.rows>([mat, targetSum, &res](auto i) constexpr {
                  if (mat.template sum_row<i.value>() != targetSum) {
                      res = false;
                  }
              });
      
              for_each<0, mat.rows>([mat, targetSum, &res](auto i) constexpr {
                  if (mat.template sum_col<i.value>() != targetSum) {
                      res = false;
                  }
              });
      
              return res && mat.sum_diag_LR() == targetSum && mat.sum_diag_RL() == targetSum;
          }
      }

      https://wandbox.org/permlink/d7PT5YWjB6DfBmTN

      Можня это всё переписать на компайл-тайм std::array<>, но так ня интересно (и компилятор страдать будет меньше).
      Ответить

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