Se ha denunciado esta presentación.
Se está descargando tu SlideShare. ×

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

Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Cargando en…3
×

Eche un vistazo a continuación

1 de 31 Anuncio

Más Contenido Relacionado

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

Más de Fujio Kojima (20)

Anuncio

Más reciente (20)

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

  1. 1. C# Live Coding! ~ 小島の分 ~ BuriKaigi 2023 @ 富山県黒部市宇奈月温泉 21st January 2023 Fujio Kojima #BuriKaigi #BuriKaigi_b
  2. 2. 自己紹介 2
  3. 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. • テクニカルな解法 • 正攻法 • 過去のやり口からしてチート 過去のメンバーの戦略の傾向 4
  5. 5. • テクニカルな解法 • 正攻法 • 過去のやり口からしてチート 過去のメンバーの戦略の傾向 5 今回チート担当(謎) 不在 クリーンな対戦が予想される
  6. 6. 今回は Same Game (さめがめ) 6
  7. 7. ルール 7 強さ 速さ 短さ 1位 10点 5点 5点 2位 5点 3点 3点 3位 1点 1点 1点
  8. 8. レギュレーション 8
  9. 9. 9
  10. 10. 「強さ」への戦略 10
  11. 11. 「強さ」への戦略 11
  12. 12. 「強さ」への戦略 12
  13. 13. 「強さ」への戦略 13 無理っぽかった 自分で考えよう
  14. 14. 「強さ」への戦略 14
  15. 15. 15
  16. 16. 「速さ」への戦略 16 ボトルネック調査 80:20の法則 ボトルネック解消
  17. 17. 17
  18. 18. 漢字一文字 • LINQ 「短さ」への戦略 18
  19. 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().座; }
  20. 20. 「短さ」への戦略 - レギュレーションを再確認 20
  21. 21. 「短さ」への戦略 - レギュレーションを再確認 21 • 他者作成のライブラリは利用可 コメントは除く
  22. 22. 「短さ」への戦略 - レギュレーションを再確認 22 • 他者作成のライブラリは利用可 コメントは除く コメントが動けば いいのになー
  23. 23. 「短さ」への戦略 23 コメントから C#のコードを取り出したり、それをコンパイル してDLLにして呼び出したりする他者の作ったライブラリが あればよいのに
  24. 24. 「短さ」への戦略 24 コメントから C#のコードを取り出したり、それをコンパイル してDLLにして呼び出したりする他者の作ったライブラリが あればよいのに ライブラリを探してみたよ .NET の中、 NuGet の中、 そんなとこにあるはずもないのに…
  25. 25. 娘 への C# 入門 25
  26. 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. 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); } サンプル コード はこんな感じだよ
  28. 28. 28 娘との LINE
  29. 29. 「短さ」への戦略 29 再度 NuGet を検索 したらなんか使えそう なものを偶然発見
  30. 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. 「短さ」への戦略 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行のコメントに

×