獲得のあの塗分けを一発で描く

 

\begin{tikzpicture}
\tikzset{x=0.2cm, y=0.2cm};
\foreach \x in {0, ..., 28}{
  \foreach \y in {0, ..., 28}{
    \tikzmath{
      \n={\x-int(\x/4)*4 == 0};%trueつまり4 | \xなら1, falseなら0
      \m={\y-int(\y/4)*4 == 0};
      \k={\n==\m};
    }
    \ifnum \k=1 \else
      \fill (\x,\y) rectangle +(1, 1);
    \fi
  }
}
\end{tikzpicture}

こんな風にTikZで求めた数値をそのままTeX標準の\ifoddなどに突っ込むと怖いので一旦TikZで真理値化してから突っ込むと良いんですかね

もしかしたらそもそも\ifnumに受け渡したりなんかせずにTikZのコマンドだけで解決するのかもしれませんが、その場合はあのクソでかマニュアルを読み進めているうちに見つけることになるのでしょう

 

ぺりをだねぇ

foreach文で割り算

 

foreach文の思わぬ使い方

正の整数を正の整数で割ったときの余りの計算をforeach文で行うことができますが、ここで注目してほしいのは大小評価による条件分岐をしていないことです。

 

入力:

\begin{tikzpicture}
\tikzmath{
  \n=334;
  \m=13;
}
\global\edef\divisor{\n}
\global\edef\divisible{\m}

\foreach \p in {-m, 0,  ..., \n}{
  \tikzmath{
    \l=int(\n-\p);
  }
  \global\edef\remainder{\l}
}
\end{tikzpicture}
\divisor を\divisible で割った余りは\remainder です

出力:

334を13で割った余りは9です

 

なぜ-mからか?

\foreach \p in {0, \m,  ..., \n}だと\n<\mのときにバグります。例えば

7を13で割った余りは-6です

となります。バグの理由はforeachの仕様(2つ目までは必ず実行する)に由来しています。

 

なぜ\globalが必要か?

foreach文中の変更はローカルで、ループが進むたびに捨てられるデータであるためです。

 

TikZパッケージのこれくらいの使用は想定されている気がしますが、うまく使うと想定外のことができるのかもしれません

 

ぺりをだねぇ

本文中の「ぺ」をすべて「ぺりを」に変えたい

 

本文中の「ぺ」を全部「ぺりを」にしたくなることはありませんか?誰しも一度はあると思います. 今回はこれを実装しようと思います. 

 

\periwoと\endperiwoで挟まれた部分に対してそのような処理をしたいとします. 

 

方針1

\@tforを使う:一文字一文字が「ぺ」かどうかを判定すればよい. 入力する文字列が長すぎると困ったりするのかな, よくわからないけど今回は@tforの話をしたいわけではないので今後の課題ということで……

 

方針2

今回はこっちがメインです. \periwo の直後のトークンXが「ぺ」かどうかを判定し, そうならば「ぺりを\periwo」, 異なれば「X\periwo」を返す, という方針で書きたいとします. この方針そのままだと別の制御綴を挟むとヤバいですが, 今回はただの文字列に対して動くことを目標として, 一旦見逃すことにします. 

 

さて, 上の方針は次が可能であるためできそうです:

\def\testa#1{#1が先に来て\testb}

\def\testb#1{#1が後に来る}

 

入力:testa ぺり

出力:ぺが先に来てりが後に来る

 

\defはあくまで{}内の置き換えにすぎず, 中身の展開はしないことがポイントです. 

となると次のようにしたくなります. 

 

\def\periwo#1{%

  \def\karia{#1}%

  \def\PE{ぺ}%

  \ifx\karia\PE

    ぺりを\periwo

  \else

    #1\periwo

  \fi

}

\def\endperiwo#1{}

 

こうすると, 例えば

\periwo っぺの法則\endperiwo

は順に

・っ\periwo ぺの法則\endperiwo

・っぺりを\periwo の法則\endperiwo

・っぺりをの\periwo 法則\endperiwo

・っぺりをの法\periwo 則\endperiwo

・っぺりをの法則\periwo \endperiwo

・っぺりをの法則\endperiwo\periwo 

・っぺりをの法則

と展開されそうです. しかし, 実行してみると永久に出力が得られません. なぜか. 

 

それは, \ifx文中の\periwoが次の制御綴\elseや\fiを引数として読んでしまい無限ループに入るためです. そのため, この展開を制御するために例えば

 

\def\periwo#1{%

  \def\karia{#1}%

  \def\PE{ぺ}%

  \ifx\karia\PE

    \def\karib{ぺりを\periwo}%

  \else

    \def\karib{#1\periwo}%

  \fi

  \karib

}

とか

\def\periwo#1{%

  \def\karia{#1}%

  \def\PE{ぺ}%

  \ifx\karia\PE

    \def\karib{ぺりを}%

  \else

    \def\karib{#1}%

  \fi

  \karib\periwo

}

とか

\def\periwo#1{%

  \def\karia{#1}%

  \def\PE{ぺ}%

  \ifx\karia\PE

    ぺりを%

  \else

    #1%

  \fi

  \periwo

}

とかするなりの方法を取ることでうまく行きます. 

 

でもこれは人工的なのでもっと直接的に制御したいです. そこで次のことを考えました:\periwoより前に\elseや\fiをTeXが読めたら良いのでは?つまり, 

\def\periwo#1{%

  \def\karia{#1}%

  \def\PE{ぺ}%

  \ifx\karia\PE

    ぺりを\expandafter\periwo

  \else

    #1\expandafter\periwo

  \fi

}

とすれば動くのではないか?……

しかし, いざこれを実行してみるとバグります. これはいったい何が起きているのでしょうか. そもそも\elseや\fiを「展開する」とはどういうことなのでしょうか. それがわかったとして, もし\fiを先に展開してしまったら「\periwo」は読まれることになるのでしょうか. もっと言えば\expandafterは先に進んだ後に「戻る」ということをしていますがこれは何なのでしょうか. 

 

また根本的な部分で知識が抜けているのかもしれません. 現在のぺりをには理解しかねました……

 

ぺりをだねぇ

 

3/7追記:最後の例は\endperiwoの定義を\def\endperiwo#1#2{}にするだけで解決しました. \def\endperiwo#1{}だと, 最後の\endperiwoの引数が\expandafterになって\periwoが余るというオチで, ただの初歩的なミスでした……

{を読んだら先に}を読むのかい?読まないのかい?どっちなんだい!

 

 

マクロへの代入

\def\staremph #1は#2である. {☆#1☆は☆#2☆である.}

 

入力:\staremph 吾輩は猫である.

出力:☆吾輩☆は☆猫☆である.

 

入力:\staremph 吾輩は猫であるのである.

入力:☆吾輩☆は☆猫であるの☆である.

 

入力:\staremph 吾輩は朝は猫である.

出力:☆吾輩☆は☆朝は猫☆である.

 

入力:\staremph {吾輩は朝}は猫である.

出力:☆吾輩は朝☆は☆猫☆である.

 

→{}はカタマリになっている

If文

入力:\if aa一致\else 不一致\fi

出力:一致

 

入力:\if a{a}一致\else 不一致\fi

出力:不一致

∵\ifの直後の2トークン, つまりaと{の一致をチェック

 

入力:\if {a}a一致\else 不一致\fi

出力:不一致

∵{とaは不一致

 

入力:\if {a}{a}一致\else 不一致\fi

出力:不一致

∵{とaは不一致

 

入力:\if {{一致\else 不一致\fi

出力:一致

 

→if文は本当に文字通り直後の2トークンの一致を見ている

 

マクロもう一度

\def\macrob #1#2#3.{1:#1 / 2:#2 / 3:#3}

 

入力:\macrob これはペンです.

出力:1:こ / 2:れ / 3:はペンです

 

入力:\macrob {これ}は{ペン}です.

出力:1:これ / 2:は / 3:ペンです

 

入力:\begingroup これ\endgroup は\begingroup ペン\endgroup です.

出力:1: / 2:こ / 3:れはペンです

 

「{これ}は{ペン}です.」のトークン分解は一文字一文字になるはずなので, 1トークンずつ引数に突っ込んでいくという解釈は誤りで, マクロの定義においてはトークンよりも{}囲いの方が強いということになるが……状況によってそれが異なるとなるとどうしたら統一的に解釈できるのだろう. 

3つ目の例を考えると{}に文字列としての一致を確認していることになるが、だとしたら引数を囲む{}の内部に\begingroup \endgroupの意味での{}があったとして、この}と引数を囲む}をどうやってTeX側は区別しているのだろうか?

 

根本的なところで何か知識が足りない気がしてきた, 一旦これについて考えることはやめよう. もうわからん.

 

ぺりをだねぇ

ゆがみ

 

はじめに

OMCの新制度「Contribution」の公表にあたって中高生に向けて話をする予定でしたが、撤回にあたって少し違う話をします。

 

まずはmapleの声明

続・OMCとどう向き合うべきか - mapleの自由帳

を読んでください。これを読んだという前提で話をします。

制度自体の問題点はおおむねmapleが指摘した通りなので、もう少し一般的なことについて話すことにします。

 

お金の問題

mapleが指摘していますが、改めて問うことにします。

 

writerやtesterの作業について、「本来はお金がもらえる作業であるが、黎明期だから仕方ない」という感覚はありますか?中高生はバイト経験が浅いこともあり、持ち合わせていない人が多いと思います。

わかったうえで活動をしているなら良いのです。わかっているのなら良いのですが……

それが自分の役に立つ作業かそうでないか、などといったことは関係ありません。むしろ「自分のためになっており、それがお金の代わりに十分になっているから、何も問題ではない」と思っているなら、いつでもやりがい搾取の被害者になります。さらに、作業に「責任」を持つことになるなら、それに対しても本来はお金が発生します。

 

上記の感覚をボランティアが失うと、運営ですら無意識のうちに搾取が始まります。この点、ただ働きをしていることと、それが当然視されていることには大きなギャップがあります。皆さんが今後もwriterにせよtesterにせよこのプロジェクトに関わっていく中で、運営にとってもユーザーにとっても後者のようには絶対になってほしくないのです。

 

今後に向けて

今回の件に対する批判として、こういった角度からのものは(少なくとも私の見える範囲には)見受けられなかった時点で、もう当たり前になっていたのかもしれません。  
繰り返しになりますが、ただ働きをしていることと、それが当然のこととみなされていることには大きなギャップがあります。このプロジェクトがボランティア無しには成り立っておらず、そのボランティアの多くが中高生である以上、尚更これは大事なことです。労働に関する法律に疎い中高生への配慮を完全に運営に押し付けるのも厳しい話です。運営が無意識のうちに道を外さないようにするためにも、中高生も自分のこととして認識してほしいと思います。

Contributionが廃止されたとはいえ、tester制度自体に潜む問題点は議論の余地が残されていると思います。改善は難しいにせよ、問題点が明確に言語化されておりそれをお互いに共有した状態にはできるはずです。多くのユーザーの協力のもとに成り立っているプロジェクトである以上、改善に向けた筋道を探すうえでも必要なことではないでしょうか。

「ビジネスとはそういうものだ」という言葉は、”顧客側には”関係ありません。エスカレートする前に躊躇わずに意見をする方が、ユーザーの声が運営に届くことで健全な環境に近づくと思いますが、どうでしょうか。

私はもう脱退してしまったので、以降私が暴走に気づくとすればもう引き返せないところまで行った後だと思います。そうならないよう、皆さんが皆さん自身でよりよい環境を求め続けるような場となることを願っています。

競争の構造

mapleの声明の一節

正直なところ、競技数学というのは、それが「競技」の形をとってしまっているがゆえに抱える問題が少なからずありますが、(以下略)

について考えることにします。私の主観が多く含まれますがご容赦ください。

 

まずは皆さんがどういった理由で(writer、tester、solverの)活動をしているかを落ち着いて考えてみてください。そもそも自分の意思だと思っているものは外的な影響を案外受けているものです。そういった意味で、「落ち着いて」考えてみてください。

 

話は少し変わりますが、このプロジェクトにより今の生徒は毎週のように競い合うのが暗黙の了解になっているように私には見えています。今の様子を見ていると遠くからでも(良くも悪くも)価値観の大きな変容を実感しています。  

このプロジェクトが始まる前は、試験の直前期は代表選考において勝ち進めることを目標とした勉強になってしまうにせよ、基本的にはじっくり自分のペースで理論を学び問題を考えるのを楽しむという世界だったと(少なくとも私は)思っています。そのため、こういう楽しみ方もできるようになったのか、と思う一方で、今は一年中競い合うことによって「休息期」のようなものが無くなり、むしろ価値観の単一化が進んでおり、自己暗示をかけて強迫観念に囚われている人が(楽しんでいるにせよ楽しんでいないにせよ、意識的にせよ無意識的にせよ)増えているのではないかという不安があります。

これは勝手な憶測かもしれませんが、このプロジェクトの中高生ボランティアへの依存度の高さは、それを利用している部分もあるのではないかと危惧しています。  
競い合う様子を常に見ることができるようになり「実力」とされるものが公式に数値化されてしまっている今、競争の構造が少なからず悪用されている側面はありませんか?「自分からより積極的に関わっていかなければならない」という感覚に囚われているということはありませんか?

 

勿論のこと本当に純粋に楽しんでいる、自分の意思で貢献している、というのなら良いですし、まだそうであることを願いますが……最初はそうであったとしても振り返る機会がなければいつの間にか歪んだ形になっていくものです。最初に「落ち着いて考える」と言ったのはそういう意図です。一度初心に立ち返ってみてはいかがでしょうか。

 

皆さんの今の立ち回り方は一つの競技数学に対する向き合い方でもありますが、他にも様々な向き合い方もあるということは一つ伝えておきたいと思います。その向き合い方が自分に合っているなら良いですが、自分に合っていない向き合い方をしてモチベーションを失ってしまったり、無駄に時間をとかしてしまったり、楽しめてもいないのに目標から離れた方向に走ってしまったりするようでは元も子もありません。

 

最後に

これを読んで皆さんがどう思うかの方が大事です。この記述は完全に間違っている!と思うのなら、なぜ間違っているかが言語化できていればそれはそれで良いです。また、これを鵜吞みにするのも危ないのできちんと自分で考えてください。あくまで一人の人間の所感として読んでいただければと思います。

 

このプロジェクトが始まってからいつの間にか2年が経過しています。運営、ユーザーの全員で一度在るべき姿について落ち着いて考え直す頃合いではないかと勝手に思っています。まあもう今更どうこうできることでもないのかもしれませんが。

 

ぺりをだねぇ

「ぺりを」の由来

 

あまりにも何度も聞かれるので、まとめることにしました。

 

時は2020年1月。高2の1月ということで、最後のIMO代表選考のシーズンがやってきました。JMO入賞経験者は予選が免除になるので、それはどうでも良かったのですが、問題は本選です。

去年代表になったのにここで本選に落ちるわけにはいかない。

これにつきました。そこで、

本選は落ちたくないので協力しよう。本選に向けた対策としてAopsで問題を解き、そのうち良質だった問題を共有することで、クソ問に悩む無駄な時間を減らそう。

といった旨の内容をmapleに持ちかけました。お互いにとってWin-Winだろうということで、この企画はもう一人(A君とします)を招いて始まりました。

TwitterのDMでは不便です。当時はSlackが無料プランでも優秀だったので、その昔に行った競プロに見せかけた数学のコンテストMathCoder001を行ったことを思い出し、その準備に用いたSlackのワークスペースで行われることになりました。

 

さて、Slackのチャンネルには名前を付ける必要があります。特に何も思いつかなかったので、ふと頭に思い浮かんだひらがなにしました。「ぺ」でした。チャンネルの名前は「ぺ」になりました。

 

解いた問題で良かったものを投稿し、その際JMO本選だったらどれくらいの難易度かを書き、その問題の返信に超略解を書く。他の人は解けたらスタンプを押す、というシステムで運用されました。押していたスタンプはサソリ、芋虫、蜘蛛などキモめの虫ばかりでした。たまにヒヨコのスタンプも押されました。ヒヨコのスタンプを押して、次に炎のスタンプを押して、目玉焼きが載っているフライパンのスタンプを押すとそれっぽくなります……そんなことはどうでも良くて、これはどこかで聞いたようなシステムですね。そう、これが後のごち数の原点となっています。

 

ある日、A君が「宇都宮に来た」と投稿しました。するとmapleが一言「食べた餃子の数だけ問題投稿な」。かなりの数の餃子を食べてしまったA君はしばらくの間餃子に束縛されることになりました。

 

しばらくして、ふとトリニダード・トバゴ料理の話になりました〔注:ルーマニア選抜の1Aの出典。解けなかった僕とS氏で擦り続けています〕。ググって出てきたものは「コーヒールスープ(Cow Heel Soup)」でした。説明を読むと

骨付き牛足(肉はついていない)にいも類バナナ類ダンプリング(すいとんのようなもの)などが入っています。

とのこと。出ましたダンプリング。世界中ダンプリングです。そこで我々は気づきました。そう、我々はロシアに行ってロシアのダンプリング、ペリメニを食べるために頑張っているんじゃないかと。なんという偶然でしょう。チャンネル名は「ぺ」ではありませんか!

 

以降我々(僕だけかもしれない)はピエロギ・ペリメニという響きにハマりました。少なくとも僕はアカウント名をペリメニに設定しました。

皆さんも「○○だなぁ」型のツイートをすることはありますよね?そのとき「みつを」と書きたくなりませんか?

ペリメニ×みつを=ぺりを

これが誕生の瞬間です。「ぺりを」の響きは完璧です。生まれてしまった以上消滅することはありません。アカウント名が変わった今も使い続けています。

 

結局コロナが始まりIMOロシア大会はオンラインでの開催となりました。結局ペリメニを食べることはかないませんでしたが、人と一緒に問題を考えることの有意義さを感じる良い機会となりました。「ぺりを」とつぶやくたびにそんなことを思っています。嘘です。

 

ぺりをだねぇ