以下の問題を解いているときのことです。
Some Sums
入力された数字について全ての桁の和を求めたい。
ex:入力24に対しては6(2+4),18に対しては9(1+8)を得たい
このために
1.入力を桁毎に区切ってリストに変換
2.リストについて~~reduce
~~ sum
で合計値を求める
ことにしました。
1.についてシンプルにやりたいと思っていたところ
Integer.digits(x)
というのがちょうどよかったのでメモしておきます。
iex(2)> Integer.digits(24)
[2, 4]
iex(3)> Integer.digits(18)
[1, 8]
第二引数に基数を指定可能
iex(4)> Integer.digits(18,2)
[1, 0, 0, 1, 0]
iex(5)> Integer.digits(18,8)
[2, 2]
iex(6)> Integer.digits(18,16)
[1, 2]
これを使って解答してみる
defmodule Main do
def some_sums(n, a, b) do
(for x <- 1..n, a <= digit_sum(x), digit_sum(x) <= b, do: x)
|> Enum.sum()
end
def digit_sum(x) do
Integer.digits(x) |> Enum.sum()
end
def main do
[n, a, b] = IO.read(:line) |> String.trim() |> String.split(" ") |> Enum.map(&String.to_integer/1)
IO.puts some_sums(n, a, b)
end
end
以下を参考にしました。
https://hexdocs.pm/elixir/Integer.html#digits/2