【.NET】「君の名は。」をモチーフに実装してみた

  • 4
    いいね
  • 0
    コメント

はじめに

これは、Visual Basic Advent Calendar 2016 の24日目の記事となります。

メリークリスマス!。今年は映画の「君の名は。」が大ヒットしましたね。

勤めている会社の近くに映画館があるので、サービスデイを選んで映画をよく観に行きます。
「君の名は。」ですがアニメという前提知識だけで監督やプロデューサーが誰とか知らないでスポーツジムで疲れた後に観ました。つまらないと寝てしまうかもと思って見始めたのですがそんなことは全く無く、むしろ観終わった後にこんな脚本を自分でも書いてみたいと思った程です。

さて、「君の名は。」の2大要素といえば、入れ替わりとタイムリープですよね。
これをモチーフにして.NETの2大言語であるVisual BasicとC#で何かしらやってみようという試みです。

入れ替わり

映画『君の名は。』で有名なワンシーン
「これってもしかして、俺たち・私たち、入れ替わってるー!?」

体はVisual Basicなのに、心はC#

VisaulBasic

Imports System
Imports Microsoft.CodeAnalysis.CSharp.Scripting

Module ModuleApp

    Sub Main()

        Dim script As String = <query><![CDATA[
        for (int i = 1; i <= 100; i++)
        {
             if (i % 15 == 0) System.Console.Write("私俺 ");
             else if (i % 5 == 0) System.Console.Write("俺 ");
             else if (i % 3 == 0) System.Console.Write("私 ");
             else System.Console.Write("{0} ", i);
        }
        System.Console.ReadLine();
        ]]></query>.Value

        CSharpScript.RunAsync(script).Wait()

    End Sub

End Module
結果
1 24 俺 私 7 8 私 俺 1113 14 私俺 16 1719 俺 私 22 23 私 俺 2628
 29 私俺 31 3234 俺 私 37 38 私 俺 4143 44 私俺 46 4749 俺 私 52 53 
私 俺 5658 59 私俺 61 6264 俺 私 67 68 私 俺 7173 74 私俺 76 7779 俺 私 82 83 私 俺 8688 89 私俺 91 9294 俺 私 97 98 私 俺

体はC#なのに、心はVisual Basic

cshap
using System;
using Microsoft.CodeAnalysis.VisualBasic.Scripting;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string script = @"
                For i As integer = 1 To 100
                    If i Mod 15 = 0 Then
                        System.Console.Write(""俺私 "")
                    ElseIf i Mod 5 = 0 Then
                        System.Console.Write(""私 "")
                    ElseIf i Mod 3 = 0 Then
                        System.Console.Write(""俺 "")
                    Else
                        System.Console.Write(i & "" "")
                    End If
                Next
                System.Console.ReadLine()
            ";

            VisualBasicScript.RunAsync(script).Wait();

        }
    }
}
結果
1 24 私 俺 7 8 俺 私 1113 14 俺私 16 1719 私 俺 22 23 俺 私 2628
 29 俺私 31 3234 私 俺 37 38 俺 私 4143 44 俺私 46 4749 私 俺 52 53 
俺 私 5658 59 俺私 61 6264 私 俺 67 68 俺 私 7173 74 俺私 76 7779 私 俺 82 83 俺 私 8688 89 俺私 91 9294 私 俺 97 98 俺 私

Microsoft.CodeAnalysis.VisualBasic.Scriptingについては、NuGetパッケージの管理の検索では見つからず、パッケージマネージャーコンソールからインストールしました。

PM>Install-Package Microsoft.CodeAnalysis.Scripting.Common -Version 1.2.0
PM>Install-Package Microsoft.CodeAnalysis.VisualBasic.Scripting -Version 1.2.0

タイムリープ

2011年に隕石("Roslyn"(ロズリン))が落下してきました。1

それから4年後のVisual Studio 2015に次世代コンパイラRoslyn改め.NETコンパイラープラットフォームとして搭載されました。
これにより前述の入れ替わり(.NET4.6以降)が出来るようになり、C#に置いていかれていた印象2があったVisual Basicも機能的にはほぼ追いつきました。3
Visual StudioのIDEにおいては、リファクタリング機能やインポートの整理と並び替えがC#同様に出来るようになりました。

やっと、C#に「君の名は」と尋ねることが出来るのです・・・

最後に

かなりかなり強引ではありますが、「君の名は。」を実現してみ・ま・し・た・・・。あーものを投げないで・・・!!

「君の名は。」については下記のネタでも使いました、良かったらご覧ください。
TensorFlowコトハジメ Word2Vecで「君の名は。」と戯れてみた

参照


  1. Roslynは2011年に初のCTP(コミュニティ技術プレビュー版)を発表 

  2. 大きな新機能(async, await, Task)はVS2010でC#同様に追加されたが、「yield」などはVS2012でやっと追加された。 

  3. ラムダ式の制限が多かったり、逐語的リテラル文字列、式の途中でコメント、メソッド内のリージョンなどが出来ないなど格差がありました。 

この投稿は Visual Basic Advent Calendar 201624日目の記事です。