作者: 機械伯爵
日時: 2005/11/28(16:52)
<今回は整形してる暇ありませんでした>
<次につなげるのは明日の朝……>

PはPythonのP ---P IS FOR PYTHON--- 07h

<i>"And Now ... , For Something Completely Different"
「さてここで、完璧になんかカンチガイしてる、シャレにならないモノをどうぞ」</i>
by <b>"MONTY PYTHON'S FLYING CIRCUS"</b>

……………毎度だけど、言語能力/センス共にゼロの人間の日本語訳だから、読み流してね

0000-0111.ぺあぺあどんどん

「僕は、公式文書なんてのは、基本的に全てデジタルドキュメント、それもできれば堅固なテキストデータ、あるいはマークアップ言語による構造化テキストデータにしてしまえばいいと思います。それを大量にコピーしておけば、一つ二つ改変したところで、全てを変化させることは不可能です。一つのオリジナルドキュメントにセキュリティをかけるよりよっぽど簡単ですし、安全です。秘密性が無く、万人が閲覧可能な文書データに、オリジナルなどそもそも存在する必要が無いのです。データを誰にも手の触れられないところに保管するという手段は、完全な複製が困難あるいは不可能なメディア上に存在するデータのみでの常識です。デジタルデータは、そのメディア自体は非常に脆い。しかしコピーすることにより、メディアと独立したデータが存在することができ、信じられない強固さを手に入れることが出来ます。保存のために隔離することは、デジタルデータの常識ではありません。保存のためには公開し、複製する。これが、新しいデジタルデータの常識です…………
<朽縄 巽の立会演説より>

    ☆   ☆   ☆

 輸入雑貨&書籍店『パール&シェル』
 ここは、巽のお気に入りの店の一つだった。
 輸入雑貨や書籍の中でも、特に『怪しいモノだけ選んでそろえたんじゃないだろうか』と思われるほど、店内には怪しいモノで埋め尽くされている。
 その徹底的に『危ないモノ』『怪しいモノ』『悪趣味なもの』、良くて『変なモノ』『変わったモノ』の洪水は、来る人を完全に選ぶ。
 間違った者が来訪した場合、二度と訪れることは無いだろう。
 しかし、来るべき人間が訪れれば、それは中毒のようにはまり込む。
 巽は後者であり、特に何を買うでもなくぶらりと訪れることもしばしばである。
 この店に訪れる目的の一つは、とある非売品展示を見ることである。
 MITS社製のALTAIR 8800。
 世界発の「個人用(パーソナル)コンピュータ」である。
 制御パネルとLCDランプだけで、キーボードもディスプレイも無いが、紛れも無く「コンピュータ」であった。
 パソコンのルーツはここにあり、後にブレイクするApple IIとともに、パソコン史上に燦然と輝く記念碑である。
 なお、この店にはその他にも、今名前の出たApple II、日本人の一部の方には涙の出るほど懐かしいNECのTK-80などを初め、パソコンマニアには文化財とも言えるようなモノが、展示してある。
 しかし、この店でその展示を全て見つけるのは、少し骨が折れる。
 中空ぶち抜き2階のフロアは煩雑で、どこに何を置いてあるのか慣れるまでさっぱりわからない。
 その上、気分によって適当に入れ替えがあるので、慣れていても突然意味が無くなる。
 目を向けるだけで気分が悪くなるようなモノの中のどこかに、宝が埋もれている。
 巽は、そんな中をブラブラと見て回るのが好きだった。
 と、そこで、その場に妙にそぐわない人間に出会った。
「木崎………?」
 言われた本人………木崎美央は、全く気付かず、熱心に本を読んでいる。
 興味をそそられた巽は、美央の背後に回って何を読んでいるか見た。

    『きのこ』

 それは、紛れも無い、キノコの図鑑だった。
 カラーのページには、色とりどりの………ややもすれば毒々しい………キノコの写真が並んでいる。
 美央はそれを熱心に眺めてのち、ぱたんと閉じて、そのまま持ってレジに向かおうとして、初めて巽に気づいた。
「くっ、くくくくくくくくくくっくちなわくんっ!?」
「こんにちわ」
「え? あ、あの、その………こ、こんにちわ」
 そして、自分が手に持ってる本を見て、さらにパニくる。
「あ、えっと、あのそのあのあの、あああああああ、こ、これ………」
「綺麗だよね」
「え?」
「きのこ。僕も結構好きだよ」
「そ、そうなの?」
 意外な、という目で見る美央に、巽は苦笑する。
「もしかして、僕はメカやコンピュータにしか興味が無いと思ってた?」
 素直にこくっ、っとうなずく美央。
「別にそんなこと無いよ。生きてるモノも結構好きだよ。植物も、菌類も、動物も、見てると、デザインが楽しいからね」
「あ、それわかる。じゃ、ウミウシとか………」
「綺麗だよね。まぁ、原色のウミウシとか、毒々しいって見る人も居るけど、僕は普通に生きたデザインの見本みたいで好きだけどね」
「地味な色のは?」
「形が面白かったり、例えばキノコなら生え方が面白かったりしたら、可だよ」
「じゃ、普通に猫とか犬とか、好き?」
「相性が合えば」
「相性?」
「うん。猫も犬も、それぞれ性格あるからね。ひとくくりに好きとは言いづらいよ。でも、基本的に懐いてくれるのなら、どっちも好きだけどね」
「どっちも? 犬派とか猫派とか無いの?」
「全く無い。っていうか、コミュニケーション取れる動物をひっくくりってのは、『人間が好き』みたいな言い方に聞こえて嫌いだな」
 美央の表情が、ぱぁっと明るくなる。
「あ、それわかる。あたし、猫も犬も好きだもん。それに、やっぱり苦手な猫も犬もいるし。個人差あるよね」
「人間じゃないから、個体差って言うのかもしれないけど、個人差のほうがぴったりくるかもね」
「朽縄くんとこ、犬とか猫とか飼ってる?」
「前はどっちも飼ってた。もう両方とも飼ってたけど」
「あ、そうなんだ………」
 ふと、会話が途切れる。
 すると美央は、突然、自分が休日の真昼間に巽と話していることに気付いた。
 店内が暗いので、どうも時間間隔が狂うのだが、今はまだ正午に近い。
 唐突に巽が言う。
「木崎、食事は?」
「えっと………まだだけど。そこらへんで食べてくつもりだったから」
「ふぅん。じゃ、一緒に食べてく? いいトコ知ってるんだけど」
「うん………って、ええ―――――っ!」
 慌てふためく美央を、訝しげに見る巽。
「どうかしたの?」
「あ、あのっ、そのっ、ご、ごはん一緒にたべるって………」
「? ? ? ? ?」
 普段翔子と普通に外に出慣れている巽にとっては、美央が何を慌てているのか全く見当がついていなかった。
 しかし、男友達など皆無だった美央からすれば、食事をすればデートと同義だった。
「なんか、アレルギーでもあって、食べられないもの、あるの?」
「そ、そういうわけじゃないけど………」
「じゃ、行こう」
「あ、ちょ、ちょっと、レジ行かないと………」
 キノコ図鑑を買って来るという理由で、いきなり掴まれた巽の手を振り払う美央。
 振り払ってしまってから、さらに自分の乱暴な態度(と自分では思っている)に、巽が気を悪くしたのではないかと見てみると、ただ『お金払ってこないの?』という顔で、何も不思議に思っていない巽。
 そして結局、店を出る時には、巽が手を引いて案内することになる。
 巽としては『はぐれないように』が重要なのだが、美央からしてみれば『気になる男の子と手を繋いでいる』ことで頭で一杯である。
 よって巽が、「ここだよ」と店の前に立って手を離した時には、いきなり命綱を外されたような錯覚に陥って、いままでろくすっぽ握り返していなかったのに、慌てて離れていく巽の手をつかんだ。
 巽が不思議そうな顔をしているのに気付いて、ようやく顔を爆発させそうに真っ赤にして手を離す美央。
「ん? 顔赤くなって、息切れてるね。そんなにペース速かった? ごめんね。翔子だと、これくらいフツーについてくるから」
 翔子の名前が出て、急速に頭の血が下る美央。
 考えてみれば、巽が女の子慣れしているのは、翔子に慣れているからというのが一番自然な理由なのだ。
 とすれば、今日のように普通に手を繋いだり、一緒にご飯をたべたり、一緒に寝たり………
 突っ込み不可能な妄想の暴走に翻弄される美央。
 で、顔色が赤くなったり青くなったりしている美央をみながら、巽は『息が収まるまで』律儀に待っているのだった。
 そして約三分。
「おちついた?」
「う、うん」
 妄想は一周して、『行くとこまで言った巽と翔子』を妄想したあげく、どこかで情報伝達エラーを起こして、翔子の位置に自分を置いて妄想して、七転八倒したあげく(巽はここに至ってようやく慌てた)、過剰な情報に脳が熱暴走をおこして真っ白になり、そして再起動して、現在に至る。
「じゃ、入ろう。ランチにはまだ間に合うみたいだからね」
 で、冷静な頭になって、ようやく最初に戻って一緒にごはんを食べることを思い出して、またもや暴走しかける妄想に強制終了をかけて、美央は初めて店の看板を見た(というか、それまで見てなかった)

    洋食屋 紅玉亭

「洋食屋さん?」
「うん。昔懐かし………って言っても僕らの生まれる前だけど、昭和初期〜中期あたりの洋食屋っぽいの。雰囲気も結構面白いけど、単純に料理は美味しいし、料理の量、結構多いし………」
 量が多いというところに、ちょっとアクセントをつけてにっこりする巽。
 その含みに珍しく気付いた美央は、ちょっとだけ引きつる。
「りょ、量が多いって………あ、あたし男の子じゃな、ないんだし………」
「でも木崎、結構弁当箱、大きいよね」
「う………」
 美央自身はやや小柄で、しかもどっちかといえばスリムな身体なのだが、実はよく食べる。
 運動量が多いわけでもなし、何に消費されているかは不明(もしかすると、妄想によって脳がカロリー消費してるのかも)だが、男子用の弁当箱の、それも結構大きめのものを持参している。
 昼を一緒に食べたことはないので、そのことを巽が知ってるとは考えたことが無かった美央だが、冷静になってみれば、鞄と別個にジャーを毎日抱えて登校していてばれないわけはない。
 ああ、こんな色気の無いとこで、コンタクトとってどうするんだ、お前ら。
「実はここだけの話なんだけど、翔子も結構よく食べるんだよ。見栄を張って弁当箱は普通の大きさだけど、午前中には登校途中に買ったパンとか食べてるし、帰りに必ず買い食いしてるか食堂に寄ってるよ。そもそも、僕らの年代は、男女問わず新陳代謝激しいし、成長にも必要だから、よく食べて良く寝るのは当然なんだ。ちなみに今の時期に下手にダイエットなんてやると、将来的に健康的なプロポーションになれないばかりか、骨粗鬆症(こつそしょうしょう)の予備軍だよ。だから別に、食べるのはいいことなんだって」
「………あのね朽縄くん。それでも、けっこうソレって女の子は気にするんだよ………」
「大丈夫、木崎や翔子の選択は正しい。二人とも、成長しても美人になること保証つきだよ」
 このタイミングで翔子と同列に扱われた美央の心情は、複雑怪奇である。
 そもそも翔子は、美央にとっては『憧れの人』でもあるのだ。
 だから、同列に扱われること自体は、間違いなくくすぐったいくらい嬉しい。
 しかも、評価をしたのが、巽である。
 嬉しくない筈はない。
 同時に………もはや言うまでもあるまい。
 翔子と並べられること、これは良くて翔子とライバル(翔子が巽の中で女性として意識されていれば)、悪ければ翔子と同じく論外(翔子が巽の中で女性として意識されていれば)である。
 その悩みに悩む美央の鼻腔を、香ばしい香りがくすぐる。

    くぅ〜〜〜〜

 同時に、小さいながらはっきりと、お腹の音が。
「さ、入ろ」
 嘲りなど微塵も無く、純粋に喜んで手を引いて店内に招き入れる巽に、美央は恥ずかしさと情けなさと期待と、その他もろもろがない交ぜになった状態で、少しだけ涙ぐんだ。

    ☆   ☆   ☆

「あんた、今日木崎ちゃんを『紅玉亭』に連れてったんですって?」
 どっから聞きつけたのか、にやにやしながら翔子が言う。
「うん。木崎も翔子と同じで健啖家だから、涙流して喜んでたよ」
 巽の答えに、愕然とする翔子。
「あんた、まさか木崎ちゃんによく食べるとか、言わなかったわよね?」
「実際、食べるじゃないか。それに喜んでたってば」

    それ、半分、悔し涙よ

 巽の鈍感さは、長い付き合いの翔子にすらまだ計り知れぬ深淵の底にあったらしい。
「もう………いいわ。ところで今日の御題は?」
「うん、今日はちょっと変わった趣向のモノをやってみようと思って」
「変わった趣向?」
「このプログラム、見て」
 巽はUSBストレージメモリを差し込んで、中のファイルをデスクトップにコピーした。

    pelman.py

「ペルマン? なにこれ?」
「ダブルクリックしてみて」


     ---PELMANISM GAME---

    [[[HIT ENTER KEY AND GAME START]]]

「神経衰弱、つまり、数合わせのゲームだよ」
 なお、pelmanというのはカードによる記憶術の提唱者で、pelmanismとは神経衰弱ゲームのことも指す。
「Enterキーを叩くと始まるの?」
「そういうこと」


    TRY : 1
    01234567
    ________
       ONE CARD :

「何をすればいいの?」
「ONE CARDの横にあるカーソルがあるでしょ? そこに0〜7の数値を入力するんだ」
「0〜7ならいくつでもいいのね?」
「いいよ」
「じゃ、7」

    TRY : 1
    01234567
    ________
       ONE CARD : 7
    THE OTHER CARD :

「今、翔子は7のスロットを選択したわけだけど、0〜6の中にどれか一つだけ、7と同じ札が入ってるんだよ。それだと思った所の数値をTHE OTHER CARDの時に入れてよ」
「あてずっぽうね」
「まずは、ね」
「うん、確かに神経衰弱っぽい。0と」

    TRY : 2
    01234567
    ________
       ONE CARD :

「何よ、もとに戻ったじゃない」
「0と7のスロットのカードは違ったってことだね」
「カードの内容、見えないの?」
「当たれば見えるよ」
「シビアね。えっと、0と7は違うから………」
「あ、メモは使っちゃダメだよ」
「う………」
「神経衰弱ですから☆」
「わ、わかったわよ。とすると、適当にやっちゃダメね。0から総当り、からはじめるわ」
「TRYでカウントしてるから、回数気をつけてね」
「上限あるの?」
「無いけど、点数的には低くなるわけだね」
「イヤね、ソレ」

    TRY : 2
    01234567
    ________
       ONE CARD : 0
    THE OTHER CARD : 1

<中略>

    TRY : 2
    01234567
    ________
       ONE CARD : 0
    THE OTHER CARD : 6

[ENTER]

    TRY : 8
    01234567
    C_____C_
       ONE CARD :

「や、やっとヒット! でも6? こっちの心読んだように、いやらしいトコに設置するわね」
「ランダムだよ。だから僕もどんな数値かわかんないよ」

    なお、このプレイは実際に行われたものを再現している

「ま、いいわ、次いくわよ。この調子ならカード減るから、だんだん簡単になるじゃない。8枚って少なすぎない?」
「そうかな?」
「ちがうの? ま、いいわ。今度は1ね」

    TRY : 8
    01234567
    C_____C_
       ONE CARD : 1
    THE OTHER CARD : 2

[ENTER]

    TRY : 9
    01234567
    ________
       ONE CARD :

「ああっ、もとに戻ったっ!?」
「うん、外れたらまたゼロに戻るから」
「ちょ、ちょっと、今までの苦労、全部パー?」
「そんなことないよ。カードは移動してないから、同じのめくればまた合うよ」
「でも、見えなくなっちゃったらわかんなく………ああそういうこと、覚えておけってことね」
「そういうこと」
「えげつないゲーム」
「やめる?」
「イヤよ。最後までやるわ」
「そう言うと思った」
「じゃ、とりあえず判ってるとこ開けて………」
「そうすると、回数増えるよね」
「う………そっか。全部のカードの位置がわかってから、埋める方がいいのよね。つまり、それまでのペアを全部覚えてなきゃならないわけね」
「結構難しいでしょ?」
「頭、切れそう………」

    TRY : 11
    01234567
    _A_A____
       ONE CARD :

「1,3ね。最初が0,6だったから……」

    TRY : 13
    01234567
    ________
       ONE CARD : 2
    THE OTHER CARD : 6[ENTER]

「あ、やっちゃったっ!」
「2,4、2,5でハズレなら、2,7しかないよね」
「う〜くやしい。でも、2,7は覚えたわ。次は3………あ、あれ、3って何かなかったっけ?」
「なんでしょう?」
「いじわるっ! あ……いいわよ、思い出したわ。1,3ね。0,6と1,3と2,7は判ったんだから、あとは4と5と………あ、上がりじゃない」
「はいはい、打ち込んでからね」
「そうね、間違えないようにしないと………

    TRY : 13
    01234567
    CA_ABBC_
       ONE CARD : 2
    THE OTHER CARD : 7[ENTER]



    CONGRATULATION!
    CARDS = CADABBCD
    SCORE= 17
    THANK YOU FOR PLAYING!

    <<<HIT ENTER KEY AND GAME END>>>

「終わったっ! よーやく終わったっ!」
「ご苦労様。ミスタイプは結局1個だから、結構優秀じゃない?」
「次は間違えないわよ」
「はいはい、ゲームで遊ぶのはこのくらいにして、今回の目的は、これを作ることだよ」
「へ………?」
「作るんだよ。これでも、レトロなマイコンで作るなら結構難しいけど、Pythonで作るなら簡単だよ」
「簡単って、できるわけ無いじゃない」
「できるってば。尤も少しだけ今まで習ったこと無いことを先に教えておくから、まずそれで考えてみて」
「………わかった。でも、わかんないとこあったら、ちゃんと教えてよ」
「もちろん。僕はそのために居るんだから」
「ならいいわ」
「じゃ、新出の関数から。osモジュールに、systemっていう関数があるんだけど、これ、引数で取った文字列を、コマンドプロンプト自体に送って、シェルコマンド………コマンドプロンプトに直接打つcopyとかcdとかアレね………として扱うことができるんだ」
「そうなの」
「うん。今回はその中でも特に、clsコマンド(UNIX系ならclearコマンド)を使って、画面を消す為に使うんだ」
「もしかして、一回一回消して書き換えてるの?」
「そゆこと」
「割と面倒臭いことしてるのね」
「ま、それが基本だから」

    >>> import os
    >>> os.system('cls')

「わ、画面がホントにクリアされた」
「便利でしょ?」
「確かにゲームとかでは必須ね。でも、長いわよこれ」
「clsとかいう関数にすれば?」
「そうね」

    >>> def cls():
    ...  os.system('cls')
    ...  return
    ...
    >>>

「これで、画面消去はできるね」
「先行き遠いわね」
「じゃ、次。whileやforみたいなループで、途中からすっとばして次の周期に入ったり、ループを抜けたりする文法があるんだ」
「そんなのあるの?」
「次の周期に入るのはcontinue、ループを抜けるのはbreakだよ」
「そんなのあったら、continueの後ろの文って書く意味無いし、breakはループできないじゃない」
「うん。だから普通は、if条件分岐文の中で、条件に合った時だけジャンプさせるんだよ」
「あ、そういうことね」
「あとは、前に少しだけ説明した、input関数くらいかな。raw_input関数は文字列で受け取るけど、inputは評価するから、式として入力するんだ。でもまぁ、今回は数字をダイレクトに数値で入力するために使ってるけどね」
「他にも関数、使うの?」
「そうだね。動きを一旦停止させるためにraw_inputとか、リストをかき混ぜるrandom.shuffleとか、文字列から文字リストを作るためにlistクラスとか、文字列の連結に使うstr.joinメソッドくらいかな」
「結構使うのね」
「そうかもね。ま、いいや、とりあえずプログラムコードを書く前に、大まかな設計をしてみよう」
「設計?」
「そう。ゲームをどうやって動かすかの設計だよ。さっきのゲーム、どんな作業が必要だと思う? 思いつくだけでいいから、言ってみてよ」
「えっと、まず、当てる文字列を作る必要があるよね」
「そうだね」
「それから、数を二つ入力したら、それを比較してるわね」
「うんうん」
「比較した数値のスロットが同じ文字なら、次に表示されるね」
「そうそう」
「違ってたら、元に戻る、と」
「うん」
「で、全部あたりなら、上がり、でいいのよね」
「もう、後は無い?」
「えっと………あ、そうそう、あの憎っくき回数カウンタ。あれ、一回やる毎に増えるのよね」
「大体そんなとこかな。じゃ、それを紙に書き出してみようよ」
「紙に?」
「うん、別にテキストにでもいいけど」
「テキストに書くわ」

    ・文字列を作る
    ・数値を入力する
    ・スロットの内容の比較
    ・同じなら、表示
    ・違うなら、全部非表示
    ・全部表示ならあがり
    ・カウンタ、一回ごとに一回ふえる

「さて、この中で、一回しか行わない作業はどれ?」
「最初の文字列をつくる、だけね」
「ということは、それ以外は繰り返しになるわけだよね」
「そうね」
「じゃ、繰り返し部分だけブロックにしよう。あと、繰り返し回数がわかんないから、ループは………whileとfor、どっちを使う?」
「while?」
「そうだね。ところで、さっきループを途中で終わる文法を教えたから、ループ自体は条件無しの無限ループでいいわけだよね」
「無限ループ?」
「whileの条件が必ず真なら、whileループは止まらないよね。こういうのを無限ループって言うんだ。勿論実際には、ループの中に中断条件を埋め込むわけだけどね。だから、無限ループは、終了条件がブロックの先頭に無いループ、と思ってもいいよ。とにかく、無限ループはwhile 1:で書けるから、それを書いて、ブロックをつくってみよう」

    ・文字列を作る
    while 1:
        ・数値を入力する
        ・スロットの内容の比較
        ・同じなら、表示
        ・違うなら、全部非表示
        ・全部表示ならあがり
        ・カウンタ、一回ごとに一回ふえる

「ところで翔子、カウンタってどこで作るの?」
「whileブロックの中………だと、毎回初期化されちゃうわね」
「そういうこと。カウンタはループの外で初期化しておく必要があるね」
「あと、初期化しておくもの、無いかしら?」
「考えてごらん?」
「………そう言えば、表示されてる文字列の記録って、どうなってるの?」
「表示用の文字のリストを別個に作って、最初は'_'で埋めておいて、合ってたら取り替えるって方法を取ってるよ」
「じゃ、その表示用の文字のリストもいるね」
「あと、表示用の文字のリストは結構普通に『白紙に戻る』から、最初のリストもつくっていおいて、コピーするといいよ」
「おっけ」

    ・文字列を作る
    ・カウンタを作る
    ・表示用リストを作る
    ・表示初期化用リストを作る
    while 1:
        ・数値を入力する
        ・スロットの内容の比較
        ・同じなら、表示
        ・違うなら、全部非表示
        ・全部表示ならあがり
        ・カウンタ、一回ごとに一回ふえる


「なんかプログラムに見えてきたから不思議ね」
「こういうのを『擬似コード』って言うんだけど、Pythonには『実行可能擬似コード』の異名があって、書式が人間の思考からそんなに離れていないんだ」
「ふぅん」
「ま、人の中には、数式のほうが理解しやすい人とか色々いるから、一概にはいえないけどね。じゃ、次のステップ。条件分岐と、条件分岐によって動く部分を分けてみて」
「条件分岐って『もし〜ならば』のifよね」
「そうそう」
「とすると、スロット内容の比較が同じなら、と違うなら、ってのがあるわ」
「条件はスロット内容の比較だね。で同じなら真、違うなら偽ってとこかな?」
「そうね。あと、全部表示なら、ってのはあるけど、これは別の条件よね」
「そうだね」

    ・文字列を作る
    ・カウンタを作る
    ・表示用リストを作る
    ・表示初期化用リストを作る
    while 1:
        ・数値を入力する
        if スロットの内容の比較:
            ・表示
        else:
            ・全部非表示
        if 全部表示
            ・あがり
        ・カウンタ、一回ごとに一回ふえる

「あがり、ってどう書くのかしら」
「ループを抜ける、でいいんじゃない?」
「あ、そっか。えっと、その文って………」
「breakだよ」
「そう、そのbreak」
「あと、カウンタの位置、ここでいい?」
「どういうこと?」
「ここに置くなら、カウンタは最後に増やされるから、最初の一回分は最初に入れておいて、2回目以降を足すことになる。ブロックの頭で足すなら、カウンタはゼロから初めることになるよ。どっちでもいいけど」
「頭に持ってくるわ。単なる趣味だけど」
「じゃ、カウンタは0に初期化でいいね」
「カウンタの変数は、counterでいい?」
「いいんじゃない? 判りやすいし」

    ・文字列を作る
    ・表示用リストを作る
    ・表示初期化用リストを作る
    counter = 0
    while 1:
        counter += 1
        ・数値を入力する
        if スロットの内容の比較:
            ・表示
        else:
            ・全部非表示
        if 全部表示
            break

「数字入力は、さっき言ってたinputね」
「raw_inputと同じく、引数はプロンプトになるから、文字を書けるよ」
「じゃ、巽が書いたのと少し変えようかな」
「ご自由に」
「シンプルに、[X],[Y]でどう?」
「いいんじゃない?」
「入れる数値も x, y で簡単だし」

    ・文字列を作る
    ・表示用リストを作る
    ・表示初期化用リストを作る
    counter = 0
    while 1:
        counter += 1
        x = input('[X]:')
        y = input('[Y]:')
        if スロットの内容の比較:
            ・表示
        else:
            ・全部非表示
        if 全部表示
            break

「これで比較もできるわけだけど、とりあえず文字列を作っとかないと、話が進まないね」
「なんか、皆目見当つかないんだけど。あ、でも、random.shuffleは使うのよね。でもこれってリスト専用だから………」
「文字列をリストにするには、listクラスに初期値として文字列を渡してやればいいよ。逆に連結は、例のjoinメソッドだね。文字列をリストにして、かき混ぜて、文字列に戻す」
「面倒ね」
「若干ね」

    import random
    cards = list('AABBCCDD')
    random.shuffle(cards)
    cards = ''.join(cards)
    ・表示用リストを作る
    ・表示初期化用リストを作る
    counter = 0
    while 1:
        counter += 1
        x = input('[X]:')
        y = input('[Y]:')
        if スロットの内容の比較:
            ・表示
        else:
            ・全部非表示
        if 全部表示
            break

「表示用リストは、アレでしょ、リストの繰り返しに使う掛け算」
「よく覚えてたね」
「もちろん。で、リストのコピーは、今回はスライスでいいよね」
「わ、それも覚えてた? ひっかかると思ったのに」
「翔子姐さんをおなめでないの☆」

    import random
    cards = list('AABBCCDD')
    random.shuffle(cards)
    cards = ''.join(cards)
    dispN = ['_'] * 8
    disp = dispN[:]
    counter = 0
    while 1:
        counter += 1
        x = input('[X]:')
        y = input('[Y]:')
        if スロットの内容の比較:
            ・表示
        else:
            ・全部非表示
        if 全部表示
            break

「だいぶ、形になってきたわねぇ」
「そうだね、あと一息。比較は簡単だよね。xもyも数値なんだから」
「あ、添え字ね」
「表示は、えっと、xとyはそのまま同じ位置だから、cardからdispにコピーすればいいのかな?」
「そういうこと」
「で、非表示は最初と同じね」
「うん」

    import random
    cards = list('AABBCCDD')
    random.shuffle(cards)
    cards = ''.join(cards)
    dispN = ['_'] * 8
    disp = dispN[:]
    counter = 0
    while 1:
        counter += 1
        x = input('[X]:')
        y = input('[Y]:')
        if card[x] == card[y]:
            disp[x] = card[x]
            disp[y] = card[y]
        else:
            disp = dispN[:]
        if 全部表示
            break

「全部表示、ってどう判定したらいいかしら。全部 and でつなぐのって、いくらなんでも無茶よね」
「dispを一旦文字列にして、cardと比較したら?」
「あ、そうか」

import random
cards = list('AABBCCDD')
random.shuffle(cards)
cards = ''.join(cards)
dispN = ['_'] * 8
disp = dispN[:]
counter = 0
while 1:
    counter += 1
    x = input('[X]:')
    y = input('[Y]:')
    if cards[x] == cards[y]:
        disp[x] = cards[x]
        disp[y] = cards[y]
    else:
        disp = dispN[:]
    if ''.join(disp) == cards:
        break

「できたっ………って、なんか、かなり足りないような気がするんだけど………」
「まぁ、間違ってたらあとで直せばいいから、とにかく動かしてみようよ」
「そうね」
(ちなみに、皆さんが動かす時は、全角空白を全て半角空白にするか、タブにして下さい)



    [X]:0
    [Y]:1
    [X]:2
    [Y]:3
    [X]:

「わかった。dispを表示するの、忘れてた。あと、カウンタも」
「じゃ、足してみて」

import random
cards = list('AABBCCDD')
random.shuffle(cards)
cards = ''.join(cards)
dispN = ['_'] * 8
disp = dispN[:]
counter = 0
while 1:
    counter += 1
    print 'COUNT:', counter
    print '01234567'
    print ''.join(disp)
    x = input('[X]:')
    y = input('[Y]:')
    if cards[x] == cards[y]:
        disp[x] = cards[x]
        disp[y] = cards[y]
    else:
        disp = dispN[:]
    if ''.join(disp) == cards:
        break

「これで少しはマシになったはずよ」
「じゃ、RUNしてみよう」

    COUNT: 1
    01234567
    ________
    [X]:0
    [Y]:1
    COUNT: 2
    01234567
    ________
    [X]:

「………画面更新するの忘れてた。確かos.system('cls')の関数よね」
「どこで画面更新する?」
「最初でいいんじゃない?」
「おっけ。じゃ、書いてみて」

import random, os

def cls():
    os.system('cls')
    return

cards = list('AABBCCDD')
random.shuffle(cards)
cards = ''.join(cards)
dispN = ['_'] * 8
disp = dispN[:]
counter = 0
while 1:
    cls()
    counter += 1
    print 'COUNT:', counter
    print '01234567'
    print ''.join(disp)
    x = input('[X]:')
    y = input('[Y]:')
    if cards[x] == cards[y]:
        disp[x] = cards[x]
        disp[y] = cards[y]
    else:
        disp = dispN[:]
    if ''.join(disp) == cards:
        break

「じゃ、今度こそっ!」

    COUNT: 8
    01234567
    A______A
    [X]:1
    [Y]:2

「あ、いいかんじ

    COUNT: 15
    01234567
    ADCD__CA
    [X]:4
    [Y]:5

「おしっ、これでっ!」

    いきなり消えるウィンドウ

「な、なんでぇ〜っ! ! ちゃんと動いてたのにぃ〜!」
「プログラムは正常だよ。でも、プロンプトから起動したならともかく、ダブルクリックするなら、ちゃんと最後にraw_input入れて止めるとかないと………」
「なんで先に言ってくれないのよっ!」
「………ごめんね、実は忘れてた」
「ばか―――――っ!」
 しばらく、ぢたばたと暴れる翔子。
 そして、仕方が無いので、最後の仕上げを書き込んだ。

import random, os

def cls():
    os.system('cls')
    return

cards = list('AABBCCDD')
random.shuffle(cards)
cards = ''.join(cards)
dispN = ['_'] * 8
disp = dispN[:]
counter = 0
while 1:
    cls()
    counter += 1
    print 'COUNT:', counter
    print '01234567'
    print ''.join(disp)
    x = input('[X]:')
    y = input('[Y]:')
    if cards[x] == cards[y]:
        disp[x] = cards[x]
        disp[y] = cards[y]
    else:
        disp = dispN[:]
    if ''.join(disp) == cards:
        break
raw_input('CONGRATULATION!')

 <実行>

    COUNT: 7
    01234567
    __BAABCC
    [X]:0
    [Y]:1
    CONGRATULATION!

「ふぅ、なんかすごく大仕事したみたい」
「細かいトコはともかく、僕のプログラムとほとんど同じだね」
「ほとんど? まだあるの?」
「うん、実はこのままだと、こういう裏技、使えるんだよね」

    COUNT: 5
    01234567
    CADC____
    [X]:4
    [Y]:4

「あ、あ、ああああっ――――――っ!」
「そういうこと。同じ数値はチェックしてないからね。ま、今夜はコレくらいにしとこうよ。改良点は宿題ということで」
「………真っ白に燃え尽きたわ………」

    ☆   ☆   ☆

<pelman.pyの完全バージョン>
import random, os

def cls():
 os.system('cls')
 return

print '\n ---PELMANISM GAME--- '
raw_input('\n[[[HIT ENTER KEY AND GAME START]]]')

counter = 0

card =list('AABBCCDD')
random.shuffle(card)
card = ''.join(card)

dispN = ['_'] * 8
disp = dispN[:]

while 1:
 cls()
 dispstr = ''.join(disp)
 if dispstr == card:
  break
 counter += 1
 print '\nTRY : ', counter
 print '01234567'
 print dispstr
 i0 = input('   ONE CARD : ')
 i1 = input('THE OTHER CARD : ')
 if i0 == i1:
  print "SELECT DIFFERENT NUMBER!"
  disp = dispN[:]
  raw_input('\n[[[HIT ENTER KEY AND CONTINUE GAME]]]')
  continue
 elif card[i0] == card[i1]:
  disp[i0] = card[i0]
  disp[i1] = card[i1]
 else:
  disp = dispN[:]
  continue

cls()
print 'CONGRATULATION!'
print 'CARDS = ', ''.join(card)
print 'SCORE=',counter
print 'THANK YOU FOR PLAYING!'
raw_input('\n[[[HIT ENTER KEY AND GAME END]]]')