2020(令和2)年度 岐阜大学3年次編入試験受験記

2019/05/25に実施された,岐阜大学3年次編入試験(推薦入試)に合格した. 以下に試験内容,やった対策などを述べる.

併願校

岐阜大学以外に願書を出した大学・専攻科.岐阜大学から合格通知があったのちに,この2校の受験日だったため受験自体はしていない.

志望学部・学科・コース

工学部 電気電子・情報工学科 情報コース

筆者の情報

出身校

沖縄工業高等専門学校 メディア情報工学

部活動

ICT委員会(いわゆるプログラミング部)

主に

など,競技系の大会に出ていた.

席次

岐阜大学の推薦試験では席次は関係ないため,具体的に覚えていないが,1~4年で平均して6位くらいだったと思われる.

TOEIC

これも推薦試験では必要ないが,落ちたらTOEIC必須の一般試験も受験するつもりであったため,述べておく.はっきり言って見せたくないほど低い.

  • 3年10月: 220(IP)
  • 4年10月: 420(IP)
  • 4年03月: 450

受験までのフロー

1~3年

なんとなく受験かなぁ,みたいな気持ちになっていた. 特に志望校も決めず部活に集中していた.

3年春休み

そろそろ進路を決めなければならない時期になり,焦り始める. 色々ネットで情報を集めて,とりあえず編入用の本を買う.

4年夏休み

学校の授業として必修のインターンシップに行く.ちなみに2社行った. 他の高専生・大学生と力比べをしてみて,そのまま就職しても全然戦えるなぁと思ってしまい,かなり進路に迷った.

4年10月~11月

高専プロコンも終わり,進路の最終決定に取り掛かる.4年間の高専生生活を経て 「プログラム理論・型システム」 が面白そうだなぁと思い,そのような研究室が高専にあればよかったが無いので大学進学を決意した.

志望校を決めるためにネットで探してみた結果,京都大や筑波大などの名門大にそのような研究室があることが分かったが,この時期から狙える頭と時間を持ち合わせていなかったため,その辺の大学は狙わないことにした.

さらに探すと,岐阜大や群馬大に同様の研究室があった.2校とも苦手な物理が受験科目になく,これなら勉強すれば間に合いそうだったため,志望校をこの2校と滑り止めの専攻科として決定した.

4年1~3月

岐阜大に推薦を出すことを心に決めていたが,落ちることを想定して,一般試験の対策をしていた.

岐阜大と専攻科の一般試験にはTOEICが必須であったため,TOEICの対策をしていた. また,同時に数学を勉強していた. 使った本などは,後に述べる.

5年4~5月

引き続き数学の対策と新たに専門科目の対策をしていた.専門科目はあんまり難しくなかったためそこまで本腰を入れてはやらなかった.

また,同じ学科の進学勢の人々と一緒に過去問を解いたりしていた.

試験

成績配分と合格基準

成績配分

面接 成績証明書 合計
配点 150 100 250

これにおける,成績証明書の換算法は,

1~4年の各科目の成績で,

  • 80点以上の科目数を A
  • 70点以上79点以下の科目数を B
  • 60点以上69点以下の科目数を C

また,総科目数を S

としたとき,

成績証明書の換算式
\frac{(A \times 5) + (B \times 3) + (C \times 1)}{S} \times 20

と換算する.

ぼくの場合,93点くらいでした.

合格基準

工学部全体の成績トップから順に合格となる.

  • 面接の得点が配点の60%未満の者
  • 成績証明書の得点が配点の80%未満の者

は不合格となる.

試験当日

試験前

クソ暑いことは分かっていたのでスーツを着ていかなかった. しかし,僕以外の人間のおそらく全員がスーツを着ていて笑ってしまった.

電気電子・情報工学を受ける人,それ以外のコースを受ける人で2つの部屋に分けられて待機していた.

暇だったのでTwitterをしながらリラックスしていた.

一発目に面接をした.

面接会場には,面接官の先生が3~4人いた.

これは良かったのかどうか分からなかったが,主に質問をしていた先生が志望する研究室の先生だった.

面接で聞かれたこと

(試験直後にメモしていたので内容は大体正確であるはず)

Q1. 志望動機は?
A1. (志望動機に書いたことをそのまましゃべる)

Q2. プロコンの開発とかで静的解析に助けられたって言ってたけど,どういうやつ?
A2. Lintとかです.

Q3. 好きな数学の証明ある?(質問した先生いわく,「証明が好きな人だと,この分野は楽しい」らしい)
A3. そんなことは考えたことがないのでないです.

Q4. ETロボコンって何?(実績に書いていたため)
A4. レゴのマインドストーム使ってライントレースする大会です.

Q5. 愛媛大プログラミングコンテストって何?(実績に書いていたため)
A5. 競技プログラミングの大会です.

Q6. その大会で得られた面白い発見とかありますか?
A6. 競技プログラミングというものは,問題が与えられて解くだけなので,特に発見といったものはありませんでした.

Q7. 高専プロコンって何?(実績に書いていたため)
A7. 全国の高専生が集まってアプリを作ったり,競技部門ではある課題を解くプログラムを作って競いあったりします.僕は,その競技部門に3年間出ていました.

Q9. その3年間で印象に残ってることは?
A9. 28回大会の問題(パズルの問題)が面白かったです.(競技の内容説明).1回戦で1位になれたことが人生で一番嬉しかった.

Q10. その大会で得られた面白い発見とかありますか?
A10. ビームサーチというメタヒューリスティクスアルゴリズムを使うと大体いい感じの解が得られたことです.

Q11. 大学院行く?
A11. 今のところ行く予定です.

Q12. 大学に入って,勉学でもそれ以外でもいいのでやりたいことは何?
A12. ICPCという競技プログラミングの大会に出場したい.

試験後

うまく答えらなかったところもあり,手応えが無かった.

帰るときに,目の前でバスが3回連続で通り過ぎていったので悲しくなる.

試験における留意点

1. 口頭試問が実際には存在しない問題

募集要項の中で,以下のような文言がある.

面接(口頭試問を含む)及び成績証明書(調査書を含む)により,総合的に合否を判定します。なお,推薦書及び志望理由書は面接において参考資料とします。

引用元: 2020(令和2)年度工学部3年次編入学募集要項 p.11

口頭試問があるということだったため,ある程度数学や専門の勉強をしていた. しかし,実際には口頭試問が無かった.ネット上にはこのような情報は無かったため驚いた.もしかしたら,毎回募集要項に書いているだけで実際にやっているわけではないかもしれない.

2. 服装問題

スーツを着ずに普通の格好で面接を受けた.結果的にそのぼくは合格していたため,スーツの着用が合否に響かないことが証明された.これから大学編入試験に挑む全人類はぜひとも普段着で面接に臨んで頂きたい.無理して暑い時期にスーツを着る必要など無いのだ.ただ,それで落ちたからといってこのブログやTwitterにぼくへの責任を求めることはしないで頂きたい.

試験対策

一般対策

数学

  • 編入数学徹底研究: 頻出問題と過去問題の演習

これは絶対に買うべき.地方国立ならこれで十分だと思われる.1周半した. 個人購入.

編入数学徹底研究: 頻出問題と過去問題の演習

編入数学徹底研究: 頻出問題と過去問題の演習

  • スバラシク実力がつくと評判の線形代数キャンパス・ゼミ―大学の数学がこんなに分かる!単位なんて楽に取れる!

学校でやってない線形の範囲を勉強するために使った.1周した.学校の図書館から借りた.

  • 大学編入のための数学問題集

解説が結構丁寧.ぼくは難しそうなものをピックアップして解いた.特殊なルートで貰った.

大学編入のための数学問題集

大学編入のための数学問題集

あんまり使ってない.難しい.特殊なルートで貰った.

大学編入試験問題 数学/徹底演習(第3版)-微分積分/線形代数/応用数学/確率-

大学編入試験問題 数学/徹底演習(第3版)-微分積分/線形代数/応用数学/確率-

英語

  • TOEIC L & R TEST 出る単特急 金のフレーズ (TOEIC TEST 特急シリーズ)

単語を覚えるために使った.半分くらいやった.個人購入.

  • [新形式問題対応/音声DL付]TOEIC(R) L&Rテスト 直前の技術

英語が出来なくてもこれやったら200点上がった.意味が分かりません.学校の授業で使ってたもの.

[新形式問題対応/音声DL付]TOEIC(R) L&Rテスト 直前の技術

[新形式問題対応/音声DL付]TOEIC(R) L&Rテスト 直前の技術

  • 鉄緑会東大英単語熟語 鉄壁

3年生のときに買って少しだけやって挫折した.個人購入.

鉄緑会東大英単語熟語 鉄壁

鉄緑会東大英単語熟語 鉄壁

専門

論理回路苦手なので使った.研究室に置かれてたものを借りた.

論理回路入門 第2版

論理回路入門 第2版

面接対策

してない.というより出来なかった.というのも,受験1週間前に担当教員とやろうと思っていたが,思いっきり体調を崩し1週間休んでしまった.結果的に受かったから良いものの,練習しないのはリスクが高いのでやったほうが良い.ちなみにぼくが緊張せずに出来たのはスーツを着なかったからである.スーツを着るな.

まとめ

編入試験対策は本当に早く始めたほうが良い.特に英語はマジでやってほしい.ぼくはやってなかったので,一般だったら落ちていた可能性が濃厚だ.

また,仲間を見つけたほうが精神衛生上良い.弊校のように,大学編入受験をする人が少ない場合はStudyPlusなどの勉強用SNSで仲間を見つけるのも良いかもしれない.

ちなみにぼくは勉強のログをStudyPlusでつけ続けていた.結構モチベーションになるのでオススメである.

岐阜大学編入試験の情報があまりにも無さすぎて,対策が取りにくかった.旧帝大やその他上位大の受験者は,ブログに書いてくれる人が多いので助かるのだが,岐阜大を含む地方国立は本当に情報が無いので辛い思いをする.受験した人々は後輩のために筆を執っていただきたい.

ぼくに質問がある人はコメント,もしくはTwitterで連絡してください.

ICPC2019 国内予選参加記

2019/07/12 に開催されたICPC国内予選に沖縄高専「NeMiKoji」チームの一員として参加した.

結果

3完114位.

チームメンバー

各ニックネームの一部を切り取ってくっつけたのがチーム名だ.

実施環境

  • 場所: 沖縄高専 2Fプログラミング演習室
  • OS: MacOS Mojave
  • マシン: MacBookPro(ディスプレイとキーボードとマウスをつなぐのでレギュレーション違反でない)
  • キーボード: HHKB US配列(チーム全員がUS配列触れるマンだったので)
  • 使用言語: C++17
  • エディタ: NeoVim(coc.nvim+clangdで補完が効くようになっている)

スタイル

この中でおそらくタイピング速度が一番はやいのと,HHKBに慣れているkurokoji(ぼく)がコーディングを担当.

基本的にぼくがコーディングしているときに,nemusouとmitoが考察をするスタイル.

コンテスト前

特別ICPCの対策をしているわけではなく,各々研究室で時間を潰した.

ぼくは寝ていて,mitoはAndroidStudioで遊んでいて,nemusouはベースの練習をしていた.

15:55くらいに起床して,「もう16:00なるやん!! 急ごう!!」と二人を急かしたが,開始が16:30であることに気づきウケた.

ライブラリはUnionFindだけ印刷した.ぶっちゃけ幾何とか出ても解けないので.

コンテスト中

A問題

A問題はやるだけだったので,やった.ぼくがコーディングしつつ2人はBの解読にかかる.

8:00でAC.

#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>

int main() {
  int n, m;

  while (std::cin >> n >> m, n != 0 || m != 0) {
    int v[n][m];
    for (int i = 0; i < m; ++i) {
      for (int j = 0; j < n; ++j) {
        std::cin >> v[j][i];
      }
    }

    std::vector<int> sum(n);

    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < m; ++j) {
        sum[i] += v[i][j];
      }
    }

    std::cout << *std::max_element(sum.begin(), sum.end()) << std::endl;
  }
}

B問題

「B問題のBはBFS」と思いながらコーディング.最近,全くといって競技プログラミングをしていなかったので蟻本を見ながら実装する.

ちょいちょいバグを埋め込んだので時間を食ってしまう.

34:30でAC.よく考えたらマンハッタン距離を足すだけなのに無駄なことをしてしまった.

#include <iostream>
#include <vector>
#include <queue>

const int INF = 100000000;
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};
int h, w;

int bfs(const std::vector<std::string>& field, int sy, int sx, int gy, int gx) {
  using P = std::pair<int, int>;
  int d[100][100];

  for (int i = 0; i < 100; ++i) {
    for (int j = 0; j < 100; ++j) {
      d[i][j] = INF;
    }
  }

  P p = {sy, sx};

  std::queue<P> q;
  q.emplace(p);
  d[sy][sx] = 0;

  while (!q.empty()) {
    auto [y, x] = q.front();
    q.pop();

    if (y == gy && x == gx) break;
    for (int i = 0; i < 4; ++i) {
      int ny = y + dy[i];
      int nx = x + dx[i];
      if (0 <= ny && ny < h && 0 <= nx && nx < w && d[ny][nx] == INF) {
        q.emplace(ny, nx);
        d[ny][nx] = d[y][x] + 1;
      }
    }
  }

  return d[gy][gx];
}

int main() {

  while (std::cin >> h >> w, h != 0 || w != 0) {
    std::vector<std::string> field(h);
    std::string s;

    for (int i = 0; i < h; ++i) {
      std::cin >> field[i];
    }

    std::cin >> s;

    int sum = 0;
    int fy = 0, fx = 0;
    for (auto&& c : s) {
      bool flg = false;
      int gy, gx;
      for (int i = 0; i < h; ++i) {
        for (int j = 0; j < w; ++j) {
          if (c == field[i][j]) {
            gy = i;
            gx = j;
            flg = true;
            break;
          }
        }
        if (flg) break;
      }

      sum += bfs(field, fy, fx, gy, gx);
      fy = gy;
      fx = gx;
    }

    std::cout << sum + s.size() << std::endl;
  }
}

C問題

先に問題を読んでいた二人から説明を聞きながら考察.なんかDPみたいなことするんだろうか,ウーンと唸りながら考えていた.mitoが分銅のパターンを列挙できそうみたいなことを言っていた.

これ全列挙したら時間足りなくね? と思ったのでまた考察に入った.その間に二人にはD問題を見てもらっていた.

よくよく考えたら計算量は  O(3^ M \times 100) なので制約を考慮すると現実的な時間に終わるやんというのに気づき実装を始める.

2:21:28にAC.通ったときはみんなでハイタッチした.めっちゃ嬉しかった.(けど時間かかりすぎ!!!!)

#include <iostream>
#include <vector>
#include <map>
#include <cstdint>
#include <unordered_map>

using lint = std::int_fast64_t;
int n, m;
int a[100], w[10];
std::map<lint, int> cand;

void func(int i = 0, int sum = 0) {
  if (i == m) {
    cand[sum]++;
    return;
  }

  func(i + 1, sum + w[i]);
  func(i + 1, sum - w[i]);
  func(i + 1, sum);
}

int main() {
  while (std::cin >> n >> m, n != 0 || m != 0) {
    cand = std::map<lint, int>();
    for (int i = 0; i < n; ++i) {
      std::cin >> a[i];
    }
    for (int i = 0; i < m; ++i) {
      std::cin >> w[i];
    }

    func();

    int cnt = 0;
    bool ok[100] = {};
    for (int i = 0; i < n; ++i) {
      for (auto&& e : cand) {
        if (a[i] == e.first) {
          cnt++;
          ok[i] = true;
        }
      }
    }

    std::map<lint, int> cand2;
    if (cnt == n) {
      std::cout << 0 << std::endl;
    } else {
      for (int i = 0; i < n; ++i) {
        std::unordered_map<lint, bool> m;
        if (ok[i]) continue;
        for (auto&& [key, value] : cand) {
          if (m[std::abs(a[i] - key)]) continue;
          cand2[std::abs(a[i] - key)]++;
          m[std::abs(a[i] - key)] = true;
        }
      }

      bool flg = false;

      for (auto&& [key, value] : cand2) {
        if (value == n - cnt) {
          std::cout << key << std::endl;
          flg = true;
          break;
        }
      }

      if (!flg) {
        std::cout << -1 << std::endl;
      }
    }
  }
}

D問題

全然分からなかった.とりあえずそれっぽいやつを書こうとしたけどC問題に時間を掛けすぎてタイムオーバー.

コンテスト後

3人とも互いに「最近競プロやってない割には頑張ったじゃない?」と褒め称えた.

実は昨年もmitoとぼくと先輩で参加したのだが,1完に終わって悔しかった記憶が残っていた.それに比べると3完なので良いよね.

感想

役割をちゃんと分業できたので,チームワークは割と良かったと思う.

予選は通過出来なかったが,良い経験だった.PCKぶりにチームで競プロをしたので楽しかった.

来年からぼくは岐阜大学に進学するのでこのチームで出場出来ないが,岐阜大でも仲間を見つけてICPC出場したい.(岐阜大ICPC出たことなさそうだが)

競技プログラミング引退したはずだったけど楽しいので復帰しそう?

D言語のおはなし

※この記事は ICT Advent Calendar 2018 18日目の記事です.

昨日はICUに合格したらしいまなえです.

manaway1019.hatenablog.com

明日は,私が高専を去ることを心底悲しんでいるkurokojiです.

親しい人が離れていくというのは正直寂しいですよ.はい.

毎年私からの愛のこもったフリを受けるために,私の次の日に記事を書いちゃう可愛いやつです.

誤りがあるので言っておくと,僕のほうが先に18日に書く予定を入れていたのに,17日に後からわざと入れたのはあなたでしょ??? 事実を曲げることは良くないです.


D言語を流行らせたい

全人類が学ぶべき言語であるところのD言語.しかし実態はあまり知られていないように思います.

D言語くんは知っていますか?

D言語くん

Twitter等で一度は見たことがあると思います.何かと変なポーズなので,ほとんどの人が笑いの対象としか見ていないような気はしますが.

「変なマスコットキャラクターが存在する,ようわからん言語」

そのイメージを払拭するために,このD言語販促記事を書いてます.

あ,ちなみに今年の高専プロコン競技部門のソルバはD言語で書かれています.

https://github.com/kurokoji/procon29-kyogi/tree/master/nagatogithub.com

軽い文法の紹介

import std.stdio, std.array;

void main() {
  writeln("Hello, World!!");
  for (size_t i = 0; i < 10; ++i) {
    writeln(i);
  }

  /*
  上のfor文と同じ動きをする
  foreachの場合,iの型は何も書かなくても型推論してくれます
  */
  foreach (i; 0 .. 10) {
    writeln(i);
  }

  uint[] ar = [1, 2, 3, 4, 5];
  ar[0 .. 3] = 0; // [0, 0, 0, 4, 5]
  ar[0 .. $] = 6; // [6, 6, 6, 6, 6]
}

import std.stdio はC,C++でいう #include <stdio.h> みたいなもの.厳密には違うけど,まぁそれは置いておいて.

writelnprintf のような標準出力関数です.writeln は改行が最後に勝手に入ります.write なら入りません.

writelnprintf と違って書式文字列("%s %s" みたいな)は使えませんが,writefln で同様に出来ます.

一般的な for も使えますが foreach も使えます.

C,C++などと違って,unsigned intuint です.短くて良い.

で,ar[0 .. 3] = 0 みたいに配列のここから,ここまで0を代入する,みたいなのが一行で分かりやすく書けます.

if などは他の言語と大体一緒です.

面白い機能の紹介

D言語には面白い(しかも便利)機能がたくさんあります.

などなど.

いくつか紹介します.

UFCS(統一関数呼び出し構文)

import std.stdio;

int inc(int a) {
  return a + 1;
}

void main() {
  int n = 1;
  writeln(inc(n)); // 2
  writeln(n.inc()) // 2
}

writeln(inc(n)) は普通ですね. writeln(n.inc()) に注目していただきたい.

UFCSとは関数の第1引数を関数の前に持ってきて,まるでメンバ関数のように振る舞うことが出来る構文です. これによりメソッドチェーンがやりやすくなり,見た目もよりキレイになります.

CTFE(コンパイル時関数実行)

import std.stdio, std.string, std.conv;

bool[] Eratosthenes(ulong N)() {
  bool[] is_prime = new bool[N + 1];
  is_prime[2 .. $] = true;

  for (ulong i = 2; i * i <= N; ++i) {
    if (is_prime[i]) {
      for (ulong j = i * 2; j <= N; j += i) {
        is_prime[j] = false;
      }
    }
  }
  return is_prime;
}


void main() {
  // enumをつけることで,強制的にCTFEを発動させることが出来ます
  enum tmp = Eratosthenes!100000;
  write(">> ");
  auto n = readln.chomp.to!uint;
  writeln(tmp[n]);
}

readln.chomp.to!uint は標準入力から一行文字列を受け取って,改行を取り除き,uint に変換しています.

このプログラムはエラトステネスの篩という素数を列挙するアルゴリズムです. 通常,この計算はN が大きくなると計算が遅くなります.そこで,CTFE(コンパイル時関数実行)を用いると高速化が見込めます.

名前の通り,この機能はコンパイル時に関数を実行,つまり計算を行っています. これにより,実行時は列挙部分の計算は行わないため,高速化が可能です.

ただし,計算結果を埋め込むことになるので吐いたバイナリのサイズは大きくなります.

mixin

void main() {
  mixin("writeln(1);");
}

見慣れないものが出てきました. これをコンパイルして実行すると,1 と出力されます.

mixin は渡された引数の文字列をその場所にDのコードとして埋め込むことが出来ます. (条件がありますが,詳しい説明は省きます)

例えば,四則演算をする関数を作りたいと思ったとき.

int calc(string op)(int lhs, int rhs) {
  // Dでは~(チルダ)で文字列の連結が出来る
  return mixin("lhs" ~ op ~ "rhs");
}

void main() {
  writeln(calc!"+"(1, 2)); // 3
  writeln(calc!"-"(3, 1)); // 2
  writeln(calc!"*"(3, 4)); // 12
  writeln(calc!"/"(8, 2)); // 4
}

このようにすると関数を4つも書かなくて済みますね.

D言語に興味を持ったそこのあなた

D言語の公式ページでコードを実行して遊べます.ここ

Windows/Mac/Linux に対応してるので今すぐインストール. ここ

Windowsは上記のURLから飛んでインストーラ使って.

LinuxMacならスクリプトを叩く.

curl -fsS https://dlang.org/install.sh | bash -s

これらのD言語の魅力は使ってみて体感してください.特にC++ユーザーは気にいるはず.


明日はバターくんです.(誰かわからんぞ)

// ここに記事を貼る