MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

Juliaで競技プログラミングやるときによく書くコードをまとめてみた

目次

はじめに

下記の記事が非常に勉強になったので、

Juliaで同じことを実現する方法を調べてみました。

https://qiita.com/y-tsutsu/items/aa7e8e809d6ac167d6a1qiita.com

(競技プロはやったことないのですが。。。)

すべてのコードは下記のリポジトリでも公開しています。

github.com

 

1. 基本的な入出力

println(uppercase(readline(STDIN)))

f:id:meison_amsl:20180520185548p:plain

2. 数値への変換

println(parse(Int64, readline(STDIN)))

f:id:meison_amsl:20180520185915p:plain

3. 空白で分割

println(split(readline(STDIN)))
println(split(readline(STDIN)))

f:id:meison_amsl:20180520185949p:plain  

4. 空白で分割しつつ数値に変換

A, B, C = parse.(Int64, split(readline(STDIN)))
println(A+B-C)

f:id:meison_amsl:20180520190030p:plain

5. 特定の条件のデータを数える

data = 1:10
count = length([x for x in data if x%3 == 0])
println(count)

f:id:meison_amsl:20180520203656p:plain

6. 複数行をまとめて読み込む

juliaは行列を綺麗に表示するのが面倒。。

n = parse.(Int64, readline(STDIN))
data = [parse.(Int64, split(readline(STDIN))) for _ in 1:n]
show(STDOUT, "text/plain", data);println()

f:id:meison_amsl:20180520203816p:plain 

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()

f:id:meison_amsl:20180520203901p:plain

 

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と同じように表示させるには、

一度転置させる必要があります。

f:id:meison_amsl:20180521201800p:plain  

9. 連結と繰り返し

a = vcat([1,2,3] , [4, 5])
println(a)

b =repeat([1,2,3], outer=3)
println(b)

f:id:meison_amsl:20180520204035p:plain 

10. 要素の存在確認

a = [1,2,3,4,5]
println(1 in a)
println(6 in a)

f:id:meison_amsl:20180519084810p:plain

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)

f:id:meison_amsl:20180519085417p:plain

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])))

f:id:meison_amsl:20180519091536p:plain

julia.hatenablog.jp

13. マイナス値のインデックス

a = [1,2,3,4,5]
# JuliaではPythonとは異なり、マイナスのインデックスは使えない
# 代わりにendを使う
println(a[end])
println(a[end-1])

f:id:meison_amsl:20180519091940p:plain

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])

f:id:meison_amsl:20180519092459p:plain

 

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)

f:id:meison_amsl:20180520085358p:plain

16. 和集合と積集合

a = Set([2,4,6,8])
b = Set([3,6,9])

#和集合
println(union(a,b))

#積集合
println(intersect(a,b))

f:id:meison_amsl:20180520085758p:plain

17. 文字列における、連結と繰り返し、存在確認

# 連結 
a = "ABC" * "DEF"
println(a)

# 繰り返し
b = "ABC"^3
println(b)

# 存在確認
c = "ABCDEF"
println(contains(c, "A"))
println(contains(c, "a"))

f:id:meison_amsl:20180520090346p:plain

 

18. 文字列の置換

a = "abc(de)fg"
println(replace(replace(a,"(","["),")","]"))

b = "aBCdEfg"
println(uppercase(b))
println(lowercase(b))

f:id:meison_amsl:20180520090804p:plain

19. 文字列の反転

s = "ABCDEFG"
println(s[end:-1:1])

f:id:meison_amsl:20180520091002p:plain

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)

f:id:meison_amsl:20180520092026p:plain

 

22. 累積和

a = [i for i in 1:10]
println(a)
b = cumsum(a)
println(b)

f:id:meison_amsl:20180520092709p:plain

23. dropwhileとtakewhile

Julia本体にはdropwhileとtakewhileは無いので、

下記のような外部ライブラリを使うか、

github.com

下記のように、簡単なスニペットを利用する必要がありそうです。

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)

f:id:meison_amsl:20180520180738p:plain

 

24. groupby

groupbyに関しては、

juliaで良いパッケージや、スニペットが

見つかりませんでした。。

どなたかいい方法を知っている方は

コメントで教えて頂けると嬉しいです。

25. for文のelse

juliaは今のところ、for文のelseや、

while文のえelseには対応していないようです。

下記のように導入の議論はされているので、

将来的に入るかもしれませんが。

github.com

26. 2進数や16進数

println(bin(255))
println(hex(255))
println(parse(Int16,"0b11111111"))
println(parse(Int16,"0xff"))

f:id:meison_amsl:20180520183443p:plain

27. 順列数と組み合わせ数

下記のライブラリを使いました。

github.com

using StatsBase

n=5
r=2
println(binomial(n, r) * factorial(r)) # 順列数、nPr
println(binomial(n, r)) # 組み合わせ数、nCr

f:id:meison_amsl:20180520184732p:plain

28. メモ化

下記参照

qiita.com

29. stdinをファイルに置き換える

STDIN = open("sample.txt")
println(uppercase(readline(STDIN)))

f:id:meison_amsl:20180520185548p:plain

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com