更新日時で差をつけろ

むしろ差をつけられている

8/23: 進捗が足りない

遅くに行って遅くに帰ってきました。比較的。
会社ではメールをごにょごにょしていました。

一晩屋内で過ごした天然水を飲んだらお腹を壊しました。
5月頃にもこういったことをしたので再発防止に努めます。

CTF, 競プロ全然できなかったのでダメだなぁと思います。
こういう日を減らして習慣にするためにもタスク管理の方法を模索しているのですが(かれこれ3年)、一向に改善できていないのでどうしようもないのかもしれません。
多分スクロール・ページをめくるといった動作が1回でも必要になるとサボってしまうのでしょうね。
そうなるとA4のコピー用紙にすべてを書き込む方法が続くのかもしれません。良い方法ではないけど。

GIMPでポスターを作るのは楽しいですね。「これに似せるにはどうすればいいんだろう?」とか考えて、予想外にいいものができたりするので。
Kaggle面白そうだなあとは思いますが、今は手を出せない><
IOL 2017の問題が出たので9月に入ったら解いてみようと思います。

inochiの方は各研究所から返信が来たらしいのですが、Gmailから見られないぞ…

はてなキーワード自動リンクを切りたい。かといってPROにするのもなぁ…(Markdownが使えるのではてブロは好き)

秋葉原に行った

すぐ部品が必要な用事ができたので、秋葉原に行ってきました。

秋月->千石->その周りの店って順番で行きました。

  • Arduino Leonardo
  • 温度センサ
  • 超音波センサ
    • 使い道まだ決めてない…
  • ブレッドボード
    • 小さいのかわいい
  • ジャンパケーブルいろいろ
    • 20本あれば足りるっしょ
  • USBライト(薄い x 2
    • なんか基盤がむき出し担ってるペラペラのそれです。ちゃんと光ってすごいかっこいい。
    • 最初千石電商で見つけて\600買ったら、となりの店で\200円で売っていました。キレそう。
  • Fidget Cube
    • ストレス解消グッズです。Kickstarterで募集していたころから気になっていました。千石電商で\250。
  • Wi-FiモジュールESP-WROOM-02
    • DIP化キットではなくて本体だけを買ってしまったので、ブレッドボードに刺せないですね…また今度開発ボードを買いに行くしか….(8/23)RPiにする

(8/23追記)結局モジュール費用と手間を考えたらRaspberry Piもう一台買う方が安上がりなので、今度買いに行きます。
Arduinoでキーボード作りたいな。

雨に打たれたtento.techオフ会

今東京にいるのですが、せっかくの土曜日なのでどこかで何かをしようと考えていると、
tento.techというコミュニティの緑色のアイコンの人に「南浦和来て 会お」と言われたので行ってきました。

六本木まで大江戸線、日比谷まで日比谷線、そこから歩いて有楽町、そしてそして京浜東北線南浦和駅で降りて歩きました。
突発的な雷雨だったので傘を持ち合わせておらず、土砂降りのなかを歩いて行きました。
雨の中を走ると必ずコケてしまい「転倒tech」になってしまうので。

ビルの一室のプログラミング教室で集合です。じろう氏が先にいました。
名刺を財布に入れておいて正解だった。
ITパスポートの最年少記録を塗り替えられちゃったことが話題に上がりました。世の中には「Iパス(笑)」みたいに考えている人も多いので、是非基本情報技術者も9歳のうちにとっていただきたい…(秋期締め切り終わっちゃった?)

自分が到着したあとに雨がマシになってきたのでなんだかなあという気分です。
他の4人は1時間ほど遅れてやってきました。なんか全員ヤバそう。
自分のような一般高専生には出せない雰囲気。
たた「おじ」って呼ばれてる理由がなんとなくわかったかも。
先程の雨で、Macを入れているカバンに昔こぼしたペリカンの青インクがMacのアルミボディに移ってしまい天板の一部が青に染まりました。悲しい。

ETH, ArchLinux, 明石高専と学寮などについて少し話してから(ほぼ聞き専)インドカレー屋に行きました。
学生セット・\1000、ナンが美味しかったです。
関西人がハンバーガー屋のことを「マクド」と呼ぶのは都市伝説ではないことを証明してきました。「ミスド」も。
俺が歴史だ

そのあとはミスタードーナツに寄って1時間ほど過ごしました。
lazy K という言語を知ったのであとで遊んでみます。

帰りは電車の予定だったのですが、京浜東北線秋葉原辺りでウトウトしてしまって神奈川??の川崎??を越えたあたりの駅で気づいて降りました(有楽町で降りる予定だった)。
随分と乗り過ごし、時刻表を見ると終電でした。人生初終電です。1km弱あるいて帰りました。

「思いついたらまず実装」タイプの人間なので、いざ未踏とかに出すときに温めているアイデアがないの悲しい。
しかも実装できないので素直に絶望です^^;

8/17: ubuntuログインループ

ubuntuログインループを起こしてしまい、調べたところ$ sudo apt-get install lubuntu-desktopからの再起動で復活してくれました。
起動時の画面とかいろいろガバガバになってしまいましたが、軽いので良しとします。

ubuntuパーティションが満杯になり警告がでるようになってからループを起こしたので、macOSパーティションを切って作ろうとしています。その待ち時間にブログを久しぶりに書くことにしました。

インターンは4日目。ちゃんと1日目から書きたかったのですが、バタバタしてたからね、しょうがないね。
洋書「Programming Phoenix」をテストの章を除き読破しました。時間かかるけど読めないことはないかな。良い本でした。
「Programming Elixir」の日本語版もだいたい読みました。練習問題がなかなか難しい。

プロコンをそろそろ進めたいので一度Slackでメンバーにメッセ飛ばしたりOpenCV入れたりして(これが容量満杯の決めて)ました。
ネットワークが弱くてつらい…

CTFと言語学と競プロがここ1週間ぐらい触れてなくてアレです。

8/5: 長い一日

D: Widespread - AtCoder Regular Contest 075 | AtCoder
二分探索によわい…解説見ました

D: Menagerie - AtCoder Regular Contest 069 | AtCoder
D: Walk and Teleport - AtCoder Regular Contest 067 | AtCoder
なぜかできた。難易度調整って難しいんだなあ

夜まで寮のLANに繋がらず、競プロもCTFも調べものもろくにできなかったので、友人の部屋にこもってIOL/NACLOのPractice Problemを解いていました。
NACLOの問題はちょっとパズル色が濃くて、クロスワードパズルとかも出ます。楽しい!
いちいち紙に問題を印刷するのが面倒だ…AtCoderの問題も紙に印刷すれば解けるようになるかな???w
IOLの練習問題(Intermediate Level): Basque Numbers - 更新日時で差をつけろ


夜になってから強い炭酸のボトルを買いました。味はなしです。安い!

国語の対策を始めないと。

IOLの練習問題(Intermediate Level): Basque Numbers

日本語版が入ってないので書きます(なんとなく)。
パット見意味不明でも少しずつわかってきて面白かった。

IOLの練習問題はここからゲットできます。
International Linguistics Olympiad - Sample Problems

数字を当てる問題です。問題文が1行なので日本人にやさしい。

実はこの問題、

bost × zazpi = hogeita hama
bost zazpi × bederatzi = hirurogeita hiru

bost × zazpi = hogeita hama bost
zazpi × bederatzi = hirurogeita hiru

と読み替えないと公式解答とつじつまが合いません。改行の場所間違えちゃったのかなあ
無論私の勘違いの可能性もありますが…ただバスク語を調べてもhogeita hamaなんて数ないんですよね…

解法

原文曰く、Basque numbers are identified straightforwardly、つまり やるだけ とのことです。
えっ?

文字を変数に見立てて変形していきました。こうすれば1番めの空欄はすぐに埋まります。

bi * bost = hamar, bi * hamar = hogei -> bi * bi * bost = hogei
lau * bost = 空欄1, bi * bi = lau -> bi * bi * bost = 空欄1

したがって空欄1 = hogeiといった具合です。

hogeita bosthogei + bostと予想し、

「hiru * hamar = hogeita hamar」
hiru * hamar = hogei + hamar
 = bi * bi * bost + bi * bost
 = bi * bost * (bi + 1) = hamar * (bi + 1)
hiru = bi + 1
「bost * bost = hogeita bost」
bost * bost = hogei + bost
 = bi * bi * bost + bost
 = bost(bi*bi+1)
bost = bi * bi + 1

bi * bi = lauより、biは0,1ではないとわかります(bi * bi = biとならないので)。 また、lauは単語の短さから、1ケタの数字と推測しました。
lau <= 9となるので、biは2か3と絞り込めます。
特に理由はないのですが、bi = 2として先程の式に代入すると、hamar = 10, hogei = 20, bost = 5, zazpi = 7, lau = 4, hiru = 3, bederatzi = 9とわかります。
あえて理由を考えるなら、bi = 3とすると、zazpiが 12 という微妙すぎる数字になるからではないでしょうか(zazpi * hamar = hirurogeita hamarより)。さすがのバスク話者もここまでしないだろ(((
ここで空欄2 * hamar = laurogeita(=lau * hogeita) + hamarより、空欄2 = bederatziと出ます(手抜き)。

あとは数字を当てはめるだけです。
なかなか変な解説になってしまいました。 冒頭の問題のミスっぽいもののせいでbederatziがなにかわからず撃沈しました….

ARC 035 B: アットコーダー王国のコンテスト事情

ARC過去問の難易度レビュー - ヘクトのメモ
hecさんの記事を参考にできそうなものから進めています。

B: アットコーダー王国のコンテスト事情 - AtCoder Regular Contest 035 | AtCoder

短い時間で解ける問題から解くのが最もコンテストペナルティが少なくなります。
解くのにかかる時間を昇順にソートして、貪欲法っぽく(別の言い方をするなら「普通に」)時間を足していきます。

解き方の順は以下のように通り数をかけるだけです。(入力例2を例にすると)

1minの問題 1min 2min 2min 2min (最適な解く順番)
<---- 2! -----> <---- 3! ---->

2! * 3! = 2 * 6 = 12

このとき階乗を求める関数で随時modを取っていかないとオーバーフローで計算できなくなります。

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

using namespace std;
using ll = long long;
const ll INF = 1e9;
const ll MOD = 1e9 + 7;

ll modfact(ll n) { // 階乗して1e9+7で割ったあまりを計算
    if (n <= 1) return 1;
    return (n * modfact(n - 1)) % MOD;
}

int main() {
    int N;
    cin >> N;
    vector<int> T(N);
    for (int i = 0; i < N; i++) cin >> T[i];

    sort(T.begin(), T.end());

    ll ansMin = 0; // 求める最小のコンテストペナルティ
    ll ansWays = 1; // 求める通り数
    ll sum = 0;
    int prev = T[0];
    int cnt = 0;
    for (int i = 0; i < N; i++) {
        if (prev == T[i]) {
            cnt++;
        } else {
            ansWays *= modfact(cnt);
            ansWays %= MOD;
            cnt = 1;
        }
        sum += T[i];
        ansMin += sum;
        prev = T[i];
    }
    if (cnt > 0) {
        ansWays *= modfact(cnt);
        ansWays %= MOD;
    }

    cout << ansMin << endl;
    cout << ansWays << endl;

    return 0;
}