123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- #!/usr/bin/ruby
- # Author: Trizen
- # Date: 24 March 2022
- # https://github.com/trizen
- # Matrix Sum
- # https://projecteuler.net/problem=345
- func resize_arr(arr, size, i, j) {
- arr.grep_kv {|k| (k%size != j) && (idiv(k,size) != i) }
- }
- func matrix_sum(arr, size, callback, value=0, sum=0) {
- var (i, j) = divmod(value, size)
- callback(sum + arr[i*size + j])
- if (size > 1) {
- __FUNC__(resize_arr(arr, size, i, j), size-1, callback, 0, sum + arr[i*size + j])
- }
- __FUNC__(arr, size, callback, i*size + (j+1), sum) if (j+1 < size)
- #__FUNC__(arr, size, callback, (i+1)*size + j, sum) if (i+1 < size)
- }
- var arr = [
- 7 53 183 439 863
- 497 383 563 79 973
- 287 63 343 169 583
- 627 343 773 959 943
- 767 473 103 699 303
- ]
- var max = 0
- matrix_sum(arr, arr.len.isqrt, {|sum|
- if (sum > max) {
- max = sum
- say "Best sum so far: #{sum}"
- }
- })
- say "Best sum: #{max}"
- arr = <<'EOT'.lines.map { .nums }.flat if true
- 7 53 183 439 863 497 383 563 79 973 287 63 343 169 583
- 627 343 773 959 943 767 473 103 699 303 957 703 583 639 913
- 447 283 463 29 23 487 463 993 119 883 327 493 423 159 743
- 217 623 3 399 853 407 103 983 89 463 290 516 212 462 350
- 960 376 682 962 300 780 486 502 912 800 250 346 172 812 350
- 870 456 192 162 593 473 915 45 989 873 823 965 425 329 803
- 973 965 905 919 133 673 665 235 509 613 673 815 165 992 326
- 322 148 972 962 286 255 941 541 265 323 925 281 601 95 973
- 445 721 11 525 473 65 511 164 138 672 18 428 154 448 848
- 414 456 310 312 798 104 566 520 302 248 694 976 430 392 198
- 184 829 373 181 631 101 969 613 840 740 778 458 284 760 390
- 821 461 843 513 17 901 711 993 293 157 274 94 192 156 574
- 34 124 4 878 450 476 712 914 838 669 875 299 823 329 699
- 815 559 813 459 522 788 168 586 966 232 308 833 251 631 107
- 813 883 451 509 615 77 281 613 459 205 380 274 302 35 805
- EOT
- var max = 0
- matrix_sum(arr, arr.len.isqrt, {|sum|
- if (sum > max) {
- max = sum
- say "Best sum so far: #{sum}"
- }
- })
- say "Best sum: #{max}"
|