任意の「正の整数」値を渡し、その値の「約数のリスト」を返す関数をElixirで作成してみた。
Elixirの「1.9.0」で動作確認済み。
yks = fn x -> v = x; 1..v |> Enum.filter(fn n -> rem(v, n) == 0 end) end
以下、処理内容。
- 引数 x の値を v に代入
- 1..v で、1から最大値 v までのRangeを作成し、パイプ演算子で Enum.filter/2に渡す
- Enum.filter/2内の関数では、引数 n を 剰余を求める関数 rem/2 で 「rem(v,n) == 0」 になった値だけを残す
課題としては、以下がある。
- 引数が「正の整数値」以外の考慮がない
- 引数に渡す値が大きくなれば、処理時間がかかるようになる
課題については、必要になったら考える。
次に、動作確認をしてみる。
iex> yks.(10)
[1, 2, 5, 10]
iex> yks.(25)
[1, 5, 25]
iex> yks.(50)
[1, 2, 5, 10, 25, 50]
iex> yks.(75)
[1, 3, 5, 15, 25, 75]
iex> yks.(100)
[1, 2, 4, 5, 10, 20, 25, 50, 100]
動き自体は大丈夫そうなので、今度は1から100の値を投入してみる。
ここで、どの値が分かりやすいように、約数のリストは逆順に並べておく。
リストの逆順は、Enum.reverse/1 で実施する。
1..100 |> Enum.map(yks) |> Enum.map(fn r -> Enum.reverse(r) end)
以下、実行結果。
[
[1],
[2, 1],
[3, 1],
[4, 2, 1],
[5, 1],
[6, 3, 2, 1],
[7, 1],
[8, 4, 2, 1],
[9, 3, 1],
[10, 5, 2, 1],
[11, 1],
[12, 6, 4, 3, 2, 1],
[13, 1],
[14, 7, 2, 1],
[15, 5, 3, 1],
[16, 8, 4, 2, 1],
[17, 1],
[18, 9, 6, 3, 2, 1],
[19, 1],
[20, 10, 5, 4, 2, 1],
〜(以下略)〜
おまけ1: 約数の「数」を算出する場合
各要素数のリストを対象として、Enum.reduce/3 で単純に個数をカウントする。
yss = fn p -> Enum.reduce(p, 0, fn(_, acc) -> acc + 1 end) end
1..100 |> Enum.map(yks) |> Enum.map(yss)
以下、実行結果。
[1, 2, 2, 3, 2, 4, 2, 4, 3, 4, 2, 6, 2, 4, 4, 5, 2, 6, 2, 6, 4, 4, 2, 8, 3, 4,
4, 6, 2, 8, 2, 6, 4, 4, 4, 9, 2, 4, 4, 8, 2, 8, 2, 6, 6, 4, 2, 10, 3, 6, ...]
おまけ2: 1から100までの約数一覧
1から100までの約数の一覧パターンを乗せておく。
- :key が正の整数値
- :list が約数の一覧
- :yososu が要素の数
1..100 |>
Enum.map(yks) |>
Enum.map(fn r -> Enum.reverse(r) end) |>
Enum.map( fn [h | t] -> %{:key =>h, :yososu => yss.([h|t]) , :list => [h | t]} end)
以下、実行結果。
[
%{key: 1, list: [1], yososu: 1},
%{key: 2, list: [2, 1], yososu: 2},
%{key: 3, list: [3, 1], yososu: 2},
%{key: 4, list: [4, 2, 1], yososu: 3},
%{key: 5, list: [5, 1], yososu: 2},
%{key: 6, list: [6, 3, 2, 1], yososu: 4},
%{key: 7, list: [7, 1], yososu: 2},
%{key: 8, list: [8, 4, 2, 1], yososu: 4},
%{key: 9, list: [9, 3, 1], yososu: 3},
%{key: 10, list: [10, 5, 2, 1], yososu: 4},
%{key: 11, list: [11, 1], yososu: 2},
%{key: 12, list: [12, 6, 4, 3, 2, 1], yososu: 6},
%{key: 13, list: [13, 1], yososu: 2},
%{key: 14, list: [14, 7, 2, 1], yososu: 4},
%{key: 15, list: [15, 5, 3, 1], yososu: 4},
%{key: 16, list: [16, 8, 4, 2, 1], yososu: 5},
%{key: 17, list: [17, 1], yososu: 2},
%{key: 18, list: [18, 9, 6, 3, 2, 1], yososu: 6},
%{key: 19, list: [19, 1], yososu: 2},
%{key: 20, list: [20, 10, 5, 4, 2, 1], yososu: 6},
%{key: 21, list: [21, 7, 3, 1], yososu: 4},
%{key: 22, list: [22, 11, 2, 1], yososu: 4},
%{key: 23, list: [23, 1], yososu: 2},
%{key: 24, list: [24, 12, 8, 6, 4, 3, 2, 1], yososu: 8},
%{key: 25, list: [25, 5, 1], yososu: 3},
%{key: 26, list: [26, 13, 2, 1], yososu: 4},
%{key: 27, list: [27, 9, 3, 1], yososu: 4},
%{key: 28, list: [28, 14, 7, 4, 2, 1], yososu: 6},
%{key: 29, list: [29, 1], yososu: 2},
%{key: 30, list: [30, 15, 10, 6, 5, 3, 2, 1], yososu: 8},
%{key: 31, list: [31, 1], yososu: 2},
%{key: 32, list: [32, 16, 8, 4, 2, 1], yososu: 6},
%{key: 33, list: [33, 11, 3, 1], yososu: 4},
%{key: 34, list: [34, 17, 2, 1], yososu: 4},
%{key: 35, list: [35, 7, 5, 1], yososu: 4},
%{key: 36, list: [36, 18, 12, 9, 6, 4, 3, 2, 1], yososu: 9},
%{key: 37, list: [37, 1], yososu: 2},
%{key: 38, list: [38, 19, 2, 1], yososu: 4},
%{key: 39, list: [39, 13, 3, 1], yososu: 4},
%{key: 40, list: [40, 20, 10, 8, 5, 4, 2, 1], yososu: 8},
%{key: 41, list: [41, 1], yososu: 2},
%{key: 42, list: [42, 21, 14, 7, 6, 3, 2, 1], yososu: 8},
%{key: 43, list: [43, 1], yososu: 2},
%{key: 44, list: [44, 22, 11, 4, 2, 1], yososu: 6},
%{key: 45, list: [45, 15, 9, 5, 3, 1], yososu: 6},
%{key: 46, list: [46, 23, 2, 1], yososu: 4},
%{key: 47, list: [47, 1], yososu: 2},
%{key: 48, list: [48, 24, 16, 12, 8, 6, 4, 3, 2, 1], yososu: 10},
%{key: 49, list: [49, 7, 1], yososu: 3},
%{key: 50, list: [50, 25, 10, 5, 2, 1], yososu: 6},
%{key: 51, list: [51, 17, 3, 1], yososu: 4},
%{key: 52, list: [52, 26, 13, 4, 2, 1], yososu: 6},
%{key: 53, list: [53, 1], yososu: 2},
%{key: 54, list: [54, 27, 18, 9, 6, 3, 2, 1], yososu: 8},
%{key: 55, list: [55, 11, 5, 1], yososu: 4},
%{key: 56, list: [56, 28, 14, 8, 7, 4, 2, 1], yososu: 8},
%{key: 57, list: [57, 19, 3, 1], yososu: 4},
%{key: 58, list: [58, 29, 2, 1], yososu: 4},
%{key: 59, list: [59, 1], yososu: 2},
%{key: 60, list: [60, 30, 20, 15, 12, 10, 6, 5, 4, 3, 2, 1], yososu: 12},
%{key: 61, list: [61, 1], yososu: 2},
%{key: 62, list: [62, 31, 2, 1], yososu: 4},
%{key: 63, list: [63, 21, 9, 7, 3, 1], yososu: 6},
%{key: 64, list: [64, 32, 16, 8, 4, 2, 1], yososu: 7},
%{key: 65, list: [65, 13, 5, 1], yososu: 4},
%{key: 66, list: [66, 33, 22, 11, 6, 3, 2, 1], yososu: 8},
%{key: 67, list: [67, 1], yososu: 2},
%{key: 68, list: [68, 34, 17, 4, 2, 1], yososu: 6},
%{key: 69, list: [69, 23, 3, 1], yososu: 4},
%{key: 70, list: [70, 35, 14, 10, 7, 5, 2, 1], yososu: 8},
%{key: 71, list: [71, 1], yososu: 2},
%{key: 72, list: [72, 36, 24, 18, 12, 9, 8, 6, 4, 3, 2, 1], yososu: 12},
%{key: 73, list: [73, 1], yososu: 2},
%{key: 74, list: [74, 37, 2, 1], yososu: 4},
%{key: 75, list: [75, 25, 15, 5, 3, 1], yososu: 6},
%{key: 76, list: [76, 38, 19, 4, 2, 1], yososu: 6},
%{key: 77, list: [77, 11, 7, 1], yososu: 4},
%{key: 78, list: [78, 39, 26, 13, 6, 3, 2, 1], yososu: 8},
%{key: 79, list: [79, 1], yososu: 2},
%{key: 80, list: [80, 40, 20, 16, 10, 8, 5, 4, 2, 1], yososu: 10},
%{key: 81, list: [81, 27, 9, 3, 1], yososu: 5},
%{key: 82, list: [82, 41, 2, 1], yososu: 4},
%{key: 83, list: [83, 1], yososu: 2},
%{key: 84, list: [84, 42, 28, 21, 14, 12, 7, 6, 4, 3, 2, 1], yososu: 12},
%{key: 85, list: [85, 17, 5, 1], yososu: 4},
%{key: 86, list: [86, 43, 2, 1], yososu: 4},
%{key: 87, list: [87, 29, 3, 1], yososu: 4},
%{key: 88, list: [88, 44, 22, 11, 8, 4, 2, 1], yososu: 8},
%{key: 89, list: [89, 1], yososu: 2},
%{key: 90, list: [90, 45, 30, 18, 15, 10, 9, 6, 5, 3, 2, 1], yososu: 12},
%{key: 91, list: [91, 13, 7, 1], yososu: 4},
%{key: 92, list: [92, 46, 23, 4, 2, 1], yososu: 6},
%{key: 93, list: [93, 31, 3, 1], yososu: 4},
%{key: 94, list: [94, 47, 2, 1], yososu: 4},
%{key: 95, list: [95, 19, 5, 1], yososu: 4},
%{key: 96, list: [96, 48, 32, 24, 16, 12, 8, 6, 4, 3, 2, 1], yososu: 12},
%{key: 97, list: [97, 1], yososu: 2},
%{key: 98, list: [98, 49, 14, 7, 2, 1], yososu: 6},
%{key: 99, list: [99, 33, 11, 9, 3, 1], yososu: 6},
%{key: 100, list: [100, 50, 25, 20, 10, 5, 4, 2, 1], yososu: 9}
]