点Nの軌跡

競プロの話または日記

最古の記憶について

あなたの記憶で最も古いものはなんだろうか。

いちばん古い記憶が何歳のものかは人によるが、調べた感じでは3歳から5歳あたりらしい。僕もそのへんで、当時は園児であった。

最初の反抗期で親に向かって覚えたての乱暴な言葉を吐きまくってたとか、「あーぶくたった にえたった」のやつが大嫌いなあまり登園したくないと毎朝泣いてたとか、そういう幅のある記憶はわりと古いものでも多く残っている。一方、かけっこでライバルと足が絡まりながらも1番になったとか、運動会の絵を描くのに困って画用紙を棒人間で埋め尽くしたとか、バレンタインに女の子からチョコを貰ったというような瞬間的な記憶はどれも比較的新しい。幅のある記憶はつまらないので、瞬間的な記憶のうち最古のものを書き残しておこうと思う。成人した今も覚えてるんだからそうそう忘れないだろうし、忘れても困らないのだが。

最古の記憶も園での出来事で、感触遊びの時のことである。説明が面倒なのでまあ検索してほしいのだが、片栗粉粘土とかのやつ。当時の題材が何だったかは定かでないが、場所は園庭で、先生が桶で粉と水を反応させ、変な感触の何かを生成した。水を入れたら粉の色が変わって驚いた。嘘かも。

さて、僕は昔から慎重な性格だったのでこういうのに積極的に参加しに行こうとしなかったのだが、その様子を見ていた(たぶん違う組のよく知らない)先生にその物体を右足かどこかにかけられてしまった。それに気づいた僕の反応は当然芳しくなく(たぶん)、そこでその先生はこんなことを言った。

「すごい神経質な子にかけてしまった(笑)」

この言葉が僕の最古の記憶になる。子供ながらにショックだったのかもしれない。神経質ねぇ。まあ本当だけど。

右手に栄光を 分析せよ

この手のプログラム間違えることが多々あるので疑り深く読んでほしいです!!!

作品内では扉のロックである以上攻略できるようになっているが、あれってちゃんとやっても右手(後手、プレイヤー)必勝なのか、左手(先手、扉)が忖度しているのか、どっちなんですか、という話。こういうゲームって先手ゲーの印象があるので。てかだいぶ先手有利ゲーに見えるなこれ、こっちのほうが勝利条件厳しいし。

ルールを再確認しよう。面倒なのでカードゲームにする。

ゲームは2人で行う。各プレイヤーは1以上5以下の整数がそれぞれ書かれたカード計5枚を手札として持っている。各プレイヤーは自分の番に以下の操作を1回のみ行う。パスは許されない。

操作:自分の手札を1枚選び、場に出す。

場のカードに書かれた数の和がちょうど23になった場合(それがどちらの手番であっても)その時点で後手の勝利、24以上になった場合先手の勝利である。

こういうゲームは数学的にいい感じの証明を与えることができそうな気がするが、数学的に考えるのは面倒(というか僕には無理っぽい気が)なので計算機で殴りたいと思う。各カードは場にあるか手札にあるかのどちらかなので、状態数はたかだか210=1024(実際は両者の手札の枚数差の制約があってもっと小さい)。多分余裕。

実装は、メモ化再帰みたいな感じにすれば解けそう。

dp[a][b] = 先手の手札の状態がa、後手の手札の状態がbのとき、現在の手番の者が必勝か否か

としてやれば、dp[先手の手札5枚][後手の手札5枚]がtrueかfalseかでどちらが必勝かわかる。

遷移だが、テーブルの埋め方は(総和23以上の自明な場合を除いて)一手先の状態が全部trueならfalse、そうでなければtrue。

C++での実装は以下。間違ってたら言って、結論が間違ってる説まであるので。

注意:出力はoutput.csvというファイルに書き込まれるので消えると困るoutput.csvがある場所では実行しないようにしてください、または出力ファイル名のところを書き換えるなどしてください

#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

vector<vector<int>> dp;
vector<int> w;

int dfs(int a, int b, int sum){
  // a,b: 下5bitが各人の手札[5][4][3][2][1]が場に出てるフラグ, aが先手
  if(dp[a][b]!=-1) return dp[a][b];
  // t: 場に出てる枚数, 今が先手番かわかる
  int t = __builtin_popcount(a) + __builtin_popcount(b);
  if(t%2==0){
    // 先手の番
    if(sum==23) dp[a][b] = 0;
    else if(sum>23) dp[a][b] = 1;
    else{
      int res = 0;
      for(int i=0;i<5;i++){
        if(a&(1<<i)) continue;
        if(dfs(a|(1<<i),b,sum+w[i])==0) res=1;
      }
      dp[a][b] = res;
    }
  }
  else{
    // 後手の番
    if(sum==23) dp[a][b] = 1;
    else if(sum>23) dp[a][b] = 0;
    else{
      int res = 0;
      for(int i=0;i<5;i++){
        if(b&(1<<i)) continue;
        if(dfs(a,b|(1<<i),sum+w[i])==0) res=1;
      }
      dp[a][b] = res;
    }
  }
  return dp[a][b];
}

// 出したカード
string f(int a){
  string res = "";
  for(int i=0;i<5;i++){
    if(a&(1<<i)) res += to_string(w[i]);
  }
  if(a==0) res="none";
  return res;
}

// 出したカードの和
string s(int a){
  int sum = 0;
  for(int i=0;i<5;i++){
    if(a&(1<<i)) sum += w[i];
  }
  return to_string(sum);
}

int main(){
  // 出力ファイル
  ofstream ofs("output.csv");
  cout.rdbuf(ofs.rdbuf());

  // 初期化
  dp.assign(32,vector<int>(32,-1));
  w.resize(5);
  for(int i=0;i<5;i++) w[i] = i+1;

  // 探索
  dfs(0,0,0);

  // その手番のプレイヤーが必勝か?->後手必勝か?に変換
  for(int i=0;i<32;i++){
    for(int j=0;j<32;j++){
      if(dp[i][j]==-1) continue;
      dp[i][j] = (dp[i][j]+1+__builtin_popcount(i)+__builtin_popcount(j))%2;
    }
  }

  // 出力
  string xo = "xo";
  cout << ',';
  cout << "wakaru";
  for(int i=0;i<32;i++){
    cout << ',' << f(i);
  }
  cout << endl;
  cout << "door";
  cout << ',';
  for(int i=0;i<32;i++){
    cout << ',' << s(i);
  }
  cout << endl;
  for(int i=0;i<32;i++){
    cout << f(i) << ',' << s(i);
    for(int j=0;j<32;j++){
      cout << ',' << ((dp[i][j]==-1)?' ':xo[dp[i][j]]);
    }
    cout << endl;
  }

  return 0;
}

出力されたcsvをいい感じにしたものがこちら。

後手(wakaru)必勝状態が緑、先手(door)必勝が赤。開始状態(左上)は赤

というわけで、このゲームは先手必勝っぽい。後手唯一の勝ち筋は先手が運よく1を初手で出してくれた時にこっちも1を捨てるのみ。こうすればあとは簡単で、後手は(7-先手)のカードを捨てていけば勝てる。

……不公平すぎないかこれ

コンデンサ解法全列挙プログラム

これのプログラムについて。

基本方針は全探索。

[0,1,2,3]

[4,5,6,7]

[8,9,10,11]

というふうに番号をふって考える。下線が引いてあるところは固定されている。ひとつ操作すると4近傍も同じように回る。固定されているやつは操作できないし、近傍が操作されても動かない。

操作できるやつは9個である。同じのを8回操作すると元に戻るので、そのようなことをするのは無駄である。それぞれ0回以上7回以下、合計89通りの操作を試してみて、正しい経路になっていればよい。12点通るので検証にそれに比例した時間がかかるとして、単純にやると89×12で16億回ぐらいの演算が必要になりそう。一般的なPCで実行してもすぐ終わりそうだけど、ちょっとだけ高速化を狙ってみたい。

よくみると、8番は最後に下を向いていなければならない。8番に影響するのは8番自身とその横の9番だけなので、8番と9番の操作回数は片方を決めるともう片方が同時に確定する。88×12で2億回ぐらいに落ちた。

同様に、0番3番11番も角なので最終的に向いている方向に強めの制約(半分以上許されない)がかかっている。ここに枝刈りを入れてあげることでもっと早くなりそうだったのでそうした。

経路の検証。スタートからたどって11回移動したときに、全部の場所を通っていてなおかつゴールにいたらOK(ゴール地点=8番の向きは下でなければならないが、二つ上の段落で解決しているので考慮する必要はない)。盤外に出たり既に来たところに戻ったらその時点で打ち切っている。

追記

ご指摘。

https://twitter.com/rustysapen/status/1476545306582208522

僕の実装だと0番の向き右を許容してるけど1番の入次数が2になってしまうのでこれは枝刈りできるポイント。ソースコードに反映してないですが、if文書き換えて実行してもらうと倍ぐらい速くなる気がします。

追記終わり

実行はこちら。

https://paiza.io/projects/Tog8_lnk1J8cQmuaApxc6w

ソースコードは以下にも。

#include <iostream>
#include <utility>
#include <chrono>

using namespace std;
using dir = pair<int,int>;
using pos = pair<int,int>;

constexpr int startid = 3;
constexpr int goalid = 8;

/*
int id[3][4] = {
  {0,1,2,3},
  {4,5,6,7},
  {8,9,10,11}
};
*/

pos id_pos(const int x){
  return {x>>2,x&3};
}
int pos_id(const pos p){
  return p.first*4+p.second;
}

constexpr bool lock[3][4] = {
  {0,0,1,0},
  {1,0,0,0},
  {0,0,1,0}
};

int in(const pos p){
  int y = p.first, x = p.second;
  return 0<=y && y<3 && 0<=x && x<4;
}
int out(const pos p){
  return !in(p);
}

pos add(const pos p, const dir d){
  return {p.first+d.first, p.second+d.second};
}

enum dirstr{
  U,UR,R,DR,D,DL,L,UL
};

constexpr dir dirs[8] = {
  {-1,0}, // U
  {-1,1}, // UR
  {0,1},  // R
  {1,1},  // DR
  {1,0},  // D
  {1,-1}, // DL
  {0,-1}, // L
  {-1,-1} // UL
};

constexpr int neighbor[4] = {U,R,D,L};

constexpr int initialpuzzle[3][4] = {
  {U,U,L,D},
  {U,D,UL,UL},
  {UL,R,L,U}
};
int getinitstate(const int x){
  return initialpuzzle[x>>2][x&3];
}

int state[3][4];
void resetstate(){
  for(int y=0;y<3;y++){
    for(int x=0;x<4;x++){
      state[y][x] = initialpuzzle[y][x];
    }
  }
}
void spin(const int id, const int t){
  if(lock[id>>2][id&3]) return;
  state[id>>2][id&3]+=t;
  state[id>>2][id&3]&=7;
}
void push(const int id, const int t){
  if(lock[id>>2][id&3]) return;
  spin(id,t);
  pos p = id_pos(id);
  for(int i=0;i<4;i++){
    pos nxt = add(p,dirs[neighbor[i]]);
    if(in(nxt)){
      spin(pos_id(nxt),t);
    }
  }
}

constexpr int fullbit = (1<<12)-1;

int path[12];
void resetpath(){
  for(int i=0;i<12;i++) path[i]=0;
}

int c[12];

int main(){
  chrono::system_clock::time_point start, end;
  start = chrono::system_clock::now();

  int cnt = 0;

  for(c[9]=0;c[9]<8;c[9]++){
    c[8] = D-((c[9]+getinitstate(8))&7); if(c[8]<0) c[8]+=8;
    for(c[0]=0;c[0]<8;c[0]++){
      for(c[1]=0;c[1]<8;c[1]++){
        int s0 = (getinitstate(0)+c[0]+c[1])&7;
        if(!(R<=s0 && s0<=DR)) continue;
        for(c[7]=0;c[7]<8;c[7]++){
          for(c[3]=0;c[3]<8;c[3]++){
            int s3 = (getinitstate(3)+c[3]+c[7])&7;
            if(!(D<=s3 && s3<=L)) continue;
            for(c[11]=0;c[11]<8;c[11]++){
              int s11 = (getinitstate(11)+c[7]+c[11])&7;
              if(UR<=s11 && s11<=DL) continue;
              for(c[5]=0;c[5]<8;c[5]++){
                for(c[6]=0;c[6]<8;c[6]++){
                  resetstate();
                  resetpath();
                  for(int i=0;i<12;i++) push(i,c[i]);
                  int id = startid;
                  pos nowpos = id_pos(id);
                  int check = 1<<id;
                  path[0] = id;
                  for(int p=1;p<12;p++){
                    nowpos = add(nowpos,dirs[state[id>>2][id&3]]);
                    if(out(nowpos)) break;
                    id = pos_id(nowpos);
                    path[p] = id;
                    if((check>>id)&1) break;
                    check|=(1<<id);
                  }
                  if(check==fullbit){
                    if(1){
                      cout << "solution found:\n";
                      cout << c[0] << ' ' << c[1] << ' ' << 'x' << ' ' << c[3] << '\n';
                      cout << 'x' << ' ' << c[5] << ' ' << c[6] << ' ' << c[7] << '\n';
                      cout << c[8] << ' ' << c[9] << ' ' << 'x' << ' ' << c[11] << '\n';
                    }
                    if(1){
                      int sum = 0, btn = 0;
                      for(int i=0;i<12;i++) sum+=c[i];
                      for(int i=0;i<12;i++) if(c[i]) btn++;
                      cout << sum  << " push, " << btn << " buttons\n";
                    }
                    if(1){
                      cout << "path:";
                      for(int i=0;i<12;i++) cout << ' ' << path[i];
                      cout << '\n';
                    }
                    cout << '\n';
                    cnt++;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  cout << cnt << " solutions\n";
  end = chrono::system_clock::now();
  double ela = chrono::duration_cast<chrono::milliseconds> (end-start).count();
  cout << "solve time: " << ela << " ms\n";
  return 0;
}

コンデンサの回し方

パソコンに計算させた。細かい話はこちら。一筆書きの経路は以下の4通りで、それぞれ16通りの実現方法がある。つまり、解は全部で64通り。

f:id:pointN:20211230195315j:plain

f:id:pointN:20211230195333j:plain

f:id:pointN:20211230195345j:plain

f:id:pointN:20211230195355j:plain

全解法は以下の通り。なるべく手っ取り早い方法が上になっているはず。

ソート基準

・合計操作回数がより少ないもの

・それが同じ場合、操作するコンデンサ数がより少ないもの

・それも同じ場合の基準は特にない(左上の操作回数が少ないほうが先、となってはいるが。)

操作回数 コンデンサ タイプ
3 0 x 2
x 0 4 0
0 5 x 0
14 4 2
0 3 x 2
x 0 4 0
3 2 x 0
14 5 2
1 2 x 2
x 0 4 0
2 3 x 0
14 6 2
2 1 x 2
x 0 4 0
1 4 x 0
14 6 2
2 1 x 7
x 0 0 3
5 0 x 3
21 6 1
3 0 x 7
x 0 0 3
4 1 x 3
21 6 1
6 5 x 2
x 0 4 0
5 0 x 0
22 5 2
2 1 x 6
x 0 0 4
5 0 x 4
22 6 2
3 0 x 6
x 0 0 4
4 1 x 4
22 6 2
7 4 x 2
x 0 4 0
4 1 x 0
22 6 2
0 3 x 0
x 2 7 0
0 5 x 6
23 5 4
3 0 x 0
x 2 7 0
5 0 x 6
23 5 4
0 3 x 4
x 2 3 4
4 1 x 2
23 8 4
3 0 x 4
x 2 3 4
1 4 x 2
23 8 4
1 2 x 4
x 2 3 4
3 2 x 2
23 9 4
2 1 x 4
x 2 3 4
2 3 x 2
23 9 4
0 3 x 7
x 0 3 1
2 3 x 5
24 7 3
1 2 x 3
x 0 7 5
5 0 x 1
24 7 3
2 1 x 7
x 0 3 1
0 5 x 5
24 7 3
3 0 x 3
x 0 7 5
3 2 x 1
24 7 3
1 2 x 7
x 0 3 1
1 4 x 5
24 8 3
2 1 x 3
x 0 7 5
4 1 x 1
24 8 3
0 3 x 7
x 0 0 3
7 6 x 3
29 6 1
3 0 x 3
x 0 4 7
0 5 x 7
29 6 1
7 4 x 7
x 0 0 3
0 5 x 3
29 6 1
0 3 x 3
x 0 4 7
3 2 x 7
29 7 1
1 2 x 7
x 0 0 3
6 7 x 3
29 7 1
4 7 x 7
x 0 0 3
3 2 x 3
29 7 1
5 6 x 7
x 0 0 3
2 3 x 3
29 7 1
6 5 x 7
x 0 0 3
1 4 x 3
29 7 1
1 2 x 3
x 0 4 7
2 3 x 7
29 8 1
2 1 x 3
x 0 4 7
1 4 x 7
29 8 1
0 3 x 6
x 0 0 4
7 6 x 4
30 6 2
4 7 x 2
x 0 4 0
7 6 x 0
30 6 2
5 6 x 2
x 0 4 0
6 7 x 0
30 6 2
7 4 x 6
x 0 0 4
0 5 x 4
30 6 2
1 2 x 6
x 0 0 4
6 7 x 4
30 7 2
4 7 x 6
x 0 0 4
3 2 x 4
30 7 2
5 6 x 6
x 0 0 4
2 3 x 4
30 7 2
6 5 x 6
x 0 0 4
1 4 x 4
30 7 2
1 2 x 0
x 2 7 0
7 6 x 6
31 7 4
2 1 x 0
x 2 7 0
6 7 x 6
31 7 4
4 7 x 0
x 2 7 0
4 1 x 6
31 7 4
5 6 x 0
x 2 7 0
3 2 x 6
31 7 4
6 5 x 0
x 2 7 0
2 3 x 6
31 7 4
7 4 x 0
x 2 7 0
1 4 x 6
31 7 4
4 7 x 4
x 2 3 4
0 5 x 2
31 8 4
7 4 x 4
x 2 3 4
5 0 x 2
31 8 4
0 3 x 3
x 0 7 5
6 7 x 1
32 7 3
3 0 x 7
x 0 3 1
7 6 x 5
32 7 3
5 6 x 7
x 0 3 1
5 0 x 5
32 7 3
6 5 x 3
x 0 7 5
0 5 x 1
32 7 3
4 7 x 3
x 0 7 5
2 3 x 1
32 8 3
5 6 x 3
x 0 7 5
1 4 x 1
32 8 3
6 5 x 7
x 0 3 1
4 1 x 5
32 8 3
7 4 x 7
x 0 3 1
3 2 x 5
32 8 3
6 5 x 3
x 0 4 7
5 0 x 7
37 7 1
7 4 x 3
x 0 4 7
4 1 x 7
37 8 1
5 6 x 4
x 2 3 4
7 6 x 2
39 9 4
6 5 x 4
x 2 3 4
6 7 x 2
39 9 4
4 7 x 7
x 0 3 1
6 7 x 5
40 8 3
7 4 x 3
x 0 7 5
7 6 x 1
40 8 3
4 7 x 3
x 0 4 7
7 6 x 7
45 8 1
5 6 x 3
x 0 4 7
6 7 x 7
45 8 1

ICPC2021国内予選参加記 - Last AC -

ICPC国内予選2021の参加記です。

筑波大学からチームfib-dih(pengin, amixedcolor, pointN) で参加してました。

前日以前

筑波大学という新しい環境になったので、かつてのkibisiのメンバーであるngng628とwakasukiはもういません。ということで、チームメイトを募集しました。声をかけやすい人の中で僕がいちばん強いと認識しているpenginさんにICPCのチーム決めについてTwitterのDMでそれとなく話しかけ、自然な流れでチームに引き込むことに成功しました。もうひとりは部のチャットで誰でもいいので組んでくれと呼びかけたところ、最速で返事が来たamixedcolorさん(以下amixさん)に加わってもらいました。彼はICPCは初めてだそうです。

チーム名はわりと適当に決めました。各自が好きな英小文字を2字ずつあげ、amixさんがそれを並び替えました。fib-dihはフィボナッチ情報本部の意味です。ICPCの問題文とノリが似ていますね。この6文字のうち、僕はbとiを宣言しました。kibisiのbiです。誰がkiでbiでsiみたいなのはないんですが。むしろ全部wakasukiのものだし。

僕はC++を使っているのですが、penginさんはC言語、amixさんはAtCoderの提出を見る限りではPythonのようで、ということはソースコード自体の共有は期待できないな、みたいなことを思っていました。

前日

木曜日です。メンタルに悪い影響を与えるのでオンライン授業は全部後回しにしました。研究室配属希望登録の時期と重なったのでそれはちゃんとやりました。チーム一覧で筑波大学内のライバルを確認したところ、shichifuku(前回予選突破してる強いところ)とkarintou_extra(前回kibisiより少し上の順位だったところ)の2チームしかいませんでした。去年に比べて明らかに少ないので、例年に比べれば突破の可能性はじゅうぶんあると思いました。とはいえ学内にライバルがいるので高専時代よりもボーダーは高くなるのですが。リハーサルを夜にやって、そのあと国内予選2020-Dを通して早めに寝ました。

当日

金曜日です。学園祭のため、授業はありません。ラッキー。Twitterを見るなどしてゆったり過ごしました。3時ぐらいになって準備を始め、3時半ぐらいに家を出ました。大学に着いたらもう他のチームが揃っていたので驚きました。部屋の奥のほうにshichifukuと思しき人たちがいて、手前にkarintou_extraの人たちがいました。暇なのでkarintou_extraの人たちと話をしました。去年とメンバーが違うらしく、去年のデータがあてにならないことが判明しました。ちょっとしてからpenginさんも来ました。shichifukuと我々fib-dihが(じゅうぶん広い)同じ部屋、karintou_extraは別室で参加することになりました。

競技開始前

いちおう、amixさんも大学に来る予定だったのですが、来れなくなったとのことなのでpenginさんと初動について少し相談し、amixさんにAを任せました。ペナルティが20分で重いのがICPCの特徴なので、Aは慎重にねと念を押し、現場のpenginさんと僕はBCをいい感じにしようという方針にしました。D以降は手が空いた人から、という感じ。

本番

4時30分。全3時間の予選がスタートしました。開始直後、コンテストページが開けなくなっていましたが、去年もそうだったのでまたかという感じでした。今回初めてのamixさんに少し待てば開けるので安心してほしいと伝えるなどしつつ待っていると、すぐにコンテストページが開けるようになりました。Bを僕が開き、Cをpenginさんが開きました。Cは実装がめちゃくちゃ重いという感じらしく、方針は立ったようなのでお任せしました。Bは20分ぐらいで通りました。順位表を見ると、コンテスト開始時のエラーでコンテストは1分延長すると書いてありました。はい。penginさんが格闘しているCを見てみたのですが、明らかに重いことがわかりました。Aが通ってない様子だったのでamixさんに確認したところ、行けそうではあるが少し実装に手間取っているとのことで、Aを裏でこっそり並走しました。書き上げてサンプルが通ったのでAの様子を確認すると、1つ目のテストに通っていたので安心して後は任せました。Dを開いて読みつつ、Aを通したamixさんにDを考えてみてダメそうなら順位表監視をしてくれと言いました。言った直後、Dの簡単な嘘解法が思いついたのでそれをamixさんに共有しました。この時点ではCよりもDのほうが通っており、Cの異常さが際立つ順位表でした。またshichifukuがBでペナルティを食らっており、この時点では学内トップでしたが、開始1時間少しでshichifukuはCを通し(早い)、学内2位に落ちました。

それからしばらく経ちました。penginさんはかなりCの実装に苦戦しているらしく、そして僕もDの方針が全然浮かばず、かなり苦しい時間が流れました。2完はさすがにまずい。学内の他チームがどうこうとかじゃなくて、普通にやばい。Dの愚直を書いてみてエスパーしようとしてみたのですが、うまくいきません。途中penginさんとCDスワップみたいな話があったりしてpenginさんがDを触っていたのですが、正直Cは僕もきつそうなので実はDを中心に考えていました。順位表を監視しているamixさんからCとEが同程度に通っているということを聞いたりしましたが、EはEでうーんという感じで、まあ通すならDだろうと思っていました。

7時を過ぎ、予選は残り30分を切りました。Cは間に合わないので捨てました。マジで何も思いつかず、チームには絶望的な雰囲気が漂っていました。ふと順位表を見るとkarintou_extraが6時40分ごろにDを通していてfib-dihが学内最下位になっていることに気づきました。が、karintou_extraはそのDでペナルティを1つもらっており、さらにABのタイムを考慮すればまだ逆転の望みがあるという感じでした。

7時10分過ぎのことです。僕の頭にふと未証明の解法が浮かびました。正しい気もするししない気もして、計算量的には制約からするといい感じになりそうという感じでした。未証明ですが、もうこの際仕方ないので実装するしかありません。大急ぎで実装し、書き終えてサンプルを通したのが7時28分。急いでテストケースをダウンロードして手元で実行。その間に提出する問題を選択したりソースコードをアップしておき(Dなのにe.cppとかいうファイルに書いていたため慎重に選びました)、実行が終わったのを見て即座に提出。驚くべきことに1つ目のテストを突破しました。この時点で7時29分。penginさんが興奮する僕の様子を見て異様な雰囲気を感じ取ったようですが、構ってはいられません。2つめのテストケースをダウンロードし、同名保存できないのでファイル名を書き換え、実行コマンドの入力ファイル名も忘れずに変えて実行ボタンを押した、そのとき、、、

パソコンの時計に目を向けると、それはすでに7時30分を示していました。

いいえ、国内予選はまだ終わっていません。 f:id:pointN:20211105222407p:plain f:id:pointN:20211105225558p:plain f:id:pointN:20211105225618p:plain

大急ぎで2つめの解答を提出すると、画面にcongratulationsの文字が表示されました。予選終了30秒前のことでした。

予選が終わりました。順位表を見ると、fib-dihの提出は確かに通っています(僕のこの提出が、国内予選全体でいちばん最後に通された解答だったようです)。さらに、 f:id:pointN:20211105222759p:plain karintou_extraを逆転していました。

終了後

少しして、karintou_extraの面々が別室から戻ってきました。頭に血が上り足が震える僕はいい試合でしたねなどと彼らに好き放題言い散らかし(ごめんなさい)、落ち着いてからいくらか会話を交わしました。karintou_extraもDは未証明エスパーだったようで、しかしながらこちらと全く同じ方針だったようです。

結果を見ると割と散々で、国内予選突破時のために持っておいたラーメン屋さんのクーポンを使うことにはなりませんでしたが、個人的には過去最高の結果でした。また来年、頑張ろうと思います。

追伸:shichifuku予選突破おめでとうございます、この先も頑張ってください

追記:ラーメン、翌週3人で食べに行った、amixさんとはこれが初対面、おいしかった

夏休みのしゅくだい 3行日記

7月
27 28 29 30 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

8月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 1 2 3 4

点Nの編入体験記-令和3年度筑波大学情報学群情報科学類

2020年9月にあった、令和3年度入学者選抜編入試験の話。

はじめに

先に受験した豊橋技科大の記事を読んだ後だと、よりこの記事を楽しむことができます*1

pointn.hatenablog.jp

また、同級生のてばさき君も記事を書いたようなので紹介しておきます。たいへん参考になるので受験生は先にこちらを読むべきです。受験生でない方は好きにしてください。

tebii-note.hatenadiary.com

点Nについて

豊橋の記事を読んだ方は飛ばしてください。AtCoderで青になりました) (とか言ってたら水色に戻りました。しかも水色適正から脱出できません)

高専生。電気と情報の学科。個人的な感覚だと授業内容は電気寄りだけど、情報のほうが好き。席次は1→1→1→1(→2)。どっちかというと定期試験で点を取るのがうまいだけだと思うけど。TOEICの最高は685で、この時のAtCoderのレートは青。絶賛オンライン授業中。情報学群情報科学類を受験(情報メディア創生学類との併願)。

入学後のための準備

編入後、高専の単位を大学の単位に読み替える作業がある。科目選択の余地がどれだけあるかは学校にもよるが、余裕があるなら筑波大学の履修要覧(あなたの同級生が大学1年生だった時のもの)を見て、情報科学類に入るうえで有用そうな選択科目があればとっておいたほうがよい。ちなみに、この戦略をとったために約40人のクラスで受講者が僕とてばさき2人だけの科目があった*2

試験勉強

試験について

情報科学類は、英語(TOEIC/TOEFLスコアによる評価)100点と、当日の筆記試験200点で評価される。筆記試験は数学と物理と専門(情報)が各2問の計6問で、ここから4問選んで解答すればよい。*3。が、情報メディアとの併願をする場合、物理の点が情報メディアの評価に入らないので基本的には数学と情報のみを選択することが多い。また、今後は情報科学類も物理が廃止され、数学と専門のみになるらしい。準備が楽になるが、どんな問題が来ても逃げが許されなくなる。

戦略

物理を捨てて、数学に全振りじゃ!!!!!

英語

TOEICは早いうちから受けていた。特に勉強したわけでもないので600後半で停滞しており*4、4年の冬時点の最高が685点。編入体験記を読む限り自分より高い点の人が多いイメージだったので、このままだとちょっとやばいかなと思っていたけど、その直後、新型コロナウイルスが世界中(とTOEIC公開テスト)を脅かすこととなる。

数学

これ。編入界隈では有名なやつ。編入数学御三家みたいなのの一角。あまりこの手の本は本屋に置いてないので図書館で借りるかネットで買うかというイメージだったが、幸いなことにたまたまこいつだけ街のでかい本屋に置いてあったのでこれ。めざす進路が明確でない時期に買ったのでどこを受けてもいいように1周したし、出がちな範囲はもう1周した。筑波の受験の前はベクトル空間など線形代数の範囲をもう1周した。受験のときも持って行った。

過去問は7年分ぐらいやった。

情報

C言語のプログラミングが出るので学校で使った教科書を持って行った。でもAtCoderしてるしアルゴリズム系は大丈夫やろと思ってた。過去問は4年分さらっと見てうわあってなった。

物理

捨てた。

でも、筑波落ちた時は電通大(物理か化学を選ぶ必要があり、点Nは化学が苦手*5)とか受けるのかなぁみたいに思っていた*6ので、実はだいぶ前にこれらの本をちらほらやっていた。これらは東大に受かった同級生が先輩(同じく東大進学)から譲り受けたものを分けてもらった。内容は学校で習ったことの遥か上をいくものだったので、わりときつかった。

豊橋技科大受験後

豊橋技科大の受験前から分かっていたことではあるのだが、筑波の編入試験のスケジュールは大幅に遅れていた。TOEICも中止になってるし北関東とはいえ感染がそこそこ広がっている地域だし、まあそれはそうという感じなのだが、そのおかげで勉強時間はたくさんとれ(るはずだっ)た。

豊橋の試験の前まで、放課後なんかを使って数学はそこそこにやっていた。物理は捨てるのでほぼやってなかった。英語はもうどうしようもないし*7、情報は大丈夫そうという謎の自信があったので直前の2週間前とか1週間前とかに始めようと思っていた。豊橋から帰ったあと、疲れたという言い訳をして合格発表まであまり勉強しなかった(してないわけじゃない)。7月中旬の豊橋の合格発表から数日の間も、まともに勉強しなかった(してないわけじゃないぞ!)。受かったので嬉しくなっちゃったし、今日ぐらい休んでいいよねが積み重なり、なんだかんだで月日が流れた。比較的正当そうな理由をあげるとすれば、学校がオンライン授業に切り替える際に環境が整うまで時間割をいじって空きコマをつくった反動で1日中授業が詰まっていたのもある。

7月22日。にじさんじライバー、舞元啓介の3Dお披露目配信があった。その放送内で、大型企画の告知があった。にじさんじ甲子園である。

点Nは気づいた。夏休みの予定が大きく狂ってしまいそうだ。

にじさんじ甲子園

ネタバレ注意。読みたくない人は飛ばしてください。そもそも、ここに書いてある内容は編入となんの関係もないです。

7月26日、ドラフト会議。


【#にじさんじ甲子園】にじさんじ甲子園ドラフト会議【にじさんじ/舞元啓介】

自分の好きなライバー*8はどのチームかなぁとか、笹木ぜんぜん第1指名されんやんけとか、しぃしぃのチーム問題児だらけやんとか、伏見を奪われる剣持とか、ドラフトの時点でたいへん面白かった。

8月になった。1週間だけ授業があった。それが終わって、夏休みが始まった。

勉強、ちゃんとできるかな。

にじさんじ甲子園、見過ぎないようにしなきゃ。

さて、さすがに僕は全員追いかけるような重度のオタクではないし、受験生だし、ということでリゼ皇女を中心に見て、あとのチームは飛ばし飛ばしとか、または切り抜き等を見つつ全体の流れを追っていった。

お化けスクリューのアンジュとか、皇女の転がせ指示を無視してホームランを打ついにゅいとか、転生夜見の爆速盗塁とか、威圧感のメフとか、走らされ続けるはかちぇとか、ほかにもいろいろ見どころはたくさんあったけどここは大学編入の記事なのでこれ以上は深く語らないことにしよう。とにかくよかった。

本番は予選も決勝もしっかり見た。静岡県王立ヘルエスタ高校はちょっと残念な結果だったけど、最強ピッチャー月ノ擁する強豪のVR関西に勝ったし、順位以上にけっこう健闘したんじゃないかと思う。


【#にじさんじ甲子園】にじさんじ甲子園 本戦 〜Aリーグ〜【パワプロ2020】


【#にじさんじ甲子園】にじさんじ甲子園 本戦 〜Bリーグ〜【パワプロ2020】


【#にじさんじ甲子園】にじさんじ甲子園 決勝【パワプロ2020】

舞元と天開の振り返り放送も1日目2日目ともに見た。なんなら力一のサイレン甲子園も見てる。切り抜きは毎日のようにニコニコに上がったし、ファンアートも大量に描かれたコジィ(@kozy0080)さんのとかよかったよね。

~試験2日前

にじさんじ3Dお披露目配信多くね?コロナで詰まってたとかあるらしいけど。エビオ社長アルスでびる夜見。全員見た。それぞれの個性が出ててよかったですね。

ちなみに、この期に及んでにじさんじ甲子園のエキシビションも見た。見ない選択肢はない。


【#にじさんじ甲子園】にじさんじ甲子園エキシビションマッチ【椎名唯華/にじさんじ】

そのほか、だいぶ飛ばし飛ばしではあるものの笹木・ニュイの栄冠ナインやにじ鯖夏祭りなども軽く見た。Fall Guysも大流行していたのでちょっとだけ見た。リンク張りに飽きたので見たい人は自分で検索してくれ。インドってなんだ…?

さすがに、いちおう勉強もしていた。参考書にある過去に筑波で出た問題や、学校にある数学の過去問を解いた。過去問を解く中で、筑波の編入試験は年による難易度のばらつきが激しいと感じた。解ける問題は落としたら即落ちるレベルで全員解けるし、解けないものはマジで解けない(多分解けなくてもダメージにならないだろレベルの問題もちらほら)。解けないときは素直に解説を見たが、わりと無理ゲーなことが多かった。解説を作成してくれた数学の先生がたありがとうございます。

前日移動

9/4(金)。丸1日公欠を取ったので朝から移動。体育やりたかったな。コンビニ*9でおにぎりを2つ買って、新幹線に乗り込んだ。買ったのはもち麦もっちり! 牛焼肉キムチビビンバおむすびもち麦もっちり! 塩こんぶ枝豆おむすび。なんか変わってたので気になった。車内で確認したところ、てばさきは1便ぐらい後ろの新幹線に乗ったとのこと。何も示し合わせていないので、やはり同じにはならなかった。途中、名古屋のほうで大雨が降ったらしく、そのせいでちょっとだけ新幹線が止まった。でも大した影響はなかったようで、スマホを見たりおにぎりを食べたり複数回にわたって寝落ちたりしていた。終点東京だから寝ても大丈夫。自由席に座ったが、外出を自粛する人も多いし平日だしでスカスカだった。隣に誰も来なくて超快適。途中、木曽三川のところで、小学校で習った木曽三川ってここにあるんだなあと思った。輪中とかいう懐かしい言葉を思い出した。

新幹線はとても速いので、すぐ東京に着く。東京はいつ見てもビルが高い。あと、やっぱりオリンピックの色が濃かった。車窓からミライトワソメイティ*10が見えた。もしオリンピックも受験も予定通り行われていたとすれば、時期が重なってホテルの予約が難しくなっていたかもしれない。他に見えたものというと、東京工業大学附属科学技術高等学校のサッカーグラウンドの印象が強い。ちゃんと調べたわけではないけど、ここに通ってるやつらはさぞ賢いんだろうなぁという勝手な想像をした。

東京駅に着いた。人が思ったより多かったが、逆にこれ以上少ないとそれはそれで気持ち悪いような感じ。初めてじゃないのに迷いながら山手線のホームにたどり着き、つくばエクスプレスの駅がある秋葉原まで乗車した。15時ぐらいだったので電車はガラガラだった。東京には年に1回ぐらいのペースで訪れている*11が、朝夕の山手線に乗ったことがないので未だに満員電車にあたっていない。車内にやたらめったら取り付けられたモニタに移る広告をじっと見ていると*12、すぐに秋葉原に着いた。2駅なので広告を見ようが見まいがすぐ着く。

JR秋葉原駅とTX秋葉原駅は直接つながっておらず、一度駅を出る必要がある。JR秋葉原駅構内で比較的しっかり迷ったが、なんとか脱出に成功した。9月のまだ序盤、とても暑かった。

TX秋葉原駅からつくばエクスプレス(快速)に乗車。ICカードに対応してくれているので、持ってきたICカードで改札を通過。切符を買うよりわずかに安いのだが、片道1200円ぐらいなので普通に高い。受かったらの話ではあるが、東京に遊びに行くだけで金が吹き飛んでしまう。ホームまでは遠く、かなり地下に潜った記憶がある。終点のつくばまで快速で45分程度。窓の外の緑を眺めたり、バズってたオモコロの記事を読んだりした。学生もいたが、受験を控えているせいか車内の偏差値がいやに高く見えた。

omocoro.jp

つくば駅は予想に反してかなり静かだった。駅の施設の一部が改修中だったのもあるかもしれないが、それにしてももうちょっとにぎわっていると思っていたので意外だった。駅を出ると駅前にありがちな商業施設が目に入ったが、どうせ後で行くことになりそうなのでこの時点では行かなかった。ホテルはかなり近くにあるのだが、公園に立ち寄ってフクロウの像を眺めたりした。つくばエクスプレス開通記念の像らしい。今でこそ1時間で都内に行けるが、彫ってあった日付は2005年とかなので、それまではだいぶ不便な土地だったのだろう。道中、このあたりではロボットの実験をしているという案内を見つけたが、肝心のロボットの姿を見ることはできなかった。季節とかタイミングがあるのだろうか。一度見てみたかった。

泊まったのはホテル日航つくばという(多分、だいぶいい)ところで、部屋は10階だった。ホテルの料金はGoToキャンペーン*13のおかげでだいぶ安かった。この恩恵を受けるために代理店から一度帰宅して身分証を持って行った記憶がよみがえった*14

www.nikko-tsukuba.com

フロントでのやり取りを済ませ、なんか知らんけどホテルの会員になってカードを作ってペットボトルの水を貰った。カードを作らないと水がもらえないシステム、何なんだ。くれたっていいじゃないか。フロントは外国の方だった気がする。だから何ということはないけど、こういうホテルでは多い気がする。カードキーを使って部屋の中へ。元から汗だくではあったが、部屋に入って立ち止まった瞬間さらなる汗が湧き出てきて、冷房の効いた客室は寒かった。とりあえず上半身に着ていた服をいったん全部脱いだ。鏡に映った自分を見て結構太ったなぁと思った。着替えは最小限しか持っていかなかったので、汗が引いた後で仕方なく着直したが、めちゃくちゃ気持ち悪かった。去年の夏休みのインターンシップの時も似たようなことをしていたことを思い出した。猛暑の中を東京駅から赤坂までスーツケースを引いて歩いたのは今思い出しても意味がわからない。大人しく電車に乗れよ。結局寒かったので冷房は切ったし、チェックアウトするまでそのままで十分快適に過ごせた。

夕食はいつも通りコンビニで調達することにした。高専生は旅先でもちゃんとした料理屋に行ってる人が多い印象だけど、どうやって探しているのだろうか。いろんなイベントとかで県外に行くことはあるけど、いっつもコンビニとか牛丼チェーン店とかで食べてる気がする。受験前にいいもの食っても味わかんなくね?知らんけど。駅周辺にはコンビニが多く、とくにホテル付近にファミマが2店舗、ローソンが1店舗ある。正直ここから勉強しても仕方ない気がしていたので、せっかくだし思い出作りも兼ねようと必要以上にうろうろした。商業施設内には積極的には入らなかったが、そのまわりや通路を探索した。筑波大学サテライトオフィスなるものを見つけた。何があるわけでもないが、中をこっそり見つつ通り過ぎた。明日ここの受験をするのだという現実を再確認し、ややテンションが下がった。ミスドが目立つ位置にあって、最近食べていなかったので食べたくなった。夕飯を買わないといけないので、そう思い立ったタイミングでちょうど近くにあったローソンに行った。麺類が好きなので温かいパスタとかがよかったのだが見当たらなかったので、ハンバーグ弁当と甘そうなコンビニスイーツを適当に買った。あと、おにぎりを買いがちな点Nにしてはめずらしく、朝食用にたまごサンドイッチを買った。カツサンドとかもあったけど、試験の日の朝にカツサンドはちょっと重いし、ゲン担ぎっぽくなるのも嫌だった*15。駅前のコンビニだけあって部活帰りと思われる学生が多かった。制服を着た女子高生の団体が入店してきてなにやら喋りながら買っていた。そういう青春を経験せずに大人になってしまったので、正直言って羨ましい。大人になりたくないという思いとは裏腹に、時間は容赦なく流れていってしまうものである。

夜はほとんど勉強しなかった。焦りも感じていたが、それ以上に今からやってももう遅いし変わらないだろうという気持ちが大きくなってしまった。落ちても豊橋には受かっているというセーフティネットが、逆に試験に向かう気力をなくしていた。テレビはちょっとつけてすぐ消した。受験前に見ても面白くない。Twitterを開いて「筑波 編入」で検索したり、にじさんじの切り抜き動画をちょっとだけ見たりした。やはりこちらも受験前に見たところで面白くないのだが。お茶や水以外に何か味のついた飲み物を買おうかと思ってホテルの自販機に行ったが、釣銭切れだったし手持ちの小銭が微妙な感じだったのであきらめた。エレベーターで上下し、時間を浪費しただけ。ちなみに自販機には逆エナジードリンクなるものがあってちょっと気になった。機会があれば試してみたい。ちなみに、僕は普通のエナジードリンクはあまり飲まない。魔剤ンゴとかも言わない。音ゲーもしないし艦これもしない*16。部屋に戻り、風呂に入っておとなしく寝ることにした。たまに石鹸の類が洗面台に置いてある場所があるが、そうではなくて風呂内に設置してあったのでよかった。洗面台においてある時って持ち込むにしても邪魔だし手を伸ばすのもあれだしでどうすればいいのか未だに分かってない。どうすればいいのか知ってる人は教えてください。風呂から出たあと、洗面所の鏡がそうだったので部分的に曇らない鏡のしくみが気になり、検索してみたりもした。ドライヤーで髪を乾かしたあとは、いつも通り備え付けの目覚まし時計と、スマホのアラームをたくさんセットして寝た。よく覚えていないが、なんだかんだで0時は回っていた気がする。やべぇ全然睡眠時間ないじゃんと思った記憶がある。

試験当日の朝

9/5(土)。予想通り、緊張していたので最初のアラームで目が覚めた。エアコンを切っていたので少し暑かったのか(快適とは)、または単に寝相が悪いのか、布団をだいぶ蹴飛ばしていた。6時だったか6時半だったかは忘れた。冷蔵庫で保管していたたまごサンドを食べた。たまにはおにぎり以外もいいかもしれないと思った。めざす筑波大学はTXつくば駅の北。筑波大学の敷地はでかいし南北にやたら長いため北のほうの会場までは相当距離があるのだが、我々の受験会場である春日試験場は南の飛地*17。ホテルに最も近いエリアで、徒歩で十分な距離なので歩いた。てばさきと待ち合わせなどは特にせず、一人で向かった。集合時刻は9時半だが開場は9時なので、ネットで調べた徒歩時間を参考にして、さらに迷うことも考慮して余裕をもって9時に着くようにホテルを出た。早めに出たので、途中に見えたロケットのようなものなど、途中でいくつか写真を撮った(写真は上のツイートに掲載)。筑波と言えば宇宙開発ってイメージがある。後ろには受験生と思しき2人組がいた。たぶん試験場が違う受験生のバスに後ろから抜かれた。パッと見ただけだが、けっこうな人数が乗っていた。途中で若干道に迷いかけたが、スマホの地図を見つつ、大きなトラブルなく筑波大学の前まで来た。あまり迷わなかったのでゆっくり歩いたつもりではあるものの、それでもちょっと早く着きすぎてしまったかと思ったが、敷地内に入って道なりに進むとそれらしい建物があり、その前の広場にすでに結構な人数が待機していた。入るのを若干躊躇した自分の葛藤を返してほしい。参考書を読む者、スマホを見る者、友人らしき人物と会話している者、みな密にならないようソーシャルディスタンスを保ちつつ思い思いのことをしていた。いちおう探してみたが、てばさきの姿はなかった。日頃のことを思うに彼はけっこうギリギリに来そうな印象を持っていたので、まあきっとそういうことだろうと思った。建物の前のボードに試験会場の部屋割りや注意事項などいろいろ書いてあったのでそれを読んで、待機する人々の中に加わった。受験番号の感じを見るに、今年もライバルが沢山いそう*18

少しして、若干早めな気もしたが開場。無事に入口の検温を突破し*19、受付で健康観察シート*20を提出して、教室に入った。教室内はだいぶ冷房が効いていたので1枚上に羽織った。座って待っていたら、てばさきも来た。小さい声であいさつしたような気もするし、アイコンタクトだけだった気もする。自分よりいくつか後ろの席に座っていたので試験中の彼の様子はわからない。仮に前にいても観察する余裕などないのだが。

試験

問題の内容についてはふんわりしか書かないので、問題用紙をお持ちの方はそれを見つつ読んでください。

英語

筆記試験開始前に公式認定証を回収された。685で提出。返却はされないので別の用事で必要なら再発行しないといけないはず。TOEICの認定証はIPテストのものではダメで、これに引っかかる人が毎年一定数いるというようなことが書いてある記事も存在するのだが、そのような人はいたのだろうか。まわりをキョロキョロできないので正確にはわからないが、特にそういう空気は感じなかった。実はそういう人もいて、受験者にそのことが伝えられないというだけかもしれないが。過去の受験生による記事では730で満点評価だとかなんとか書かれているので、それが正しいとして、得点が  \frac { \min ( 730 , score) } { 730 } \times 100 で算出されるとすると、小数点以下の処理にもよるが英語の評価はだいたい92点か93点か、その辺だろうと見積もることができる。筑波の編入試験の合格ボーダーは240/300だなんだと噂されているが、とするならば筆記はざっくり150/200必要になる。要求される得点率は75%で、それって結構厳しくない…?ちなみに今年はTOEIC/TOEFLの中止に伴い、オンラインで受験できたTOEFL iBT Special Home Editionのスコアでも対応していたが、利用した者はいたのだろうか。よく知らないけど、TOEFLのほうが大変なイメージ。

試験直前

筆記試験は2時間。どれだけ事前に勉強していても、あるいはサボっていても、最後は結果がすべてであり、この2時間で勝負が決まる。4問なので、1問あたり平均30分で解く必要がある。問題冊子と解答用紙、下書き用紙が配られた。解答用紙と下書き用紙は4枚ずつで、それぞれの紙に1問ずつ解答する形。用紙は上部がくっついていて、しかも解答用紙と下書き用紙が交互になっていたので、最初に全部バラして並び替える必要があった。ちょっとめんどくさい。解答用紙と下書き用紙は色が違うだけで同じフォーマット。解答欄にはなぜか横に点線が入っており、1段の幅が絶妙な大きさ。これに律儀に従うと数式なんかがちょっと書きにくい。裏は白紙で、オモテだけで足りない場合は裏に続くことを表に明記したうえで書き込んでよいらしい(現場のアナウンスに従ってください)。いっそオモテ面には「裏へ続く」とだけデカく書いて裏だけ使ったほうがストレスが少なそうだったが、さすがにやめた*21

数学

問題冊子をめくる。まずは微積。中身は実質的に2問。

大問1、重積分。分からん。いつかの過去問で似たような形式の問題を見た記憶があるが、明らかにそれより数段難しい。原始関数を暗記してないタイプの関数だったので、まずは不定積分を求めたかったのだが、これがどうも分からない。置換の方法を間違えたかと思い一旦全部消した*22。問題集で絶対やってるタイプの問題で、解ける人は普通に解けそうな問題。やばい。

大問2、偏微分。これもいまいち。まともに高専の数学を習って進級した人間なら解けるし対策してないわけがない簡単な小問が半分で、もう半分がマジで全然わからん。方針とかじゃなくて、問われてる内容がわからん。

ちなみに、友達数人に聞いた感じ、最後の問題に関しては記述のある参考書も少なく、さっさと捨てていい問題だったっぽい。東大受かったやつが「コラムみたいなところに書いてあった気がするけど覚えてない」って言ってた。

次に線形。全体を通して大きな1問。

小問1。見たことある問題。方針はわかる。解く。間違っていたらあとの問題にも響くので確認のために答えを代入してみる。計算が合わない。え、これが解けないと先に進めないんですが。何度見直しても合わない。嘘でしょ。まるまる白紙はさすがに落ちる。微積もボロボロなので100%落ちる。

この辺で、捨てたにもかかわらず物理の可能性を少し検討することに。残り1時間半。

物理をチラ見

物理1。力学で、割とスタンダードな問題のように見えた。なんならどっかの問題集にそのままありそう。むずいけど軽くひねっただけの典型という感じ(物理って大抵そういうものでは?)。残念ながら、勉強してないから解けない。

物理2。どの分野かと言われるとおそらく電磁気学だが、けっこう衝撃的な問題だった。過去問を見られる人はぜひ見てほしい、まじで。勉強していなくても初手はわかるが、その先は緊張状態では発想に悩みそう。解けなくもない気はするが、途中でミスがあると一生引きずるタイプの構成だし、そもそも物理なのでよほどの自信がない限りは手を付けたくない。

仕方ないので希望が残っている専門を先に回し、可能な限りさっさと処理して残り時間を全力で数学に振ることに。判断は迅速に。残り1時間半。

情報

情報は問題文も長いしソースコードを読まないといけない(し、僕はこの時点で数学がぜんぜんできていない)ので速度が大事になる。近年変わったアルゴリズムが出たので不安だったが、今年は2問とも競技プログラミングをしている人なら必ず見たことのある超ド典型問題が題材だった。幸運にもC言語の仕様に依存した処理はなかったし、ポインタとかの面倒な処理もなかった。はっきり言って、自分にとって難しい箇所は特になし。この辺は個人的な感覚なので正確にはわからないが、AtCoder緑ぐらいなら普通に戦えるし、水色ぐらいの実力があれば十分という感じ。1からプログラムを書くわけではないのでこの見積もりすらオーバーキル気味かもしれない。2問を30分で片づけ、見直しも満足にしないうちに数学に戻った。引っ掛け要素があったのならその分は減点されているが、感触はほぼ満点。競技プログラミング編入試験の役に立つ。残り1時間。

数学(再)

まずはこのままだと計算ミスのせいで部分点を加味してもせいぜい15点ぐらいの線形を何とかしなければ。冷静に何度も式を見直し、ようやく間違いに気づくことができた。気づいてしまえばなんてことはない、符号ミスだった。でも緊張してるとわからないものなので、冷静になることが大切である。小問2は簡単だったので順調に進んだが、最後の小問3の方針がいまいちわからない。頑張った証として問題集の記憶からそれっぽい内容のことを引っ張り出して書いておいた。温情の部分点がわずかに入る可能性はあるが、たぶんあってないと思う。でも時間がないので次へ行かざるを得ない。今の目的は完璧な答えを書くことではなく、得られる得点を最大化すること。残り30分ぐらい。もうこの辺から厳密な記憶は残っていない。

次に微積の大問1。どうしてもわからないのでちょっとイレギュラーな式変形を試みた。どうやってもその方針だと苦しいのだが、些細なことに目をつぶり、途中で式がおかしくなりながらもゴリ押して答えっぽいものを書いた。きっと全然違うけど、温情の部分点がわずかに入る可能性に賭ける(再放送)しかない。ちなみに、あとから確認したら全然違った。

最後の10分ぐらいは何をしていたかよくわからない。見直しをして、間違っていることに気付いて、そして無視した気がする。無力。落ちてるやろこれと思った。

試験後

解答用紙を回収。問題冊子と下書きは回収されず手元に残った。お持ち帰りくださいとのこと。いずれ公開するわけだしそれもそうか。どう計算しても7割5分ではない気がした。てばさきとはじめて合流し、彼が預けていたパソコンだかなんだかを取りに行くというのでそれを待ってから、一緒に歩いて駅のほうまで戻った。去年に比べて急に数学ムズくね落ちたわこれとか言った。てばさきも同調してくれていたように見えたのだが、後日ブログにて数学は余裕でしたとの旨を書いていた。ふざけるな。そのまま駅近くの商業施設に行ったが、てばさきはお土産を物色するそうなのでここから別行動。お土産とか買うつもりなかったし。このあたりでグループLINEに試験がいろんな意味で終わった旨を報告し、昼ごはんを食べていなかったのでひとりでラーメン屋へ。

清六家 つくばキュート店 - つくば/ラーメン | 食べログ

入ったはいいが勝手がわからないので店内を見回すと、右手側に券売機があった。どうやらここは食券を買って店員さんに渡す方式らしい。とりあえず主力商品っぽいやつにした。個人的には券を黙って受け取って欲しかったのだが、麺のかたさとか味とかいろんなオプションを聞かれた(ラーメン屋ではよくあることなので仕方ない)。よく分からんやつは分からんのでだいたい普通にした気がする。なんとか無事注文に成功。店員さんからも説明があったのだが、このお店はラーメンを注文すると店内にある炊飯器の中のご飯を残さない範囲で勝手に好きなだけ取って食べていい*23とのことで、この後の移動も考えて気分が悪くならない程度にいっぱい食べた。いっぱいといっても、あまり大食いではないので茶碗に軽く2杯と少し程度。卓上に高菜とかすりおろしたニンニクとかがあったので、よくわからないまま終盤にちょっと入れてみたりした。

ちなみに、このラーメン屋は大学付近に24時間営業の店舗を構えており、筑波大学生はそこによく行くらしい。

本音を言えば筑波や秋葉原うろうろしたかったのだが、コロナをもらって帰るわけにもいかないし、過去最強ともいわれた台風10号が接近していて帰りの新幹線が心配だしでさっさと帰ることにした。試験が2日にわたるところを受験している人たちは大丈夫なのだろうかとか要らぬ心配をしつつ、つくばエクスプレスに乗った。筑波編入勢のツイートを探しながら秋葉原へ。エクスプレス内がおそらくいちばん落ち込んでいた。横に座ってるやつら絶対受験生だし。

秋葉原に着いた。暑いしメイドさんを眺めに行くほどの元気は残っていなかったが、せっかくなので秋葉原駅をぐるっと一周だけすることにした。スクエニカフェを見つけた。残念ながら僕はFFもドラクエも詳しくないし、それ以外のタイトルは知らない。適当に街の写真を撮って東京駅まで山手線で移動。電車は相変わらず空いていた。

東京駅から新幹線に乗って帰宅。自由席は端っこのほうにあるのでそこまで歩くのが大変。暑かったので自販機でお茶を買った。交通系ICカードでお支払い。時間的に家で夕飯を食べられそうだったので駅弁は買わなかったが、途中で車内販売のアイスは食べた。フォロワーが食べていたのを見て気になっていたピスタチオ味を食べた。おいしい。

寝たり起きたりTwitterを開いたり閉じたりまた開いたり寝たりしながら、なんだかんだで駅に着いた。乗り過ごさなくてよかった。家族が車で待機してくれていたのでそれに乗って帰った。つくばの様子などを簡単に車内で話した。結果については合格している可能性がなくもないと伝えた。

とりあえず受験はここまでにするつもりだったので、あとは自由の身である(結果はともかく)。よい機会なのではてなブログに登録して豊橋の記事を書いた。あとCodeforcesも始めた。これまではAtCoderしかやってなかったが、これでたくさんコンテストに出られる。

結果

試験から1週間半後の9/16(水)。受かっている感触がなくて、このあたりは逆に心穏やかに過ごしていた。オンライン卒研の日だった。発表は10時だったがビビリなので昼休みに見ることにした。とりあえずTwitterを開いたら、てばさきが合格してましたツイートをしていた(この頃はてばさきのフォローはしていなかったが、共通の友人がリツイートしたものがタイムラインに流れてきた)。

可能性の光が見えたのも事実だが、なんか変なプレッシャーがかかって、よけいに合格者番号のページを見たくなくなった。が、見ないわけにもいかないので見た。情報科学類の合格者は20人。募集人数より多めに合格者をとる大学は多く、筑波も例年合格者を多めにとっているようだが、それにしても多めな印象。別タブで開いた情報メディアのほうの合格者数は10人ぐらいだっただろうか。かなり狭き門だったようだ。当然ながら合格者番号は第一志望である情報科学類のほうから見た。紙で隠して順番に…とかはせず(ビビリなので精神的にあれは無理)、全体をパッと眺める。不思議なもので、自分の番号は探さずとも勝手に目に入ってくる。合格していたらしい。とはいえ万が一のことがあるので、いちおう正式な書類が送られるのを待つことに。

9/17。前期末試験のため全員登校。まだ何も言ってないのにおめでとうだの何だの言われた。てばさきが受かってたからってこっちも受かってる保証はないのだが、落ちてたらどうするつもりだったの。泣いても知らんぞ*24。なお試験は何事もなく終了。いつもより早く帰宅した。その日の午後に書類のたくさん入った封筒が届いた。合格。

結局お前どれぐらい勉強したの?

あんまり勉強せずに余裕で受かったような感じで書いていますが、たぶん喉元過ぎて熱さを忘れただけだと思います。春休みに部屋を整理していたら、数学の問題を解いたA4ノートが5冊と、(結果には関係ないですが)物理の問題を解いたA4ノートが1冊半見つかりました。よく受験に使った参考書とノートがうず高く積み上げられた写真がありますが、(旧帝とかでもないし、所詮は編入なので)あれほどではないにせよ、にじさんじ甲子園とか3D配信とか言いながらも、最低限のことはしていたようです。

受験生へのお気持ちメッセージのコーナー

ちゃんと勉強しましょう。落ちる人のほうが多い試験ですが、誰にでもチャンスはあるレベルだと思います。もちろん、合格するに越したことはありません。この記事を読んだ方が合格することを切に願っています。それならもっと勉強法とかそういうまともなことを書けよという話なんですが。

また、今年はTOEICの中止の影響が非常に大きかったように思います。十分な英語の実力があるのにTOEICが中止になったせいで不利になった人もいるかもしれません。特に英語はそうですが、今年のイレギュラーな編入が来年以降もそのまま通用するとは僕自身も思っていないので。

あと、VTuberの見すぎはよくないです。VTuberの配信と自分の人生の両方を満喫するには一日は短すぎます。現実逃避はそこそこにしましょう、マジで。せっかくなので、おそろしい悪魔であらせられるところのでびでび・でびる様からのお言葉をどうぞ。

成績開示

気になる成績はこちら。

英語 94/100

専門 126/200

合計 220/300

英語94ということは僕が仮定してた計算式よりもうちょいめんどいことしてるのかも。高めに出てるからいいけど。てか数学ボロかったとはいえここまで落ちる?情報も若干ミスってるのかな……

*1:個人の感想です

*2:しかも1限

*3:一般に、自信がある問題を選択すると合格しやすくなる

*4:勉強しないと絶対に成績が上がらない、実によくできた試験である

*5:3年生の時にその年のセンター試験を解いてみたことがあるが、物理が73/100で化学が34/100だった

*6:実際のところ、筑波のあとにはモチベが消え去っており受けなかった

*7:TOEFLを受けるという手はあったが高得点が期待できないため却下

*8:秘密

*9:セブン

*10:東京五輪のマスコットだが名前をちゃんと覚えている人はどれぐらいいるだろうか

*11:3年前は部活の友人との旅行、2年前はハッカソン、昨年はインターンシップ

*12:田舎の電車にはそんなものないので珍しそうに見てしまった

*13:懐かしいですね。こんな時代もありました

*14:学生証単体では認められなかった。マイナンバーカードかパスポートか免許証あたりを持っていくと吉

*15:神社のお守りをカバンにつけていたりはする。このことはすっかり忘れていたが

*16:高専生に対する偏見が強いし、実際こういうやつは在学中あまり見なかった

*17:なお入学したら行くのは北のほうのキャンパス

*18:浪人してるわけじゃなくて、過去の倍率や受験者数のデータとの比較

*19:あの手の体温計って数字ちょっと低めに出てない?引っ掛かる気がしないんだけど

*20:受験票と一緒に送られてきた。朝夕の検温の結果や体調などを記入する

*21:嘘。緊張しているのにそんなくだらないことは思いつかない。これでも私は人生の岐路に立っているのだ

*22:後で調べたところ、実際は間違っていなかったのだが

*23:このサービス終了してると思います、お店で確認を

*24:向こうにとっても知ったこっちゃない