Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
あなたの知らない(概ね知らなくても良い)Juliaの世界 for JuliaLangJa 年末...
Search
GOTOH Shunsuke
December 08, 2024
Technology
0
49
あなたの知らない(概ね知らなくても良い)Juliaの世界 for JuliaLangJa 年末 LT 大会 2024
あなたの知らない(概ね知らなくても良い)Juliaの世界
JuliaLangJa 年末 LT 大会 2024 LT発表資料
GOTOH Shunsuke
December 08, 2024
Tweet
Share
More Decks by GOTOH Shunsuke
See All by GOTOH Shunsuke
Julia 新 LTS v1.10 解説 for JuliaTokai #20
antimon2
1
170
夏休みの(最後の)宿題 for JuliaTokyo #12
antimon2
1
190
Julia クイズ ~API編~ for JuliaTokai #19
antimon2
1
150
Julia でどうしても super().hoge みたいなことしたい人へ for JuliaTokai #18
antimon2
1
350
『実践Julia入門』 で 割愛したネタ for JuliaTokyo #11
antimon2
2
590
勉強会を主催したら 本を出して技術顧問になった話 for NGK2024S
antimon2
0
290
Julia本を書いたら技術顧問になった話 for JuliaTokai #17
antimon2
0
560
Juliaってどんなことができるの? for JuliaTokai #16
antimon2
1
620
型と多重ディスパッチ for 数学と物理におけるJuliaの活用 2023-07-10
antimon2
0
770
Other Decks in Technology
See All in Technology
非機能品質を作り込むための実践アーキテクチャ
knih
5
1.5k
KubeCon NA 2024 Recap / Running WebAssembly (Wasm) Workloads Side-by-Side with Container Workloads
z63d
1
250
祝!Iceberg祭開幕!re:Invent 2024データレイク関連アップデート10分総ざらい
kniino
3
310
普通のエンジニアがLaravelコアチームメンバーになるまで
avosalmon
0
110
watsonx.ai Dojo #5 ファインチューニングとInstructLAB
oniak3ibm
PRO
0
170
継続的にアウトカムを生み出し ビジネスにつなげる、 戦略と運営に対するタイミーのQUEST(探求)
zigorou
0
600
サイボウズフロントエンドエキスパートチームについて / FrontendExpert Team
cybozuinsideout
PRO
5
38k
スタートアップで取り組んでいるAzureとMicrosoft 365のセキュリティ対策/How to Improve Azure and Microsoft 365 Security at Startup
yuj1osm
0
230
レンジャーシステムズ | 会社紹介(採用ピッチ)
rssytems
0
200
生成AIをより賢く エンジニアのための RAG入門 - Oracle AI Jam Session #20
kutsushitaneko
4
260
Google Cloud で始める Cloud Run 〜AWSとの比較と実例デモで解説〜
risatube
PRO
0
110
オプトインカメラ:UWB測位を応用したオプトイン型のカメラ計測
matthewlujp
0
180
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
40
2.4k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
28
900
Writing Fast Ruby
sferik
628
61k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
The Pragmatic Product Professional
lauravandoore
32
6.3k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
The Invisible Side of Design
smashingmag
298
50k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.4k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
2
290
KATA
mclloyd
29
14k
Transcript
あなたの知らない (概ね知らなくても良い) Juliaの世界 2024/12/08 JuliaLangJa 年末 LT 大会 2024 antimon2(後藤
俊介)
お品書き • お前誰よ? • 簡単な Julia の紹介 • JuliaTokai の紹介
• 本編
お前誰よ?
自己紹介 • 名前:後藤 俊介 • 所属:有限会社 来栖川電算 • コミュニティ:🌟JuliaTokai, 🌟機械学習名古屋,
⭐JuliaLangJa, Ruby東海, Python東海, … • 言語:Julia, Python, Ruby, … • SNS等: (@antimon2) • SNS等(2): (@antimon2.jl) • 著書:実践Julia入門
本編
あなたは、こんな書き方知ってますか?
① ~=◯◯
① ~=◯◯ (基本) • Julia の演算子は普通に(再)代 入できる! ◦ 関数を代入すると演算式でシンプ ルにコードを書くことができる
◦ ~ の場合、= との間の空白も省略 できる(~= という複合代入演算子 が存在しないため) ◦ ※普通にやると Base の演算子を 上書きしてしまうので注意! let ~=+ 2~3 # == 2 + 3 end #> 5 let ~=binomial (2:8).~2 # == binomial.(2:8, 2) end #> [1, 3, 6, 10, 15, 21, 28] # 三角数
① ~=◯◯ (応用) • for 式でも利用可能(ローカル スコープになるので安全) • コードゴルフの基本テク: ~=split
とすると ~s とも書け る(空白文字で分割)し s~◦ とも 書ける(右オペランドの値で分 割) → • (あと実は(予約語の後かつ)~の前の空 白も省略できる) for~=(+,-,*,/) println(2~3) end ## 5 ## -1 ## 6 ## 0.6666666666666666 let~=split,s="1 2 3\n4 5 6\n7 8 9" stack(.~(s~'\n'), dims=1) end #> 3×3 Matrix{SubString{String}}: #> "1" "2" "3" #> "4" "5" "6" #> "7" "8" "9"
② a>b=◯◯
② a>b=◯◯ (基本) • Julia の演算子は 《演算式》 =◯◯ という形で定義できる! ◦
比較演算子を定義する場合、戻り 値が Bool でなくても定義できる (エラーにはならない) ◦ ※普通にやると Base の演算子を 上書きしてしまうので注意!(2回 目)(多重定義(メソッド追加)では なく上書きとなることに要注意!) let a > b = a % b == 0 6 .> (1:6) end #> [true, true, true, false, false, true] let a>b=a+2b 6 .> (1:6) end #> [8, 10, 12, 14, 16, 18]
② a>b=◯◯ (応用) • コードゴルフの基本テク: ◦ 比較演算子の定義中に同じ比較演 算子が出てきても良い(再帰関数 の定義になる) ◦
比較演算子は Chain できるの で、再帰関数の終了条件を簡潔に (というかトリッキーだけど短く) 書ける! # 1以上N未満のフィボナッチ数を列挙( 1行ずつ出力) let N=100 n>r=println(r.den)≠r.num<n>1+1/r N>1//1 end ## 1 ## 1 ## 2 ## 3 ## 5 ## 8 ## 13 ## 21 ## 34 ## 55 ## 89
③ x.|>[f,g,h]
③ x.|>[f,g,h] (基本) • Julia には ブロードキャスティ ング という機能があり、関数を 手軽にベクタ化・次元拡張できる
• |>(パイプライン演算子)を組み 合わせると「1つ(または複数)」 の値を 複数の関数に適用 する こともできる! # 普通のブロードキャスティング sin.([1, 2, π/4]) #> [0.841471, 0.909297, 0.707107] # 関数適用のブロードキャスティング π/4 .|> [sin, cos, tan] #> [0.707107, 0.707107, 1.0] # 複数vs複数の例 [1 2 π/4] .|> [sin, cos, tan] #> [0.841471 0.909297 0.707107 #> 0.540302 -0.416147 0.707107 #> 1.55741 -2.18504 1.0 ]
③ x.|>[f,g,h] (応用) • コードゴルフ:Quine ◦ 現在見つかっている最短の Julia Quine(32bytes) ◦
補足:Quine とは(色々な定義が あるがここでは)ソースコードと全 く同一の出力をするプログラムの こと(ソースコードを読み込んで出 力するコードは反則)。 ".|>[show,print]".|>[show,print] ## ".|>[show,print]".|>[show,print] # 解説. # 1. `"a".|>show` は `"a"` と出力される # 2. `"a".|>print` は `a` と出力される # 3. `"a".|>[show,print]` は `"a"a` と出 力される # 4. `".|>[show,print]".|>[show,print]` は `".|>[show,print]".|>[show,print]` と出力される
④ A'B
④ A'B (基本) • A'B は A'*B と等価(乗算演算 子の省略、2x==2*xとかと同じ) •
v'v (v isa AbstractVector) なら ベクトルの内積 が計算できる • @.A'B(A'.*B)だと転置行列との 要素ごとの積(ブロードキャスティン グ) v = [1, 2, 3]; [100, 10, 1]'v #> 123 # 各桁の数字から10進数値を構築 v'v #> 14 # 内積 @.v'v # == v'.*v #> 3×3 Matrix{Int64}: #> 1 2 3 #> 2 4 6 #> 3 6 9
④ A'B (応用) • コードゴルフ:素数列挙 ◦ 2桁以下の素数列挙なら最 短(30bytes, 28chars) ◦
もっと大きい素数列挙だともっと 短く書く別の方法がある(というか そもそもメモリ使用量も計算量も O(N²)なので決して効率は良くな い) R=2:99;@.R[R∉[R'R]]|>println ## 2 ## 3 ## 5 ## 7 ## :《中略》 ## 83 ## 89 ## 97
⑤ A⊆B⊆A
⑤ A⊆B⊆A (基本) • A⊆B⊆A は issetequal(A, B) と等価(つまり「要素の組合 せが一致していれば
true」) • ご想像の通り コードゴルフ (ショートコーディング)以外の応 用は(たぶん)ありません!! A = 1:3; B = [3,1,2,1]; C = [3,1,4]; D = [3,1,2,4]; A⊆B⊆A #> true A⊆C⊆A #> false A⊆D⊆A #> false
⑤ A⊆B⊆A (応用) • コードゴルフ:順列列挙 ◦ A⊆R は必ず成立するので R⊆A とだけ書いている点も
注目。 ◦ その他色々な技を駆使しているの で(お暇な方は)ぜひ解読してみて ください! A>R=R⊆A≠println(join(A,-)),R.|>x->A<A∪x>R []>1:4 ## 1-2-3-4 ## 1-2-4-3 ## 1-3-2-4 ## 1-3-4-2 ## :《中略》 ## 4-2-1-3 ## 4-2-3-1 ## 4-3-1-2 ## 4-3-2-1
⑥ A<A∪x
• A∪x は [A;x] と大体同じ (!isa(A, Set) かつ x∉A ならば)
• A<A∪x は x∉A (!in(x,A))と 大体同じ ◦ 配列の大小比較は各要素の 辞書 式順序 比較(文字列比較と同様) ◦ なので「短い方の配列と要素が同 じ」ならば長い方が大きくなる! ◦ A の要素が大小比較できる必要は あり ⑥ A<A∪x (基本) A = 1:3; all(A∪x==A for x in 1:3) #> true all(A∪x==[A;x] for x in 4:10) #> true all(A<A∪x for x in 4:10) #> true
⑥ A<A∪x (応用) • コードゴルフ:順列列挙(再) ◦ 比較の Chain で A∪x
を再帰 処理に渡せる(バックトラッキン グ) ◦ その他色々な技を駆使しているの で(お暇な方は)ぜひ解読してみて ください! A>R=R⊆A≠println(join(A,-)),R.|>x->A<A∪x>R []>1:4 ## 1-2-3-4 ## 1-2-4-3 ## 1-3-2-4 ## 1-3-4-2 ## :《中略》 ## 4-2-1-3 ## 4-2-3-1 ## 4-3-1-2 ## 4-3-2-1
まとめ
まとめ • Julia でコードゴルフも意外と パズル要素が多くて楽しいよ! • Julia 楽しいよ!
参考
参考文献・リンク等 • Code Golf (コードゴルフコンペサイト) ◦ Wiki: Julia (JuliaのコードゴルフテクTips) •
Tips for golfing in Julia (コードゴルフTips、ただしバージョンが古かった り現在通用しないテクニックもしばしばあるので注意)
ご清聴ありがとうございます。