SlideShare a Scribd company logo
1 of 31
Download to read offline
C# Live Coding!
~ 小島の分 ~
BuriKaigi 2023 @ 富山県黒部市宇奈月温泉
21st January 2023
Fujio Kojima
#BuriKaigi
#BuriKaigi_b
自己紹介
2
Live Coding は 13回目!
3
イベント お題
1 2014/03/22 MVP Community Camp 北陸会場 リバーシ
2 2015/01/31 MVP Community Camp 北陸会場 七並べ
3 2016/02/20 Hokuriku ComCamp 2016 Tetris っぽい落ちゲー
4 2017/01/28 BuriKaigi 2017 リバーシ
5 2017/10/28 仙台 IT 文化祭 2017 リバーシ
6 2018/02/03 BuriKaigi 2018 リバーシ
7 2019/01/26 BuriKaigi 2019 Base64 エンコード/デコード スピード対決
8 2019/05/30 de:code 2019 Blazor 七並べ
9 2019/12/15 牛タン会議 2019 FastEnum コード レビュー
10 2020/02/01 BuriKaigi 2020 スピード (トランプ ゲーム)
11 2021/01/30 BuriKaigi 2021 Azure Functions リバーシ
12 2022/01/29 BuriKaigi 2022 ダイヤモンド ゲーム
13 2023/01/21 BuriKaigi 2023 Same Game
• テクニカルな解法
• 正攻法
• 過去のやり口からしてチート
過去のメンバーの戦略の傾向
4
• テクニカルな解法
• 正攻法
• 過去のやり口からしてチート
過去のメンバーの戦略の傾向
5
今回チート担当(謎) 不在
クリーンな対戦が予想される
今回は Same Game (さめがめ)
6
ルール
7
強さ 速さ 短さ
1位 10点 5点 5点
2位 5点 3点 3点
3位 1点 1点 1点
レギュレーション
8
9
「強さ」への戦略
10
「強さ」への戦略
11
「強さ」への戦略
12
「強さ」への戦略
13
無理っぽかった
自分で考えよう
「強さ」への戦略
14
15
「速さ」への戦略
16
ボトルネック調査
80:20の法則
ボトルネック解消
17
漢字一文字
• LINQ
「短さ」への戦略
18
漢字一文字
• LINQ
「短さ」への戦略
19
static Point 得(Board 板)
{
var 数 = 板.GetBoardData()
.Cast<Piece>()
.GroupBy(m => m.PieceColor)
.Select(m => new { 色 = m.Key, 数 = m.Count() })
.Where(m => m.色 != Piece.PieceColorEnum.None && m.数 >= 2)
.OrderBy(m => m.数);
var 全 = 数.Sum(m => m.数);
const int 閾 = 50;
const int 天 = 3;
if (全 < 閾)
return 得(板, 天);
var 色 = 数.Select(m => m.色)
.ToList();
var 点 = 効(板);
return 点.OrderBy(m => 色.FindIndex(n => n == 板.GetBoardData()[m.座.X, m.座.Y].PieceColor))
.ThenByDescending(m => m.横)
.ThenByDescending(m => 計(板, m.座))
.First().座;
}
「短さ」への戦略 - レギュレーションを再確認
20
「短さ」への戦略 - レギュレーションを再確認
21
• 他者作成のライブラリは利用可
コメントは除く
「短さ」への戦略 - レギュレーションを再確認
22
• 他者作成のライブラリは利用可
コメントは除く コメントが動けば
いいのになー
「短さ」への戦略
23
コメントから C#のコードを取り出したり、それをコンパイル
してDLLにして呼び出したりする他者の作ったライブラリが
あればよいのに
「短さ」への戦略
24
コメントから C#のコードを取り出したり、それをコンパイル
してDLLにして呼び出したりする他者の作ったライブラリが
あればよいのに
ライブラリを探してみたよ
.NET の中、
NuGet の中、
そんなとこにあるはずもないのに…
娘 への C# 入門
25
娘 への C# 入門
26
public static Assembly? CodeToAssembly(string csharpCode, IEnumerable<MetadataReference>? references = null)
{
var fileName = Guid.NewGuid().ToString();
var options = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp11);
var sourceCodeName = $"{fileName}.cs";
var syntaxTree = CSharpSyntaxTree.ParseText(csharpCode, options, sourceCodeName);
var dllName = $"{fileName}.dll";
var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
var compilation = CSharpCompilation.Create(dllName, new[] { syntaxTree }, references, compilationOptions);
using var stream = new MemoryStream();
var emitResult = compilation.Emit(stream);
if (emitResult.Success) {
stream.Seek(0, SeekOrigin.Begin);
var assembly = AssemblyLoadContext.Default.LoadFromStream(stream);
return assembly;
} else {
foreach (var diagnostic in emitResult.Diagnostics) {
var pos = diagnostic.Location.GetLineSpan();
var location =
"(" + pos.Path + "@Line" + (pos.StartLinePosition.Line + 1) +
":" +
(pos.StartLinePosition.Character + 1) + ")";
}
return null;
}
}
サンプル コード
はこんな感じだよ
public static Assembly? CodeToAssembly(string csharpCode, IEnumerable<MetadataReference>? references = null)
{
var fileName = Guid.NewGuid().ToString();
var options = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp11);
var sourceCodeName = $"{fileName}.cs";
var syntaxTree = CSharpSyntaxTree.ParseText(csharpCode, options, sourceCodeName);
var dllName = $"{fileName}.dll";
var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
var compilation = CSharpCompilation.Create(dllName, new[] { syntaxTree }, references, compilationOptions);
using var stream = new MemoryStream();
var emitResult = compilation.Emit(stream);
if (emitResult.Success) {
stream.Seek(0, SeekOrigin.Begin);
var assembly = AssemblyLoadContext.Default.LoadFromStream(stream);
return assembly;
} else {
foreach (var diagnostic in emitResult.Diagnostics) {
var pos = diagnostic.Location.GetLineSpan();
var location =
"(" + pos.Path + "@Line" + (pos.StartLinePosition.Line + 1) +
":" +
(pos.StartLinePosition.Character + 1) + ")";
}
return null;
}
}
27
static Dictionary<(string, string), MethodInfo> staticMethodCache = new();
public static object? StaticInvoke(Assembly assembly, string typeName, string methodName,
object[] parameters)
{
if (!staticMethodCache.TryGetValue((typeName, methodName), out var method)) {
var type = assembly.GetType(typeName);
if (type == null)
return null;
method = type.GetMethod(methodName);
if (method == null)
return null;
staticMethodCache[(typeName, methodName)] = method;
}
return method.Invoke(null, parameters);
} サンプル コード
はこんな感じだよ
28
娘との LINE
「短さ」への戦略
29
再度 NuGet を検索
したらなんか使えそう
なものを偶然発見
「短さ」への戦略
30
// // static Point 得(Board 板)
// // {
// // var 数 = 板.GetBoardData()
// // .Cast<Piece>()
// // .GroupBy(m => m.PieceColor)
// // .Select(m => new { 色 = m.Key, 数 = m.Count() })
// // .Where(m => m.色 != Piece.PieceColorEnum.None && m.数 >= 2)
// // .OrderBy(m => m.数);
// // var 全 = 数.Sum(m => m.数);
// // Debug.WriteLine($"得 - Sum: {全}");
// // const int 閾 = 50;
// // const int 天 = 3;
// // if (全 < 閾)
// // return 得(板, 天);
// // var 色 = 数.Select(m => m.色)
// // .ToList();
// // var 点 = 効(板);
// // return 点.OrderBy(m => 色.FindIndex(n => n == 板.GetBoardData()[m.座.X, m.座.Y].PieceColor))
// // .ThenByDescending(m => m.横)
// // .ThenByDescending(m => 計(板, m.座))
// // .First().座;
// // }
何故か
主なロジックが
168行のコメントに
「短さ」への戦略
31
// // static Point 得(Board 板)
// // {
// // var 数 = 板.GetBoardData()
// // .Cast<Piece>()
// // .GroupBy(m => m.PieceColor)
// // .Select(m => new { 色 = m.Key, 数 = m.Count() })
// // .Where(m => m.色 != Piece.PieceColorEnum.None && m.数 >= 2)
// // .OrderBy(m => m.数);
// // var 全 = 数.Sum(m => m.数);
// // Debug.WriteLine($"得 - Sum: {全}");
// // const int 閾 = 50;
// // const int 天 = 3;
// // if (全 < 閾)
// // return 得(板, 天);
// // var 色 = 数.Select(m => m.色)
// // .ToList();
// // var 点 = 効(板);
// // return 点.OrderBy(m => 色.FindIndex(n => n == 板.GetBoardData()[m.座.X, m.座.Y].PieceColor))
// // .ThenByDescending(m => m.横)
// // .ThenByDescending(m => 計(板, m.座))
// // .First().座;
// // }
static PlayerKojima() => 器 = new("PlayerKojima.cs", Encoding.UTF8, "// //", typeof(PlayerKojima).Assembly, 5);
public Point GetPoint(Board 板) => (Point)器.StaticInvoke("手", "点", new object[] { 板 });
不思議なことに
プログラムの自作部分が
コメント除くと2行に
何故か
主なロジックが
168行のコメントに

More Related Content

Similar to Burikaigi 2023「C# Live Coding!」 小島の分

TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio CodeAkira Inoue
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11えぴ 福田
 
函数プログラミングの エッセンスと考え方
函数プログラミングのエッセンスと考え方函数プログラミングのエッセンスと考え方
函数プログラミングの エッセンスと考え方啓 小笠原
 
データとは何か
データとは何かデータとは何か
データとは何かKenta Suzuki
 
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsPL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsKohei KaiGai
 
Unity C#3からC#6に向けて
Unity C#3からC#6に向けてUnity C#3からC#6に向けて
Unity C#3からC#6に向けてonotchi_
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話Masanori Masui
 
これからのJavaScriptの話
これからのJavaScriptの話これからのJavaScriptの話
これからのJavaScriptの話Shogo Sensui
 
C++ lecture-1
C++ lecture-1C++ lecture-1
C++ lecture-1sunaemon
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016kyoto university
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるShintaro Fukushima
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会Akihiko Matuura
 
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」Hiro H.
 

Similar to Burikaigi 2023「C# Live Coding!」 小島の分 (20)

TypeScript と Visual Studio Code
TypeScript と Visual Studio CodeTypeScript と Visual Studio Code
TypeScript と Visual Studio Code
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
ぱっと見でわかるC++11
ぱっと見でわかるC++11ぱっと見でわかるC++11
ぱっと見でわかるC++11
 
函数プログラミングの エッセンスと考え方
函数プログラミングのエッセンスと考え方函数プログラミングのエッセンスと考え方
函数プログラミングの エッセンスと考え方
 
データとは何か
データとは何かデータとは何か
データとは何か
 
PL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database AnalyticsPL/CUDA - GPU Accelerated In-Database Analytics
PL/CUDA - GPU Accelerated In-Database Analytics
 
Unity C#3からC#6に向けて
Unity C#3からC#6に向けてUnity C#3からC#6に向けて
Unity C#3からC#6に向けて
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
Cocoa勉強会201208
Cocoa勉強会201208Cocoa勉強会201208
Cocoa勉強会201208
 
(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話(ゲームじゃない方の)switchで遊びたい話
(ゲームじゃない方の)switchで遊びたい話
 
これからのJavaScriptの話
これからのJavaScriptの話これからのJavaScriptの話
これからのJavaScriptの話
 
Sql learning
Sql learningSql learning
Sql learning
 
C++ lecture-1
C++ lecture-1C++ lecture-1
C++ lecture-1
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016
 
データサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみるデータサイエンスワールドからC++を眺めてみる
データサイエンスワールドからC++を眺めてみる
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 
What is Metasepi?
What is Metasepi?What is Metasepi?
What is Metasepi?
 
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
 
Misrac20150523
Misrac20150523Misrac20150523
Misrac20150523
 

More from Fujio Kojima

2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発Fujio Kojima
 
.NET 6 時代のデスクトップ アプリケーション開発
.NET 6 時代のデスクトップ アプリケーション開発.NET 6 時代のデスクトップ アプリケーション開発
.NET 6 時代のデスクトップ アプリケーション開発Fujio Kojima
 
BuriKaigi 2022 「C# Live Coding!」 小島の分
BuriKaigi 2022 「C# Live Coding!」 小島の分BuriKaigi 2022 「C# Live Coding!」 小島の分
BuriKaigi 2022 「C# Live Coding!」 小島の分Fujio Kojima
 
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~Fujio Kojima
 
.NET 5 勉強会 ~.NET Framework から .NET へ~
.NET 5 勉強会 ~.NET Framework から .NET へ~.NET 5 勉強会 ~.NET Framework から .NET へ~
.NET 5 勉強会 ~.NET Framework から .NET へ~Fujio Kojima
 
.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」Fujio Kojima
 
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~Fujio Kojima
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~Fujio Kojima
 
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020Fujio Kojima
 
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分Fujio Kojima
 
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights FukuiFujio Kojima
 
機械学習 (AI/ML) 勉強会 #2 IoT編
機械学習 (AI/ML) 勉強会 #2 IoT編 機械学習 (AI/ML) 勉強会 #2 IoT編
機械学習 (AI/ML) 勉強会 #2 IoT編 Fujio Kojima
 
機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編Fujio Kojima
 
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分Fujio Kojima
 
機械学習入門
機械学習入門機械学習入門
機械学習入門Fujio Kojima
 
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しようC# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しようFujio Kojima
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~Fujio Kojima
 
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」Fujio Kojima
 
.NET MVP によるドキドキ・ライブコーディング! 小島の分
.NET MVP によるドキドキ・ライブコーディング! 小島の分.NET MVP によるドキドキ・ライブコーディング! 小島の分
.NET MVP によるドキドキ・ライブコーディング! 小島の分Fujio Kojima
 
Windows アプリケーション開発 はじめに ~ Windows アプリケーション開発初学者の方向け Visual Studio を使ったアプリケーショ...
Windows アプリケーション開発はじめに ~ Windows アプリケーション開発初学者の方向けVisual Studio を使ったアプリケーショ...Windows アプリケーション開発はじめに ~ Windows アプリケーション開発初学者の方向けVisual Studio を使ったアプリケーショ...
Windows アプリケーション開発 はじめに ~ Windows アプリケーション開発初学者の方向け Visual Studio を使ったアプリケーショ...Fujio Kojima
 

More from Fujio Kojima (20)

2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
2022.04.23 .NET 6 -7 時代のデスクトップ アプリケーション開発
 
.NET 6 時代のデスクトップ アプリケーション開発
.NET 6 時代のデスクトップ アプリケーション開発.NET 6 時代のデスクトップ アプリケーション開発
.NET 6 時代のデスクトップ アプリケーション開発
 
BuriKaigi 2022 「C# Live Coding!」 小島の分
BuriKaigi 2022 「C# Live Coding!」 小島の分BuriKaigi 2022 「C# Live Coding!」 小島の分
BuriKaigi 2022 「C# Live Coding!」 小島の分
 
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~
 
.NET 5 勉強会 ~.NET Framework から .NET へ~
.NET 5 勉強会 ~.NET Framework から .NET へ~.NET 5 勉強会 ~.NET Framework から .NET へ~
.NET 5 勉強会 ~.NET Framework から .NET へ~
 
.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」
 
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~
『議論パターン』 (Discussion Patterns) ~不毛な議論を避け、実り有る議論とするために~
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
 
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
 
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分
牛タン会議 2019 @ 仙台 「C# ドキドキ ライブ!!」 小島の分
 
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui
『機械学習 (AI/ML) の基礎と Microsoft の AI | 2019/04/02 Global AI Nights Fukui
 
機械学習 (AI/ML) 勉強会 #2 IoT編
機械学習 (AI/ML) 勉強会 #2 IoT編 機械学習 (AI/ML) 勉強会 #2 IoT編
機械学習 (AI/ML) 勉強会 #2 IoT編
 
機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編機械学習 (AI/ML) 勉強会 #1 基本編
機械学習 (AI/ML) 勉強会 #1 基本編
 
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分
BuriKaigi2019 「C# ドキドキ・ライブコーディング」 小島の分
 
機械学習入門
機械学習入門機械学習入門
機械学習入門
 
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しようC# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~
 
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」
「ふくいソフトウェアコンペティション 2014 大賞受賞者プレゼンテーション」
 
.NET MVP によるドキドキ・ライブコーディング! 小島の分
.NET MVP によるドキドキ・ライブコーディング! 小島の分.NET MVP によるドキドキ・ライブコーディング! 小島の分
.NET MVP によるドキドキ・ライブコーディング! 小島の分
 
Windows アプリケーション開発 はじめに ~ Windows アプリケーション開発初学者の方向け Visual Studio を使ったアプリケーショ...
Windows アプリケーション開発はじめに ~ Windows アプリケーション開発初学者の方向けVisual Studio を使ったアプリケーショ...Windows アプリケーション開発はじめに ~ Windows アプリケーション開発初学者の方向けVisual Studio を使ったアプリケーショ...
Windows アプリケーション開発 はじめに ~ Windows アプリケーション開発初学者の方向け Visual Studio を使ったアプリケーショ...
 

Recently uploaded

TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成Hiroshi Tomioka
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 

Recently uploaded (9)

TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 

Burikaigi 2023「C# Live Coding!」 小島の分

  • 1. C# Live Coding! ~ 小島の分 ~ BuriKaigi 2023 @ 富山県黒部市宇奈月温泉 21st January 2023 Fujio Kojima #BuriKaigi #BuriKaigi_b
  • 3. Live Coding は 13回目! 3 イベント お題 1 2014/03/22 MVP Community Camp 北陸会場 リバーシ 2 2015/01/31 MVP Community Camp 北陸会場 七並べ 3 2016/02/20 Hokuriku ComCamp 2016 Tetris っぽい落ちゲー 4 2017/01/28 BuriKaigi 2017 リバーシ 5 2017/10/28 仙台 IT 文化祭 2017 リバーシ 6 2018/02/03 BuriKaigi 2018 リバーシ 7 2019/01/26 BuriKaigi 2019 Base64 エンコード/デコード スピード対決 8 2019/05/30 de:code 2019 Blazor 七並べ 9 2019/12/15 牛タン会議 2019 FastEnum コード レビュー 10 2020/02/01 BuriKaigi 2020 スピード (トランプ ゲーム) 11 2021/01/30 BuriKaigi 2021 Azure Functions リバーシ 12 2022/01/29 BuriKaigi 2022 ダイヤモンド ゲーム 13 2023/01/21 BuriKaigi 2023 Same Game
  • 4. • テクニカルな解法 • 正攻法 • 過去のやり口からしてチート 過去のメンバーの戦略の傾向 4
  • 5. • テクニカルな解法 • 正攻法 • 過去のやり口からしてチート 過去のメンバーの戦略の傾向 5 今回チート担当(謎) 不在 クリーンな対戦が予想される
  • 6. 今回は Same Game (さめがめ) 6
  • 7. ルール 7 強さ 速さ 短さ 1位 10点 5点 5点 2位 5点 3点 3点 3位 1点 1点 1点
  • 9. 9
  • 15. 15
  • 17. 17
  • 19. 漢字一文字 • LINQ 「短さ」への戦略 19 static Point 得(Board 板) { var 数 = 板.GetBoardData() .Cast<Piece>() .GroupBy(m => m.PieceColor) .Select(m => new { 色 = m.Key, 数 = m.Count() }) .Where(m => m.色 != Piece.PieceColorEnum.None && m.数 >= 2) .OrderBy(m => m.数); var 全 = 数.Sum(m => m.数); const int 閾 = 50; const int 天 = 3; if (全 < 閾) return 得(板, 天); var 色 = 数.Select(m => m.色) .ToList(); var 点 = 効(板); return 点.OrderBy(m => 色.FindIndex(n => n == 板.GetBoardData()[m.座.X, m.座.Y].PieceColor)) .ThenByDescending(m => m.横) .ThenByDescending(m => 計(板, m.座)) .First().座; }
  • 21. 「短さ」への戦略 - レギュレーションを再確認 21 • 他者作成のライブラリは利用可 コメントは除く
  • 22. 「短さ」への戦略 - レギュレーションを再確認 22 • 他者作成のライブラリは利用可 コメントは除く コメントが動けば いいのになー
  • 25. 娘 への C# 入門 25
  • 26. 娘 への C# 入門 26 public static Assembly? CodeToAssembly(string csharpCode, IEnumerable<MetadataReference>? references = null) { var fileName = Guid.NewGuid().ToString(); var options = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp11); var sourceCodeName = $"{fileName}.cs"; var syntaxTree = CSharpSyntaxTree.ParseText(csharpCode, options, sourceCodeName); var dllName = $"{fileName}.dll"; var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary); var compilation = CSharpCompilation.Create(dllName, new[] { syntaxTree }, references, compilationOptions); using var stream = new MemoryStream(); var emitResult = compilation.Emit(stream); if (emitResult.Success) { stream.Seek(0, SeekOrigin.Begin); var assembly = AssemblyLoadContext.Default.LoadFromStream(stream); return assembly; } else { foreach (var diagnostic in emitResult.Diagnostics) { var pos = diagnostic.Location.GetLineSpan(); var location = "(" + pos.Path + "@Line" + (pos.StartLinePosition.Line + 1) + ":" + (pos.StartLinePosition.Character + 1) + ")"; } return null; } } サンプル コード はこんな感じだよ
  • 27. public static Assembly? CodeToAssembly(string csharpCode, IEnumerable<MetadataReference>? references = null) { var fileName = Guid.NewGuid().ToString(); var options = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp11); var sourceCodeName = $"{fileName}.cs"; var syntaxTree = CSharpSyntaxTree.ParseText(csharpCode, options, sourceCodeName); var dllName = $"{fileName}.dll"; var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary); var compilation = CSharpCompilation.Create(dllName, new[] { syntaxTree }, references, compilationOptions); using var stream = new MemoryStream(); var emitResult = compilation.Emit(stream); if (emitResult.Success) { stream.Seek(0, SeekOrigin.Begin); var assembly = AssemblyLoadContext.Default.LoadFromStream(stream); return assembly; } else { foreach (var diagnostic in emitResult.Diagnostics) { var pos = diagnostic.Location.GetLineSpan(); var location = "(" + pos.Path + "@Line" + (pos.StartLinePosition.Line + 1) + ":" + (pos.StartLinePosition.Character + 1) + ")"; } return null; } } 27 static Dictionary<(string, string), MethodInfo> staticMethodCache = new(); public static object? StaticInvoke(Assembly assembly, string typeName, string methodName, object[] parameters) { if (!staticMethodCache.TryGetValue((typeName, methodName), out var method)) { var type = assembly.GetType(typeName); if (type == null) return null; method = type.GetMethod(methodName); if (method == null) return null; staticMethodCache[(typeName, methodName)] = method; } return method.Invoke(null, parameters); } サンプル コード はこんな感じだよ
  • 30. 「短さ」への戦略 30 // // static Point 得(Board 板) // // { // // var 数 = 板.GetBoardData() // // .Cast<Piece>() // // .GroupBy(m => m.PieceColor) // // .Select(m => new { 色 = m.Key, 数 = m.Count() }) // // .Where(m => m.色 != Piece.PieceColorEnum.None && m.数 >= 2) // // .OrderBy(m => m.数); // // var 全 = 数.Sum(m => m.数); // // Debug.WriteLine($"得 - Sum: {全}"); // // const int 閾 = 50; // // const int 天 = 3; // // if (全 < 閾) // // return 得(板, 天); // // var 色 = 数.Select(m => m.色) // // .ToList(); // // var 点 = 効(板); // // return 点.OrderBy(m => 色.FindIndex(n => n == 板.GetBoardData()[m.座.X, m.座.Y].PieceColor)) // // .ThenByDescending(m => m.横) // // .ThenByDescending(m => 計(板, m.座)) // // .First().座; // // } 何故か 主なロジックが 168行のコメントに
  • 31. 「短さ」への戦略 31 // // static Point 得(Board 板) // // { // // var 数 = 板.GetBoardData() // // .Cast<Piece>() // // .GroupBy(m => m.PieceColor) // // .Select(m => new { 色 = m.Key, 数 = m.Count() }) // // .Where(m => m.色 != Piece.PieceColorEnum.None && m.数 >= 2) // // .OrderBy(m => m.数); // // var 全 = 数.Sum(m => m.数); // // Debug.WriteLine($"得 - Sum: {全}"); // // const int 閾 = 50; // // const int 天 = 3; // // if (全 < 閾) // // return 得(板, 天); // // var 色 = 数.Select(m => m.色) // // .ToList(); // // var 点 = 効(板); // // return 点.OrderBy(m => 色.FindIndex(n => n == 板.GetBoardData()[m.座.X, m.座.Y].PieceColor)) // // .ThenByDescending(m => m.横) // // .ThenByDescending(m => 計(板, m.座)) // // .First().座; // // } static PlayerKojima() => 器 = new("PlayerKojima.cs", Encoding.UTF8, "// //", typeof(PlayerKojima).Assembly, 5); public Point GetPoint(Board 板) => (Point)器.StaticInvoke("手", "点", new object[] { 板 }); 不思議なことに プログラムの自作部分が コメント除くと2行に 何故か 主なロジックが 168行のコメントに