https://codeforces.com/contest/1116/problem/C1
N桁の量子状態$\ket{x}$とqubit$\ket{y}$が与えられる。$\ket{y}$をオラクルqubitとして、$\ket{x}$が連続するqubit列$\ket{00}$もしくは$\ket{11}$をもたない場合に$f(x)=1$、そうでない場合に$f(x)=0$となるようなオラクルを作成せよ。
$\ket{x}$が連続するqubit列$\ket{00}$もしくは$\ket{11}$をもたない場合に$f(x)=1$となるということは、$\ket{x}=\ket{010101\dots}$もしくは$\ket{x}=\ket{101010\dots}$であるような場合のみ$\ket{y}$を反転させると言い換えることができます。
$\ket{x}$の奇数番目のqubitのみにXゲートを作用させると、$\ket{010101\dots}$は$\ket{111111\dots}$に、$\ket{101010\dots}$は$\ket{000000\dots}$にそれぞれ変化します。この2つの状態に対して$f(x)=1$となるオラクルを作成することは容易であって、Controlled Xゲートを使うことで実装できます。
最後に再び奇数番目のqubitにXゲートを作用させることで$\ket{x}$を元の状態に戻すことができます。
これで、この問題が解けました。
namespace Solution {
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;
operation Solve (x : Qubit[], y : Qubit) : Unit {
body (...) {
for(i in 0..2..Length(x)-1){
X(x[i]);
}
Controlled X(x,y);
(ControlledOnInt(0,X))(x,y);
for(i in 0..2..Length(x)-1){
X(x[i]);
}
}
adjoint auto;
}
}