長めのメモ

旅行とか理系の何かとか呼んだ本の記録とか

神戸大学編入体験記

すこし古いお話です

傾向、出題範囲は今と変わっているかもしてないので注意してください

結構忘れたのと文章力がカスなので中身がスカスカな気がします

はじめに

大学に入って神戸に住みたいのと勉強を頑張りたいので神戸大学編入することにしました。学部は工学部です。 時期順に書いていきます

一回生春

部活に入ったり、やめたり、別にサークルに入ったりしてました

入ったはいいもののそれほど熱心に活動していません

勉強面においてはこの時学科の内容に興味が持てず今の学科でよいのか迷っていました

一回生夏

だんだん大学に通うモチベがなくなり同じ学科の大学生の「遊ぶために大学に入った」という一言が最後の一押しとなり編入を決めます

ちゃんと勉強してみたいのといい大学に行けば勉強熱心で面白い人がいるやろくらいの気持ちで勉強を始めます

一回生秋

情報科に興味があったので学科を変えて編入することを決めます

志望校はどうせ受けるなら受けられるところで一番よく高校からの第一志望だった神戸大学に決めました

このときから編入についてまともに調べて本腰を入れて勉強を始めます

一回生冬

多分大学が変わるので別に変っても人間関係に影響がないような学術系インカレサークルに入りました

勉強のみに時間を費やすと人間関係が閉じるので入ってサークルなどは入るほうが良いかもしれません

サークルに限らずともなにか外部とのつながりは確保するのが良いと思われます

このとき数物セミナーとか入っとければ良かった...

このときにもうめんどくさくなったので一回生でインカレじゃないほうのサークルをやめます

二回生春~夏

バイトをしたり教習所に通ったりして過労で一週間倒れるほど忙しかった気がします

このとく勉強ではひたすら過去問を解いており、わからないところがあれば大学の質問センターで先生や在籍するチューターさんや浪人が終わった高校の友人たちに聞いていました

嫌な顔をせずに丁寧に教えていただいたので感謝しかありません

受験慣れのために筑波も受けることとしましたが当時はTOIECが低くプログラミングの知識皆無で特攻したので普通に落ちました

試験前

試験は夏にあり近くホテルをとり、試験会場に迷って遅れないよう、前日に歩いて大学くなどの準備をしてました

中田敦彦youtube大学を見て面接対策をしていたら本番の小論文に問われる知識がでてました

試験当日

受験生は100人以上だったと思います

試験科目が終わるたび人が人が減っていったような気がします

このときもそれほどプログラミングの知識はなかったのですが面接で学習意欲は示したのでなんとかなりました

合格発表後

学科を変えて編入したので足りない知識が多く、大学のカリキュラムを何が必要か確認したのち見て勉強してました

この後の単位認定で受けてない授業が60単位以上認定されててひっくり返ってました

専門も独学でなんとかしないといけなくなったので...

編入に必要な単位は満たしており授業をほぼ取っていなかったのですが遊ぶ時間はほぼありません

科目別問題集

数学

ひたすら

  • 編入数学過去問特訓: 入試問題による徹底演習 (大学編入試験対策)
  • 編入微分積分 徹底研究: 基本事項の整理と問題演習 (大学編入試験対策)
  • 編入線形代数 徹底研究: 基本事項の整理と問題演習 (大学編入試験対策) を解いていました

入試問題による徹底演習をCまで解ければいいやろくらいに思っていました

物理

基礎 物理学演習I 基礎 物理学演習II をやってました

最初に物理を学び始めたときは歯が立たなかったのでマセマの力学、電磁気の参考書と演習をやってから取り組みました

英語

赤本の神戸大学の英語15年と竹岡英作文を使ってました 今はTOEICらしいです

小論文

以下の二点を行いました

  • 予備校に通って小論分の添削をしてもらう
  • 本を読んで専門知識を仕入れる

面接

対策方法があまりわかってなかったです よくわからないので面接対策の本に目を通したりなんかYoutuberスーツが面接を受ける動画を見てました

最後に

勉強はほぼ独学になり大学受験とは違いほぼ一人で勉強することとなります なので勉強のモチベ管理が重要になると思われます

また編入は学問に対して考える良い機会となります 自分が何に興味を持ってどの大学で何を学べるのか意識しておくと良いかもしれません

leetcode -201 bitwise-and-of-numbers-range 解説

問題

leftからrightまでの数をすべてANDの演算をした結果を出力

leetcode.com

解説

leftから1ずつ増やしてAND演算をすると間に合わない

ここでずっと1になっている場所に注目する

left、rightのビットをこれは最上位の連続した1bitである数を数えればよい

よってleft、rightを同じ数になるまで2で割っていけばよい この割った回数をsとおく

そこで残った最上位の1連続した1bitのみが取り出された変数であるleftをsで左シフトすれば求める答えとなる

Coding Games shadows-of-the-knight-episode-1解説

問題

www.codingame.com

解説

まず探索範囲を考える. 現在位置をx,y,xの探索範囲上限はmax_x,xの探索範囲下限はmin_x,同様にmax_y,min_yとおく. 探索範囲は最初は全範囲とする. max_x = w - 1 min_x = 0 とすればよい.

次に探索範囲を二分探索で狭めていくことを考える.

Uと入力された(現在の位置より上)なら探索範囲を現在位置よりも上の位置に設定,つまりmax_x = x -1 Dと入力された(現在の位置より下)なら探索範囲を現在位置よりも下の位置に設定,min_x = x + 1 yについても同様に行う.

実装(Rust)

use std::io;

macro_rules! parse_input {
    ($x:expr, $t:ident) => ($x.trim().parse::<$t>().unwrap())
}

/**
 * Auto-generated code below aims at helping you parse
 * the standard input according to the problem statement.
 **/
fn main() {
    let mut input_line = String::new();
    io::stdin().read_line(&mut input_line).unwrap();
    let inputs = input_line.split(" ").collect::<Vec<_>>();
    let w = parse_input!(inputs[0], i32); // width of the building.
    let h = parse_input!(inputs[1], i32); // height of the building.
    let mut input_line = String::new();
    io::stdin().read_line(&mut input_line).unwrap();
    let n = parse_input!(input_line, i32); // maximum number of turns before game over.
    let mut input_line = String::new();
    io::stdin().read_line(&mut input_line).unwrap();
    let inputs = input_line.split(" ").collect::<Vec<_>>();
    let mut x = parse_input!(inputs[0], i32);
    let mut y = parse_input!(inputs[1], i32);


    let mut min_x = 0;
    let mut min_y = 0;
    let mut max_x = w - 1;
    let mut max_y = h - 1;

    // game loop
    loop {
        let mut input_line = String::new();
        io::stdin().read_line(&mut input_line).unwrap();
        let bomb_dir = input_line.trim().to_string(); // the direction of the bombs from batman's current location (U, UR, R, DR, D, DL, L or UL)

        // Write an action using println!("message...");
        // To debug: eprintln!("Debug message...");
        if bomb_dir.contains("U"){
            max_y = y - 1;
        }
        else if bomb_dir.contains("D"){
            min_y = y + 1;
        }
        if bomb_dir.contains("L"){
            max_x = x - 1;
        }
        else if bomb_dir.contains("R"){
            min_x = x + 1;
        }

        x = (min_x + max_x) / 2;
        y = (min_y + max_y) / 2;


        // the location of the next window Batman should jump to.
        println!("{} {}",x,y);
    }
}

参考

https://m-ansley.medium.com/a-brief-introduction-to-2d-binary-searches-c-c862d101efbb https://github.com/vadim-job-hg/Codingame/blob/master/MEDIUM/SHADOW%20OF%20THE%20KNIGHT%20-%20EPISODE%201/python/shadows-of-the-knight-episode-1.py https://github.com/luojinzhang/Codingame-medium-solutions/blob/master/Shadows%20of%20the%20Knight%20-%20Episode%201.cpp

823.Binary Trees With Factors 解説

元のページ

leetcode.com

問題

与えられた一意の整数からなる配列 arr があり、各整数 arr[i] は必ず1より大きいものとします。

これらの整数を使用してバイナリツリーを作成し、各整数は任意の回数使用できます。各非葉ノードの値は、その子ノードの値の積でなければなりません。

作成できるバイナリツリーの数を返す関数を実装し、その答えが非常に大きい場合、109 + 7 で割った余りを返します。

解説

有料プランしか見ることができないのでSolutionsを参考して書きました。

アプローチ 1:動的計画法

具体例から見ていきましょう。 [2,4,5,10,20]という配列が当たられたとします。

2,5は子のノードがなく1つの[2]、[5]のバイナリツリーしかつくれません。 4は[4],[2,2]が作成できます。 10のときは[10],[10, 2, 5], [10, 5, 2]となります

表記場二つのみとすると 20のときは[20],[2,10,2,5],[4,5],[5,4],[10,2]となります。 ここで20のとき4,10はさらに複数のバイナリツリーが作成できます。

このため自身の約数のバイナリツリーができる数をあらかじめ求めておく必要があります。

一般化すると バイナリツリーを作成する数を A_i  A_i の約数を A_jとすると以下の式が成り立ちます

 dp[A_i] をdp[A_i]のバイナリツリーを作成することができる数とすると

dp[A_i] = dp[A_j] + dp[A_j] * dp[A_i / A_j]

これを A_i >  A_jとなるすべての jに対して A_j A_iの約数であるか調べてから動的計画法の計算行い  \sum\limits_{i=1}^n dp_i が求める答えとなります

アルゴリズム

arrayが配列として与えられていると

  1. arrayをソート
  2. 1からarray.sizeまでループ。添え字をiとする
  3. 1からiまでループ
  4. array[j]がarray[i]の約数ならばdp[array[i]] にd[array[j] * dp[array[i] /array[j]]を足す

実装

配列でなく連想配列を使っています。

Rust

use std::{cmp::*, collections::*, *};
impl Solution {
    pub fn num_factored_binary_trees(mut arr: Vec<i32>) -> i32 {
        const modu: i64 = 10_i64.pow(9) + 7;
        let mut dp: HashMap<i32, i64> = HashMap::new();

        arr.sort();

        for i in 0..arr.len() {
            let mut vi = 1;
            for j in 0..i {
                if arr[i] % arr[j] == 0 && dp.contains_key(&(arr[i] / arr[j])) {
                    let vj = *dp.get(&arr[j]).unwrap();
                    let vrm = *dp.get(&(arr[i] / arr[j])).unwrap();
                    vi = (vi + vj * vrm) % modu;
                }
            }
            dp.insert(arr[i], vi);
        }
        (dp.values().sum::<i64>() % modu) as i32
    }
}

leetcodeコンテスト初参戦記

はじめに

はじめてleetcodeに参加をしたので振返りや思ったことを記録します。 時間がない人は反省と改善点から読んでください。

やったこと

参加登録

Registarボタンを押すのだがその際に面接を受けるかというアンケートがとられた。他の競プロサイトと比べ就活のためという色が強いらしい。

環境構築

直前にやったのであまりできていない。 この拡張機能を使用。

ログイン

拡張機能はログイン機能を持っており、コンテスト中にleetcodeアカウント、Github、Linkedinのサードパーティログインができなかったためかなり焦った。ローカルやDocker上の環境で試したがLinkedinはできたりできなかったりし、leetcode、Githubはどちらもできなかった。 Cookieによるログインはできたためこちらで完了。

問題を解くとき

Rustにて取り組む。 拡張機能は自動テストができるのが便利だが、補完とかがなくきつかった。そこでatcoderで使っている環境を使用して、テストはleetcodeのコードテストにて行っていた。かなり効率が悪かったと思う。 Rustにあまり慣れてないのもあって、問題によってはC++を使ってこちらもatcoder用のものを流用した。デバッグ時は提出する関数部分をのみをコードに貼り付け、テストサンプルをmain関数内の変数に書き込んで行った。

和訳

英語の問題だったのでChrome上でサイトを開いたとき右クリックメニューの日本語に翻訳という機能を使った。 これは数式の処理があまり良くないため、英語で問題文を読むことに。

感想

問題数が少なくてatcoderよりは優しそうな気がする。コンテストは毎週日曜日のweekly contesutと隔週土曜日のbiweekly contestが日本時間11:30と健康的な時間帯にあり頻度が高いため参加しやすそう。

参加者は日本人が少なく中国人、インド人が多そう。vscode拡張機能を検索し、上から見ていったら開発者が中国人ばかり。

難易度は、参加時のコンテストではeasy 1問 medium 2問 hard 1問でeasyはatcoderでのA問題くらいでmedium 1問目は茶diff下位、medium 2問目は茶diff上位~緑diffくらいだった。Hardは見ていない。

反省と改善点

環境構築

C++ならhttps://marketplace.visualstudio.com/items?itemName=wangtao0101.debug-leetcodeという拡張機能があるのでテストとデバッグを行いやすくする。デバッグできる言語を追加すると書いてあるが最後のコミットが2021年なのが心配。

Rustならhttps://github.com/clearloop/leetcode-cliというのがあるためこれを使うと良さそうな気がする。

拡張機能

問題を解くとき

Rustを使うときコードを書くためのウィンドウと拡張機能を使ったテスト用のウィンドウを開き書いたコードを貼り付けてテストしていくのが良さそう。 ベストプラクティスとは遠いと思うが。

コンテスト

バチャコン機能が公式から提供されているので本番参加前に慣れておくべき。 普通に過去問を解くときは落ちたテストを表示してくれる親切設計があり、さらにサイトの機能で多数の一般参観者の解説をみることができるのでatcoderだけでなくこちらで勉強するのもよい。

和訳

今後ChatGPTを使うのが良いと考える。 問題文に数式の表記があり普通の和訳サイトだとうまくできないことが多いが、ChatGPTに投げたら数式までうまく処理をして和訳してくれた。

最後に

全体としてかなりよいサービスだと思います。 leetcodeやりましょう!

vscode拡張機能leetcodeでログインができなくなった

該当拡張機能はこれ https://marketplace.visualstudio.com/items?itemName=LeetCode.vscode-leetcode

環境

  • windows11
  • node version18

leetcodeかgithubでログインができなくなった。 Linkedinではログインができた。

dockerのRustが使えるデフォルトの環境(mcr.microsoft.com/devcontainers/rust:1-bullseye)で試したら資格がないとのことでleetcodeのアカウント、githun、Linkedinでもログインできなかった。 ただしcookieならログインできた。 cookiehttps://leetcode.com/で開発者ツールを開きNetwork->Name->graphql->Cookieで読みこめる。何も出て来ないならページを更新すれば良い。

linux系で/usr/local/binにファイルを配置すると...

どこからでも呼び出せるらしい シェルスクリプトを置いたら便利そう

デフォルトでここにパスが通っているので当然か

参考

https://zenn.dev/shinji/articles/0eaad9d8c0954f https://qiita.com/valzer0/items/67a4c8bf2b1be0fc825a