徒書

徒に何か書いています。


4BLDのU2法をもっと楽に回したい!

この記事はSpeedcubing Advent Calendar 2019 4日目の記事です。3日の記事はキラっちさんの 「スピード」キューバー人口を増やしたい でした。5日の記事は全てをホメてくれるSpeedCuberの妹botさんの 妹botの、 botに這いよる、 botまとめのヒーロー垢デミア (タイトルわかりにくい) です。

この記事は(自分を含む)4BLD初級者向けに、センターを揃える際の追加手順を提案するものです。前提知識として以下の記事を読むことをお勧めします。

目次

動機

4BLDの初級者向けセンター解法であるU2法は、とても分かりやすくお得な解法だと思います。パーツの2点交換が セットアップ + U2 だけでできて、パリティ処理も追加で U2 を回すだけでよいというのは、3BLDのM2法・Old pochmann法と比べてなんと簡単なことでしょうか。

しかしそんな便利なU2法にも、例外的に難解で長い手順が存在します。

Urbl u' l' U' l u l' U' l u' l' U2 l u l' U2 = (a)
Ulfl u' l' U l u l' U l u' l' U2 l u l' U2 = (b)

16手! 他のセンターパーツ(側面)の手順が7手または9手なのに比べるとかなりの長さです。しかも上記は奇数回目の交換の場合であり、偶数回目ではそれぞれ逆にしなければなりません(偶数回目では Urb は (b)、Ulf は (a) の手順を使います)。それぞれバッファ(Ubl)のすぐ隣のパーツであるのに、交換には他より多くの手数がかかってしまうというのはキューブパズルの不思議なところ。

これらの手順を実際に回すのはとてもとても面倒ではありますが、しかしセンター3-cycleに移行するのはハードルが高く、U2法の手軽さは捨てがたいです。そこで、「通常はU2法を使い、U面のUbr, Uflを含む2点についてはコミュテータで3点交換すればいいのでは」という考えが浮かびました。

Ubl→Urb→R面

そんなわけで、以下に自分が採用している3-cycle(3点交換)手順について説明していきたいと思います。まずは Ubl→Urb→* という交換について。

例として Ubl→Urb→Ruf のコミュテータを考えてみます。
[Ubl→Urb→Rfu]

この場合、インターチェンジ面はU面となります。インサートについては、バッファ(Ubl)を1番目として3番目のパーツ(Rfu)を、バッファの位置にインサートすることを考えます。つまり手順としては

まとめて l u l' U' l u' l' U となります。(リンク先の alg.cubing.net で動きを確認できます)

これで8手。U2法で Urb と Ruf をそれぞれ交換すると 16 + 7 = 23 手かかるのと比べると、かなり楽になったのではないでしょうか。

以下、この手順について [l u l', U'] というコミュテータの表記を使います。([A, B] = A B A' B')

さて、バッファにインサートしやすい位置にあった Ruf についてはこれでよいとして、R面の他のパーツについて考えてみます。実はセンターの場合は面を回すことで簡単に位置関係を変えられるので、R面の他のパーツについては、Rを回して Rfu の位置にセットアップすればよいわけです。

そんなわけで Ubl→Urb→R面 の手順をまとめると以下の通りとなります。

Ubl→Urb→Rbu [R': [l u l', U']] R' l u l' U' l u' l' U R
Ubl→Urb→Rdb [R2: [l u l', U']] R2 l u l' U' l u' l' U R2
Ubl→Urb→Rfd [R: [l u l', U']] R l u l' U' l u' l' U R'
Ubl→Urb→Ruf [l u l', U'] l u l' U' l u' l' U

2つ目のカラムがコミュテータの表記、3つ目が実際の手順です。また、セットアップを表す記法 [A: B] を追加で導入します。([A: B] = A B A')

なお、Ruf 以外の3点についても、セットアップを使わないピュアコミュテータの手順は存在します。

Ubl→Urb→Rbu [U, r' u r] U r' u r U' r' u' r
Ubl→Urb→Rdb [l' d l, U'] l' d l U' l' d' l U
Ubl→Urb→Rfd [U, r d r'] U r d r' U' r d' r'

しかしながら、以下の点を考慮して、この記事では面ごとに基準の1パーツを考え、他のパーツについてはセットアップを用いた手順を採用としたいと思います。

また、Ublバッファへのインサートは上記の Rdb 手順のようにB面側からインサートする手順もありますが、(手順を練習する際の)見やすさのため、この記事ではF面側からインサートする手順を使っていきたいと思います。

Ubl→Urb→L面

同様にL面パーツについても考えてみましょう。基準のパーツは Lub となります。
[Ubl→Urb→Lub]

インサートは l u' l'、インターチェンジは先と同じく U' であるため、手順としては [l u' l', U'] = l u' l' U' l u l' U となります。他パーツの手順もまとめると以下の通り。

Ubl→Urb→Lfu [L': [l u' l', U']] L' l u' l' U' l u l' U L
Ubl→Urb→Ldf [L2: [l u' l', U']] L2 l u' l' U' l u l' U L2
Ubl→Urb→Lbd [L: [l u' l', U']] L l u' l' U' l u l' U L'
Ubl→Urb→Lub [l u' l', U'] l u' l' U' l u l' U

Ubl→Urb→F面、B面

[Ubl→Urb→Lub] [Ubl→Urb→Lub]

F面、B面に関しては、例えば持ち替えをせずに Bur をバッファにインサートするような手順(l u2 l')もありますが、内層の u2, d2 回しは指の力を使うので、できれば避けたいところ。

なのでF面、B面は最初に y 持ち替えを行い、L面・R面と似た形で考えたいと思います。持ち替えをすることでセットアップも L または R 回しになり、やり易くなるかと思います。

まずはF面から。基準のパーツは Fru です。インサート手順は y 持ち替え後の r' u' r、インターチェンジは変わらず U'。手順は [y: [r' u' r, U']] = y r' u' r U' r' u r U y' となります。

B面の基準パーツは Blu です。手順は内層 u の向きが変わって [y: [r' u r, U']] = y r' u r U' r' u' r U y' となります。

他パーツ手順も含め、まとめると以下の通り。

Ubl→Urb→Fru [y: [r' u' r, U']] y r' u' r U' r' u r U y'
Ubl→Urb→Fdr [y L': [r' u' r, U']] y L' r' u' r U' r' u r U L y'
Ubl→Urb→Fld [y L2: [r' u' r, U']] y L2 r' u' r U' r' u r U L2 y'
Ubl→Urb→Ful [y L: [r' u' r, U']] y L r' u' r U' r' u r U L' y'
Ubl→Urb→Blu [y : [r' u r, U']] y r' u r U' r' u' r U y'
Ubl→Urb→Bdl [y R': [r' u r, U']] y R' r' u r U' r' u' r U R y'
Ubl→Urb→Brd [y R2: [r' u r, U']] y R2 r' u r U' r' u' r U R2 y'
Ubl→Urb→Bur [y R: [r' u r, U']] y R r' u r U' r' u' r U R' y'

Ubl→Urb→D面

D面パーツとの交換は少々考えどころです。例えば l2 D' l2 D l2 で Dlb をバッファに直接インサートすることもできるのですが、ここではU2法で既に手に馴染んでいる r2 D' r2 D r2 のインサートをそのまま流用することにしてみます。そのためには最初に U2 のセットアップを行います。

[Ubl→Urb→Drf]

基準のパーツはU2法の時と同じく Drf。セットアップ U2、インサートは r2 D' r2 D r2、インターチェンジはこれまで同様 U' なので、手順は [U2: [r2 D' r2 D r2, U']] = U2 r2 D' r2 D r2 U' r2 D' r2 D r2 U' となります。

一見長くて分かりにくいですが、5手インサートを X に置き換えると、U2 X U' X U' という仕組みになります。最初に U2 を回し、あとは U' で1つずつ戻る、と考えましょう。

D面の場合では5手インサートを使うので手順が長くなってしまいますが、それでも Urb と Drb をU2法で回すのと比べると、16 + 11 = 27 手から 13手と 1/2 以下に減らせることになり、かなりお得に感じられるのではないでしょうか。

D面手順のまとめは以下の通りです。

Ubl→Urb→Drf [U2: [r2 D' r2 D r2, U']] U2 r2 D' r2 D r2 U' r2 D' r2 D r2 U'
Ubl→Urb→Dbr [D' U2: [r2 D' r2 D r2, U']] D' U2 r2 D' r2 D r2 U' r2 D' r2 D r2 U' D
Ubl→Urb→Dlb [D2 U2: [r2 D' r2 D r2, U']] D2 U2 r2 D' r2 D r2 U' r2 D' r2 D r2 U' D2
Ubl→Urb→Dfl [D U2: [r2 D' r2 D r2, U']] D U2 r2 D' r2 D r2 U' r2 D' r2 D r2 U' D'

Ubl→Ulf→*

さて Ubl→Urb→* という交換手順の説明は以上ですが、習得を要する手順としてはまだ 1/4 の量です。別のU面パーツである Ubl→Ulf→* という交換についてはどうなのか。

実は先にも述べていた通り、これまで説明した手順は全てバッファ Ubl にインサートする手順なので、Ubl→Ulf→* の交換にも応用することができます。必要なのはこれまでのインターチェンジ U'U に置き換えるだけです!

念のため実例を見てみましょう。最初のように Ubl→Ulf→Ruf のコミュテータを考えます。
[Ubl→Ulf→Rfu]

バッファ Ulb へのインサートは l u l'、インターチェンジは Ufl パーツをバッファ Ubl の位置に移動させるため U となります。つまり手順ととしては [l u l', U] = l u l' U l u' l' U' となります。

Ulb→Urb→Ruf [l u l', U'] l u l' U' l u' l' U
Ulb→Ulf→Ruf [l u l', U] l u l' U l u' l' U'

比べてみると、インターチェンジが替わるだけというのが分かるのではないでしょうか。

そんなわけで、Ubl→Urb→* の手順が分かっていれば、Ubl→Ulf→* の手順もほぼ分かったも同然ということになります。いちおう手順をまとめると以下の通りとなります。

Ubl→Ulf→Rbu [R': [l u l', U]] R' l u l' U l u' l' U' R
Ubl→Ulf→Rdb [R2: [l u l', U]] R2 l u l' U l u' l' U' R2
Ubl→Ulf→Rfd [R: [l u l', U]] R l u l' U l u' l' U' R'
Ubl→Ulf→Ruf [l u l', U] l u l' U l u' l' U'
Ubl→Ulf→Lfu [L': [l u' l', U]] L' l u' l' U l u l' U' L
Ubl→Ulf→Ldf [L2: [l u' l', U]] L2 l u' l' U l u l' U' L2
Ubl→Ulf→Lbd [L: [l u' l', U]] L l u' l' U l u l' U' L'
Ubl→Ulf→Lub [l u' l', U] l u' l' U l u l' U'
Ubl→Ulf→Fru [y: [r' u' r, U]] y r' u' r U r' u r U' y'
Ubl→Ulf→Fdr [y L': [r' u' r, U]] y L' r' u' r U r' u r U' L y'
Ubl→Ulf→Fld [y L2: [r' u' r, U]] y L2 r' u' r U r' u r U' L2 y'
Ubl→Ulf→Ful [y L: [r' u' r, U]] y L r' u' r U r' u r U' L' y'
Ubl→Ulf→Blu [y : [r' u r, U]] y r' u r U r' u' r U' y'
Ubl→Ulf→Bdl [y R': [r' u r, U]] y R' r' u r U r' u' r U' R y'
Ubl→Ulf→Brd [y R2: [r' u r, U]] y R2 r' u r U r' u' r U' R2 y'
Ubl→Ulf→Bur [y R: [r' u r, U]] y R r' u r U r' u' r U' R' y'
Ubl→Ulf→Drf [U2: [r2 D' r2 D r2, U]] U2 r2 D' r2 D r2 U r2 D' r2 D r2 U
Ubl→Ulf→Dbr [D' U2: [r2 D' r2 D r2, U]] D' U2 r2 D' r2 D r2 U r2 D' r2 D r2 U D
Ubl→Ulf→Dlb [D2 U2: [r2 D' r2 D r2, U]] D2 U2 r2 D' r2 D r2 U r2 D' r2 D r2 U D2
Ubl→Ulf→Dfl [D U2: [r2 D' r2 D r2, U]] D U2 r2 D' r2 D r2 U r2 D' r2 D r2 U D'

D面パーツの手順の仕組みは U2 X U X U となります。今度は最初に U2 して、U で1つずつ戻る、と覚えましょう。

Ubl→*→Urb および Ubl→*→Ulf

さて習得すべき手順の 1/2 が終わったわけですが、これまでとは逆向きの 3-cycle、Ubl→*→Urb および Ubl→*→Ulf がまだ残っています。

しかし、これは単にインサートとインターチェンジの順序を入れ替えるだけで済みます。つまりこれまでの「インサート→インターチェンジ」で始まる手順を、「インターチェンジ→インサート」という順序にすることで、逆向きの3点交換となります。

[Ubl→Ulf→Rfu]
例として、Ubl→Urb→Ruf およびその逆向きの Ubl→Ruf→Urb の手順は以下のようになります。

Ubl→Urb→Ruf [l u l', U'] l u l' U' l u' l' U
Ubl→Ruf→Urb [U', l u l'] U' l u l' U l u' l'

実際にキューブを使って練習する場合、この逆向きの交換はU面パーツの区別がつきにくいので、最初のうちはステッカーを貼って見分けがつくようにしてみるとよいかと思います。

また、D面手順については U2 のセットアップがあるため、少々注意が必要です。

Ubl→Urb→Drf [U2: [r2 D' r2 D r2, U']] U2 r2 D' r2 D r2 U' r2 D' r2 D r2 U'
Ubl→Drf→Urb [U2: [U', r2 D' r2 D r2]] U r2 D' r2 D r2 U r2 D' r2 D r2 U2

Ubl→Drf→Urb の手順の仕組みは U X U X U2 となります。最初は Urb を Ufr(インサート位置) に持ってくる U、もう一度 U をして、最後に U2 で戻す、と覚えましょう。

Ubl→Ulf→Drf [U2: [r2 D' r2 D r2, U]] U2 r2 D' r2 D r2 U r2 D' r2 D r2 U
Ubl→Drf→Ulf [U2: [U, r2 D' r2 D r2]] U' r2 D' r2 D r2 U' r2 D' r2 D r2 U2

Ubl→Drf→Ulf 手順の仕組みは、最初が U'U' X U' X U2 となります。

というわけで逆向き 3-cycle については全手順の記載は省略し、説明を終えたいと思います。

結び

これらの3-cycle手順が習得できれば、これまで面倒だった Urb および Ufl パーツに対する抵抗感はかなり減るかと思います。逆に手順としてはかなり減るため、U2法がより楽しくなってくるのではないでしょうか。

自分としてはこれらの手順を足掛かりとして、他のセンター3-cycleについても少しずつ習得できるとよいなと考えていますが、他の4BLD初級者の方にも、本記事がそのようなきっかけとなれば幸いです。

また、5BLDの+センターについても同じように Ur, Ul パーツを含む 3-cycle を習得し、いつかまとめ記事を書いてみたいと思います。(他の方に書いて頂いても全然OKです!)

最後に、4BLD入門 の著者であるふわさん、Y.Y さんに感謝を述べたいと思います。この入門記事のおかげで自分も 4BLD ができるようになりました。有難うございます。また、Y.Y さんには YRCC にて多分割BLDについてお話を伺い、そのことがこの記事に述べた 3-cycle 手順を考えるきっかけとなりました。


FMC Advent Calendar 2019 (1) 思考過程

この記事はFMC Advent Calendar 2019 1日目の記事です。2日目の記事は佐村健人さんの CFOPで解く人生二度目のFMC : さむぶろぐ です。

FMCは好きなので、この Advent Calender には意気揚々と初日に参加登録してみたものの、実際にお題(1)を解いてみたところ自分としては不本意な結果となってしまいました。とはいえこの思考過程がどなたかの何かの参考になれば幸いです。

注意として、以下に記載する回転記号は基本的に色固定となります。つまり U=白、D=黄、F=緑、B=青、L=橙、R=赤 の(センターパーツがある)面を示しています。

手順についてはなるべく alg.cubing.net へのリンクを張っています。キューブが手元になくても状態や動きを確認できるかと思います。

また、FMC特有の技術に関しては文中内で WRCCさんのサイト 等へのリンクを設けていますので、併せてご参照頂ければと思います。

scramble:
(1) R' U' F L D B' R2 D2 U2 R2 F L2 F' D2 F' L' R' U B' L2 B L D2 R' U' F

[scramble]

2x2x2 ブロック

自分はまだ EO から解くようなことはできないので、ブロックビルディングで 2x2x2 ブロック作りを目指します。このスクランブルだとBR側に白赤緑の c/e ペア(1x1x2ブロック)があり、F側に緑センターとくっついた白緑エッジがあるので、これを生かして 1x2x2 ブロックができそうだなと考えました。

最初の一手を B' とすると、赤白のエッジも赤センターとくっついていい感じになりそうに見えたので、そこから以下のように 1x1x2 ブロックを作る手を見つけました。

B' D F L' //1x1x2

そこからさらに赤白エッジを白センターにもくっつけて、計6手で白緑赤の 2x2x2 ブロックを作ることができました。

B' D F L' //1x2x2
R' F2 //2x2x2

ブロックビルディングをする上では 2x2x2, 2x2x3, F2L-1 の各ステップで5手以内を目指したいので6手はやや不満ではあります。しかし inverse scramble も含めて検討したものの、この時(制限時間60分内での思考)では他の 2x2x2 ブロックを作る手が見つからなかったので、ひとまずこの手を採用としました。

B' D F L' R' F2 //2x2x2 (6)

2x2x3 ブロック

さて 2x2x2 まではできたものの、ここから 2x2x3 ブロックに拡張するのは少々難しいと感じました。

できれば 2x2x2 ができたところで、他に 1x1x2 ブロックができていると有難いのですがそれも無し。こういう場合はまず 2x2x2 ブロックを崩さない面(今回だと L, D, B)を1手ずつ総当たりで探してみるのですが、コーナーとエッジが繋がる手はありませんでした。

[2x2x2 まで。D面側からの図] 一見惜しいのが、D面側に赤黄エッジ・青黄エッジが黄センターとL字型に繋がっているところ。あとはここに赤青黄コーナー(図では右上にあります)を入れて 1x2x2 ブロックにすれば、疑似 2x2x3 ブロックに持ち込めそうです。

ただしこれを利用して疑似 2x2x3 ブロックを作ろうとすると、

U B' R B R' U' //another 1x2x2
D' //pseudo 2x2x3, premove D

と7手、premove を含めると8手かかる手順しか見つけられず、これは手数がかかり過ぎると感じました。

他にいい手も見つからなかったので、NISS を使って inverse 方向から探索してみることにします。

//switch to inverse
F2 R L F' D' B //(2x2x2)'
F' U R D2 L' B' L2 B U' R L F D2 F L2 F' R2 U2 D2 R2 B D' L' F' U R //inverse scramble

ちなみに、inverse scramble をあらかじめメモ書きする方もいるかとは思いますが、自分は noramal scramble を見て脳内変換して inverse scramble を回すようにしています。NISS を使う場合はそれまでに解いた手順もその場で逆変換する必要があるので。

[2x2x2 からNISS。D面側からの図] さて inverse 方向を見てみると、先ほど検討したL字のブロックとコーナーの位置関係が少々変化していました。ここからであれば inverse sexy move で

U B U' B' //another 1x2x2

と、2x2x2 を崩さずに 1x2x2 ブロックを作り、

D' //pseudo 1x2x2, premove D

で、疑似 2x2x3 ブロックができました。これでも premove を含めると6手となってしまいますが、他にいい手も見つけられず、この手を採用としました。

ここまでの手順を FMC におけるコメント書きにすると以下のようになります。()内は inverse 方向の手順であることを示します。

B' D F L' R' F2 //2x2x2 (6)
(U B U' B' D') D' //2x2x3 (6/12)

premove は1手のNISSとみなせるので、inverse 方向で premove を使う場合は normal 方向に1手追加することになります。

F2L-1

次は F2L-1 の形を目指します。まずはこれまでの流れから inverse 方向で

//to 2x2x3 (inverse)
D //(premove)'
F2 R L F' D' B //(2x2x2)'
F' U R D2 L' B' L2 B U' R L F D2 F L2 F' R2 U2 D2 R2 B D' L' F' U R //inverse scramble
U B U' B' D' //2x2x3

という形から F2L-1 への手順を検討しますが、いまいち短手数で辿りつける手が見えなかったので、さらに normal 方向へ NISS してみます。


//to 2x2x3 (normal)
D B U B' U' //(2x2x3)'
R' U' F L D B' R2 D2 U2 R2 F L2 F' D2 F' L' R' U B' L2 B L D2 R' U' F //normal scramble
B' D F L' R' F2 D' //2x2x2 + premove

ここで B とすると、赤クロスの F2L-2 の形になります。さらに青白エッジと赤青白コーナーが目に留まったので、一旦 B する前に L2 しておくと、いわゆるT型のF2Lの位置関係にすることができます。

L2 B //F2L-2
L2 U' L' U //F2L-1

ということで、ここでも6手かかってしまいましたが、F2L-1 の形に持ち込めました。

B' D F L' R' F2 //2x2x2 (6)
(U B U' B' D') D' //2x2x3 (6/12)
L2 B L2 U' L' U //F2L-1 (6/18)

なかなかいい手が見つからない中、ここまでで30分くらい経過しているため、インサート探索に必要な時間を考えると焦りがでてきています。

エッジ合わせ

ここからエッジを揃えてコーナーを数個残した状態を目指します。理想的には、

という手法で行きたいところなのですが、焦りもありそこまでの手が見えなかったので、

という手法を取ることにしました。(このあたりの詳しい説明はWRCCの解説をご参照下さい)

//to F2L-1 (normal)
D B U B' U' //(2x2x3)'
R' U' F L D B' R2 D2 U2 R2 F L2 F' D2 F' L' R' U B' L2 B L D2 R' U' F //normal scramble
B' D F L' R' F2 D' //2x2x2 + premove
L2 B L2 U' L' U //F2L-1

という状態から検討するわけですが、L面を見るとエッジが反転しているものが多く、あまりいい状態ではありません。なので

D' B D B' //F2L#4 edge

と、sledgehammer のようにして、青黄エッジを入れつつL面のエッジを2つ反転させました。

L面(のエッジ)を見るとLの形になっているので、ここは最も短い OLL 44 (F U R U' R' F')、またはその鏡手順を使いたいのですが、エッジの位置関係からこれは使えませんでした。ここでは OLL 6 (Rw U2 R' U' R U' Rw') か OLL 7 (Rw U R' U R U2 Rw')、またはそれらの鏡手順が必要になります。

ちなみにOLL手順でエッジの位置がどのように変わるかについては、以前自分がまとめたものがありますので、よろしければご参照ください。

ここではまずL面を上、U面を正面として OLL 6 の手順を適用してみました。(2層回しは1層回しの手順に置き換えています)

F U2 B' U' B U' F' L' //OLL 6 + adjust L face

5コーナーが残った形にはなったのですが、2つのコーナーが正しい位置で捻った状態(2CO+3CP)になっており、これを解決するとなるとインサートが3回必要になってきます。

なので別手段として、同じ向きから OLL 7 の鏡手順(Lw' U' L U' L' U2 Lw)を適用してみます。

B' U' F U' F' U2 B L' //OLL 7(mirror) + adjust L face

この場合では 1CO+3CP のラスト4コーナーが残った形(L4C)となりました。実のところL4Cを解決するのはL5C(5CP)の場合より難しいと思っているのですが、たまたま F2L#4 edge の最後の B' と1手キャンセル(B' B' = B2)できることもあり、この手を採用することにしました。

B' D F L' R' F2 //2x2x2 (6)
(U B U' B' D') D' //2x2x3 (6/12)
L2 B L2 U' L' U //F2L-1 (6/18)
D' B D B' //F2L#4 edge (4/22)
B' U' F U' F' U2 B L' //1CO+3CP (8-1/29)

ここまでで29手。2回インサートをしてキャンセルがないとなると+16手になるので、これを sub40 (40手未満) の解にするのはかなり厳しそうです。

実際に解いていた時は正確な手数まではカウントしていないのですが、ぱっと見であまりいい結果にはならなそうだと悲観的な感情に支配されておりました。しかしなんとか解を出すところまでは辿りつきたいところ。

skeleton

L4Cの形まで辿り着きましたが、上記の解の手順では normal 方向、inverse 方向の手順が混ざった状態ですので、これを一旦 normal scramble からの解の形に書き直します。書き直す際の手順としては、

ということになります。今回の場合だと以下のようになりました。

//skeleton:
B' D F L' R' F2
D'
L2 B L2 U' L' U
D' B D B2
U' F U' F' U2 B L' //normal
D B U B' U' //(inverse)'

実際に回してみると確かに4つのコーナーを残して揃った状態になっていることが分かるかと思います。

これまでの過程でメモ書きのミスなどをしていると、この skeleton への変換でミスが表面化するので、このステップは割と重要だと考えています。実際に解いていた時にも1箇所 ' の抜けがあり、訂正するのに少々時間がかかりました…。

これでようやく、残ったコーナーを解決するインサート手順を加えれば解を出せるところまで辿り着いたことになります。

インサート探索

ここからは残ったコーナーにステッカーを貼って、解の中でコーナーを解決する手順を探っていくわけですが、今回のような 1CO+3CP の場合、自分は以下のようにステッカーを貼っています。

実際に貼ったところはこのような感じです。
[ステッカー1, 4を貼ったのコーナーの写真] [ステッカー2を貼ったのコーナーの写真] [ステッカー3を貼ったのコーナーの写真] [ステッカー6を貼ったのコーナーの写真]

まず出発点として1つのコーナーに1を貼り、そのコーナーが本来入る場所に2のステッカーを貼り…、という風にしていきます。1CO+3CP の場合、3CP はねじれたループになるため、3が入るところは1のステッカーとは別の面になり、そこに4を貼ります。ステッカーを貼る面・向きも重要です。

捻って入っている1COのパーツについては、とりあえずCOであることが分かればよいです。

そしてインサートの探し方としては以下のようになります。

時間もなくなってきているので、まずはステッカーを貼ったところから逆に手順を回して1つ目のインサートを探します。2回インサートが必要な場合は少なくとも2手のキャンセルがほしいので、2手ごとに確認していきます。(cf. WRCC解説)

ただこの時はなかなか2手以上キャンセルする手順を見つけられず、以下の * まで辿ったところでようやく1つ見つかりました。

//skeleton
B' D F L' R' F2 D'
L2 B L2 U' * L' U
D' B D B2 U' F U' F' U2 B L'
D B U B' U'

* = B L' F' L B' L' F L

実際にステッカーを貼っている場合の位置関係は以下のようになってます。
[1つめのインサート]

ここで B L' F' L B' L' F L とすると 3→4→6 という3点交換が行われるのですが、この末尾の L が skeleton での次の手順 L' と相殺され、2手キャンセルとなります。

これで残りの手順を回すと、3(白青橙)のコーナーが解決され、3点が残る状態となりました。

この残った3点に改めて1~3のステッカーを貼り直し、またインサートを探索していきます。ただこの時は2手以上のキャンセルを見つけられず、以下の ** の場所での1手キャンセルで妥協する結果となりました。

//skeleton
B' D F L' R' F2 D'
L2 B L2 U'  * L' U
D' B D B2 U' F U' F' U2 B ** L'
D B U B' U'

* = B L' F' L B' L' F L 
** = U R' U' L U R U' L'

これでインサート手順を加えてキャンセルを解決し、以下の42手の解を出すことができました。

scramble:
R' U' F L D B' R2 D2 U2 R2 F L2 F' D2 F' L' R' U B' L2 B L D2 R' U' F

B' D F L' R' F2 //2x2x2 (6)
(U B U' B' D') D' //2x2x3 (6/12)
L2 B L2 U' L' U //F2L-1 (6/18)
D' B D B' //F2L#4 edge (4/22)
B' U' F U' F' U2 B L' //1CO+3CP (8-1/29)

skeleton:
B' D F L' R' F2 D'
L2 B L2 U'  * L' U
D' B D B2 U' F U' F' U2 B ** L'
D B U B' U'

* = B L' F' L B' L' F L  //(8-2/35)
** = U R' U' L U R U' L'  //(8-1/42)

solution:
B' D F L' R' F2 D'
L2 B L2 U'  B L' F' L B' L' F  U
D' B D B2 U' F U' F' U2 B  U R' U' L U R U' L2
D B U B' U'
(42 moves)

反省

以上のように自分では合計3手キャンセルのインサートしか見つけられなかったのですが、後に Insertion Finder で確認してみると、実は計9手のキャンセルがあったようです。1つめのインサートで6手のキャンセルがあり、ここは探索で通り過ぎていたところなので、ぜひとも見つけておくべきでした。

なお6キャンセルがある箇所のステッカーの位置関係は、以下の通りでした。
[optimalなインサートのある箇所]
1→2→6 : U B D B' U' B D' B'

ここでは U で 2 と 6 がインターチェンジとなっています。おそらく解いていた時の探索では 1と2、2と3、3と4 がインターチェンジとなるコミュテータのみを注目しており、このように 6 と他のパーツがインターチェンジとなるものを見ていなかったのが見落としの原因だったと思います。

6 のステッカーはそれまでの探索で貼る向きを変えていた可能性もあり、そこも見落としの要因の一つであったでしょう。このように CO があるインサートは自由度が高いのですが、その分探索が難しくなってきます。とはいえこの見落としは今後注意すべき点であることを認識できました。

あと、2x2x2 ブロックの作成についてですが、今回のように白赤緑の 1x1x2 と白緑エッジを利用する場合でも、他に以下の手順があるなあと後日気付きました。

B F U' L U2 F2 //2x2x2
F2 R' B' U R' F //2x2x2

後者の場合では BD 側に橙青黄の 1x1x2 のブロックができており、かなり有利そうです。自分では skeleton までの手順で以下のものを見つけました。

F2 R' B' U R' F //2x2x2 (6)
(D B L B2) B //2x2x3 (5/11)
D B D B' //F2L-1 (4/15)
L F L F'
F' D F D' L2 
D F' D' F L //L3C (13/28)

skeleton:
F2 R' B' U R' F
B
D B D B'
L F L F'
F' D F D' L2 
D F' D' F L
B2 L' B' D'

本番でもこのくらいの手順を見つけたいところであります。

実際解いている時、いかに自分がうっかりしていたかということを再認識させられました。FMC は頭がすっきりした状態で臨みたいものです。

結び

記事は以上となります。長々となってしまい申し訳ありません。自分としては不本意な結果でしたが、例えば FMC の手法を学び始めた方に、解を出すまでの流れについて参考になればと思い、なるべく詳しく書いてみました。Advent Calender の後日の方々の思考過程もぜひご参照下さい。

明日は佐村健人さんの記事です。(誕生日おめでとうございます!)


自己流パイプフラッグ制作

※この記事は 川崎フロンターレ Advent Calendar 2016 の12月20日分として寄稿するものです(遅れてすみません)。12月19日の記事は 【蹴/川崎】フロンターレ女子は経済効果をうみだす力を持っている?|ほぼ日発、はれときどきフロンターレ、12月21日の記事は 〈フロンターレアドベントカレンダー 寄稿〉ぼくがMind-1ユニを脱げない訳|mimozo_kf|note です。合わせてご参照下さい。

北村曉と申します。この blog の更新もかなり久しぶりとなりましたが、その間に紆余曲折を経て今ではすっかり川崎フロンターレを応援する人となっています。ふだんは等々力競技場のゴール裏(バックスタンド寄り)で旗を振って応援していたり、Twitter にてフロンターレに関することやそれ以外のことを呟いております。

本記事では自分が応援に使用している旗、いわゆるパイプフラッグ(パイフラ)を作る上で、今までの経験から得たこつのようなものを紹介させて頂ければと思います。

そもそもパイプフラッグとは

パイプフラッグは旗竿に塩ビパイプを使った旗のことです。パイプのしなりを利用して、観客席(自由席や立見席)のような比較的狭いスペースでも、頭上で旗が振れることが利点だと思います。ゴール裏席の最前列で振られるような大旗は、主に金属ポールの旗竿が使われていますが、パイプフラッグは客席の中ほどで振られることが多いです(この辺りは個々人の応援スタイルによっても変わりますが)。

想定する旗のサイズ

自分が作っている旗の布の大きさはだいたい 120cm x 160cm くらいの大きさです。市販のLフラッグ よりやや大きい程度ですが、自分にはこのくらいが扱いやすくてよい感じです。振り旗の最も重要な役割は動きで選手・味方を鼓舞することであり、大きさにはさほどこだわることはないと考えています。

国旗などだと縦横の比率が 2:3 のものが多いですが、振るための旗としてはやや横長なようで、かなり勢いをつけて振っても上端が垂れてしまいます。なので自分は今のところ 3:4 の比率としています。(最近のGゾーンで振られている旗は正方形に近い形が多いですね)

旗竿の長さは 280cm くらいです。この長さは 公式のフラッグケース に入る長さ x 2 という理由により決めたものです。旗竿については、旗が周囲の(特に後ろの)人の視線を遮らないよう、ある程度の長さを確保しておく方がよいと思います。

旗布と旗竿の接合について

手っ取り早い旗作りでよく用いられる手法として、旗の片側を袋状に縫い、その中に旗竿を差し込む、というのがあります。前述のLフラッグや、時々観客席に配られるフロンターレ後援会の小旗もこの仕組みですね。旗作りの取っ掛かりとしては分かりやすいですが、長く常用する旗にはあまり向いていないのではないかと思っています。

振り旗のための布には、少しの風でも効果的にはためくよう、なるべく軽い布を使うことが望ましいです。そうすると必然的に布の強度としては弱いものとなってしまうため、それを旗竿との接合にも使うとなると、旗竿との摩擦による消耗がかなり激しいことになります。

また、旗の組み立てが案外面倒、ということもあります。旗布が 1m 以上の大きさともなると、狭い袋状の布に旗竿を入れるのは結構手間がかかるものです。

そんな訳で、自分は旗布の3点を紐で竿に接合する、という方法を取っています。そうすることで旗布と旗竿との接点は限りなく小さいものとなり、また仮に紐が摩耗しても紐だけを交換すればよいことになります。実際にどのように加工しているかは以下の制作例にて述べたいと思います。

実際の制作例

旗布の加工

先に述べた通り、旗布にはポリエステルなどのなるべく軽い布を使うのがよいと思います。自分で布を買って縫い合わせるもよし、業者さんにデザインしてもらうのもよし。

自分で青と黒の布を買って縫い合わせるのであれば、昔の 川崎華族さんのページ に色分割のサンプルが掲載されているので、参考になるかと思います。

布(化学繊維)の切断には、ほつれ防止のため、ヒートカッターと呼ばれる熱で切断する工具があると便利です。自分は以下の工具を秋葉原で購入して使っております。ほつれた箇所の修復にも役立ちます。

いま自分が主に使っているカワサキまるこの旗は、フロンターレのビッグフラッグでもお馴染み 染太郎 さんに作成を依頼しました。デザインデータは自分で用意し、依頼したのは布の染色の部分(周囲はヒートカット)のみなので、そこそこの値段で作って頂いています。

MARUKO attr-acive!

旗布の旗竿側には、6cm ほどの幅を木綿の布(ブロード、シーチング等)にて補強しています。ちなみに以下の写真では旗のデザインに合わせて補強布の色も変えたりしていますが、今になってみるとそこまでこだわることもなかったかなとも思ったり。補強布を手縫いで縫い付けるのは直線とはいえ大変なので、ミシンがあると便利です。

補強布(上)

補強布をつけた後は上・中央・下にハトメ(10mm)をつけます。布にハサミなどで切れ目をつけて 10mm の穴をあけ、両側からハトメで止めます。この穴はほつれたままでもハトメで覆われるので問題ないです。

中央のハトメは、旗布を二つに折り畳むことを考慮し、真ん中からすこしずらした位置につけるといいかもしれません。

補強布(中央)

旗竿の加工

旗竿の塩ビパイプには、自分は VP13 という型のものをつかっています。全長 280cm ということで 140cm のパイプが2本必要になるわけですが、売っている長さは 1m や 2m なので、2m のものを切って使います。麻生区なら ビーバートザン 五月台店 にて入手できます。麻生グラウンドへの練習見学ついでに寄ってみたりしてはいかがでしょう。

その他の材料としては VP13 にあうキャップ、接手となるソケット、あとT字型の接手などを使います。

キャップ、ソケット、T字接手(チーズ)

接手の部分に関しては、強度を重視するならネジ式のバルブソケットを使うのも一つの選択です。自分はどちらかというと組み立て・取り外しの容易さ、それによる旗の持ち運びの便利さを重視して、単にはめるだけのソケットを使用しています。等々力でのバス待ちで旗を持って場外に出る時などには便利です。

旗竿の上半分の加工は以下の写真のようになります。

旗竿上半分・上部

旗竿上半分・下部

キャップは接着剤でつけます。灰色の一段大きい輪のようなものは、T字接手から 1cm ほどで切断したものです(3つ必要になるためT字接手を使っているわけです)。この輪を養生テープ(白い部分)で止めています。養生テープは縦にも避けやすいので、1/4 くらいの幅に切ったものを何枚か重ねて止めています。このキャップと輪の間・輪と輪の間が、紐で結ぶための箇所となります。

なお旗布の中央部分には、旗竿には特に何も加工していません。中央は紐で旗竿に結ぶだけの状態となります。

旗竿の下半分には、上部に接手となるソケットをつけます。こちらも養生テープで止めています。

旗竿下半分

旗布と旗竿は以下のように紐で接合します。

旗布と旗竿の接合・上部

旗布と旗竿の接合・下部

紐は蝶結びなどで竿に結びつけても構わないのですが、より手間を省くため写真中の黒くて丸い部品を使っています。これはコードストッパー という名前で手芸店などで売っています。よほど風が強い時とかでない限り、これでも十分かと思います。(不安があるようであれば、コードストッパーの上から更に紐を結ぶことも可能です)

終わりに

サッカーの応援に参加する人にとって、自分の作った道具(旗・ゲーフラ・その他独自のグッズ等)を使って応援することは一つの楽しみであり、またその道具をどうより良いものにしていくかを工夫することも楽しみになるかと思います。この記事を読まれた方で、「自分は応援用の道具・グッズを作るときにこのようにしている」というようなアイディアや作成例などがあれば、それをぜひ公開してほしいものと思います。

勢いで一気に書いた記事となったため、誤字脱字、認識違い等々ありましたらご指摘頂ければ幸いです。

付記

2017年の新体制発表会見に青歌隊で参加します。1月22日はよろしくお願いします。


HTML5の要素を条件付きコメントなしでIEで使う

今更ながら、ここもHTML5にしてみようかなという気持ちが湧いてきています。以前は、一旦公開した文書の形式を無闇に変えるのはよくないという思いが強かったのですが、個人のページなのだし色々と実験的なことをもっと試してもいいのでは、と思うようになったので。

さて、HTML5導入にあたり一番気にしていたのが、IEでHTML5の新しい要素を使う方法のことでした。今だと html5shiv を使って以下のようなコメントを入れるのが一般的になっているようです。

<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->

しかしながら、HTML文書というのは様々な環境で利用されるための文書形式だと自分は考えているので、その中に(コメントとは言え)特定のブラウザのための記述を入れることには抵抗があったのでした。そこで、上記のような条件付きコメントを使わずに、IEでHTML5の新しい要素を使う方法をここ数日模索しており、何とか方法が見つかりましたので以下に紹介する次第です。

ひとまずサンプルをどうぞ。

他に使用しているファイルは以下の通りです。

見ての通り、以前に角丸の表示で利用していた、IEの DHTML Behaviors を利用しました。これだとHTML文書に適用するCSSの中で、

body {
  behavior:url(./html5.htc);
}

というようなルールを追加するだけなので、HTML5文書自体には余計な記述を追加することなく利用できます。

なお、html5.htc の中では html5shiv のコードをほぼそのまま利用しています。

* * *

この html5.htc を作る過程の試行錯誤で、2点ほど学んだことがあったので覚え書き。

htcファイルの中から、HTML文書のdocumentオブジェクトは直接参照できない。 htcファイルのscript要素で document と書くと、それは「htcファイルのdocumentオブジェクト」ということになるようです。一方、behavior を適用した要素(body要素)は element で参照できるので、HTML文書の document オブジェクト、window オブジェクトを得るには以下のようにする必要がありました。

var doc = element.document;
var win = doc.parentWindow;

最後に element.innerHTML の更新が必要。 これをしなくてもhtcファイルのscript要素のスクリプトは実行されていたので、それで問題ないように思っていたのですが、実際はそれだけだとスタイルが適用されませんでした。色々試す中で、半ば自棄で element.innerHTML = element.innerHTML というコードを入れてみたところ、思いがけずそれでうまく行ってしまったのでした。おそらく代入によりHTML5新要素のタグが改めて解析されたのだろうと推測しますが、自身を代入することで結果が変わるというのは何とも不思議な感じです。

コードをより短くするため、element.innerHTML += '' と変更しました。


Mojolicious wikiにあるORLiteの例をUnicode対応にする

Mojolicious::LiteでData::Modelを使ってみたという記事で、

MojoliciousのWikiにORLiteを使ったサンプルがあったのですが、残念ながらそのままでは日本語には対応していないので、…

という文を見かけたので、その Working with ORLite inside Mojolicious にあるサンプルを日本語でも使えるようにできないか、調べてみました。

Mojolicious::Liteにおける文字エンコーディング周りの動作を調べてみたところ、Mojolicious::Liteの内部では、文字列はあくまでPerlの内部文字列として扱われることを知りました。具体的に言うと:

なので、 $self->param('type') のようにして取得したデータは、その時点で内部文字列となっているし、また、データベースから取得したデータをテンプレートに埋め込むならば、内部文字列とした上で埋め込む必要がある、ということになります。

そうすると修正はデータベース寄りということになりそうです。調べると、ORLiteが使用するDBD::SQLiteには、入出力データを内部文字列として扱うための属性(sqlite_unicode)がありました。しかしORLiteではその属性を使用していないようです。

そこで、以下のように package Model のところで connect メソッドを上書きすることで、日本語文字列のポスト・表示にも対応することができました。

追記(2012年2月3日): ORLite がバージョン1.52以降で unicode オプションをサポートしたため、以下のソースも変更しました。

#!/usr/bin/env perl

package Model;
use strict;
use ORLite {
    file   => 'sample.db',
    create => sub {
        my $dbh = shift;
        $dbh->do(
            'CREATE TABLE motorcycles (
             id INTEGER PRIMARY KEY,
             type TEXT NOT NULL, 
             brand TEXT NOT NULL,
             color TEXT)'
        );

        # just use $dbh->do(...) if you need more
        # tables
        return 1;
    },
    # ORLite >= 1.52
    unicode => 1,
};

#{
#    # use unicode character (ORLite < 1.52)
#    my $connect = sub {
#        DBI->connect( $_[0]->dsn, undef, undef, {
#            PrintError => 0,
#            RaiseError => 1,
#            sqlite_unicode => 1,
#        } );
#    };
#    no warnings 'redefine';
#    *connect = $connect;
#}

package main;

use Mojolicious::Lite;
use utf8;

get '/' => sub {
    my $self = shift;
    $self->stash(motorbikes => [Model::Motorcycles->select('order by type')]);
} => 'index';

post '/' => sub {
    my $self = shift;
    Model::Motorcycles->create(
        type  => $self->param('type'),
        brand => $self->param('brand'),
        color => $self->param('color')
    );
    $self->redirect_to('/');
};

app->start;

__DATA__

@@ index.html.ep
<!DOCTYPE html>
<html>
  <head>
    <title>Motorcycles</title>
    <style>td { background-color:#dee; } </style>
  </head>
  <body>
    <h1>Motorcycles</h1>
    <table>
    % foreach my $cycle (@{$motorbikes} ) {
      <tr>
        <td><%= $cycle->type %></td>
        <td><%= $cycle->brand %></td>
        <td><%= $cycle->color %></td>
      </tr>
    % }
    </table>
     
    <p>Enter a new motorcycle here (バイクを登録して下さい)</p>
    <p>
      <%= form_for '/' => (method => 'post') => begin %>
% foreach (qw/type brand color/) {
        <%= uc($_) %>: <%= input_tag $_, 'type' => 'text' %><br />
% }
        <%= submit_button 'Submit motorcycle' %>
      <% end %>
    </p>
  </body>
</html>

スクリプト内部(__DATA__ 以下)のテンプレートで日本語文字列を使うような場合は、内部文字列として扱われるように use utf8; を追加しておくとよさそうです。