はじめに
- Elixir 楽しんでいますか
- @e79a93e5b7b1 さんのGoogle RecruitをElixirでやってみます
What is Elixir ?
Elixir is a dynamic, functional language designed for building scalable and maintainable applications.
Elixir leverages the Erlang VM, known for running low-latency, distributed and fault-tolerant systems, while also being successfully used in web development, embedded software, data ingestion, and multimedia processing domains across a wide range of industries.
- 不老不死の霊薬っちいうことですよ
準備
$ mix new google_recruit
$ cd google_recruit
- いろいろファイルができますが、Elixirが初めての方はそんなものだとおもってください
- 慣れると景色に見えます (by @kikuyuta 先生)
- 今回は1ファイルしか触りません
- プロジェクトのルートに
exp.txt
を置きました
exp.txt
2.71828182845904523536028747135266249775
7247093699959574966967627724076630353547
5945713821785251664274274663919320030599
2181741359662904357290033429526059563073
81323286279434907632338298807531952510190
問題
- 問題文は参考にした記事中をご参照ください
-
Google Recruit Problem
- e(自然対数の底)の値で連続する10桁の数のうち,最初の素数をrubyで求めよ.
-
発展問題
f(5)=__________
-
Google Recruit Problem
- あっ、Ruby縛りなの...
- まあ、いいやElixirでやろう
- 私には問題の意味があんまりわかりませんでしたが、参考記事のRubyプログラムをElixirで書いてみたらどうなるかをやってみて、答えが同じになればそれでよしとします
で、四の五の言わずに書いてみる
lib/google_recruit.ex
defmodule GoogleRecruit do
def problem_one do
list_of_10_digits()
|> Enum.map(&Enum.join/1)
|> Enum.map(&String.to_integer/1)
|> Enum.find(&is_prime?/1)
end
def problem_two do
list_of_10_digits()
|> Enum.filter(&is_digits_sum_49?/1)
|> Enum.at(4)
|> Enum.join()
|> String.to_integer()
end
defp list_of_10_digits do
File.read!("exp.txt")
|> String.replace("\n", "")
|> String.replace(".", "")
|> String.codepoints()
|> Enum.chunk_every(10, 1, :discard)
end
defp is_prime?(n) when n in [2, 3], do: true
defp is_prime?(n) do
floored_sqrt =
:math.sqrt(n)
|> Float.floor()
|> round
!Enum.any?(2..floored_sqrt, &(rem(n, &1) == 0))
end
defp is_digits_sum_49?(digits) do
Enum.map(digits, &String.to_integer/1)
|> Enum.sum()
|> Kernel.==(49)
end
end
- 素数の判定は、Rubyにはprimeライブラリが標準添付ライブラリとして存在することを知っていますが、Elixirは標準にはない1とおもっています
-
https://gist.github.com/aditya7iyengar/2487b9ed7f70ed39aa4afec86c730665#file-n_primes_fermat_algorithm-ex-L5-L10 をおおいに参考にしました
- てか、写しました
-
$\huge{心をこめて、一文字一文字彫るように写しました}$
- あ、年賀状書かなきゃ
Run
$ iex -S mix
Erlang/OTP 23 [erts-11.0.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
Compiling 1 file (.ex)
Interactive Elixir (1.11.2) - press Ctrl+C to exit (type h() ENTER for help)
iex> GoogleRecruit.problem_one
7427466391
iex> GoogleRecruit.problem_two
5966290435
iex> System.halt
$
Wrapping Up
- Enum.chunk_every/4くん、大活躍
- Enumモジュールは、Elixirにおいて必修科目
- Stringモジュールもよく使うでありますよ
- 今回に関していうと大部分この2つのモジュールで書き上げています
- 他は
- Enjoy Elixir
ありがとナイス