Rubik's Cube
Rubik's Cube
図書館から、『四角六面キューブとわたし』なんて言う、 ルービック・キューブの開発者の回顧録を借りてきた。そこに面白いURLが紹介されてたので、載せておく。 God's Number is 20 いわゆる何手で解けるかの限界数。
日本では、 Rubik's Cube (Japan) が、公式販売権をもっている。特許が切れているので、らしい物が沢山販売されているみたい。 こちらに、一般的な解説が出てた。 ルービックキューブ 百科事典は有り難いなあ。
有名な物なんで、Debianとかでも遊べるみたい。
gnubik/stable 2.4.3-3+b1 i386 3D Rubik's cube game kubrick/stable 4:20.12.1-1 i386 game based on Rubik's Cube pybik/stable 3.0-3.1 all Rubik's cube game pybik-bin/stable 3.0-3.1 i386 Rubik's cube game - architecture dependent files rubiks/stable 20070912-5 i386 Small collection of Rubik's cube solvers
play
gnubik rubiksと2つのアプリを入れてみた。
gnupikはGUIなアプリ。ちゃんと画面が出て来た。キューブの所にカーソルを置くと、矢印になるので、クリックすれば回転出来る。暇潰しにはもってこい。しかも無料で楽しめる。
もう一方のrubiksの方は、CUIなアプリ。
rubiks_cubex rubiks_dikcube rubiks_optimal
このように3ヶで構成されてる。
sakae@deb:~$ rubiks_cubex 500 ERROR: solver failed for the following reason: 510 ERROR: non-protocol input entered. 101 version 1.30.505 by Eric Dietz (root@wrongway.org) 400 syntax: rubiks_cubex <cube-layout>[<center-rotations>] rubiks_cubex random[-centers] example command-lines: cubex 212212212333333333626626626555555555141141141464464464 cubex 111111111222333222555222555444555444333444333666666666100003 cubex random notes: - hint: try using the random parameter to get a feel for how to input cubes. - read readme.txt (included with this distribution) for protocol details. - use a terminal with scrollback feature to use this program! (or pipe it) 401 end of notes. 501 terminating unsuccessfully.
何だか、WEBサーバーと通信してるみたいだな。まあいい、指示に従ってみるか。
sakae@deb:~$ rubiks_cubex random 200 cube solved ok. 101 version 1.30.505 by Eric Dietz (root@wrongway.org) 202 101 moves 7 groups 15 23 31 6 10 16 0 220 starting diagram: 2 1 3 2 0 3 1 3 2 0 2 3 3 6 2 2 6 4 4 6 5 5 1 2 2 1 2 3 5 3 3 6 2 4 1 5 5 4 4 1 1 6 6 5 6 6 2 2 1 4 3 4 4 4 5 2 6 5 3 1 5 221 diagram end. 210 sending solution: DR, BA, RU, RU, DL, LD, BA, DR, DR, LU, BC, LD, LD, UL, UL, BA, DR, BC, DL, BA, RD, BA, RU, BC, LD, BC, LU, BA, DL, BA, DR, LU, BC, LD, BA, LU, BC, LD, UR, BA, UL, BA, RU, BC, RD, BA, RD, BA, RU, BA, DR, BC, DL, BC, LD, BC, LU, BC, DL, BA, DR, BC, UL, BC, UR, BC, LU, BA, LD, DL, BC, RD, BA, RU, DR, BC, LU, BC, BC, LD, BA, LU, BA, LD, BA, UR, BA, DR, BC, UL, BA, DL, BC, UR, BA, DR, BC, UL, BA, DL, BC, 211 completed solution. 203 cmd: rubiks_cubex 213313362644533166655624566122155221123441434445265315 201 terminating successfully.
色の表現は1から6で表す。抵抗のカラーコードならぬ、キューブのカラーコード。そしてキューブを展開した配置図。これを解決しなさい。サーバーに解決を依頼。サーバーからの解決作がステータスコード210で示されている。
誇らしげにステータス211で、解決済みって報告。それから、与えられた問題はステータス203で示されている。何だか、懐しい感じがするぞ。manもそれぞれ付いているので、読んでおくと吉。
gnubikのマニュアルを参照。
IMPLEMENTATION The code for gnubik is written in C and Scheme. It uses the Mesa/OpenGL graphics library, and the Gtk+ library and Guile. As such, it should be easy to generate a version for any system complying with these stan‐ dards.
さすがGNUを名乗るだけある。大事な部分はguile/schemeとな。
sakae@deb:/usr/share/gnubik/scripts$ wc * 61 217 1910 debug.scm 310 1426 10986 flubrd.scm 423 1878 17261 mellor-solve.scm 48 288 2116 rand.scm 842 3809 32273 total
表現力豊かなのは、Mesa/OpenGL Gtk+ それとも scheme ?
try make
arch linuxにも入れておこうと思ったら、そんなパッケージは無かった。一般向けではないのか。ならば、自炊するかな。頭にGUNって付いているって亊はGNU軍団だな。
ソースを頂きに行ったら、2003/11/21初の2.0があった。最新の2.4.3版が2011/04/09。もう枯れているんだね。迷わず最新を頂く。
[sakae@arch gnubik-2.4]$ ./configure : checking for OpenGL Utility library... -lGLU checking for varargs GLU tesselator callback function type... no checking for GUILE... no checking for library containing scm_c_string_length... no configure: error: "Guile 1.8.0 or later is required"
最初はグーじゃなくて、エラーは当たり前。Guile 3.X系は新し過ぎると思うので、2.2系を入れた。それでもエラーですよ。エラーログ嫁。
configure:9304: gcc -o conftest -g -O2 conftest.c -lguile >&5 /usr/bin/ld: cannot find -lguile: No such file or directory collect2: error: ld returned 1 exit status configure:9304: $? = 1 configure: failed program was: | /* confdefs.h */ | #define PACKAGE_NAME "GNUbik" :
libguileが見付からないと言ってる。
[sakae@arch ~]$ locate lib/libguile /usr/lib/libguile-2.2.so /usr/lib/libguile-2.2.so.1 /usr/lib/libguile-2.2.so.1.4.2
ちゃんと有るんだけどな。エラーログを少し遡って見てくと
Package 'guile-2.0', required by 'virtual:world', not found configure:9273: checking for library containing scm_c_string_length configure:9304: gcc -o conftest -g -O2 conftest.c >&5 /usr/bin/ld: /tmp/ccVcpgeR.o: in function `main':
あれれ、configureの中に、guileのバージョンが決めうちで2.0ってなってる。そんなの有りか? 文言では、1.8以上ならいいよってなってるけど。まあ、その時代には2.0が最新だったんだろうね。時代考証が必要っぽいな。
guile-2.2に書き換えたら、少し先に進んだ。けど、やはりエラー
checking for GUILE... yes checking for library containing cos... -lm checking for GTK... yes checking for GDK_PIXBUF... yes checking for GDK_GL_EXT... no configure: error: Package requirements (gdkglext-1.0) were not met: Package 'gdkglext-1.0', required by 'virtual:world', not found
今度は、gdkglextが無いとな。パッケージにも無い。まて、野生の勘でパッケージ名前を端折って検索。
[sakae@arch pkgconfig]$ pacman -Ss glext extra/eglexternalplatform 1.1-2 EGL External Platform interface extra/gtkglext 1.2.0-13 opengl extensions for gtk2
でてきたっぽい。入れたよ。
[sakae@arch ~]$ cd /usr/lib/pkgconfig/ [sakae@arch pkgconfig]$ ls -d gtk* gtk+-2.0.pc gtkglext-x11-1.0.pc gtk+-x11-2.0.pc gtk+-3.0.pc gtk+-unix-print-2.0.pc gtk+-x11-3.0.pc gtk+-broadway-3.0.pc gtk+-unix-print-3.0.pc gtkglext-1.0.pc gtk+-wayland-3.0.pc
こういうのもパッケージのヒントになるね。まあ、無事にインストール出来た。 動かすと多少エラーが出てくるけど、目を瞑っておこう。
src/cubeview.c:860 Error in display: invalid enumerant Cube geometry (version dimensionality size-of-dim-1 ...): (1 3 3 3 3) 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2
全面が揃った完成形。
853render_scene (GbkCubeview * cv, GLint jitter) 854{ 855 projection_init (&cv->scene, jitter); 856 857 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 858 859 gbk_cubeview_model_view_init (cv); 860 ERR_CHECK ("Error in display"); 861 862 drawCube (cv->cube, FALSE, cv); 863 ERR_CHECK ("Error in display"); 864}
気になるエラー。まあ、良きに計らえでいいのかな。
from info
GNUの場合、一番詳しい説明はInfoなドキュメントにある。開いてみたよ。 上で出て来た、キューブのダンプの説明があった。
-- Procedure: gnubik-cube-state This will return a `scheme' object, which is in fact a cons cell whose first component is a list describing the geometry of the cube, and the second component is a vector of six vectors of nxn items, where n is the size of the cube. The geometry list consists of a version number, which will change if the definition of the cube object ever changes (scripts should check this to ensure compatibility or else things will surely break); the current version is 1 (one). The next item in the list is the dimensionality of the cube, which currently is always 3. The list then holds three more numbers describing the size of the cube in each direction. So a current 3x3x3 cube will have the geometry list `(1 3 3 3 3)'.
キューブ・カラーコード。
gnubik.color0: Red gnubik.color1: Green gnubik.color2: Blue gnubik.color3: Cyan gnubik.color4: Magenta gnubik.color5: Yellow
マウスでグリグリすると思っていたら、キーボードを駆使して、キューブの見えかたってか、視点を変更出来るのね。これって、OpenGLの得意とする場面だな。
4.1 Using the keyboard to rotate the cube ========================================= You can re-orientate the cube using the following keys. The <Up> and <Down> keys rotate the cube about the horizontal axis. The <Left> and <Right> keys rotate the cube about the vertical axis. Holding down the <Shift> key whilst pressing the <Left> or <Right> arrow keys rotates the cube about the z axis.
群論
群論とルービックキューブ 卒業研究でキューブをやるって、楽しいだろうね。
Rubic キューブと置換の乗算 by haskell 和田先生登場
ルービックキューブを解くプログラムを書いてみよう by python
これだけ分かるとNxNxNのルービックキューブは全部解ける Gold finger ?
RubiksCube-TwophaseSolver by python
上記の2段階法による。テーブル作成に1時間かかった。下記は、example.pyを走らせた時に出て来るコンソール出力例。
Connected with 127.0.0.1:32980, 2022.07.01 06:43:06 RFUDULFUFLBRURDBRUDBUUFFRFDBLLRDURFBFRLLLLFBDBDUBBDLRD RFUDULFUFLBRURDBRUDBUUFFRFDBLLRDURFBFRLLLLFBDBDUBBDLRD U3 L1 F2 B3 L1 F2 U3 F2 L3 F1 R2 F2 L2 U1 R2 F2 R2 F2 U3 F2 (20f)
20手で、解決しましたって、あんたはキューブの神様か。
ctwm on debian
ctwmのマニュアルをボーと眺めていたんだ。こんなくだりが出てた。
Button1 = modlist : context : function The modlist is any combination of the modifier names shift, control, lock, meta, mod1, mod2, mod3, mod4, or mod5 (which may be abbreviated as s, c, l, m, m1, m2, m3, m4, m5, respectively) separated by a verti‐ cal bar (|). Similarly, the context is any combination of window, ti‐ tle, icon, root, frame, workspace, iconmgr, their first letters (icon‐ mgr abbreviation is m), or all, separated by a vertical bar. The func‐ tion is any of the f. keywords described below. For example, the de‐ fault startup file contains the following bindings: Button1 = : root : f.menu "TwmWindows" Button1 = m : window | icon : f.function "move-or-lower" : "Left" = m : all : f.backiconmgr "Right" = m | s : all : f.forwiconmgr
ボタンの代わりに、キーでもいいんだって主張。これをヒントに、前回の .ctwmrc に下記を追加したよ。
"Right" = : all : f.nextworkspace "Left" = : all : f.prevworkspace
矢印キーで、仮想窓の切り換え。素直に矢印キーだけで切り換えするようにしたけど、アプリでこのキーを使いたい場合、コンフリクトしちゃう。そんな時は、シフトキーとかと併用するようにすればよい。
気分がよくなったので、debianのWMをicewmからctwmに衣替えしてみました。 普通に起動すると、debian流のctwmになりました。そんなのどこでやってるの? 答は、/etc/X11/ctwmの中にありました。
ctwmが供給してる、system.ctwmrcにフックをかけているようです。このファイルの最後に、 undivert(`/etc/X11/ctwm/menudefs.hook') が追加されてました。で、その中身は?
{ "SIMH Altair" f.exec "x-terminal-emulator -T \"SIMH Altair\" -e sh -c \"/usr/bin/altair\" &" "SIMH Altair Z80" f.exec "x-terminal-emulator -T \"SIMH Altair Z80\" -e sh -c \"/usr/bin/altairz80\" &" "SIMH DEC PDP1" f.exec "x-terminal-emulator -T \"SIMH DEC PDP1\" -e sh -c \"/usr/bin/pdp1\" &" "SIMH DEC PDP10" f.exec "x-terminal-emulator -T \"SIMH DEC PDP10\" -e sh -c \"/usr/bin/pdp10\" &" "SIMH DEC PDP11" f.exec "x-terminal-emulator -T \"SIMH DEC PDP11\" -e sh -c \"/usr/bin/pdp11\" &" :
渋い設定があるなあ。皆さん、uv6狙いなんですかね。オイラーもこの間やったよ。
menu "/Debian/Applications/Programming" { "Guile 2.2" f.exec "x-terminal-emulator -T \"Guile 2.2\" -e sh -c \"/usr/bin/guile-2.2\" &" "Hugs" f.exec "x-terminal-emulator -T \"Hugs\" -e sh -c \"/usr/bin/hugs\" &" "Tclsh8.6" f.exec "x-terminal-emulator -T \"Tclsh8.6\" -e sh -c \"/usr/bin/tclsh8.6\" &" "TkWish8.6" f.exec "x-terminal-emulator -e /usr/bin/wish8.6 &" } menu "/Debian/Applications/Science/Mathematics" { "Bc" f.exec "x-terminal-emulator -T \"Bc\" -e sh -c \"/usr/bin/bc\" &" "Dc" f.exec "x-terminal-emulator -T \"Dc\" -e sh -c \"/usr/bin/dc\" &" "Xcalc" f.exec "xcalc &" }
これも中々、渋い選択だなあ。今でもhugsが使えるってのは、ポイント高いよ。重くなくて、ちょいと使うには後都合。
emacs color
emacsの色調査。ソースの好きな色の所で、 M-x describe-face すると、こんな風に返答がある。emacsはソースの文法を知ってるな。
Describe face (default ‘font-lock-variable-name-face’):
どんな色が割当てられているかは、 M-x list-faces-display で確認出来る。なかなかカラフル。
fixed-pitch-serif abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOP$ font-lock-builtin-face abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOP$ font-lock-comment-delimiter-face abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOP$ : font-lock-variable-name-face abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOP$ font-lock-warning-face abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOP$ fringe abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOP$
この他に、色の集合をテーマとして用意してる。GUIな感じがするぞ。 usr/share/emacs/27.1/etc/themes
で、elispではどうなってるか、強引に探してみる。
sakae@deb:/usr/share/emacs/27.1/lisp$ zgrep font-lock-func *gz apropos.el.gz: '((t (:inherit (font-lock-function-name-face button)))) bs.el.gz: '("^..\\(.*Dired .*\\)$" 1 font-lock-function-name-face) cus-theme.el.gz: font-lock-doc-face font-lock-function-name-face dired.el.gz: '((t (:inherit font-lock-function-name-face))) font-core.el.gz:(defvar font-lock-function 'font-lock-default-function font-core.el.gz:is toggled via `font-lock-function'." font-core.el.gz: (funcall font-lock-function font-lock-mode) font-lock.el.gz:(defvar font-lock-function-name-face 'font-lock-function-name-face font-lock.el.gz:(defface font-lock-function-name-face font-lock.el.gz: (1 font-lock-function-name-face prepend) :
ソースなら、きっとプログラミング部門だろうって亊で、更に追求。このあたりが文法を知ってるという由縁になるんだな。
sakae@deb:/usr/share/emacs/27.1/lisp$ zgrep font-lock-func -l */*gz : progmodes/cc-awk.el.gz progmodes/cc-engine.el.gz progmodes/cc-fonts.el.gz progmodes/cc-langs.el.gz progmodes/cc-mode.el.gz : progmodes/python.el.gz progmodes/ruby-mode.el.gz progmodes/scheme.el.gz progmodes/sh-script.el.gz :
個別に書き換えると、init.elに反映される。
(custom-set-faces '(font-lock-comment-face ((t (:foreground "red")))))
(add-hook 'font-lock-mode-hook '(lambda () (set-face-foreground 'font-lock-comment-face "yellow") (set-face-foreground 'font-lock-string-face "green") (set-face-foreground 'font-lock-keyword-face "#66e6e6") (set-face-foreground 'font-lock-builtin-face "LightSteelBlue") (set-face-foreground 'font-lock-function-name-face "cyan") (set-face-foreground 'font-lock-variable-name-face "LightGoldenrod") (set-face-foreground 'font-lock-type-face "PaleGreen") (set-face-foreground 'font-lock-constant-face "Aquamarine") (set-face-foreground 'font-lock-warning-face "Pink") ))
CUI用にフォーグランドだけを集中的に設定するなら、こういう方法も有る。