ラベル Erlang の投稿を表示しています。 すべての投稿を表示
ラベル Erlang の投稿を表示しています。 すべての投稿を表示

2017年8月4日金曜日

Erlangでfizzbuzzっぽいの書いてみた。

Erlangを勉強しだしてまだちょっとですが、
fizzbuzzっぽいの書いてみました。

今回書いたfizzbuzzのルール。
・3で割り切れる。
・5で割り切れる。
・3と5両方で割り切れる。
・数のリストを受け取りfizzbuzzした結果リストを返す。

ーコードーーーーーーーーーーーーーーーーーーーーーーー
fizzbuzz(L) -> fizzbuzz(L, []).
fizzbuzz([H|T], Result) -> 
    case {H rem 3, H rem 5} of
        {0,0} -> fizzbuzz(T, [fizzbuzz|Result]);
        {0,_} -> fizzbuzz(T, [fizz|Result]);
        {_,0} -> fizzbuzz(T, [buzz|Result]);
        {_,_} -> fizzbuzz(T, [H|Result])
    end; 
fizzbuzz([], Result) -> lists:reverse(Result).

ー実行結果ーーーーーーーーーーーーーーーーーーーーーー
1> c(test).
{ok,test}
2> test:fizzbuzz([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]).
[1,2,fizz,4,buzz,fizz,7,8,fizz,buzz,11,fizz,13,14,fizzbuzz,16]
ーーーーーーーーーーーーーーーーーーーーーーーーーーー

こんな簡単な処理を書くのにも数時間かかった・・。
ちゃんと実践せずに本を読んでるだけじゃだめってことですね。
早く並列分散をガシガシ書きたい!

こんな感じで、今回は以上です。


追記:
出力バージョンも作ってみました。
ーコードーーーーーーーーーーーーーーーーー
%% 受け取ったリストに対して以下の処理を行う
%% 3で割り切れる場合は「Hello」を出力。
%% 5で割り切れる場合は「World」を出力。
%% 3,5どちらでも割り切れる場合は「Hello World」を出力。
%% すべてのリスト要素を処理したら「End」を出力。
fizzbuzz([H|T]) ->
    case {H rem 3, H rem 5} of
        {0,0} -> io:format("~p:Hello World~n", [H]),fizzbuzz(T);
        {0,_} -> io:format("~p:Hello~n", [H]),fizzbuzz(T);
        {_,0} -> io:format("~p:World~n", [H]),fizzbuzz(T);
        {_,_} -> io:format("~p~n", [H]),fizzbuzz(T)
    end;
fizzbuzz([]) -> io:format("End~n").

% 引数の数値nから1~nのリスト作成
make_list(MaxNum) -> make_list(1, MaxNum, []).
make_list(MinNum,MaxNum) -> make_list(MinNum, MaxNum, []).
make_list(I, Max, List) when Max >= I-> make_list(I + 1, Max, [I|List]);
make_list(I, Max, List) when Max =< I -> lists:reverse(List).

ー実行結果ーーーーーーーーーーーーーーーーーーーーーー
1> c(hello).
{ok,hello}
2> L = hello:make_list(30).
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
 23,24,25,26,27,28,29|...]
3> hello:fizzbuzz(L).
1
2
3:Hello
4
5:World
6:Hello
7
8
9:Hello
10:World
11
12:Hello
13
14
15:Hello World
16
17
18:Hello
19
20:World
21:Hello
22
23
24:Hello
25:World
26
27:Hello
28
29
30:Hello World
End
ok
4>
ーーーーーーーーーーーーーーーーーーーーーーーーーーー

「;」と「,」の使いどころがまだ理解できてないため、毎回コンパイラに怒られる。
あと、 io:formatとかもうちょいドキュメント(Erlang -- io)読まなきゃなぁ。

追記は以上です。

2017年6月24日土曜日

Erlangインストールメモ

$ gcc -v
$ perl -v
$ sed --version
$ java -version

$ sudo yum -y install ncurses ncurses-devel openssl openssl-devel orber gcc gcc-c++ unixODBC unixODBC-devel fop

$ mkdir DL
$ cd DL

※下記JDKのURLは最新版以外は取得できないため都度最新URLに変更する。
$ curl -OL --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-linux-x64.rpm
$ sudo rpm -ivh jdk-8u144-linux-x64.rpm

メモ:OpenJDKでも大丈夫な気がする。
   $ sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel

$ wget http://www.erlang.org/download/otp_src_20.0.tar.gz
$ sudo tar -zxvf otp_src_20.0.tar.gz -C /usr/local/src/
$ cd /usr/local/src/otp_src_20.0

$ sudo ./configure
$ sudo make
$ sudo make
$ sudo make install

インストール後の確認。(Erlangのコンソールに入れることを確認)
$ erl
1>
1> q().

$ cd ~/DL
$ wget http://erlang.org/download/otp_doc_man_20.0.tar.gz
$ sudo tar xvzf otp_doc_man_20.0.tar.gz -C /usr/local/lib/erlang/

ドキュメントの確認
$ erl -man lists
lists(3)                           Erlang Module Definition                          lists(3)

NAME
       lists - List processing functions.

DESCRIPTION
       This module contains functions for list processing.

       Unless  otherwise  stated,  all  functions assume that position numbering starts at 1.
       That is, the first element of a list is at position 1.

       Two terms T1 and T2 compare equal if T1 == T2 evaluates to true. They match if T1  =:=
       T2 evaluates to true.