PE #009 in J

ピタゴラスの定理を満たす自然数 a < b < c の3つ組で a+b+c = 1000 なるものが唯一存在する.それを求め,3つの積を答えよ.」
ワンライナーにまとめてはいないけど.

   { (~. ^ each ((i.@>: each)@;/@(#/.~))) q: -: 5e5
+----+----+-----+------+------+-------+--------+
|1 1 |1 5 |1 25 |1 125 |1 625 |1 3125 |1 15625 |
+----+----+-----+------+------+-------+--------+
|2 1 |2 5 |2 25 |2 125 |2 625 |2 3125 |2 15625 |
+----+----+-----+------+------+-------+--------+
|4 1 |4 5 |4 25 |4 125 |4 625 |4 3125 |4 15625 |
+----+----+-----+------+------+-------+--------+
|8 1 |8 5 |8 25 |8 125 |8 625 |8 3125 |8 15625 |
+----+----+-----+------+------+-------+--------+
|16 1|16 5|16 25|16 125|16 625|16 3125|16 15625|
+----+----+-----+------+------+-------+--------+
   ((] , (0&< *. 1000&>))@(1000&+)@-@(, (5e5&%))@*/ each) { ((~.) ^ each ((i.@>: each)@;/@(#/.~))) q: -: 5e5
+---------+--------+--------+-------+-------+--------+---------+
|    999 1|   995 1|   975 1|  875 1|375 1  |_2125 0 |_14625 0 |
|_499000 0|_99000 0|_19000 0|_3000 0|200 1  |  840 1 |   968 1 |
+---------+--------+--------+-------+-------+--------+---------+
|    998 1|   990 1|  950 1 |  750 1|_250 0 |_5250 0 |_30250 0 |
|_249000 0|_49000 0|_9000 0 |_1000 0| 600 1 |  920 1 |   984 1 |
+---------+--------+--------+-------+-------+--------+---------+
|    996 1|   980 1|  900 1 |500 1  |_1500 0|_11500 0|_61500 0 |
|_124000 0|_24000 0|_4000 0 |  0 0  |  800 1|   960 1|   992 1 |
+---------+--------+--------+-------+-------+--------+---------+
|   992 1 |   960 1|  800 1 |  0 0  |_4000 0|_24000 0|_124000 0|
|_61500 0 |_11500 0|_1500 0 |500 1  |  900 1|   980 1|    996 1|
+---------+--------+--------+-------+-------+--------+---------+
|   984 1 |  920 1 | 600 1  |_1000 0|_9000 0|_49000 0|_249000 0|
|_30250 0 |_5250 0 |_250 0  |  750 1|  950 1|   990 1|    998 1|
+---------+--------+--------+-------+-------+--------+---------+
   (1000-375)-200
425
   +/ 200 375 425
1000
   */ 200 375 425
31875000

追記:ワン(?)ライナーにまとめた.と言うか↑のコードの :- は余分で,バグ.
なお整数方程式の定石*1因数分解を使っている.すなわち a^2+b^2 = (1000-a-b)^2 \Longleftrightarrow (a-1000)(b-1000) = 500000 について,500000の素因数分解に従って整数解を列挙し,条件を満たすものを選んでいる.遅延ストリームがあれば効率アップだろうね.

   ([: */"1@x: ] ,"1 -~/@,&1e3"1)@((#~ </"1)@~.@,/"3@(>@((0:`] @. ((*./)@(1e3&> *. 0&<)))@(1e3&+)@(-"1)@(*/)@(>"1) each)@{@((;/@(|:@,: |.)@(, -) each)@(~. ^each (i.@>: each)@(;/)@(#/.~)))))@q: 5e5
+-+-+-------+-+-------+-+-+-+-+-------+-+-------+-+-+
|0|0|0      |0|375 200|0|0|0|0|0      |0|0      |0|0|
+-+-+-------+-+-------+-+-+-+-+-------+-+-------+-+-+
|0|0|0      |0|0      |0|0|0|0|0      |0|0      |0|0|
+-+-+-------+-+-------+-+-+-+-+-------+-+-------+-+-+
|0|0|0      |0|0      |0|0|0|0|0      |0|0      |0|0|
+-+-+-------+-+-------+-+-+-+-+-------+-+-------+-+-+
|0|0|0      |0|0      |0|0|0|0|0      |0|0      |0|0|
+-+-+-------+-+-------+-+-+-+-+-------+-+-------+-+-+
|0|0|0      |0|0      |0|0|0|0|0      |0|0      |0|0|
+-+-+-------+-+-------+-+-+-+-+-------+-+-------+-+-+
|0|0|200 375|0|0      |0|0|0|0|0      |0|0      |0|0|
+-+-+-------+-+-------+-+-+-+-+-------+-+-------+-+-+
|0|0|0      |0|0      |0|0|0|0|0      |0|375 200|0|0|
+-+-+-------+-+-------+-+-+-+-+-------+-+-------+-+-+
|0|0|0      |0|0      |0|0|0|0|0      |0|0      |0|0|
+-+-+-------+-+-------+-+-+-+-+-------+-+-------+-+-+
|0|0|0      |0|0      |0|0|0|0|0      |0|0      |0|0|
+-+-+-------+-+-------+-+-+-+-+-------+-+-------+-+-+
|0|0|0      |0|0      |0|0|0|0|0      |0|0      |0|0|
+-+-+-------+-+-------+-+-+-+-+-------+-+-------+-+-+
|0|0|0      |0|0      |0|0|0|0|0      |0|0      |0|0|
+-+-+-------+-+-------+-+-+-+-+-------+-+-------+-+-+
|0|0|0      |0|0      |0|0|0|0|200 375|0|0      |0|0|
+-+-+-------+-+-------+-+-+-+-+-------+-+-------+-+-+
   (] */@x:@, -~/@,&1e3)"1@((#~ </"1)@~.@,/"3@(>@((0:`] @. ((*./)@(1e3&> *. 0&<)))@(1e3&+)@(-"1)@(*/)@(>"1) each)@{@((;/@(|:@,: |.)@(, -) each)@(~. ^each (i.@>: each)@(;/)@(#/.~)))))@q: 5e5
31875000

それにしてもだんだんpoint-free styleに慣れてきている自分が嫌だ.

*1:大学への数学で身に付けた知識なんてこんな問題のための問題にしか使ったことない...