Microsoft Q# Coding Contest warmupラウンドが終了して結果として私は107位でした。自分にとってはたぶんこれが初めてのオンラインプログラミングコンテスト参加だったと思います。
また問題も公開されているようです。
codeforces.com
というわけで自分が提出した回答をGitHubに公開してみました。
github.com
問題そのものの解説はすでにあるようなので、
smijake3.hatenablog.com
最初の問題を例にどうやって実行したかを説明してみます。問題としては、状態であるQubit
型の引数qと1か-1であるInt
型の引数signに与えられ、signが1であればqを、-1であればqをに変化させるoperationを記述するというものです。引数で渡された状態を変化させるため、このoperationは返り値を持ちません。
先日のエントリで書いた通り、QubitはC#のDriverクラスでは生成できないので、もうひとつQ#のoperationを作成し、その中でQubitを生成、operationを実行、実行した結果を確認、という手順を踏みます。というわけで、テスト用のQ#コードはこのようになります。
namespace Solution
{
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Extensions.Diagnostics;
operation Test() : ()
{
body
{
using (register = Qubit[1])
{
let q = register[0];
DumpMachine("dump-initial.txt");
Solve(q,-1);
DumpMachine("dump-0.txt");
Reset(q);
Solve(q,1);
DumpMachine("dump-1.txt");
Reset(q);
}
}
}
}
usingでQubitを初期化、(必要はないですが)配列のindex0のQubitを変数qとしています。DumpMachineは引数にファイルパスをとって、そのパスにQubitの状態を出力します。Solve operationを実行したあと、DumpMachineで状態を出力、Resetで再度初期化を行っています。DumpMachineの出力結果は次のようになって、期待通りのoperationを記述できたことがわかります。
dump-initial.txt
Ids: [0;]
Wavefunction:
0: 1 0
1: 0 0
dump-0.txt
Ids: [0;]
Wavefunction:
0: 0.707107 0
1: -0.707107 0
dump-1.txt
Ids: [0;]
Wavefunction:
0: 0.707107 0
1: 0.707107 0
まじめに測定するコードを書いてもいいと思うのですが、デバッグ目的ではDumpMachine
がかなり便利でした。
Microsoft Q# Coding Contestの本戦は土曜1時(金曜深夜25時)からなので、W-cup観戦の合間にいかがでしょうか。