目次
- 目次
- はじめに
- 1. 基本的な入出力
- 2. 数値への変換
- 3. 空白で分割
- 4. 空白で分割しつつ数値に変換
- 5. 特定の条件のデータを数える
- 6. 複数行をまとめて読み込む
- 7. 二重のリストの行列を入れ替える
- 8. 二重のリストをフラットにする
- 9. 連結と繰り返し
- 10. 要素の存在確認
- 11. 削除
- 12. ソート
- 13. マイナス値のインデックス
- 14. 部分リストの取り出し(スライス)
- 15. シャローコピーとディープコピー
- 16. 和集合と積集合
- 17. 文字列における、連結と繰り返し、存在確認
- 18. 文字列の置換
- 19. 文字列の反転
- 20. 文字列定数
- 21. 正規表現
- 22. 累積和
- 23. dropwhileとtakewhile
- 24. groupby
- 25. for文のelse
- 26. 2進数や16進数
- 27. 順列数と組み合わせ数
- 28. メモ化
- 29. stdinをファイルに置き換える
- 参考資料
- MyEnigma Supporters
はじめに
下記の記事が非常に勉強になったので、
Juliaで同じことを実現する方法を調べてみました。
https://qiita.com/y-tsutsu/items/aa7e8e809d6ac167d6a1qiita.com
(競技プロはやったことないのですが。。。)
すべてのコードは下記のリポジトリでも公開しています。
1. 基本的な入出力
println(uppercase(readline(STDIN)))
2. 数値への変換
println(parse(Int64, readline(STDIN)))
3. 空白で分割
println(split(readline(STDIN))) println(split(readline(STDIN)))
4. 空白で分割しつつ数値に変換
A, B, C = parse.(Int64, split(readline(STDIN))) println(A+B-C)
5. 特定の条件のデータを数える
data = 1:10 count = length([x for x in data if x%3 == 0]) println(count)
6. 複数行をまとめて読み込む
juliaは行列を綺麗に表示するのが面倒。。
n = parse.(Int64, readline(STDIN)) data = [parse.(Int64, split(readline(STDIN))) for _ in 1:n] show(STDOUT, "text/plain", data);println()
7. 二重のリストの行列を入れ替える
data = [1 2 3 4 5 6 7 8 9] show(STDOUT, "text/plain", data);println() t = transpose(data) show(STDOUT, "text/plain", t);println() println() show(STDOUT, "text/plain", sum(t,1));println() show(STDOUT, "text/plain", sum(t,2));println()
8. 二重のリストをフラットにする
# 二次元の配列の場合 data = [1 2 3 4 5 6 7 8 9] show(STDOUT, "text/plain", data);println() flat = vec(data) #ベクトル化 show(STDOUT, "text/plain", flat);println() # 二重の配列の場合 data2 = [[1,2,3], [4,5,6], [7,8,9]] show(STDOUT, "text/plain", data2);println() flat2 = [x for inner in data for x in inner] show(STDOUT, "text/plain", flat2);println()
Pythonとは異なり、Juliaは列からデータが並ぶので、
Pythonと同じように表示させるには、
一度転置させる必要があります。
9. 連結と繰り返し
a = vcat([1,2,3] , [4, 5]) println(a) b =repeat([1,2,3], outer=3) println(b)
10. 要素の存在確認
a = [1,2,3,4,5] println(1 in a) println(6 in a)
11. 削除
# delete with index a = [1,2,3,4,5] deleteat!(a, 3) println(a) # delete with slice b = [1,2,3,4,5] deleteat!(b, 3:5) println(b) # delete with element c = [1,2,3,4,5] filter!(e->e!=2,c) println(c)
12. ソート
a = [2,5,1,4,3] b = sort(a) c = sort(a, rev=true) println("a:",a) println("b:",b) println("c:",c) sort!(a) println("a:",a) d = ['e', 'B', 'd', 'C', 'a'] println(sort(d)) # 普通にsortすると、すべての要素が大文字になったリストが返ってくる println(d[sortperm(uppercase.(d))]) f = [1 "One" "1"; 1 "One" "01"; 2 "Two" "2"; 2 "Two" "02"; 3 "Three" "3"; 3 "Three" "03"] println(f) println(sortrows(f, by=x->(x[2],x[3])))
13. マイナス値のインデックス
a = [1,2,3,4,5] # JuliaではPythonとは異なり、マイナスのインデックスは使えない # 代わりにendを使う println(a[end]) println(a[end-1])
14. 部分リストの取り出し(スライス)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9] println(a) # Juliaのインデックスは1始まりで最後の要素も含むことに注意 println(a[3:7]) # JuliaはPythonと異なり、始点や終点の省略ができない println(a[3:end]) println(a[1:7]) println(a[2:2:8]) # 逆順に取得も可能 println(a[6:-2:1])
15. シャローコピーとディープコピー
a = [1,2,3,4,5] b = a[:] b[1] *= 10 println(a) println(b) c = [[1,2,3], [4,5,6]] d = c[:] push!(d[1], 0) c2 = [[1,2,3], [4,5,6]] f = deepcopy(c2) push!(f[1], 0) println(c) println(d) println(c2) println(f)
16. 和集合と積集合
a = Set([2,4,6,8]) b = Set([3,6,9]) #和集合 println(union(a,b)) #積集合 println(intersect(a,b))
17. 文字列における、連結と繰り返し、存在確認
# 連結 a = "ABC" * "DEF" println(a) # 繰り返し b = "ABC"^3 println(b) # 存在確認 c = "ABCDEF" println(contains(c, "A")) println(contains(c, "a"))
18. 文字列の置換
a = "abc(de)fg" println(replace(replace(a,"(","["),")","]")) b = "aBCdEfg" println(uppercase(b)) println(lowercase(b))
19. 文字列の反転
s = "ABCDEFG" println(s[end:-1:1])
20. 文字列定数
JuliaではPythonのようなアスキーアルファベットの
文字列定数は見つかりませんでした。
(知っている方がいらっしゃったら教えてください)
21. 正規表現
text = "<h1 style=\"width: 100px; height: 200px;\">" println(text) m = match(r"width: (\d*)px; height: (\d*)px;", text) println(m.captures[1]) println(m.captures[2]) println(m.captures)
22. 累積和
a = [i for i in 1:10] println(a) b = cumsum(a) println(b)
23. dropwhileとtakewhile
Julia本体にはdropwhileとtakewhileは無いので、
下記のような外部ライブラリを使うか、
下記のように、簡単なスニペットを利用する必要がありそうです。
a = [3,6,1,7,2,5] # dropwhile b = a[findfirst(a, 1):end] println(b) # takewhile c = a[1:findfirst(a, 1)-1] println(c)
24. groupby
groupbyに関しては、
juliaで良いパッケージや、スニペットが
見つかりませんでした。。
どなたかいい方法を知っている方は
コメントで教えて頂けると嬉しいです。
25. for文のelse
juliaは今のところ、for文のelseや、
while文のえelseには対応していないようです。
下記のように導入の議論はされているので、
将来的に入るかもしれませんが。
26. 2進数や16進数
println(bin(255)) println(hex(255)) println(parse(Int16,"0b11111111")) println(parse(Int16,"0xff"))
27. 順列数と組み合わせ数
下記のライブラリを使いました。
using StatsBase n=5 r=2 println(binomial(n, r) * factorial(r)) # 順列数、nPr println(binomial(n, r)) # 組み合わせ数、nCr
28. メモ化
下記参照
29. stdinをファイルに置き換える
STDIN = open("sample.txt") println(uppercase(readline(STDIN)))
参考資料
MyEnigma Supporters
もしこの記事が参考になり、
ブログをサポートしたいと思われた方は、
こちらからよろしくお願いします。