LoginSignup
13
3

More than 1 year has passed since last update.

数のリスト ln と数 n を受け取って、ln の要素のうち、n より大きい個数を返す関数

Last updated at Posted at 2022-09-24

はじめに

Pythonプログラミング入門」という、東京大学 数理・情報教育研究センターさんが作成された教材でPythonを学習しています。

Pythonの学習を進めつつ、同じ内容をElixirで置き換えてみたらどうなるだろう? という視点でも眺めています。
私はどうしようもなくElixirが好きなのです。

今日は、「数のリスト ln と数 n を受け取って、ln の要素のうち、n より大きい個数を返す関数」をやってみます。

Python

お手本は

に書いてあります。

def number_of_big_numbers(ln, n):
    return sum(map(lambda x: 1, filter(lambda x: x>n, ln)))

実行してみます。

>>> number_of_big_numbers([10, 0, 7, 1, 5, 2, 9], 5)
3

:tada::tada::tada:

Elixir

Elixirで書いてみます。

iex> number_of_big_numbers = fn ln, n -> 
  ln |> Enum.filter(& &1 > n) |> Enum.map(fn _ -> 1 end) |> Enum.sum()
end

iex> number_of_big_numbers.([10, 0, 7, 1, 5, 2, 9], 5)
3

:rocket::rocket::rocket::rocket::rocket::rocket::rocket::rocket::rocket::rocket::rocket::rocket::rocket::rocket::rocket::rocket::rocket::rocket::rocket::rocket:

上記は、Pythonのお手本に寄せてみました。
お手本といっても、「高階関数」という章立てにおいて、なんとしてでも「高階関数」を駆使するという条件下でのお手本です。

その条件を取っ払ったほうが素直なコードになります。
処理の本体は、
ln |> Enum.filter(& &1 > n) |> Enum.count()でもよいです。

:qiitan::rocket::rice::rocket::rice::rocket::rice::qiitan:

別解

iex> number_of_big_numbers2 = fn ln, n -> 
  for(x <- ln, x > n, do: 1) |> Enum.sum()
end

さらに別解

iex> number_of_big_numbers3 = fn ln, n -> 
  Enum.count(ln, & &1 > n)
end

iex> number_of_big_numbers3.([10, 0, 7, 1, 5, 2, 9], 5)
3

Enum.count/2で一撃でした。

おわりに

「数のリスト ln と数 n を受け取って、ln の要素のうち、n より大きい個数を返す関数」を楽しみました。

13
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
3