03/01(月)
日曜日の31時に週記を投稿してから、寿司打を少しやった。久しぶりに高級コースで+10,000した。手元を撮影しようと思ったがスマホの三脚などないしなあ……で諦めかけたが、ふとWebカメラが使えることに気づく。モニタ上部に設置したまま限界まで下に向けると、いい感じに机の天板だけが映る(後から気づいたが、これは動画編集でどうにでもなることだった)。それで、適当にお手軽コースを撮影して、上下反転して撮影されているのを直してTwitterに投稿した。
「ひよこピヨピヨ」は人間工学的に無理 pic.twitter.com/MhZZ6nSkEX
— こたつがめ (@kotatsugame_t) 2021年3月1日
動画が終わってから8秒くらい無の時間があって悲しい。聞くところによれば、オブジェクトの最初と最後を切り落として先頭に詰めただけだと、元の長さ分の尺が確保されてしまうのではないかとの話だった。
午前10時半に布団に入ってしばらくハーメルンやなろうを読んでいたが、どうにも腹が減る。仕方なく食事をし、さらに1時間程度なろうを読んで、午後0時半に寝落ちした。
午後8時半くらいに目を覚ました。今週からサークル解説会は春休みなので、思うさま寝ていられた。午前0時半くらいまでそのまま布団でなろうを読んでいたが、メールを確認すると4年セミナーの配属が決定されていたらしいので、確認のために布団を出てパソコンに向かった。
4年次ゼミの割り振りについて、現在僕が第一希望にしているゼミは定員より多い人数が希望しているため、何人かを第二希望以降に回す必要がある。
週記(2021/02/01-2021/02/07) - kotatsugameの日記
こういうことがあって、周りの人の取得単位数など気にもしたことがなかったためアンケートの内容を見て怖がっていたのだが、無事第一希望のゼミに配属された。ホスフィン曰く、僕が希望しているゼミに人が集中しているとはいっても、そこで扱う4冊の教科書のうち僕が希望しているもの以外を目当てにしている人が多いのではないか、とのことであったから、そういうことなのだろうと思っておく。
2月が終わっていたので、また読書冊数の集計をしてツイートしておいた。
2月の集計
— こたつがめ (@kotatsugame_t) 2021年3月1日
買った:17冊
読んだ:14冊
積読:+3冊
積読(累積):-2冊
午前1時、また布団に戻ってなろうを読み始めたが、午前2時くらいにすぐ寝落ちしたようだ。
03/02(火)
午前7時起床。またなろうを読み続ける。せっかく朝に起きたのだから生協に行って本の受け取りでもしようかと考えたが、どうにも体が動かず、午後7時くらいまでなろうを読み続けた挙句また寝落ちした。
昨日から今日の午前9時半くらいまではこの作品を読んでいた。
https://ncode.syosetu.com/n2296ez/
これは「うちの脳内コンピューターが俺を勝たせようとしてくる」の作者の別作品なのでいずれ読もうとしていたのだが、どうにも設定や内容が肌に合わなかった。知識チートでNAISEIする話、まではよかったのだが、平凡な主人公が曖昧な知識で物事を推し進めようとしているのが合わなかったのだろう。身の丈に合わないことをしている、と感じてしまって、おしまいだった。知識チートもので、Wikipediaか何かのように正確かつ広汎な知識を披露する主人公が揶揄されることもあるようだが、僕はそうやって振り切ってくれたほうが好きである。
そのあとはこの作品を読んでいた。
https://ncode.syosetu.com/n0859fa/
この日記を書いている時点で100話くらいか。本編完結まであと50話もないが、読み終わるとは限らない。しかして今ここでこれまでの感想を書く気もない。
午後7時に寝落ちして、起きたのは午後11時半だった。サークルのバチャを寝坊した……と思ったが、slackを見ても今日開催された形跡がない。さらに今日はECR105があるが、あと5分もないし諦めるかな……と思ったところ、10分こどふぉったという情報が流れてきた。これは何らかの思し召しか。参加を決めて急いで準備した。
ABCD4完で終わり。直前まで寝ていたにせよ、これはあまりにひどすぎる。
Aは全探索。Bもちょっとひねって、四隅の置き方を24通り全探索すればよい。Cは難しいが、押すときはあるスペシャルマスの直前まで押してよい(わざわざ少し離れたところで止めなくてよい)ことが何となくわかるので、それを全探索する。そこまで押したとき、どこの箱まで影響して動くかは尺取り方のように計算できる。それ以降動かない箱のうちいくつがもともとスペシャルマスにあるかというのは、後ろからカウントを累積すればわかる。手元ではサンプルが合ったのに提出すると1ケース目で落ちて首を傾げていたが、custom invocationで実行してみたところ配列外参照していることに気づいた。1ケース目で落ちたのでペナが付かなかったのはいいこと。Dは答えが必ず存在するという制約がなくて微妙に不安だが、答えが存在しなかった場合の処理が書かれていないので大丈夫だろうと適当に提出したら通った。
Eは、サンプルの3つ目の答えを見てループでもOKだと勘違いしてしまい、解けなかった。結局双方向に辺がある頂点ペアが存在しないとNOで、さらにその辺に書かれた文字が一致していなければk
が偶数の時NO、それ以外はYESというギャグであった。Fは考えていない。
寝ている間に取られていた最短コードを取り返したりもしていた。
布団に入ってから4時間半ほどかけてハーメルンの「輝きたくて」を一気読みした。
これも「うちの脳内コンピューターが俺を勝たせようとしてくる」の作者の別作品で、今連載中のもの。この作者は毎日更新してくれるのが本当にすごい。今日の朝読んでいた作品は途中で読むのを止めてしまったが、こちらは肌に合ったのか、非常に面白く感じられた。主人公は自己評価低めで、主人公視点でしか語られない序盤は与えられたチートで一転突破みたいな感想を覚えるが、前作同様次第に主人公の生身のスペックも人間辞めてるレベルであることが明らかになってきて僕としては非常に好ましい。Vtuberものも好きなのでさらに良い。
そのあとハーメルンでVtuberものを探していた。3つくらい序盤をちょっと確認して、1つ、文章も読みにくくなく良さげなものを見つけたが、8話にしてエタっていそう。僕もちょっとゆっくり実況を作ったが、創作を続けられずエタるのはどうしようもないことが体感できたので、ただただ涙を呑むしかない。
チュウニズムに「LOVE EAST」が収録されるという告知が流れてきた。最高すぎる。本当に良いので、皆さんも良くなりましょう。
【3/4(木)「東方Project」楽曲追加!】
— チュウニズム公式@4/1(木)「三国志大戦」コラボ&新曲2曲追加&WORLD'S END登場! (@chunithm) 2021年3月3日
4日(木)より、すぐに遊べる大人気楽曲をご紹介!「疾走あんさんぶる」「しゅわスパ大作戦☆」「LOVE EAST」の3曲がチュウニズムに追加されるよ!!3月も、レッツ・チュウニズム!!https://t.co/H04krIsa4v pic.twitter.com/0hhOMSDB8u
そのあとなろうに移ってさらに別の作品を少し読み、午後3時就寝。
03/03(水)
午後11時半起床。今日もサークルのバチャはなかったようだ。正直な話をすると、昨日の時点で主催者がバチャを忘れているであろうことは何となくわかっていたが、しかし生活リズムの関係上今週は出られそうにない僕が指摘してもなあ……と思ってなんとなくモジモジしているうちに僕も忘れてしまっていた。
食事してすぐ布団に戻り、昨夜(昼?)読んでいたなろうの続きを読む。
ちょっとTLを眺めているとウマ娘とハルウララについての話が流れてきて、読んだだけで感動してすぐに泣いてしまった。涙もろすぎる。
「ハルウララの有馬記念」という限りなく卑怯な負けイベント|ストーム叉焼 #note https://t.co/F28QNlnXqA
— ストーム叉焼 (@roastpork193) 2021年3月2日
ハマったもんに誰が読むかも分からんクソ長い文を書く悪癖が出ました
皆もウマ娘やってサイゲに怒りの炎を燃やそう!
あと中山競馬場に土を撒こう!
ハルウララ有馬記念1着取れました😭😭😭
— フルさん (@fruits_san515) 2021年3月3日
思わずめっちゃ泣いてしまった、、、#ウマ娘 pic.twitter.com/l3vpvv5U7x
午前4時くらいに寝落ちしたらしい。今日は活動時間4時間半、そのほとんどを布団の上で過ごしており、まさに虚無の具現化とも言うべき1日であった。
03/04(木)
午前8時起床。ちょっと眠いが、起きていることにする。しかし午前中はパソコンの前で固まっているだけだったので、シャワーを浴びて切り替える。今日はチュウニズムのアップデートの日なので、午後はゲームセンターに行くことにする。
いったん生協に寄ってパンと注文していた本を買う。↓のときの本が1冊遅れて発送されていて、まだ受け取っていなかった。
また大学生協で本を注文しておく。前回注文してから新たに発売された新刊と、前回は在庫切れで注文できなかったが今見ると復活していた分、計4冊。
週記(2021/02/15-2021/02/21) - kotatsugameの日記
天気がいいので街までは自転車で移動した。久しぶりに乗ると太ももがパンパンになって、筋力の衰えを感じさせられた。
ゲームセンターには10時間くらい滞在して、55クレ使った。最初5クレほど新曲のAJ埋めをして、そのあと9時間くらいかけて「LOVE EAST」の理論値粘着をした。
LOVE EAST AJC pic.twitter.com/fTU46g2lg4
— こたつがめ (@kotatsugame_t) 2021年3月4日
120回くらいプレイしたはず。1落ちが4回、2落ちが5回、3落ち以上は数えていない。1日中プレイしてようやく出たが、別に譜面が難しいわけではなく、ただ僕が普段から何でもないところで赤を出してばかりだからである。僕にとってはこれが理論値2譜面目であった。粘着を始めたときはスピード9.5、判定0.0で、そこからいろいろ試して結局スピード10.0、判定-0.2に落ち着いた。昔SDVXで判定を弄ったとき、どれだけ早くしても自分がそれに慣れたらさらに早く押してしまうため全然nearが減らなかったというトラウマがあって、ちょっと腰が引けていたが、まあこの粘着の間だけなら何とかなるだろうと値を変えた。それより効果が大きかったのがスピードを上げたことで、判定は粘着後にもとに戻したが、スピードはこれからもこのままでやっていこうと思う。
本当に好きな曲なので飽きることはないし、譜面も体力を使わないので、立ちっぱなしであることにさえ目をつぶれば疲れはしない。金銭もこの際問題にならない。ただ、これだけの好条件があってすら理論値粘着は辛かった。自分には早いのではないかと思いもしたが、諦めたくなかったので、自分の精神力に寄らず粘着するため「全ランが埋まるか閉店するまでプレイし続ける」ことに決めた。結果として全ラン98人目に滑り込めていいことずくめ。
ここで赤を出しまくった。この部分だけ見ても理論値通過できたのは10回くらいではなかっただろうか。このままではいけないと思って、注意深く観察したところ、普段はFASTが多いところこの部分ではLATEが出ているらしい。具体的には、47小節の振り下ろしが遅く、スライド始点で赤が出ていることが分かった。注意深く曲を聞いてみると、確かに僕が思っているのとテンポが少しずれていることに気づいた。かといって単純に早めると今度は手前のタップで赤が出るようになって、本当にどうしようもなかった。
疲れ果てて帰宅。「影の実力者になりたくて!」の更新が2年ぶりくらいに来ていてびっくりした。
https://ncode.syosetu.com/n0611em/
午前3時半就寝。
03/05(金)
午前10時、宅配が届いて起床。ICPC関連グッズだった。その中にチーム紹介ドキュメントも含まれていた。
潰れちゃった!https://t.co/VrYPwq4HI4 pic.twitter.com/wZSNAWuPPV
— こたつがめ (@kotatsugame_t) 2021年3月5日
メイキングは下書きですでに完成しており、あとは投稿するだけだった。夜のほうがいいだろうと思ってしばらく待っていたが、そのままタイミングを逃してしまった。2021/03/09に投稿した。
そのあと少ししてから新春TechFULの商品であるトラックボールマウスが届いた。
TechFULからマウスが届きました!ありがとうございます! pic.twitter.com/EuANQfIein
— こたつがめ (@kotatsugame_t) 2021年3月5日
最初は使い勝手に戸惑ったが、今はそこそこ慣れてきた。少しだけマインスイーパをやってみたが、3画面を移動するためのマウスポインタの速度とマインスイーパを正確にプレイするマウスポインタの速度は全然両立しない。今使っているキーボードもマウスも、競プロの商品として得たものであることに気づいた。面白い。
午前11時からTSG-KMC合同コードゴルフ大会に外部からの参加者として参加した。以降午前9時までずっとコードゴルフしていた。この日提出したのは次の言語たちであった。かっこで注釈が付けられている問題について、取られたのはこの日ではなくもっと後のことかもしれない。そのあたりの時系列を復元する気力はない。現在の最短コードを更新しないと提出できない仕様のため、手を付けた言語はもっと多かったかもしれないが、もはや記憶が定かではない。ずっとコードゴルフしていたので現実感も薄い。
- Perl(取られた)
- Python3(取られた)
- Go
- Ruby
- AWK(取られた)
- D
- sed
- Haskell(チームメイトに短縮された)
- GolfScript
- Crystal(取られた)
- F#(取られた)
- wake
- Perl6
- Ballerina
- Rail
- Octave
- Lua(取られた)
- Erlang
- bash(pureのほうは取られた)
- SQLite3(チームメイトに短縮された)
- Verilog(取られた)
- 05AB1E(取られた)
- gs2(取られた)
- COBOL
- Elixir
- Racket(取られた)
- Zsh(取られた)
- Kotlin
- Vim
- m4(取られた)
- Makefile(取られた)
午前9時就寝。
03/06(土)
午後1時起床。
午後2時からDDCC予選に参加した。サンプルがあるのに気づかず提出しWAを生やしてしまったりもしたが、30分前後で全完。やるだけの問題4問用意して何がしたいんだろう。もうどんな問題があったかも覚えていない。
コードゴルフに戻る、が、途中ABC194に参加したのでそれを先に書いておこう。50分全完3WAで66位。
Aは問題を読めず2WA出した。Bも全然題意が把握できず結構時間がかかった。Cは明らか。Dは最初sum N/i
ではなくprod N/i
を求めてしまい1WA。何を考えていたのかわからない。Eはやるだけ。Fは桁DPをもとにして考えた結果、N
より小さくなることが確定した桁で残りの出現パターンも包除原理で数えてしまう実装をし、DPがいらなくなった。代わりに16^2
くらいの定数倍がついて1900msだった。
総じて頭が回っていない。コードゴルフに意識を支配されすぎていて、また睡眠時間も減らしてしまったため、非常につらい。明日のAGCが怖すぎる。
ABCのほうのコードゴルフは、ACDを取ってBは取られてEFは手つかずといった感じか。Cは分散のN^2
倍なのでOctaveが強いかと考えたのだが、精度の問題だろうか、大きなケースが全然合わなかった。正直あまり考えていないので、すべての問題について縮む余地は大いにある。
さて、DDCC予選とABC以外の時間はずっとコードゴルフをしていた。この日提出したのは次の言語たちであった。昨日提出して今日も提出している言語は、つまり縮めたということである。
- Erlang
- cubically(WA。チームメイトがアルゴリズムを流用して通してくれた)
- Elixir
- Lua(取られた)
- ImageMagick
- APL
- Cubix
- Node.js(取られた)
- ReScript(取られた)
- gnuplot
午前6時就寝。
03/07(日)
正午起床。午後1時からICPC模擬地区大会があった。これについては参加記を書いた。
コードゴルフ大会は今日の午後9時までであった。ICPC模擬地区大会が終わってから3時間ばかり、最後の仕上げとして取り組んだ。今日提出した言語は次の通り。
- Jelly
といっても1つしかない。残りの時間は、Makefileと><>(fish)と格闘していた。Makefileのほうは入力を3行ごとに処理する方法が、><>のほうは答えを求めるアルゴリズムが全然違っていて、負け。
終了直後からAGC052があったので出た。ABの2完78分で87位、パフォーマンス2698、レートは2716→2714(-2)。相変わらず頭が回っていなかったものの、崖に助けられた。さらにB問題も最後の解の判定が微妙に足りておらず、yosupoさんのケースで落ちる。
3
— よすぽ (@yosupot) 2021年3月7日
1 2 1 3
2 3 3 3
どうなりますか
Aは、パズルとして面白くはあるのだろうが、Ratedに出されると泣くしかない問題。45分かかった。0をN
個と1をN
個と0または1を並べるのだろうな、ということまでは問題を見た瞬間に分かった。そこから文字列の両端は0..0
と0..1
と……という風に4パターンあって、このうち3種類しか出現し得ないことを利用するのだと考えていたが、0..0
と1..1
が両方出る入力に対する答えを作れなくて苦労した。文字列の形を、末尾に続く0または1の個数という形でもっと詳しく見れば、うまく証明できることに気づいてびっくり。
翻ってBは非常に面白かった。辺に関する条件を頂点に関する条件に言い換えるステップが面白い。この方針が降ってきたとき、直観として正しいと確信した。実際に実験すると頂点の値のswapになっていて、一気に目の前が開けたような心地がした。そこから解のチェックをするステップで、これまで謎に包まれていたN
が奇数という条件が突如姿を現して、見事に伏線を回収されたような驚きがあった。詰めが甘かったので、それだけは心残り。完璧に解いておきたかった。
AGC後に、コードゴルフ大会のWriteUpを書いた。以前の大会のものはここから見られる。2021/03/15以降には、今回の大会のものもここから飛べるようになるはずだ。
さて、僕は最終的に121言語のうち40言語(bash
は外部コマンドの実行の可不可で2種類ある)に提出し、21言語の最短コードを保持していた。相変わらず以前に書いた経験のある言語や汎用言語ばっかりだが、まあ数字にしてみればかなり頑張っていたのではないか。その中から5言語、特に面白いと感じたものについて、WriteUpの内容をここにも書いておこう。短縮ポイントを見つけられた場合などはぜひ教えてほしい。
コンテストリンク:Esolang Codegolf Contest #7
問題
入力
- 入力には 16 個のテストケースが含まれている。
- 各ケースでは、文字 0, 1 からなる長さ 3 の文字列が 3 個、改行区切りで与えられる。
- 各ケースの最後には改行が与えられる。
出力
- 各ケースについて、次の問題を解け。
入力を 3 行 3 列の将棋盤とみなす。 文字 1 は対応するマスに歩が 1 個あることを、文字 0 は対応するマスに駒がないことを表す。 二歩であるとは、2 個以上の歩が置かれている列が将棋盤に存在することとする。 (3 個の歩が置かれている列でも二歩になることに注意せよ。)
- 二歩であれば 1 を、そうでなければ 0 を出力せよ。
- 文字 0, 1 はちょうど 16 個出力せよ。
- 出力された文字列に含まれる空白文字(改行含む)は無視される。
- 文字 0, 1 および空白文字以外の文字を出力してはいけない。
- 提出するプログラムは、入力されうるすべてのテストケースに正しく出力できるものでなければならない。つまり確率解を禁止する。
制約
- どのテストケースも 1 の個数は 2 以上 4 以下である。
- 入力されうるテストケースの集合は、1 の個数が 2 以上 4 以下である盤面の集合と一致する。
- 1 の個数が 1 以下または 5 以上である盤面に対しては、プログラムは正しく動作しなくてもよい。
APL (47B)
{+/'23'∈⍕ω}¨+/16 3⍴⍎⍕⎕ARG[6] )OFF
数値として足して/2|3/
をしている。右から順に
⎕ARG[6]
:入力⍕
:to_stringのはずだがよくわかっていない。ないと動かない。⍎
:eval16 3⍴
:16行3列に成形+/
:sum(行ごと)¨
:行ごとに左の関数を適用
{}
が無名関数で、引数はω
に入る。
⍕
:to_string'23'∈
:elem。[2を含むか 3を含むか]という列が得られる。+/
:sum
最終的に01の列になって、変数に入れたりしていないため出力される。
Cubix (21B)
pa^<IIaqbI/biO<@..?:,
pa ^< IIaqbI/b iO<@..?: ,. ..
スタック型の言語だが、ほとんどの演算がスタックの中身を消費しないのは特徴的か。例えば加算をすると、popしたオペランドを再度pushしてから演算結果をさらにpushする。
上のような配置の2x2x2のキューブ上をIPが動いていく。スタートは3行1列目のI
で、方向は右向きだ。
3x3x3に詰め込んで満足していたが、ふと2x2x2を考えてみたら詰め込めてしまってびっくりした。
アルゴリズムは、3行を数値として読んで(x&y|(x|y)&z)!=0
である。
スタックの中身を消費しないことを利用してIIaqbIapb:,O
と書ける。
x&y
を計算してから、いったんq
でスタックの底に退避させ、後でp
で持ってきている。
!=0
の代わりに、:
でdupして,
で切り捨て除算している。実装上0/0
は0らしい。
次に、どのようにIPが動くのか見ていこう。
まず3行1列目のI
から右方向にIIaqbI/
と進む。
/
で進行方向が変わる。右方向に進んでいたので、次は上方向になり、立方体上面、1行4列目のa
に上から進入する。
上面では<
と^
によってUターンのようなことをしながらap
を実行する。1行4列目のp
から上に進むと、今度は3行8列目のb
に上から進入することになる。
そのままb:
と進み、今度は6行3列目に下から進入する。.
はnopで、途中<
で進行方向を変えつつ,O
と進む。
これでケース1つぶんの入出力が完了した。無限ループになってはいけないので、実行を継続するか判定する必要がある。
i
で1文字読んで、改行コードか-1(EOF)かで判定できる。
先ほどの続きから、4行1列目のi
、さらに左に行くと今度は4行8列目に回り込んで:?
と進む。:
はdupなので関係ない。?
が条件分岐になる。
?
にたどり着いたとき、スタックのトップが0より小さいなら左に、0より大きいなら右に曲がる。
先ほど読んだ文字の文字コードが見られ、改行コードなら右に、EOFなら左に曲がることになる。
左向きに進んでいるので、右に曲がると上方向に進むことになる。また/
で反射して右方向に進み、そのまま3行1列目のI
に左から進入することになる。確かにループしている。
逆に、左に曲がると下方向に進むことになる。今度は6行4列目に下から進入し、そのまま上がって@
にたどり着き、実行が終了する。
コードゴルフとしては、2x2x2に収めたほかにも、下面にnopが多くあらわれるように工夫している。 2x2x6文字に足りない分は勝手にnopで埋められるので、下面の3つのnopはコードに書かなくてもよい。
Jelly (24B->21B)
ƈƈFпOs12µs4PS%9>1)
アルゴリズムは、1ケース12文字(改行を含む)の文字コードを順にabcdefghijkl
としたとき(aei+bfj+cgk+dhl)%9>1
である。
左から読んでいこう。
ƈƈFп
:入力を全部読むおまじない。第5回大会のWriteUpから持ってきたものが1B改善できた。元はƈƈ¹Ð¿
であるが、この¹
はただの恒等関数のくせに2Bも使っている。適当に1Bのmonadを試してみたところ、F
でうまく動いてくれた。F
の意味はリストのFlattenである。O
:ord。s12
:リストを12個ごとに区切り、リストのリストにする。µ
:関数定義を区切る。ここから右は左とは独立した関数になる。
区切られた関数はmonad
である。s12
で作った12要素のリスト[a,b,c,d,e,f,g,h,i,j,k,l]
が引数となることを考えよう。
s4
:4要素ごとに区切ったリストのリストにする。[[a,b,c,d],[e,f,g,h],[i,j,k,l]]
。P
:総積。積は、リストに対しては内積になるらしい。[aei,bfj,cgk,dhl]
。S
:総和。aei+bfj+cgk+dhl
。%9
:9で割ったあまり。>1
:1より大きいか否か。)
:µ€
のエイリアス。関数定義を区切り、€
で左の要素に対してmappingしている。 つまり、先ほどのµ
より左にあるリストのリストに対して、今見たmonad
が要素ごとに適用されている。)
が信じられないくらい偉い。µ
という2B文字と€
という3B文字が合わさって1B文字になっていて笑いが止まらない。
ところで、赤チームのコードは見た目的に全然違うものだった。そちらを参考に21Bまで縮めたので、後学のために読んでおこう。
ɠṭɠ,ɠ¤OPS%9>0¢
アルゴリズムは変わっていない。
ɠ
で1行読み込んでいるが、このとき改行が消えるため、OPS%9
したあと>1
ではなく>0
になっている。
ɠṭɠ,ɠ¤
を読もう。先頭のɠ
はnilad
なので、以下これに対して関数が適用されていく。
ṭ
は左オペランドを右オペランドにリストとして足す。左オペランドはɠ
だが、右オペランドについて少し注意する必要がある。
順当に読めばすぐ右にあるɠ
だが、少し先の¤
でパーサの挙動が変わり、実際にはɠ,ɠ
が右オペランドになっている。
¤
は、直前にパースしたコマンド列の後ろからいくつか切り取って、nilad
と1つ以上のlink
が繋がったパターンを1つのnilad
としてまとめる役割を持っている。
今回はɠ
というnilad
と,ɠ
というlink
がまとめられている。複数の切り取り方がある場合は、最も短いものが採用されるので、ここで切られる。
ɠ,ɠ
は2行読んで2要素のリストにしたnilad
なので、それに最初のɠ
が足されて、全体として["efg","ijk","abc"]
のようになる。
あとは先ほどと同様OPS%9>0
で答えが得られる。
以上で、ɠṭɠ,ɠ¤OPS%9>0
が1ケース分の入力を読んで計算するnilad
であることが分かった。
最後に¢
で直前のlink
が(nilad
として)参照されている。直前のリンクというものは存在しないため、この場合現在見ているlink
が参照されるようだ。
結果的に、いわばmain再帰のような形のコードとなって無限ループが実現されている。(これは僕の解釈なので、より良い説明があればぜひ教えてほしい。)
最終的にEOFを読んで落ちる。
sed (20B)
N N h G /1...1/c1 c0
3行を連結し、2倍して/1...1/
を探している。
N
:次の行を読む。2回実行するので、合計で3行、つまりケースごとに以下の処理を行うことになる。h
:上書きホールド。以前のホールドスペースの内容を削除し、現在のパターンスペースの内容を入れる。G
:ホールドスペースの内容をパターンスペースに追加する。これで文字列が2倍されたことになる。/1...1/c1
:/1...1/
にマッチしたら1を出力して(残りの処理をせず)次の行の処理に進む。c0
:前の行のマッチに失敗した場合のみこの行に到達する。0を出力して次の行に進む。
Vim (32B)
qq3JYPJr0/1...1\|\%# xVpjq15@qZZ
qq..q
でマクロを作り、15@q
で15回(実行しながら定義するため1回減っている)繰り返す。
以下マクロを詳しく見ていく。処理開始の時点では1ケース3行のうち1行目にいて、処理が終わったら次のケースの1行目にいる、という状態を保つ。
3J
:3行連結YPJ
:ヤンクして直上に貼り付け、即座に下の行と連結する。これで行が2倍になったことになる。r0
:カーソル下の1文字(J
の直後のため、必ず空白文字)を0に置き換える。/1...1\|\%#
:/1...1/
を探す。マッチすれば、カーソルは最初の1の上に動く。マッチしなければ次の\%#
だが、これは現在のカーソル位置であるため、カーソルの移動は起こらない。マッチに失敗するとマクロの実行が止まってしまうので、必ず成功させるためのもの。末尾の/
は省略できる。
この時点でカーソル直下の文字が出力すべき値になっている。
最後のj
で最終行のさらに下に進もうとすると勝手にマクロが止まるので、qq..q15@q
ではなくqq..@qq@q
と再帰のようにしてもよい。これはループ回数が3桁以上になると縮む。
AtCoderにVimが追加されてからたった10か月の間に100問以上の最短コードが生まれていて、知見が溜まりまくり。