🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Erlang

Erlangとは、多目的でありガーベッジコレクションを行うプログラミング言語および実行環境です。Erlangは並行処理・分散化された環境・フォルトトレランスを実装しています。

Elixir

Elixirは、並列処理や関数型に特化した、Erlang VM (BEAM) 上で動作する汎用プログラミング言語です。分散システム、耐障害性、ソフトリアルタイムシステムなどの機能を持ちます。

Q&A

解決済

1回答

1152閲覧

数字によってパターンマッチング

marny

総合スコア19

Erlang

Erlangとは、多目的でありガーベッジコレクションを行うプログラミング言語および実行環境です。Erlangは並行処理・分散化された環境・フォルトトレランスを実装しています。

Elixir

Elixirは、並列処理や関数型に特化した、Erlang VM (BEAM) 上で動作する汎用プログラミング言語です。分散システム、耐障害性、ソフトリアルタイムシステムなどの機能を持ちます。

0グッド

0クリップ

投稿2019/12/12 08:51

入力された数字でパターンマッチングさせたい

入力された数字番目のフィボナッチ数を計算して出力するプログラムを作ったのですが、数字に応じて序数の、st,nd,rd,thを場合分けしようとした際、以下のようにcondで条件分岐させる以外にパターンマッチングなどうまい方法はあるでしょうか.
P.S.
Elixirでの標準入力でもっとうまい方法があれば教えていただきたいです...

該当のソースコード

elixir

1defmodule Fib do 2 def of(0), do: 0 3 def of(1), do: 1 4 def of(n) do 5 of(n-1) + of(n-2) 6 end 7 def print_loading(n) do 8 cond do 9 div(n,10) == 1 -> 10 IO.puts "now #{n}st fibonacci number loading" 11 div(n,10) == 2 -> 12 IO.puts "now #{n}nd fibonacci number loading" 13 div(n,10) == 3 -> 14 IO.puts "now #{n}rd fibonacci number loading" 15 true -> 16 IO.puts "now #{n}th fibonacci number loading" 17 end 18 end 19end 20#C言語でのscanf 21num = IO.gets("input number?\n") 22 |> String.replace("\n","") 23 |> String.to_integer 24 25worker = Task.async(fn -> Fib.of(num) end) 26Fib.print_loading(num) 27IO.puts "wait for the task" 28 29result = Task.await(worker) 30 31IO.puts "result is #{result}"

補足情報(FW/ツールのバージョンなど)

Erlang/OTP 22 [erts-10.4.4] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]

Elixir 1.9.1 (compiled with Erlang/OTP 22)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

数字に応じて序数の、st,nd,rd,thを場合分けしようとした際、以下のようにcondで条件分岐させる以外にパターンマッチングなどうまい方法はあるでしょうか.

パターンマッチするならcaseとガードを使うと素直に書けそうです。

elixir

1 def print_loading(n) do 2 ordinal = case rem(n, 10) do 3 _ when 11 <= n and n <= 13 -> "#{n}th" 4 1 -> "#{n}st" 5 2 -> "#{n}nd" 6 3 -> "#{n}rd" 7 _ -> "#{n}th" 8 end 9 IO.puts "now #{ordinal} fibonacci number loading" 10 end

caseの部分を別の関数(ordinal_of/1)に分けてもいいかもしれません。

elixir

1 def print_loading(n) do 2 IO.puts "now #{ordinal_of n} fibonacci number loading" 3 end 4 5 def ordinal_of(n) 11 <= n and n <= 13, do: "#{n}th" 6 def ordinal_of(n) do 7 case rem(n, 10) do 8 1 -> "#{n}st" 9 2 -> "#{n}nd" 10 3 -> "#{n}rd" 11 _ -> "#{n}th" 12 end 13 end

(元のコードのdev(n, 10)(除算)は間違いのようでしたので、rem(n, 10)(余り)に変えました)

追記

111は111stではなくて111thなので、以下のように書くのが正解でした。

elixir

1 def print_loading(n) do 2 ordinal = case {rem(n, 100), rem(n, 10)} do 3 {m, _} when 11 <= m and m <= 13 -> "#{n}th" 4 {_, 1} -> "#{n}st" 5 {_, 2} -> "#{n}nd" 6 {_, 3} -> "#{n}rd" 7 _ -> "#{n}th" 8 end 9 IO.puts "now #{ordinal} fibonacci number loading" 10 end

投稿2019/12/12 10:54

編集2019/12/12 11:15
tatsuya6502

総合スコア2046

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marny

2019/12/13 03:35

詳しい回答ありがとうございます!divとremは失礼しました. 11~13の序数の場合分けはすっかり忘れていました... 3桁の場合含めてcaseとガードについて大変勉強になりました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問