犬も歩けばエンジニアになる

プログラミングや数学や物理に関する技術メモ

Julia - リストをソートする方法

Juliaのソート関数

Juliaで作成したリストにはビルトイン関数のsortが使えます。 sort()はリストを引数にとり、ソートされたリストをreturnします。 エクスクラメーションマーク(!)をつけたsort!()は引数として渡すリスト自体を変更します。

list = [5,-6,-2,1,7,3,-4,9,-8]
sort!(list)
println(list)                         #結果 [-8, -6, -4, -2, 1, 3, 5, 7, 9]


ソートはオプショナル引数として、rev、lt、by、algを指定することができます。

revはtrueをわたすことで逆順にソートします。

list = [5,-6,-2,1,7,3,-4,9,-8]
sort!(list, rev=true)
println(list)                          #結果 [9, 7, 5, 3, 1, -2, -4, -6, -8]


ltに関数を渡すことで、その関数を自前のisless関数として使うことができます。 isless関数は二つの要素を引数にとり、true/falseをreturnします。falseが返された場合、二つの要素は位置が入れ替えられ、trueの場合はされません。

以下の例では、自前のisless関数を作ることにより、文字列のリストを短い→長い順にソートします。

#自前のisless関数
function comp(a, b)
    if length(a) < length(b)
        return true #文字列aが文字列bより短ければtrueを返す。
    end
    return false  #falseを返す
end

list = ["apple", "julia lang", "car", "physics"]    #文字列のリスト
sort!(list, lt= comp)       #comp関数を自前のltに指定
println(list)      #結果 ["car", "apple", "physics", "julia lang"]

無名関数(Anonymous function)を使えばコードが短くなります。

sort!(list, lt= (a,b)->length(a) < length(b))       #無名関数を引数として渡す


byはリストの要素一つ一つに引数となる関数が実行された状態でソートが実行されます。

list = [5,-6,-2,1,7,3,-4,9,-8]
sort!(list, by= x->x^2)               #リストの要素の二乗を比較してソート
println(list)                           #結果 [1, -2, 3, 4, 5, -6, -7, -8, 9]

byを使ってタプルをソートする例 *Juliaは1-based inidexing

list = [(3, "three"), (2, "two"), (4, "four"), (1, "one")];
sort!(list, by =x -> x[1] )           #タプルの第一要素を比較してソート
println(list)                               #結果  [(1, "one"), (2, "two"), (3, "three"), (4, "four")]


algでソートのアルゴリズムを指定することができます。 アルゴリズムにはQuickSort、InsertionSort、MergeSortなどが指定できます。

Julia - 10進数→N進数/N→10進数変換

Juliaで2進数や16進数へ変換するには?

Juliaで数値を変換するには10進数から変換する場合と10進数へ変換する場合で使う関数が異なります。

10進数からN進数に変換する

Int型10進数はstring関数を使うことにより、N進数の文字列型に変換できます。 baseで何進数かを、padで表示する桁数を指定できます。

string(10, base=2)    #10(10進数)を"1010"(2進数)に変換
string(255, base=16) #255(10進数)を"ff"(16進数)に変換
string(255, base=16, pad=4) #4桁まで表示させる。結果は"00ff"

N進数から10進数に変換する

String型のN進数はparse関数を使って、Int型10進数に変換できます。 baseで何進数から10進数へ変換するか指定します。

parse(Int ,"ff", base=16) #16進数"ff"を255へ変換
parse(Int ,"1010", base=2) #2進数"1010"を10へ変換

組み合わせることで2進数から16進数や16進数から2進数への変換ができます。

a = 1010 #二進数1010
a = string(a) #string型へ変換
a = parse(Int, a, base=2) #10進数へ変換
a = string(a, base=16, pad=4) #16進数へ変換
println(a) #結果、"000a"

Julia - グローバル変数とローカル変数

Global変数とLocal変数

変数にはglobal変数とlocal変数の2種類があります。 Juliaは動的型付け言語のため、基本的に変数の型は宣言しません。

ループや関数のスコープ内で宣言された変数は自動的にglobal変数となり、スコープ内で宣言されるとlocalとなります。 スコープ外からlocal変数にアクセスすることはできません。

x = 1 #これはglobal変数
for i = 1:10
    y = 2 #これはlocal変数
end
println(x)    #これはOK。1が出力される。
println(y) #これはエラー。forループ外では変数yが定義されてないため

スコープ内からglobal変数にアクセスするには、globalキーワードが必須となります。 globalキーワードをつけないとglobal変数にアクセスできません。

x = 1 #global変数
y = 2 #global変数
for i = 1:10
   println(x) #エラー。local変数xが定義されていないため。
   println(global x) #globalキーワードをつけるとアクセスできる。出力は1

   y = 3 #local変数yの宣言。global変数yとは別物
   println(y) #globalキーワードがないのでlocal変数のyを出力。よって3
end
println(y) #これはglobal変数のyを出力。よって2

データ型

Juliaではループや関数のスコープ内でのみ変数の型を指定することができます。

a::Int = 8 #エラー。スコープ外では型指定できない。
for i = 1:10
    b::Int = 5 #Int型
    c::Float64 = 2.2 #浮動小数点型はFloat64
    s::String = "asdf" #文字列型はString
end

Julia - Hello World

Juliaとは

Juliaとは科学計算によく使われるプログラミング言語です。実は私はPythonが使えなかったりします。以前、友達に「えー、今時Pythonつかえないの~?」と言われ、なんかムカついたのでPythonより速く、Pythonよりシンプルで、PythonよりかわいいJuliaを勉強することにしました。

確かにPythonは信者が多く、リソースも豊富で、いわば超売れっ子ジャニーズ級アイドル。それに比べてJuliaは生まれて間もなく成長中。このブログはそんなJuliaを応援しながら自分好みの(彼女)プログラミング言語になるよう応援していこうという変態的ブログです。

Hello World

とりあえずはJuliaちゃんに挨拶します。 コンソールに出力する方法はいたって簡単。

print("Hello Kanojyo")

printlnを使えば改行されます。

文字列内では$を使うことにより変数を埋め込むことが可能です。

kanojyo = "Julia"
print("Hello $kanojyo")

Output: Hello Julia

また、カンマ(,)を使って変数を埋め込む方法もあります。

kanojyo = "Julia"
print("Hello ", kanojyo, "! How are you today?")

Output: Hello Julia! How are you today?

--

コメント

Juliaでは#で一行、#=と=#で囲むことによって複数行コメントが書けます。

#一行のみコメント
#=
複数行の
コメント
=#