この部誌はパズル研究部の部員達の自己満足の塊ですので、ここに載っているパズルの 中には、遊び要素の多いネタパズルやパズル通信ニコリには絶対載らない ような超難度パズルも数多く掲載されております。十分注意して取り掛かって下さい。
また、ここに載っているパズルは、誤植などの理由により解けないパズルや、 別解の発生するパズルも存在する事があります。予めご了承下さい。
今年度から仕事で学園広報を担当することになりました。
今まで雰囲気で用いていた 『言葉』 と云うモノに,敏感になりました。現実の全てを言葉で表現するには無理があり,だからと云って踊ったりする技能もなく,チョッと苦悩しています。当然,数式も役に立ちません。さらには,場面によっては反射神経も必要であり,結果として綱渡り感は否めません。反省と共に,いやな汗が流れます。
例えば 『多様性』 と云う言葉があります。最近よく耳にする言葉です。「多様性の担保が重要である」と云う趣旨の話を,国内外の大学関係者,果ては中学・高校の関係者からも聴きます。実のところ,僕も使用します。でもある時,ふと疑問みたいなモノを感じました。
開成学園を紹介する時,僕は以下のようなことを云います。
教員A:「開成では中学が一学年300名,高校が一学年400名なので,全学年を合わせると2100名います。人数的にかなり多様な人材が集まっています」
教員B:「開成には2100名もいます。その規模の大きさから自分の学年で同好の士が5名ぐらいはいます。そのため,ある程度の行動力さえあれば仲間が見つかり,個人が疎外感を持つことはまずありません。時にはその仲間で同好会が結成されたりもします。事実,20ほどの同好会が存在し,部も合わせると70ほどになります。この70と云う数字は開成が持つ多様性の表れだと思っています。」
さて,この二つの話にどのような感想を持つでしょうか。さらには,大学と中・高では規模が違うので『多様性』が意味することもかなり異なると思いきや,リベラルアーツ系の大学などは開成学園と人数的に変わらなかったりするので厄介です。僕はきっと『多様性』を理解できていません。
何となくですが,『多様性』って便利で厄介です。最近,僕はこの言葉を用いなくなりました。
また,広報という仕事を通じて結構な方々とお会いする機会もあります。
良く云われることではありますが,開成学園にとってOBの存在は大変な財産です。しかし仕事でのお付き合いとなると,ただただ申し訳ないばかりで恐縮してしまいます。皆さん,それぞれの分野で凄い存在です。その方々に手弁当で活動していただいています。今のテーマは,OBの方々と現役生や受験生との出会いをどのように創り出すかです。チョッと広報の域を超えていますが,是非とも取り組みたい話題です。なんか興味深い手はないでしょうか。
総じて,広報を担当するようになってからの5か月がトンデモナイ勢いで過ぎていきました。
たぶん踏ん張りどころなんだろうなぁ...と感じています。
さてさて話題は変わり,文化祭です。
子供たちをみるのは楽しいことです。ましてや,ある程度以上の真剣さで何かに取り組んでいる子をみるのは尚更です。開成はそのような子達の先に,ちゃんと『何か』がある学校です。それは保証できるのですが,何故そうなっているのかが謎です。世の中,そう云うモノなのでしょうか。
パズ研の皆さんも,それぞれの真剣さで何かしらに取り組んでいるようで何よりです。パズルひとつ作れない顧問ですが,これからもよろしくお願いいたします。
参加されている皆様方も,パズ研の子達の先に何があるのかを頭に置きながら,ぜひ話しかけてみてください。こう云うのも文化祭の楽しみ方だと思います。
毎度,どうでもいい文章ですみません。このような文章を書ける自分にあきれています。
...と云う文章を,今から5年前の平成26年に書きました。
『広報』としての3年間,海外での説明会やニューヨークタイムズの取材対応を経験し,何となくですが時代の潮流も感じました。また昨年は3度目の6年間を終え,卒業生を送りました。もう50歳,開成では25年が経ちます。
此の間の経験で,なんだかんだ云って得た実感は「意外と開成イケてる」です。
数学科を含め教科の充実ぶりは目を見張りますし,ウチの子たちはカンボジアに学校を作らなくても,英語さえクリアできれば,何処の大学へも進学を望めます。「本気」になればです。
そして今,僕は昨年から学年主任をしています。いま中二を担当していますので,予定では卒業までの5年ほど学年主任をします。そろそろ自分トコの生徒とOBとのコラボに手を付ける時期かな,と考えています。「ようこそ先輩」スタイルではなく,出来ることならOBのトコへお邪魔するスタイルを模索します。さて,どうしましょうか。
やっぱり目の前に生徒がいる仕事は愉しいですね。
さて,パズ研です。今年は100ページを超える部誌を作ったとのこと。内容の充実も凄いようです。さすがの編集長! また合宿も昨年から行っています。二泊三日ですが,基礎体力作りに可なりの効果があるようです。OBも貢献してくれています。
上にも書きましたが,パズルはお子様に任せ,大人の方々は是非ともパズ研の子に話しかけてみてください。チョッとコミュニケーションの難があるかもですが,其れをかき分けると,きっと「開成」を感じられると思います。
この度は、パズル研究部による参団「エニグマゼヒツェーン」にお越しいただき、誠に有難うございました。毎年、ドイツ語で「謎」を表す「エニグマ」にドイツ語で数字をくっつけて参団名にしています。 今年は16年目で、16はゼヒツェーンなんだそうです。
今年は高2の数が多く、部誌100ページ企画が立ち上げられました。 さらに初めて合宿を行ったり部Tを作ったりと、革新の年となりました。 この年がたまたま令和元年にあたり、奇遇だなあと思う次第です。
少し部誌について書きたいと思います。 今回はかなり充実した物ができたのではと思います。種類・量ともに増えたので、 きっと面白いなと思えるパズルが見つかると思います。 また、読み物系も増えました。そちらも楽しんでいただけたらなと思います (一部僕にも分からないものがありますが)。 ただ、この部誌は部員達の自己満足の塊ですので、超難易度パズルが多数掲載 されております。Lv.1からして難しいです。 十分注意して取り掛かってください。 ニコリを一度解いてからやってみると良いかもしれません。
最後におそらく僕の20倍ほどは働いているだろうと思われる 編集長をはじめとする部員たちへの感謝を述べて、この挨拶を終わらせたいと思います。
去年はLuaLaTeXを使いましたが、メンテナンスが上手くできなさそうだったので 今年はSATySFiを使うことにしました。必要なものが全くそろっていなかったので 1000行以上もあるクラスファイルを一から作りあげた上に 足りていないパッケージを何個か作りましたが、苦労した甲斐あってか 夏休みに入ってからの編集作業がとても楽になりました。 Webページの作成も苦労しました。上手く自動生成することができましたが、 自動化出来なかったら4000行も手打ちすることになっていたと考えると冷や汗ものですね。 この部誌を作る過程で様々な技術を新たに身につけることができました。 貴重な経験になったと思います。
部誌本体の組版にはSATySFiが使われていますが、 LaTeXも虫食い算作成をはじめこの部誌のいろいろなところに使われています(実は部Tにも……)。 TeXを作成してくださったKnuth先生、LaTeXの作成や発展、TeXやLaTeXの普及に取り組まれている多くの方々、 SATySFiを作成してくださったT. Suwaさん、 そして部誌を作るのに利用した様々なツールを開発保守運営をしてくださっている多くの方々に感謝申し上げます。
今年は120ページという歴代最大のページ数を達成したうえ、作成部数1250部という これもまた例年よりかなり多い量を作っています。大変でした。いや、本当に。
量だけでなく、パズルの種類も増えました。 「ドッスンフワリ」・「ビルディング」・「ぬりみさき」・「お家へ帰ろう」・「シロクロリンク」 ・「立体ぬりかべ」などが新しく入り、 「フィルオミノ」と「スラローム」などが数年ぶりに復活を遂げています。 パズルも増えましたが記事も増えました。部員一人ひとりが抱えている世界観や知識を覗いていただけたら幸いです。 是非お楽しみ下さい。
中1から高3まで全ての学年の部員が様々なパズルを沢山作ってくれたおかげでこうして部誌が完成しています。 沢山のパズルを提供してくださった部員の皆・活動を支援してくださった顧問やOB、関係する方々には感謝してもしきれません。 来年も同じクオリティのニポリを作れるかはわかりませんが、やれることをやっていきたいと思います。
本日はこのニポリ16号を手にとっていただき誠に有難うございます。
今年度一番働いたであろう編集長に「真面目に書け」と言われたので、 今年はあくまで真剣に書かせていただこうと思います。
私は中学高校通して五年間、パズル研究部員として過ごしてきました。 高校に入ってからは副部長という大役も任せていただいた訳ですが、おそらくパズル研究部員として 一番精力的にパズルを作っていたのは中学二年生の頃で、以降は忙しさも有り余り積極的にパズルを 作ることが出来なかったと記憶しております。
ですが、今年度は部活動の運営に力を尽くし、 合宿を行う・部Tを作るといった初の試みを行う事が出来たので、 部誌にはあまり現れない側面ではありますが、 パズル研究部という部活動に対して少しは何かを残せたのではないかと思います。
さて、今年の部誌に関してですが、10号以来の100ページ、史上最大のページ数になっている、はずです。
パズルの種類も増やし、ペンシルパズル以外のコーナーも充実させ、 以前よりバラエティ色豊かな部誌になっている、はずです。
そう、私がこの挨拶を書いている時点では部誌はまだ完成していません。 去年より進捗は順調だと思いますが、100ページなどという馬鹿げた数字に対して 「去年より」という曖昧な基準では少々不安がありますが、まあ優秀な 次期部長(もしかして:編集長)がなんとでもしてくれると思います。
中学一年生の頃、私の夢の一つは難しいパズルを簡単に作れるようになる事でした。 その夢は叶っていません。今では難しいパズルを解くのですら骨が折れます。 ですが、今の私には同じ部活の仲間が沢山います。 私一人には困難でも、「パズル研究部」は大量の難しいパズルを生み出すことが出来ます。
私が五年間で学んだ事は、言ってしまえば妥協することです。投げ出すことです。 代わりに私の前には、他の人が出来ない、やらないことが回ってきます。 言ってしまえば「協力する」という簡単なことですが、明らかに自分以上に優秀な能力を持つ 仲間達に囲まれ、その中で仕事を見つけ出す。という経験は、思いの外得難い物だったのだろうと思います。
このパズル研究部も今年で16年目となりました。この16年間、さらにはそれができる前には数々のエピソードがありました。ここではそんなパズ研の歴史をご紹介したいと思います。
旧パズル同好会消滅当時、会員には高2と中2・3がいました。そして当時の会長がその座を引き継ぐ時、中3ではなくパズルを作るのが上手かった中2を次期会長としました。…が、会長の座を渡した後、その高2の旧会長が突然開成をやめてしまい、その事実を知った会員達は慌てふためき、そのままパズ同は消えてしまったそうです。
上のような経緯で旧パズ同が消滅してしまいましたが、直接的な原因は同好会継続申請届の出し忘れ(というより、そもそも存在を知らなかった事)に有ったようです。しかし翌春、当時の高2はこれにこりたハズなのに、同好会新規作成届を出し忘れたそうです。このままだと会員を呼び込めず、パズ同を立てる人がいなくなってしまいます。
そこで彼らは文化祭を使って何とか会員を呼び込み、同好会を立て直す計画を立てていたのですが…文化祭に出る為には必須の第三次参団説明会をすっぽかしたようで、文化祭自体に出られなくなるという悲惨な事態に。ちなみに参団とは、文化祭でいろいろな出し物をしているそれぞれのグループの事です。
彼らは文化祭が無理なら廊下を使って…と考えていたようですが、見事に文化祭準備委員会に却下されました。その後紆余曲折を経て、囲碁部の部屋の片隅で文化祭をしたそうです。
パズ同の危機を知った現パズ同の初代会長は、同好会の立ち上げには5人必要なので、ニコリを買っている人を2人見つけ、あと2人は強制的にパズルを覚えさせ、奇跡の復活を遂げました。尚、ニコリについては57ページを御覧下さい。また、この年から文化祭に「エニグマ」+「ドイツ語の数字」の参団名で参加しています。ちなみにエニグマは、ドイツ語で「謎」の意味です。そして、先述のニコリと日暮里をかけて「ニポリ」という名前の会誌を始めました。
新パズ同になってから2年目の文化祭。なんと当時の会長さんの一声により、その年の会誌「ニポリ」が100ページになりました。凄いですねぇ…ちなみに創刊号は48ページだったので、2倍以上に増えたんです。ただ、次号からは今までずっと3、40ページくらいをうろうろしています。流石に無理がありましたか…。
3年目の文化祭では活動場所が半部屋になると知り、2年目の文化祭が終わった後に座を引き継がれた会長さんが、「部屋が広くないとできない」と言ってくれたおかげで、結局部屋1個分の広さは確保できたものの、場所が中学(B会場)5階。とにかく入り口から遠いです。また、この年からパズルっぽい対戦型ゲームコーナーも設けました。お客さんが結構来てくれたので良しとしましょう。感謝、感謝。
当時高2と中2だった誰かがパズルを大量作成してくれた為、殆どパズルの数に困る事はありませんでした。良かった良かった。
4年目の文化祭後に5人も先輩会員がいなくなり、前年とは打って変わって会員数が激減しました。元から10人くらいしかいなかったので、ほぼ半分になってしまいました。よって、パズルの数も足りず、文化祭ギリギリまでニポリ第5号を作成していました。そのせいで会誌にミスが多発。ペコン。とにかく時間と人員が不足した1年でした。
場所が中学(B会場)5階。…要するに3年前と同じ状況になってしまった訳ですが、そんな中で来てくれた方々には本当に感謝です。 このときは文化祭がはじまってから二ポリを製本し始める、という状況でした(汗)。 まだまだ人員不足が解消されない1年でした。
まだまだ時間も人員も不足しているようで、パズルの量は減る一方。文化祭直前にスパートをかけて何とか息継ぎしている、といった状況です。このままではまたパズ同が消滅してしまう……!
7年目の文化祭後に多くの会員が引退し、危機を脱するどころかさらに悪化。部屋は半部屋から1部屋になって広くはなったものの、場所は変わらず中学(B会場)5階。さらに当時の編集長が2年間幽霊だったこともあってパズルは全然作れずに編集もまともに出来ない、ということでこの年もまた大変な年でした。
8年目の文化祭の後、当時の高2の先輩2人が抜け、一時は7人というさらに悲惨な状況に。しかし、文化祭後から3学期にかけて2人入ってくれたため、何とか当時と同じ人数まで持ち直すことが出来ました。さらに9年目になって勧誘会で高校2人中学4人の6人と、その直後に1人入ってくれたおかげで16人まで会員が増えました。つまり、合計で9人増えました。ただ、場所については高校の教室も申請してみたものの、相変わらず中学(B会場)5階でした。
ついに部に昇格してパズル研究部となることが出来ました。人数に関しては、9年目の文化祭の地点で高2の会員がいなかったため、そこまで部員は減らず、勧誘会で中学生がたくさん入ってくれたため、18人になりました。そして、当時の高2の活躍により、ニポリが100ページに!但し、相変わらず中学(B会場)5階でした。。
場所がついに4階に!そして、フリーペーパーの取材が来るなどいろいろなことが起きました。その一方で、部になったことにより文準の援助がなくなり、部費が足りないなどの問題も見えてきました。
場所は去年に引き続き中学(B会場)4階でした。この年は勧誘会で入ってくれた中学1年生が5人もいて、みんながしっかり働いてくれたため、人員不足にあまり困らなかった一年でした。また、当時の部長は2年目(11年目)の部長が2年連続で部長を務めてくれたため、部長の仕事が慣れていたこともあり、比較的仕事も思い通りに進みました。
前年の文化祭が終わった時点での中一(今年の中二)が五人でただでさえ例年比で多いところを、翌年の勧誘会でさらに増やして中二だけで八人になりました。ここまでくるとパズルの量にはほとんど苦労しません。パズルが予想以上に集まってくれて助かりました。
この年の文化祭は参団数を増やそうという試みが行われたらしく、部屋が足りなくなりつつあったために、昔パズル研究部がB501を使っていたということからこの年のみ再びB501を使うことになりました。多分この年が最後です。
去年は新入部員が0名だったので心配でしたが、今年は勧誘会も成功し、会場も再び4階に。執行部となる高1のメンバーも沢山いて部誌は安泰、かと思いきや活動が思いの外不調。パズルは何とかなったものの、編集長の中三にかなりの負担を強いることに。面目ない……。
今年は高2の数が多いこともあって様々な新しいことが行われました。初めて部Tを作成し、さらに合宿を2回も行いました。部誌は100ページを大幅に超え、非常に充実した1年になったと思います。文化祭でも不思議と場所が激戦区、3階に。元号が令和になってからいいスタートを切れたと言えそうです。
驚くほど新規イベントが多いです。また、部誌のページ数が良くも悪くもとても多いです。紙が足りないと問題になったくらいです。さらに部誌の印刷の日にちも執筆時点では文化祭直前ではないと予想されています。もはやパズケンではない?!部長として先導したことはあまり無いないので、部員のみんなには感謝の言葉しかありません。
「ニコリ」の名称はここまでに度々出てきていたかと思います。本誌の元となっているニコリについて、 説明しようと思います。
そもそもニコリとは、元々は競走馬の名前であり、それにちなんで名付けられたパズル雑誌であり、その パズル雑誌のメインキャラクターの馬の名前であり、その雑誌を発行する会社でもあるんです。こんがらがっ ています。つまり…ニコリの意味は4 つあるわけですが、正直な所結構引用で書いているので、最初のなん て本当なのかどうだか…恐らくは本当だろうと思いますけど。
勿論の事ながら、競走馬やキャラクターを説明しても仕方が無いので、パズル雑誌のニコリについて説明 します。ところで、ニコリの名前を新聞のパズルコーナーなどで見かけた事は有りませんか?知っている方 も多いと思いますが、ニコリは新聞や雑誌などにパズルを提供しています。メインとしては、パズル通信ニ コリやその別冊、そしてペンシルパズル本(通称ペンパ本)を刊行しています。
パズル通信ニコリは季刊で、年に4 回発行されます。大きさはB5 変型で特徴的です。価格は882 円と手 にとりやすい価格なのですが、実際に手に取るには一部の書店に行かなければならないようです。どの本屋 にもパズルコーナーはあると思いますので、おそらく探せば売っていることと思われます。コンビニでも売っ てるかも……?
ニコリには読者参加型企画も有り、読み物のページも有り、と結構面白い物が多いです。ニコリにはパズ ルも投稿出来て、パズルが載るとその載った本と多少のお金がもらえるそうです。投稿した事が無いので何 とも言えませんが…是非一度投稿してみてはどうでしょうか?
そして、本題から少しずれますが、秋葉原の方に「TORITO(トリト)」というパズルショップが有ります。 そこには知恵の輪やブロックパズルなど、本当に沢山の種類のパズルが売っています。僕も文化祭に使うも のの買い出しのついでに行ってみましたが、2 時間程潰れましたから、くれぐれも暇のある時に行くようお 願いしますね(笑)。
勿論、あの有名なルービックキューブも売っています。ルービックキューブから派生したパズルも結構置 いてあるので、興味のある方は足を運んでみて下さい。ちなみに、先程も書いた通り、この店にはニコリや ペンパ本も売っています。一度トリトに訪れれば、貴方もきっとパズルの世界は奥が深い事を実感出来るハ ズです。
いくつかのパズルを解く際に気を付けなければいけないルールです。
黒マスがタテヨコに連続してはいけないというルールです。説明無しでも分かると思います。こういうルー ルのパズルが多い一方、ぬりかべやLITS では「全ての黒マスは繋がっていなければならない」というルー ルがあるので、結構特殊なパズルだったりします。詳しくは下の図で確認して下さい。
黒マスがタテヨコに続かない、つまりナナメにしか接していなくても、それらの黒マスによって盤面を分 割していてはいけないというルールです。…と、そのままなので少し言い換えると、白マスはタテヨコにひ と繋がりになっていなければならない、という事です。ナナメで接していてもタテヨコで繋がらないとルー ル違反となります。詳しくはまたまた下の図で確認して下さい。
クロスワードパズルにおける黒マスの配置は、上の二つのルールに則った上で、更に点対称でなければな らない、という事になっています。…が、いろいろなクロスワードを見ていると、黒マスの配置が点対称で ない物も多々見られるようです。他にも、スリザーリンク、フィルオミノなどは、パズルを作成する時に数 字の配置が点対称でなければならない、という規則があります
この数独は対角線でも、1から9までの数字が1つずつ入ります。
ここにあげる定石は、私個人が執筆当時に思いついた「定石」をあつめたものです。 何が言いたいかというと、
①3の条件は強い
と仮定すると、
となり、矛盾する。
その他は対称性より明らか
まず、のように仮定すると、
より矛盾。
さらに、と仮定すると
より普通は(これ以外に数字があれば)ループが2つ以上できるので矛盾。
②角(と縁)の条件は強い
まず、
このように仮定する。すると
のようになり、右側下の線が脱出できていないので矛盾。その他は対称性より明らか。
まず、線がのようになるとすると、
こうでてくる。
のように線がないとすると、
のようにでてくる。
あとは共通点より明らか。
このように仮定すると、
こうなって線が脱出できないので矛盾。その他も対称性より明らか。
0があると同様な状況が起こりやすい。
③本数にて議論
まずまではすぐにわかる。
ここで、
の指金形部分の線の合計は1本である。すると、
"十"部分の線の合計は1本であるため、3の条件より
が確定する。
①黒マスの伸びる性質
まず、数字が次のようにあったとき、
?と?の間が白マスになることは無いので黒マスになります。
ここで、
のように仮定すると、黒マスが孤立してしまうので矛盾。以上より、黒マスがこのように伸びることになる。
②黒マスが洪水しないようにする
(※ただし、まわりに大きな数字が無いとして)
「?」マスには誰も届かないので黒マスが確定する。
黒マスは2×2の塊を作ってはいけない無いのでこのように確定する。
③空間充足
6が通れないマスに点を打つと
のようになり、空間が6で埋まり確定する。
①個数にて議論
の★のどちらかには明かりが入る。すると、☆には絶対に明かりが入らない。
よって確定する。
②照らすのがコイツしかいない
☆を照らす明かりは★しかありえない。
①3の条件は強い
より、共通している☆が白マスであることが確定する。
縦2置きにすると破綻する。よってこの場合しか成り立たない。
①こいつしか届かない
右下は8しか取れない。よって、8が右下をとるようにすると8の形が決まる。
②部分確定を書く
5の置き方を考えると、★のマスは絶対取る必要がある。よって、3マス分の線が確定する。
①白マス周辺の処理
ここで、
とすると、白マスが繋がって長方形にならないため、必ず黒に塗られる。
また、
以外の塗り方をするとすべて白部分を長方形にすることができないので不可能。よって確定する。
もし★部に黒マスが入ったとすると、
のようになってどうしても白部が長方形にならない。よって★は白マス
②個数にて議論
★のどちらかには必ず三角形が入ることになる。そうすると☆は
白マスになるので確定する。
①黒マスと線の強い結びつき
★の部分に線は入れないので、黒マスが来る。すると、このように線を引くしかなくなり、確定する。
★の部分を通ろうとするとこのように曲がるしかなくなる。
②個数で議論
説明することはあまりないが、盤面の辺に接して黒マスを配置すると、 線が通る分を確保せねばならないことに注意したい。
③偶奇を考える
「ループが完成する」という条件から閉じた空間に出入りする線の数は2以上の偶数になることがわかる。 このことより、2→の黒マスの置き方が確定する。
(両方とも不成立)
①意外なところに折れ曲がる条件が……
このように仮定すると、☆の〇が両端でまっすぐになり、矛盾。
②わかるところから書く
●での線の引き方は2通り。
共通するところから確定する。
①白マスを分断しないという条件は強い
とすると☆が孤立するので矛盾。
とすると☆が孤立するので矛盾。
①黒マス2×2のカタマリを作らないように!
☆が白マスとすると、その他で黒マス2×2を作ることになるので矛盾。
②わかるところからかく
黒マスの置き方はどちらかなので、共通部分を取り出してみる。
掛け算表を作成するソフトをHaskellというプログラミング言語で作りました。 このソフトに任意の非負整数を入力させると、その数での進法の掛け算表が書かれたCSVファイルを生成してくれます。
n進法の虫食い算を作るときには掛け算表が必須になります。 10進法であれば頭の中に入っているので楽ですが、違う進法になると基本的に使います。5進法などの小さいものでも使います。 ましてや12進法や15進法、100進法などになると使わないとまず無理です。 例えば、「20進法の時、 \(1ab32\times2cd\) の答えはわかる?」と言われたときにパッと答えられるでしょうか。 無理です。 しかも虫食い算を作るときはこれをなんどもやるわけです。
もちろん、この「掛け算表が必要」という問題の対策のために掛け算表を作ることができるExcellファイルを作ってみたり、 LaTeXで掛け算表を自動生成するパッケージを利用したりしていたわけですが、 それぞれ「複数の進法の掛け算表を見比べることが難しい」「あまりにも大きい進法だとはみ出してしまったり、見にくくなったりする」 などの不満がありました。
そこでその不満を解消するべく、今回ソフトを作成することにしました。
ソフトを起動するときに数字(ここでは仮に〈n〉とする)を与えると、〈n〉.csv
というファイルを生成し、その中に〈n〉進法の掛け算表を書き込みます。
この時、〈n〉進法の表記は〈m〉-〈l〉
(読みは「〈m〉ダッシュ〈l〉」といった感じでしょうか)という形で、
〈n〉が10より大きい場合でもアルファベットを使ったものにはしません。これは、アルファベットが足りなくなるほど〈n〉が大きくなった時に対応するためです。
例えば、12進法で通常2a
と表記される数は2-10
という風に表記し、5
は0-5
という風に表記されます。
また、表が大きくなった時でもどの数の積の結果なのかがすぐにわかるように、掛け算の形で記します。
そのため、12進法での掛け算 \(1b\times1b\) は11 x 11 = 10-1
と表記されます(x
は便宜的に掛け算記号を表しています)。
これらの結果は表の形をするようにならばせ、それぞれの式の間には", "
を挟みます。
そのため、3進法の掛け算表はこのようになります。
1 x 1 = 0-1, 1 x 2 = 0-2,
2 x 1 = 0-2, 2 x 2 = 1-1,
起動方法ですが、ソフト名を仮にmulttable
としたとき、起動する際には
$ mluttable 12
V
またはversion
が入力されたときはバージョン番号を、
H
またはhelp
が入力されたときはヘルプを表示するようにします。
引数が1よりも多い場合にはエラーを返すようにします。
仕様が固まったところでこれらの実装方針を示します。 まず、言語はHaskellを使うことにします。Haskellを選んだ理由は特にないですが、 強いて言えば5日くらい前に使い始めてみたので良い練習になると思ったからです。 C++やC#、RubyやPythonといったものは使いません。苦手なので。
1から〈n〉-1までのリストを2つ用意し、それらを組み合わせて(1個目のリストの数, 2個目のリストの数, それらの積)
となるタプルを全組み合わせで生成します。
そして、これらをもとに式を作り出し、あとはリストの要素同士を,
と改行コードで繋ぐだけです。
そしてそれをファイルに書き出します。
入力に対しての反応は場合分けを頑張ることで乗り切ります。
Haskellの特徴と構文をよく知らない人が多いと思うので、簡単に説明をします。
Haskellは静的型付け言語であり、かつ関数型言語であるプログラミング言語です。
静的型付け言語とは、値をその性質によって分類するときに使う「型」というものについて、
そのプログラムを実行する前に検査を行ってある程度の安全性を保障する言語のことです。
型とは、「値をその性質によって分類する」もので、例えば数字は「四則演算ができる」といった特徴を持つものとして分類し、特別にInt型
という型を与えます。
また、文字列は「一文字ずつ分解できる」「文字同士を結合できる」といった特徴を持つものとして分類し、特別にString型
という型を与えます。
これらのように型がきちんとついて何が嬉しいかというと、エラーを事前に見つけやすくなるということがあります。
例えば、整数を受け取ったら1増やして返すplus
という関数を考えてみましょう。
plus 1
は2
を返しますし、plus -1
は0を返します。そのため、この関数を「Int型を受け取ってInt型を返す関数」と呼ぶことが出来ます。
さて、この関数に文字列を入れてみるとどうなるでしょう。plus "kaisei"
としたときに何が返ってくるか予想がつきますか?
正解は簡単、エラーが返ってきます。
特別に定義されていない限り、文字列に対して「1増やす」なんていう操作はできないのです。
逆に言えば、これを逆手に取って「事前にコードをチェックしてplus
に対して数字以外が与えられていたら報告する」という仕組みを作ると、
非常に早くエラーを発見できることになります。
単純化すると「Int型を受け取る関数にInt型以外が渡されていたらエラーを出す」という仕組みになります。これが静的検査の概要です。
これを全ての関数や値に対して行い、対象となる型も大量に用意するととても便利になります。
ココらへんに関しては高校図書館にある「型システム入門 プログラミング言語と型の理論」という本
に詳しく書いてあるので基礎を学びたい人はぜひ読んでみてください。
関数型言語は、すべてのものを関数と値に分けて、これらを組み合わせてコンピュータに指示を出す言語です。 同じ値を与えると常に同じ値が返ってくることが前提となっていて、それが破られるものは特殊な形でしか利用できないようになっています。 小さな関数を組み合わせて大きな機能を作り上げられるのが魅力です。
[1,2,3,4]
のように、同じ型が並んでいるデータ構造をリストと呼びます。
同じようなものをまとめるときは非常に便利なものです。
これを扱う関数がいくつかあり、head
は一番左の要素を取り出すもので、
map
は関数を受け取って要素全体にその関数を適用するもので、
foldr
は、関数を受け取って、要素の右側から順に適用していくものです。
また、Haskellでは[1..5]
のように書くと、[1,2,3,4,5]
という1から5まで数字が一つずつ増加していくリストが作成されます。
例えばhead [1,2,3]
は1
を返し、
map plus [1,2,3,4]
はすべてに1が足された[2,3,4,5]
が返ってきます。
タプルは、関連する複数の情報を一つにまとめるときに利用します。
例えば、出席番号と名前を結び付けたいときは(15, "山田太郎")
などのようにします。
これをリストと組み合わせると非常に強力で、クラス名簿のようなものも簡単に作ることができます。
以下のコードを実装しました。Main.hs
で定義されるmain関数がソフトを起動したときに実際に動くものです。
ここでLib.hs
で定義された関数を使って結果を返します。
Main.hs
module Main where
import System.Environment (getArgs)
import Lib
main :: IO ()
main = do
args <- getArgs
if 1 == length args then
if head args == "V" || head args == "version" then
returnVersion
else
if head args == "H" || head args == "help" then
returnHelp
else
writeFileTable (head args)
else
returnError
まず、必要なパッケージなどをimport
を使って読み込みます。
次にmain
関数を定義します。この関数はIO()
型です。
まずはgetArgs
を使って、起動したときに入力したものを文字列のリストで受け取ります。
そして、このリストの中身が1でない場合はエラーを返すようにしています。
そして、この入力の値がv
かversion
である場合にはバージョン情報を、
h
かhelp
である場合にはヘルプを返すようにしています。
この時、returnError
・returnVersion
・returnHelp
はそれぞれLib.hs
で定義されている関数です。
この時、はじかれなかった場合はCSVファイルを実際に生成する関数であるwriteFileTable
にリストの中身を渡します。
もちろんこれもLib.hs
で定義されています。
Lib.hs
module Lib
(returnVersion,
returnHelp,
returnError,
writeFileTable
) where
import Data.List
import Control.Monad
returnVersion :: IO()
returnVersion =
putStrLn "(バージョン番号)"
returnHelp :: IO()
returnHelp =
putStrLn "(良い感じのヘルプ)"
returnError :: IO()
returnError =
putStrLn "error"
makeTable :: Int -> String
makeTable n =
let xList = [1..(n - 1)] in
let yList = [1..(n - 1)] in
let makeTuple n = map (\y -> (n, y, n * y)) yList in
let convert i = (show (i `div` n)) ++ "-" ++ show (i `mod` n) in
let makeCell (x, y, xy) =
show x ++ " x " ++ show y ++ " = " ++ convert xy
in
let mainList = map (map makeCell) $ map makeTuple xList in
foldr (\x y -> x ++ "\n" ++ y) "" $ map (foldr (\x y -> x ++ ", " ++ y) "") mainList
writeFileTable :: String -> IO()
writeFileTable n = writeFile (n ++ ".csv") (makeTable (read n))
まずはreturnError
などを実装します。これは文字列を表示するだけの関数なので特に難しいものはありません。
次に一番下で、ファイル書き出しを行うwriteFileTable
という関数を定義しています。
これは入力された数字をもとにファイルを生成して表を書き込む関数です。
ここで使われているwriteFile
という関数は、まずファイル名を受け取ってそれを生成し、
次に受け取った文字列をそのファイルに書き込むという動作をします。
書き込む内容は上で定義してあるmakeTable
という関数で自動的に作成します。
makeTable
では、まず1からn - 1までのリストを2つ用意します。
次にmapを上手く使って(かけられる数, かける数, 積)
のタプルのリストを作ります。
そして上手く定義したconvert
を使って式を完成させ、
最後にfoldr
を使ってカンマと改行文字で要素をつなげ、文字列を作成します。
これによって、makeTable
によって作られた文字列がファイルに書き込まれ、欲しいCSVファイルが完成します。
ここで作ったソフトは https://github.com/puripuri2100/multtable にあり、 作成したCSVファイルはCSVというフォルダの中にあります。 60進法の虫食い算を作る時などにぜひ利用してみてください。
パズル。この言葉を聞いたら、あなたは何を思い浮かべるでしょうか。
普通の人なら厚紙を組み合わせて絵を作る例のアレ、つまりジグソーパズルを思い浮かべるのかなと思います。パズドラやキャンディークラッシュといったスマホゲームを思い付く人も多いと思います。 ですが、こんな分厚い部誌のこんな辺鄙な所にまで目を通しているあなたなら、多分ちょっと捻くれたことを言って下さると思います。 数字は独身に限る、とか。
パズルと一口に言っても種類は様々で、ぱっと思い付くだけでも、クロスワードやイラストロジックを始めとするペンシルパズル、天秤でニセ金を見分けたり天使と悪魔に話し掛けたり川を渡ったりする論理パズル、勿論知恵の輪やルービックキューブ、変わった所では詰将棋なども入るかと思います。 ちなみに私は15パズルのようなスピードを競えるパズルが好きです。短時間で解けるパズルは頭のリフレッシュにもなります。
例えばこういう小難しいふりをした文章を考えるとき、小休止としてちょっとルービックキューブを、みたいな格好いいことができると凄く楽しいと思いませんか。 まあ私の手元には無いんですけど。お陰で大分煮詰まってきました。悪魔の爪が触りたい。
閑話休題。 様々な種類のあるパズルですが、ふと思ってみると、クイズや数学の問題などとの違いが分からなくなってしまうことがあります。 例えばいわゆる漢字パズル、中央の四角に何の字が入るかを当てるパズルはほぼほぼ語彙力勝負ですし、この部誌に載っているようなとても難しいペンシルパズルは全てのパターンを書き出して解く他無いこともたまにあります。
求められているものがただの学力や根気かもしれない、ということです。
では、一体何がパズルで、パズルの何が面白いのでしょうか。
どのご家庭にでもある一般的な広辞苑第五版を開いてみると、そこにはこう書いてあります。
『謎解き、判じもの。』
恐ろしく簡潔です。外国語だからでしょうか。 ちなみに広辞苑に判じもの意味は載っていませんでした。酷いと思います。 では実質三文字、『謎解き』がパズルの正体ということになります。再び広辞苑で引いてみましょう。
『謎の意味を明らかにすること』
はしごを外された気分です。せっかく辞書界の大御所であるところの広辞苑様に頼ったのに、あまり有用な答えは返ってきませんでした。 ……いえ、もしかしたら、もう答えは出ているのかもしれません。 この謎を明らかにするために、どのご家庭にもごく一般的にあるウィズダム英和辞典第四版を引いてみましょう。
〈puzzle〉 動詞 1,〈人〉の頭を悩ます 2,〈人が〉頭を悩ます、考え込む 名詞 1,理解できない事、難問、謎 2,パズル;ゲーム
少し、分かってきました。 まず、パズルは問題では無く、難問であるということです。 確かに、何か面白かったクイズや問題を「パズルみたい!」と人に話すとき、大抵その問題に対して、あなたは随分頭を悩ませ、ときに自分の力で、ときに答えを見て、ぽんと膝を打ったのではないでしょうか。 つまり、 「考え込まされるような事が綺麗に明らかになるようなもの」 を、人はパズル、あるいはパズルのようにと呼ぶのです。
少し辞書から言葉を補ってしまいましたが、おおよそこのような解釈で納得していただけるのではないかと思います。 ……これだと手なぐさみに私が解こうとしていたパズルは、片手間で解けてしまって全然パズルらしく無い、という事になってしまう気もします。ですが、例えば今の自分が簡単に解けてしまうようなパズルでも、かつての自分が頭を悩ませ解いたものは、きっと解法発見の鮮烈な快感と共に、パズルとして刻み込まれているのでしょう。 と言ってみると、恐らく大事なのは「明らかにする」という広辞苑で既に出ていた要素になるのかなあと思いつつ、その辺りは次代の副部長にやってもらう事にして、私はとりあえず一通り謎を解き明かした後のすっきりとした気持ちで筆を置かせてもらおうと思います。
2年間編集長をやりましたが、この2年間でいろいろな技術を試してきました。 その成果として今ここに部誌があるわけですが、今回は部誌をつくるまでの過程や そこに投入されている技術等を紹介していきたいと思います。 ちなみにですが、引き継ぎがあまり引き継がれなかったので自分以前の編集状況については 前日までドタバタで編集していたことくらいしか知りません。
夏休みまでパズルを作ります。パズルが無いと何もはじまらないのでパズルをとにかく作ります。 また、それと同時に手が空いている人が、パズルを解いて「解がただ一つに定まること」を確認します(我々はこれを「別解チェック」と呼んでいます)。 そして、解が一つであることを確認したら難易度を付けます。この部誌での難易度の基準は大まかにこのようになっています。
パズルができたらこれを綺麗に画像化します。 このときに使うのが「ぱずぷれv3」というサイト( http://pzv.jp/ )です。 このサイトはjavascriptを使ってパズルを画像化することができるものです。 さて、パズルの別解チェックもレベル付けも画像化も終わったらこれを紙面に配置してPDFを作成することになります。 部誌にはパズル本体だけでなく、その解答も載せる必要があり、さらにはいくつかの記事も必要ですのでこれらの作成・執筆も行います。
部誌のPDFファイルが完成したら印刷・輪転・製本を行い、完成したものが当日配布されます。
部活用のLINEグループがあるので、それぞれ個人用のアルバムを作成してそこに画像を追加することでパズルの提出を行っています。
編集者としてはLINEのアルバムは使い勝手が良いわけではないので変更したいところですが、 やはり追加する際の手軽さや様々なデバイスから扱えるという点で部員からするとやりやすいだろうということで続けています(新しいソフトを導入しても学習コストを考えると現実的ではないですしね……)。
昔はdropboxを使っていたらしいですが、2年前からGitLabのプライベートリポジトリを利用してバージョン管理を行っています。
画像ファイルが多いのでGit管理はあまり適しているようには見えませんが、 後述するようにSATySFiやLaTeXを使っているのでクラスファイルやパッケージファイルの差分を管理する際にGitはかなり役立ちます。
今は基本的に1人で編集を行っているので、masterブランチに直接commitしています。 そこまで厳密な運用を行っているわけではないので、ある程度パズルが溜まったらcommitしたり、記事ができたらcommitしたりといったくらいの適当さです。
去年はLuaLaTeXを使ってPDFファイルを作成していましたが、今年はSATySFiを使うことにしました。
理由はいろいろとありますが、LaTeXはメンテナンスが難しいことや複雑なことをしようとすると一気にコードが冗長になり読みにくくなることがあげられます。 Pandocを使ったりRe:VIEWを使ったりする方法もありますが、どちらもニポリを作るためには表現力が乏しいので不採用となりました。
今までSATySFiという単語が出てきたと思いますが、 ここからもどんどん出てくるので説明してしまいます。 また、この記事をこの先読み進めるのに必要な知識も説明します。
SATySFi(カタカナにするなら「サティスファイ」となるでしょうか)はつい最近発表されて今現在も発展し続けている組版ソフトです。 組版とは文字や図をページ上に配置することで、組版ソフトはそれを行うためのソフトです。
SATySFiの特徴として、“配置等の制御をすべて文字で行う”ということが挙げられます。 文字で制御するということで、SATySFiには高度なプログラミング機能が備わっています。
このプログラミング機能は大きな特徴を有しており、他の記事で紹介してあるHaskellと同じ関数型言語で静的型付け言語です。静的型付け言語なので型推論が強力で、そのおかげでエラー報告がかなり充実していてわかりやすいです。
PDFファイルを作成する過程を軽く説明します。
まず、メインとなる.saty
拡張子のファイルをSATySFiで処理します。
すると、SATySFiは.saty
ファイルが読み込んだ.satyh
を先にチェックして
エラーが出る箇所を探します。この.satyh
ファイルはユーザー定義コマンドや便利な関数がたくさん定義されているものです。
エラーが出ないことが確認されたら.saty
ファイルの中身を実際に処理して文字を並べていってPDFファイルを自動生成していきます。
SATySFiに標準で備わっている主要な型を紹介します。
上の三つはそれぞれ整数・小数・長さ(10mmとか12ptとかです)です。単純ですね。
string
型はなんの付加情報もない文字列です。^
という演算子で繋げることができます。
例えば、`kaisei` ^ `gakuen`
とすると`kaiseigakuen`
となります。
これは多くのプログラミング言語でありますね。
重要でSATySFi特有なのは下の4つです。inline-text
型は
組版上の情報も追加されたテキストです。
{テキスト}
のように、中括弧の中に書くことで入力できます。
このテキストの中で関数(コマンドと呼びます)は、\command;
のように、バックスラッシュから始まる命令を書き、最後にセミコロンを打つことで使うことが可能になります。引数を与えたい場合は\command(1)({text});
のように丸括弧にいれることで実現できます。
inline-boxes
型は、通常のinline-text列を文脈の保持するフォントや文字サイズなどをもとに
“組める状態になったグリフとしての文字”に変換したものです。
inline-boxes
型は++
という演算子を使って文字列と似たような感覚で繋げることができます。
block-text
型は'<>
という括弧の中に入れて書きます。
通常の文字としては入力不可能なので、括弧内にコマンドの形で入力します。
ブロック内のコマンドは+command;
のように、プラス記号からはじまる命令で書きます。
block-boxes
型はinline-boxes
型やblock-boxes
型を行分割した組みあがった段落として変換したものです。+++
という演算子を使って縦方向に繋げることができます。
この部誌には200以上のパズルが載っており、問題と解答を合わせると400を超える画像を適切に配置しなければなりません。 これを手動で行うのは大変すぎますし、変更が加わったときに一々手動で細かな調節や並び替えを行うのは不可能と言っても良い作業です。 そこで、パズル画像の配置を自動化することで編集作業を楽にすることにしました。
デザインの本質的な変更は行わないので、まずは去年までの部誌を眺めてみましょう(みなさんもぜひ今年の部誌のデザインを見ながらこの記事を読んでみてください)。 するとパズルを載せるときに必要な要素が見えてくるはずです。
まず、パズルのタイトルとルールと例題、そして最後に大量に問題です。 これらがあればパズルを載せられます。さて、タイトル・ルール・例題については自動配置とあまり関連が無いので今回はパスしまして、問題なのは大量の問題です。 この問題には作者名・パズル画像・レベルの3つ情報が必要であることはすぐにわかりますね(パズル番号は自動で付けられるのでわざわざこちら側が用意する必要はないですね)。 さて、この3つだけで良いのでしょうか……? 実はもう一つ必要です。それがパズル画像の横幅です。いくつかのパズルにおいて、通常のサイズより大きいパズルがあると思います。これらに対処するためにはパズル大きさ、特に横幅の情報が必要であることがわかります。
さて、必要な情報がわかったところでこれをどのような形で与えるかも重要ですが、ここは単純に(画像の横幅, 画像のファイル名, 作者名, レベル)
というタプルをリストにすれば良いでしょう。例えばこういう感じです。
ここで、横幅を直接30mm
とかの長さではなく、標準サイズへの倍率であるのは、HTML版作成や汎用性との兼ね合いからです。
[
(1., `puzzle/bijutukan/puri-1-Q.jpeg`, {ぷりにゃん}, 1);
(1., `puzzle/bijutukan/puri-2-Q.jpeg`, {ぷりにゃん}, 2);
(2., `puzzle/bijutukan/puri-3-Q.jpeg`, {ぷりにゃん}, 3);
]
さて、このデータを解答編でも使い回せるようになればさらに効率的に、間違いが無くなるでしょう。そのためにはいくつかの細工をしなければなりません。
具体的には、ファイル名の部分を「問題編では最後に-Q
を、解答編では-A
をつけるようにし、拡張子は.jpeg
で統一する」と決めた上で
ファイル名部分を`puzzle/bijutukan/puri-1`
だけにし、処理部分でファイル名を補完するようにするのです。
つまり、`puzzle/bijutukan/puri-1`
というデータを受け取った問題編作成関数は自動的に-Q.jpeg
という文字列を付け足して`puzzle/bijutukan/puri-1-Q.jpeg`
として解釈をはじめるのです。解答編では-A.jpeg
という文字列を付け足します。
こうすれば同じパズルの問題部分と解答部分のファイル名をhoge-Q.jpeg
とhoge-A.jpeg
に統一しておけば自動的に問題と解答がペアになってくれます。さて、データの形はこうなりました。
[
(1., `puzzle/bijutukan/puri-1`, {ぷりにゃん}, 1);
(1., `puzzle/bijutukan/puri-2`, {ぷりにゃん}, 2);
(2., `puzzle/bijutukan/puri-3`, {ぷりにゃん}, 3);
]
さて、データの形を決めたところでこれをどのように処理すればこのニポリのようなパズルの配置になるでしょうか。 答えはわりと単純で、
(画像の横幅, 画像のファイル名, 作者名, レベル)
という情報をもとにinline-boxes
型を作るinline-boxes list
になる++
演算子を使って横につなげていくinline-boxes
を行分割処理してblock-boxes
にするblock-boxes
にする過程で適切な位置に適切なスペースを入れる
実装もList.map make-ib-puzzle list |> List.fold-left (+++) inline-nil
のようにすれば良いだけ……なのですが、このまま愚直に実装すると行分割が行われないままパズル画像がページからはみ出していきます。
これは、パズル画像には行分割候補箇所が設定されていないからです。
通常の文字であれば、基本的には単語内では分割禁止で、単語間であれば分割しても良いというふうに設定されているのですが、画像に関してはそういうふうな設定が存在していません。なので、行分割候補箇所を挟み込んでいきます。
行分割候補箇所はdiscretionary : int -> inline-boxes -> inline-boxes -> inline-boxes -> inline-boxes
というプリミティブで作成することができます。引数の内容はそれぞれ「どれだけ行分割してほしいか」「そこで行分割されなかった場合に入るもの」「そこで行分割されたときに行末に入るもの」「そこで行分割されたときに行頭に入るもの」です。
それぞれ適切な値を入れて返ってくるinline-boxes
をそれぞれのパズル画像の間に入れ、後はSATySFiの行分割アルゴリズムに任せるだけです。
今回の部誌では
let break = discretionary 100 inline-fil inline-nil inline-fil
で定義されたbreak
を挟み込んでいます。
こうすると、行分割された際にinline-fil ++ (パズル画像) ++ inline-fil ++ (パズル画像) ++ inline-fil
のようになってちょうどよい配置となります。
これで完了と行きたいところですが、自動化するということは当然例外機構を組み込まないといけないということです。 具体的には、特殊ルールのパズルを載せるときにルールを書かなければいけない場合などです。今までは横に繋がっていただけのパズル画像にいきなり縦の流れを入れなければいけないのでかなり難しいです。
これを実現するためにSATySFiにはembed-block-breakable : context -> block-boxes -> inline-boxes
というプリミティブがあります。
これの役割は、「途中までinline-boxesっぽく扱われるが、評価される段になると直前で行分割されてblock-boxesのような挙動をし、終わるとまたinline-boxesに戻る」というもので、“inline-boxesに擬態化したblock-boxes”という言い方ができます。
embed-block-breakable
で特殊ルールの説明などをinline-boxes
に変換してそのままつなぐと前後に自動的に挿入されるスペースがいたずらをするので、これを回避する必要が出てきます。
通常のinline-boxesをInlinePuzzle (ib)
とし、変換したinline-boxesをBlockPuzzle (ib)
として扱い、この2種類の接し方4通り全ての場合のスペースの付け方を個別に設定してやることで正常にスペースが入るようにしました。
紙の枚数は有限ですが、ページ数はどこまでも増やすことが可能です。そのため、頒布可能冊数が減ることは容易に想像できました。 頒布可能冊数が減るとということは、本来受け取れるはずだった人が受け取れなくなるということです。 これは困るので、救済策としてWeb上にホームページを作成してPDFファイルを公開することにしました。しかし、PDFファイルが40MB弱にもなる巨大なファイルになってしまったため、同じ内容のHTMLファイルを作成し、公開することにしました。
とは言っても部誌と同じ内容のHTMLファイルを一から書くのはとても大変な作業で、部誌本体に変更が加わったときにその変更を取り込むのも大変でしょう。 そこで、PDFファイルを作成しているデータから自動でHTMLファイルを作成することにしました。
SATySFiにはPDFファイルを書き出すだけでなく、テキストファイルを書き出す機能がついています(masterブランチの最新版でないと使えません)。
コマンドで変換コードを書いてあげればそのとおりにファイルに書き出される便利機能です。
例えば、URLを出力する\url(`http://nipori.gitlab.io`);
のような使い方をする\url
コマンドは
let-inline ctx \url url =
HTMLBase.tag ?:[(`href`, url)] ?:(false)
tinfo `a` (fun tinfo -> url)
のように定義でき、\url(`http://nipori.gitlab.io`);
は
http://nipori.gitlab.io
のようにファイルに書き出されます。
これを組み合わせていけば自由にファイルを作ることが出来ます。
そして、実際この機能を使ってPDFファイルを同じ文書構造になるようなHTMLファイルを作成しています。
ここでPDFモードで使われているコマンドをHTML書き出しように別ファイルで定義して、同じファイルから自動でHTMLファイルとPDFファイルが作成されるようにしています。ちなみに、デザインの制御はCSSで行っています。
HTML書き出しとPDF書き出しの結果がほとんど同じようになるようにコマンドの記法を考えるのが難しかったです。
部誌を作るときに使った技術や設計をいくつか紹介してきました。 まだまだ書いていない部分もありますが、苦労や工夫のもとでこの部誌ができているということに思いを馳せていただけると幸いです。
今年は部Tを(おそらく)はじめて作成しました。 文化祭当日、青い部Tを着ている部員を見られることでしょう。 なにか質問等ありましたらぜひ声をかけてみてください。 さて、この部Tがどのようにして作られたのかを記事にしたいと思います。
例年、開成生が多く来場する参団のため、部員を見分けるのが困難となっていました。 これでは部員に用がある際に困るのではないかと考え、部員を見分けやすくするために専用のTシャツを作ることにしました。
大まかにデザイン編、とくくりましたが、Tシャツのデザインには様々な要素があります。もし何も決まっていなければ、Tシャツの色すら定まりません。 今回はTシャツ作成の発起人である副部長が大まかなデザインの構想を提案をすることから始まりました。
今回、単色のTシャツで、左胸と背中にプリントをしたTシャツを作成することにしました。Tシャツの色は無難で後述の背中デザインにもマッチした水色、胸にはこのパズル研究部のロゴという手堅い仕上がりだと思います(図一)。ちなみにロゴのデザインは四マス四方の変則数独になっています。
そして背中のデザインですが、まずはこれを見て下さい(図二)。
このドット絵をカラーロジック化して背面イラストにする予定でした。左が初期案、右が修正を重ねたものです。モチーフは「不思議の国のアリス」よりアリスです。分かるでしょうか。
しかしまだカラーロジック化していないので、実際の背面プリントとは大きく異なります。ここまではFireAlpacaというフリーペイントソフトを使って作業していたのですが、ここからはカラーロジック作成用のLogiNekoというフリーソフトを使用しました。
そして、カラーロジック化やTシャツにする上でのデザインを行ったものがこちらになります(完成図)。
ドット絵の状態から更に変化していますが、これは主に別解を消去するためのものです。別解というのはパズルに解が複数存在してしまうことで、カラーロジックの場合はイラストそのものに微修正を加えて解を確定させる必要があります。 左上の謎の英文は不思議の国のアリスの原作から引用したものです。パズル研究部なのでpuzzleの単語が入っている部分を引っ張ってきています。
後は細かい修正を加えた後、発注や入稿などと言った作業を行うので、そちらは作成編で詳しく記述します。
さて、原案は述べたとおりのものでしたが、部員から原案に反対する意見が出たので部員からもアイデアを募集することにしました。結果、アリスの絵を含めて3つの案が出ました。
しかしこのA案は7進法でどこかに明記しないと解けないということで、OBの力を借りるなどして以下の10進法覆面虫食い算のデザインに修正し、さらにアリスにも完成図と同じになるように若干の 修正をしたうえで投票を行いました。
結果、修正A案に決定し、作業を進めることになりました
パズルとしてはスタイリッシュで格好いいと思いますが、どうやって解くんだコレ
とはいえこれでデザインが完成したので、次は実際のTシャツを作成する段階に入ります。
紆余曲折の末デザインが決定したので、実際に画像を作成することになりました。 色々と事情があり、急遽編集長が作ることになりました。 LaTeXで虫食い算を作るパッケージ(編集長作)を利用して一旦PDFファイルを作り、これをさらにソフトを使って透過PNGに変換するという 非常に面倒な作業を行いました。が、それでは背中が寂しいということで参団名である「Enigma Sechzehn」という文字を追加することになったのですが、 作成した虫食い算のPNG画像を貼り付けてその下に文字を InDesignで打ち込んで、また透過PNGを出力するという非常に面倒な作業を行います。 部T作成の責任者がデザインの修正指示を担当していたのですが、編集者と完成イメージの共有ができなかったため、 作業が難航した上、結果も二人共がいまいち納得の行かないものになってしまったまま締め切りがきてしまいました。
これで画像が完成したので今度は発注作業に入ります。 まず、完成イメージを部員に見てもらい、大体の注文数を把握します。 次に、発注する会社を選ぶのですが、最近はオリジナルTシャツの作成を行っている会社が案外増えていて 選択肢は豊富にありました。しかし、前述の事情で時間があまりなく、吟味の余裕が無かったので適当な会社を選びました。 この会社は去年の文化祭のTシャツの作成を担当した会社だったのですが、1000人以上が購入する文化祭Tシャツとは勝手が違い、少し割高についてしまいました。
注文は入力フォームに必要事項を記入するだけで済むのでとても楽でした。 見積もりや支払い方法などはメールでスムーズにやり取りを行えたのでその後は特に苦労することなく無事にTシャツが届き、 全員に渡すことができました。
急なデザイン変更などで予定が狂うなどありましたが、こうしてTシャツが完成しました。 締め切りには気をつけて、デザインを変更するなら早めにしないとダメですね。ともあれ無事に配布まで終わったのでよしとしましょう。
ここでは、恐らく初めての試みである、パズ研の合宿について書きたいと思います。文字ばかりになりますがすみません。筆者は合宿の運営に関わったわけでもなく、構成からして、かなり偏見に満ちた記事となりますが、パズ研では全員が異なる立場にあるので、このような記述になるのは仕方ないと思います。
パズ研で合宿をしたいという意見は、筆者が中1の時から存在した。オリンピックセンターでやるという案や、数研と合同でやるという案もあった。しかし、ほとんどの人が現実的でなくやる必要もないと考え続けていて、顧問にも反対されていた。そんな中、高1の1月頃に、合宿の予定が固まったと聞いて驚いた。しかも、高校教員室の上にある第一会議室に寝泊まりするというもので、そもそも学校に泊まるのが制度的に可能なのか心配であった。
しかし、合宿が現実になると、部長が泊まるのを拒否するという不自然な事態が発生したこともあり、高1は副部長兼自称合宿係1人しか泊まらなかった。筆者も非常に迷ったが、申込書が渡されるのが遅く親に確認する時間もなかったため、泊まらずに家から通うことになった。
3月26日(火)〜28日(木)に行われた春合宿では、OBを含めて通常より多くの人が集まった。部長も3日間とも、午前中に過去の部誌から抜萃したパズルが6問並べられたプリントを参加者に配り、しばらくしてから解説も行われた。1日目は他にも、実際のパズル大会と似た形式の模試のような物が行われ、2日目はその解説、3日目にはOBによるパズルの作り方の講義のようなことも行われた。特に模試では解きながら会話のドッジボールが起こったり、1日目に来れずに3日目に解いた人が圧勝したりして盛り上がった。通常の下校時刻である17時を過ぎると次々に帰って行き、筆者も特にすることがなくなり2日とも18時40分頃には泊まる5人だけとなった。
実は、春合宿より前に、修学旅行で同学年のパズ研部員の内6人が奇跡的に同じコースを選択したことが分かっていた。これは、春合宿より人数が多く、筆者が学校に泊まるのを妨げた要因の一つでもあった。6月4日(火)〜7日(金)の3夜同じ宿に泊まった。4日は部Tについて激しい議論が行われ、部長は急遽その日中に虫食い算を作らされることになった。詳しくはTシャツの記事を見て欲しい。しかし、その後は特にパズ研らしいことは行われなかった。
かつては、あれは最初で最後の無名の合宿だと思っていた。ところが、中1にパズルの作り方を教え、部誌のパズルを増やすという目的で、夏休みに再び合宿が行われることが決定した。この時はお知らせの配布も早く、申し込んだ人も倍増し10人であった。筆者もあまり迷わず申込を決めた。泊まらない参加者は春より少なかった。相変わらず部長は泊まらず、解かせるパズルのプリントを作っただけであった。プリントは春より多く、簡単な問題集と難しい問題集の2種類×3日分作ったが、その分学校での滞在時間が短かった。
8月6日(火)、重い荷物を持って冷房が動き始める前の食堂に集合する。第一会議室では折り紙研究部が合宿をするため、春より狭い第二会議室で行われるようなので、日中の活動は別に部屋を取るという案もあったが、連絡がない。部長はしばらく鍵を取っているのかプリントを作っているのか知らないが、校内をしばらく動き回っていて、先が思いやられる。結局、活動は全て第二会議室で行われることが決定し、その後机を動かしたり貸し布団屋から布団を運び込んだりして、本格的な活動を始められるまで、1時間近くかかってしまった。何人かが問題を解き終わると、昼食について話し合う。春合宿と違い食堂が営業していないので、全て外で調達しなければならない。昼食後は部室から知恵の輪や対戦型パズルが運び込まれる。それで遊ぶ人、色々なペンパを解く人、部誌を編集する人、OBと話す人、部屋の中を漂う人などが混在し、通常活動と同様適当に活動する。夕食は再びコンビニかスーパーで買い、風呂はすぐ近くの銭湯を利用する。そして、そのまま深夜まで盛り上がり、寝るのは1時を過ぎた。
2日目は7時過ぎに起きた。部長は来なかったが9時頃にプリントのパズルを解き始めた。1日目はほとんどパズルが生産されなかったので、全員にパズルを作らせようとした。前回よりは短いが作り方の軽い解説が行われ、中1もいくつかパズルを作った。昼食後に部長が来る頃から、部誌に載せる予定のパズルの本格的な別解チェックも行われた。泊まらない人が帰っても作業を続ける人もいた。この日の夕食は全員で弁当屋に買いに行った。OBも学校に残れる限界である22時の直前まで残り、証拠写真を撮るなどした。
3日目は全員が寝坊し、8時15分頃に起きた。そのため朝食後はすぐにパズルを解き始めた。そして2日目同様パズル制作や別解チェックが行われた。13時半頃には貸し布団屋のトラックが到着したので運び出し、活動と並行して少しずつゴミや私物の片付けが始まった。部長が到着したのは片付けが始まってからであった。その後、机の配置などの現状復帰を行い、17時に会議室を閉め、解散となった。
この代にとって、文化祭までの半年間は特に密度の濃い物となった。これらのパズ研合宿は全て終わりを告げたが、部活に積極的に参加する下級生も増え、顧問も賛成するようになり、来年以降も合宿を行いやすくすることができた。OBも参加していたので、合宿が毎年続けば、筆者の代も再び集まって活動することができる。受験勉強が終われば部長も泊まってくれるかもしれない。合宿は、元々人数が多いこの代が成し遂げた最大のことの一つである。とはいえ、これからの代も部の歴史に何かを残して行けば、合宿を始めたことなど小さいことになってしまうだろう。
筆者は所詮部室管理人という、役職ありと役職なしの境界のような立場ですが、これからの末長い部の繁栄を願います。
昨年度の表紙パズルの問題です。ヒントは「和は15」でした。
以下の四角の中に、同じ数が1組あります。ただし、数字を分解したり、計算したりしてはいけません。
以下の数及び漢字の列は、ある法則に従い並んでいる。法則を見抜き、□に当てはまる数・数字を答えよ
下に示す言葉は、ある法則に当てはまれば「ある」、当てはまらなければ「ない」に分類される。このとき、「ある法則」を答えよ(左から(1), (2), (3)です)。
ヒントを参考に、空欄に当てはまる言葉を書いてください。
A君は52枚のトランプ(ジョーカー除く)を持ってきてその中から適当に6枚引いたところ、次のようになったという。
このとき、引いた6枚のトランプに書かれている数字を答えよ。
ヒントは「和は15」でした。和が15、そして妙な位置にある6と9といえば \(3\times3\) 魔法陣ですね。これさえ思いつければ非常に簡単です。 この6と9に当てはまるように魔法陣を書き、その数字順に文字を並べていきます。 すると「文化祭たの6しい9」という文字列が出てくるはずです。 6と9は無視していいので、 答えは「文化祭たのしい」になります。
中央左よりの「4」と、右下の「ここは中学4階」の"4"が共通しているので、答えは「4」
2, 2, 7, 10, 13, 13