書きたいことを書きたいだけ。

とある会社員の生活記録。

第247回TOEIC所感

明けましておめでとうございます。 去年の7月ぶりにTOEICを受けてきました。 今回はTOEIC対策をやらずにTOEIC用じゃない単語帳で勉強して挑戦。 やったのはSVLのLevel3の8000語まで。

究極の英単語 Standard Vocabulary List [上級の3000語] Vol.3

究極の英単語 Standard Vocabulary List [上級の3000語] Vol.3

  • 作者:
  • 出版社/メーカー: アルク
  • 発売日: 2007/05/26
  • メディア: 単行本(ソフトカバー)

やったといっても全部の単語を覚えているわけでもないしパッと出てくる単語は結構限られている感じ。

Part1の最初の問題が男性がパソコン?の横のプリンターか何らかの機械をいじっている問題でした。

Part1〜〜普通ぐらい Part2〜〜なんかめっちゃ簡単、前回が難し過ぎたのもあるけど簡単だった Part3〜〜何か聞き取れなくなっていた、前回はもっと自信持って解けていたし先読みも余裕あったんだけど全然駄目だった Part4〜〜Part3と同じく聞き取れなくなっていた…

リスニングセクションはこんな感じ、英語を全然聞いていなかったのか問題が難しくなったのかは分からないけど駄目駄目。 予想は300-350

Part5〜〜普通ぐらい、品詞問題より語彙問題に時間を掛けてしまったので反省 Part6〜〜ちょっと難しかったような、自信持って選べるのが少なかった。 Part7〜〜相変わらず量が多い、単語レベルはそんなに難しくないし最近やったbulkyとか出てきてテンション上がったのだけれど速読が足りず最後8問ほど塗り絵になってしまった… 単純に考えると1問5点なので8問読めなかっただけでも痛い。 予想は330-360

合計で今回は700あるかないかのラインかなー。 感想としてはTOEICレベルの単語は仕上がってきた。 それ以上に速読やリスニング。 本腰入れてTOEIC対策やらないと点数が伸びないと感じた。

AtCoder Beginner Contest 149参戦記

ということで2回目のABCに参加してきました。
結果から言うとABCDの4完でD問題で一回WA出しました。
ただしunratedになるという不幸が待ち構えていた。
まだ最初だから回数稼いでレート上げたかったのに残念。
それとunratedなの気づかなくてめっちゃ必死に考えてて終了5分前に気がついた。

A - Strings

S Tと文字を受け取ってTSと出力するだけ。

            var N = Console.ReadLine().Split();
            var S = N[0];
            var T = N[1];
            Console.WriteLine(T + S);

B - Greedy Takahashi

A(高橋くんのクッキーの枚数) B(青木くんのクッキーの枚数) K(繰り返しの回数) の形で入力が与えられて 高橋くんがクッキーを食べていく問題。
制約が1012と大きいことに注意。

高橋くんは自分のクッキーがなくなれば、青木くんのクッキーを食べていく。
なのでA>Kならば単純に高橋くんがA-K枚で青木くんはB枚
A<Kのときは不足分のK-A枚を青木くんの分から引くので高橋くん0枚 青木くんB-(K-A)枚
ただしB+A<Kならば二人共0枚になることに注意。

           var amari = A - K;
            if(A + B < K)
            {
                A = 0;
                B = 0;
            }
            else
            {
                if (amari < 0)
                {
                    B = B + amari;
                    A = 0;
                }
                else
                {
                    A = A - K;
                }
            }

急いで書いたら可読性の可の字もない。

C - Next Prime

Nが与えられて次に大きい素数を探す問題。
素数かどうかを判定する関数isPrimeを作っておいて単純にfor文で線形探索。
上限が1010なので、一個一個調べても余裕で間に合う。

            var N = Inputer.Int1Char();
            for(int i= N; i <= 1e10; i++)
            {
                if (IsPrime(i))
                {
                    Console.WriteLine(i);
                    break;
                }
            }

D - Prediction and Restriction

無駄にソースコードが長くなってしまったので省略。
解説見るとDPで解く方法と貪欲法で解く方法の2パターン。
自分の場合は貪欲法にて解いた。
高橋君が読み取った情報は文字列 Tに対して前から順番に考えていって勝てるなら勝ちます。
前の手が邪魔しているなら次の手に邪魔にならない手を出します。

7 1
100 10 1
ssssppr

の入力例のときに前から見ていって 最初のs(1個目)は勝てるのでr出します。
次のs(2個目)は前回出した手と被ってしまうので別の手を出します。
このときに、3回目のじゃんけんに邪魔にならない手を出しておきます。(この場合pかs)
4個目のs は勝てるのでrで勝ちます。
5個目のpは勝てるのでsで勝ちます。
6個目のpは前回にsを出したので、別のものを出します。選択肢はrかpですが、次のじゃんけんで勝つためにはpを出す必要があるので、必然的にrを出すしかありません。

という感じに、前回出した手と次に出す手を参照しながら出す手を決めていくと最適値が求まります。

2019年を振り返ってみよう。

現在、2019年12月29日。
2019年が終わるまであと3日ほどなのでこの1年を振り返ってみようと思います。
所謂たんなる日記。

毎年毎年思うのは1年過ぎるの早かったなぁと。
これは科学的に証明されているらしいので(ジャネーの法則)当たり前なのですが、年の瀬が近づくと毎年こう思ってしまいます。

出来事 感想
1 ・2019年幕開け、実家に帰る
・4日にはOB訪問という鬼畜スケジュール
・横浜に行ったりもしてた
・車買って東京→神戸まで運んだ
就活関連イベント多め、寒い中色々と歩き回った
2 ・面接やESラッシュ
・その間にスノボも何回か行く
・合間をぬって奥飛騨やら白川郷にも行った
一週間で東京→神戸→横浜→大阪→奥飛騨に行った、よくそんな体力があったなと。
白川郷にいるときに面接通過のメールが来てワクワクした記憶
3 ・米津のライブに参戦
・大型バイクを売った
・代わりにビクスク買った
・卒業式の日に内定もらった
無事に内定いただけて就活が終わった。
めちゃくちゃアクティブに行動してたな
4 ・特に書くことが無いぐらい暇 就活終わると一気に予定減った。
本当にイベントが無い
5 ・GW、大雨の中和歌山へツーリング
家庭教師と漫画喫茶のバイトの繰り返しの日々
ツーリングは1日雨だった、ビクスクは楽
6 友ヶ島に旅行へ 一回旅行行っただけで特にイベントなし
7 ・内定者研修
TOEICを久しぶりに受けた
暇なときはTOEICの勉強したり。
8 無人島で活動
・花火大会
・友人と釣り
1週間近く無人島で生活、めちゃくちゃ日に焼けた。
無人島から帰ってきて鳥刺しを食べたら当たった
9 ・仙台へ旅行
・長野や岐阜へ旅行
・車検切れで車をドナドナ
学生最後の夏休みなので旅行三昧。
15万キロ走っているオンボロで長野らへんを走り回った。
エンジン壊れそうでヒヤヒヤ。
10 ・内定式もどきで久しぶりに東京へ
・そのまま友人と観光
・応用情報受けた
・部活で最後の登山
久しぶりに登山という運動をして死にかけた。
「最後の」ってつくイベントが多くなってきた。
11 ・地元の秋祭り
四国カルストへキャンプ
・下関とかへ旅行
年に1回の地元の祭り、今年は帰れたけど来年はどうなることやら。
ちょくちょく旅行に行ったり。角島がキレイだった。
12 ・応用情報発表、無事受かっていた
ルミナリエ
例年に比べて忘年会が少なかった(行ってないとも言う)
年末感が少ない

でした。
ざっと上げて振り返ってみるとそれなりにイベントがあったのにまだ1年かと感じたりもしますね。
1年が早いとかいいながら色々な経験はした気がする。
遊んだり旅行したりも多かったけどちょくちょくは勉強したりとそれなりに充実はした2019年であった。
来年も元気があれば書いてみたいけど、全部「仕事」ってなったら鬱になりそうだなぁ。。。
それではよいお年を。

AtCoder Beginner Contest 148参戦記

はじめに

ABC148に参戦しました。
競プロは実はこれが初めてだったりします。
てなわけで書いたコードを忘れないためと復習がてらよくある参戦記を書いておきます。
C#で書いています。

結果

先に結果を書いておくとABCDの4完でした。
最初の30分でABCDを終わらせて残りの時間ずっとE問題を考えていました。
こういう場合、Fに飛んでもよかったかもしれませんが最初ということで・・・

A - Round One

var a = 6;
var N = int.Parse(Console.ReadLine());
var N1 = int.Parse(Console.ReadLine());
Console.WriteLine(a - N - N1);

1+2+3 = 6なので6から入力を二つ足したものを引くと答えがでるという考え。
過去問解くときだと、なるべくショートコードにこだわったりもするもんですが、本番だと取り敢えず愚直にコード書きました。

B - Strings with the Same Length

与えられた文字列を前から順番に交互に並べる。

var N = int.Parse(Console.ReadLine());
 var input_string = Console.ReadLine().Split();
 for(int i = 0; i < input_string[0].Length; i++)
 {
    Console.Write(input_string[0][i]);
    Console.Write(input_string[1][i]);
  }

最初のvar N に代入する必要はありませんが気にしないでおこう。
入力から文字を読み取って、いったんstring[] 型のinput_stringに保存。
その後、for文でinput_string[0]とinput_string[1]を前から交互に出力することで完成。

C - Snack

        public static void Main(string[] args)
        {
            var input_num = Console.ReadLine().Split().Select(long.Parse).ToArray();
            Console.WriteLine(Lcm(input_num[0], input_num[1]));
        }
        static long Gcd(long a, long b)
        {
            var v = new[] { a, b };
            while (v[1] != 0) { v = new[] { v[1], v[0] % v[1] }; }
            return v[0];
        }

        static long Lcm(long a, long b)
        {
            return a / Gcd(a, b) * b;
        }

問題文に惑わされずに最小公倍数の問題と見抜いたらあとはコードを調べるだけ。
さすがに自分で実装すると時間がもったいないので拝借させていただきました。

D - Brick Break

        public static void Main(string[] args)
        {
            var N = int.Parse(Console.ReadLine());
            var input_num = Console.ReadLine().Split().Select(int.Parse).ToArray();

            var stack = new Stack<int>();
            foreach (int num in input_num.Reverse())
            {
                stack.Push(num);
            }
            var i = 1;
            var count = 0;
            while (stack.Count > 0)
            {
                if(stack.Peek() == i) { count += 1; i += 1; };
                stack.Pop();
            }
            Console.WriteLine(count==0?-1:N-count);
        }

スタックを使って実装。
まずは与えられた数列を逆順にしてスタックに放り込みます。
その後、スタックが無くなるまで取り出していきます。
レンガの中から左からi番目のものに書かれた整数がiであることが必要であるので、var i=1の部分で欲しい数値を記録しておきます。
つまり、最初はレンガの数字が「1」が欲しいので1を記録。レンガの数字の「1」が出た後は欲しい数字は「2」になるので2を記録します。
例として、入力例の「3 1 4 1 5 9 2 6 5 3 」を考えると
この中で1,2,3・・・・と並んでいるのは左から2番目と7番目と10番目です。
つまり3個は並んでいるので並んでいないのは7個なのでそれを消せばいいわけです。
てことでN-countが答えで解答。
後から見直すとvar iとvar count の二つもいらなかったな。
入力のとこもわざわざスタックじゃなくても普通に配列のままで処理できるはずなのになぜスタックにしたかは謎。
たぶんそっちのほうが考えやすかったのかな・・・
急いでプログラム書いているときはくっそ適当なコードになりがち。

E問題以下

解けず。時間はあったのでE考えてたけど思い浮かばなかった。

応用技術者試験、受かりました。

結果から言うと受かりました。 f:id:itisyuu:20191221024355j:plain

午後試験がぎりっぎりでした。
62点って、、、あと1問ミスってたら落ちてた可能性大です。
合格は合格なので受験料無駄にせずにすんで良かったですが心臓に悪いです。

ちなみに試験受け終わった後の所感がこれ。
itisyuu.hatenablog.com

予想が午前85%で午後厳しくて6割って書いていたので当たっているちゃ当たっていますね。
記述はあまり部分点貰えないみたいだ。

サービスマネージメント システム監査

が多分足引っ張ったかな。 プログラミングの問題見たときにニューラルネットワークは分かりそうだったけど、1問間違えたら総崩れしそうだったんでびびって辞めときました。
日本語力勝負でサービスマネージメントとシステム監査選んだのは果たして正しい判断だったのか・・?

これで1年半前にとった基本情報と今回の応用とれてなんとか最低限のラインに立てたという感じ。
次はデータベーススペシャリストを取りたいけど、春季しかやってないのであと4ヶ月で間に合うか微妙すぎる。
TOEIC修論・卒業旅行・引っ越し・入社などイベント盛りだくさんで勉強時間とれなさそう。

応用情報とってから2年間は高度区分の午後Ⅰが免除なので2年の間には取りたいところです。
なんにせよ合格できてよかった。

AtCoder Beginner Contest 147 C問題

実装力が無い、かつアルゴリズムに対する知識が無いと思ったので競プロ界隈を覗いてみた。
若いのに、すごい人が一杯いる。
凄い人と自分の差がスコアではっきり分かってしまうのはある意味、競技プロのいいところかもしれない。

当分は過去問を解くぐらいだけど、ある程度実力ついたらコンテストとかにも出てみたい。
そんな訳でABC147のC問題がいい問題らしいので解いてみた。
色々とあってC#で書いています。
他の人の実行時間とかと比べるとめちゃ遅いです。

一回目は全くちんぷんかんぷんな解答をしてしまったので、解説を見てからの実装です。
サンプルは合ってたんだよ。(言い訳)

using System;
using System.Linq;
using System.Collections.Generic;

namespace AtCoder
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //入力部分,最初のN(人数)を読み取る
            var N = int.Parse(Console.ReadLine());
            var input_data = new List<List<int[]>>();

            //人数分の証言を読み取る
            for(int i = 0; i < N; i++)
            {
                var num_evidence = int.Parse(Console.ReadLine());
                var tmp = new List<int[]>();
                //特定の人の証言の数だけ読み取る
                for(int j= 0; j < num_evidence; j++)
                {
                    var evidence = Console.ReadLine().Split().Select(int.Parse).ToArray();
                    tmp.Add(evidence);
                }
                input_data.Add(tmp);
            }

            var max = 0;//正直者の最大値
            
            //仮定のパターンだけ繰り返す、1をNビットシフトさせた数。つまり2のN乗
            for (int i = 0; i < 1<<N ; i++)
            {
                var flag = true;//今回の仮定はすべてあってるかどうかを確認する
                for (int j = 0; j < N; j++)
                {
                    //仮定のパターンに対して1ビットずつ確認していく
                    if ((i >> j & 1) == 0) { continue; }//不誠実な人のパターンは無視
                    else
                    {
                        for(int k = 0; k < input_data[j].Count(); k++)
                        {
                            var num = input_data[j][k][0]-1;
                            if (((i >> num) & 1) != input_data[j][k][1])//パターンが一致しなかった
                            {
                                flag = false;
                            }
                        }
                    }
                }
                if (flag)//今回の仮定が正しかったので正直者の数を数える
                {
                    var c=0;//立っているビットの数、つまり正直者の数
                    for(int n = 0; n < N; n++)
                    {
                        if(((i >> n) & 1) == 1) { c++; }//1つずつずらして「1」が立っているビットの数を調べる
                    }
                    max = max > c ? max : c;
                }               
            }
            Console.WriteLine(max);
        }
    }
}


長いですがソースコード丸々です。
高々2の15乗ほどしかパターンしか無いので全部試してみるってやつです。
全ビット探索と言われるものらしい。
ソースにコメントを大量につけたので、ちょっとは理解しやすいと思う。

当たり前ですが、ソースは読み込み部と判定部に分かれていて、
標準入力から読み込んだデータは

var input_data = new List<List<int[]>>();

に放り込んで、例えばinput_data[0]で1人目の証言が取得できます。
1人が何個証言するかは入力によって違うけど、証言の数に応じて取得できます。
(例えば1人目が3個証言すると、input_data[0][0]、input_data[0][1]、input_data[0][2]が1人目の3つの証言) 更に、input_data[0][0][0]だと1人目が誰に対しての証言、input_data[0][0][1]でその時の正直or不誠実のデータが取得できるっていう実装にしました。

判定部は、

for (int i = 0; i < 1<<N ; i++)

の部分から始まり、2のN乗のパターンだけ試行します。
つまり正直か不誠実な人の2択なので、2のN乗のパターンがあるのでそれらをすべて調べ上げる。
このfor文の中の1回の試行で、例えばN=3・i=3の時、i=3の3をビットにすると「011」になります。
この「011」を1人目から3人目まで「不誠実、正直、正直」パターンと置き換えて考えます。

最初のfor文の中で

for (int j = 0; j < N; j++)

ともう一度for文を回すことで、この例えば「不誠実、正直、正直」のパターンを1人目が不誠実な時、2人目が正直な時、と判定します。

if ((i >> j & 1) == 0)

この部分は不誠実だった場合は、そもそも意見がどっちか分からないので考えようがないし、答えは正直な数の人を求めるのでスルーしますって事です。
つまり、「不誠実、正直、正直」パターンを調べるときに1人目は不誠実なので特に判定せず、次の2人目の正直の判定に移ります。
2人目が正直パターンの場合、証言と一致するか確認します。
input_dataからinput_data[1]で2人目の証言データを取り出して判定します。
2人目の人が、「3人目の人は正直で、1人目の人は不誠実である」と証言した場合を考えてみましょう。
今、調べているパターンは「不誠実、正直、正直」でなおかつ2人目は正直であると仮定しています。
つまり「3人目の人は正直で、1人目の人は不誠実である」は絶対正しいわけです。
今、「不誠実、正直、正直」パターンを調べていて、「3人目の人は正直で、1人目の人は不誠実である」という意見は正しいので次に進みます。
次は3人目の正直の判定です。
3人目が正直だと仮定して、実際の3人目の証言が「1人目は正直で、2人目は不誠実であった。」と証言すると今、調べている「不誠実、正直、正直」と合わないわけです。

つまり、「不誠実、正直、正直」は成り立たないというわけです。
このようにN=3とすると8通り出てきますが、すべてのパターンに対して成り立つか成り立たないかを調べていきます。
そして成り立った場合には、正直者の数を数えます。

正直者の数を数えるには、成り立ったパターンのビットにしたやつの「1」が立っている数を数えればいいわけです。

 if(((i >> n) & 1) == 1) { c++; }

この部分です。
forで回しながらビットを1つずつずらして、1が立っているかどうかをカウントしています。

後は、今までの最も多かった正直者の数と比較して、大きければ現在の最も多かった正直者の数を更新して出力します。

ドラマ「SUITS」S1E9を見た。

ドラマの「SUITS」のエピソード9話まで見ました。(アマゾンプライムの字幕版で)日本語訳のタイトルで「敵と味方の境界線」がついています。シーズン1しか見ていませんが、今回ほど最高な話はなかったほど・・・! 詳細は伏せて今の所エピソード1だけしか見ていませんが、今回の話は最高でした。駆け引き・やり取りで最高にテンションが上ります。
こんな感じのビジネスマン・社会人になりたいと憧れる、、、

一言で表すと、やっぱりライバル同士が手を組んで巨大なものに立ち向かっていったり歯向かうのが盛り上がるのと一緒です。

以下、少しネタバレが入りますが、ジェシカがけしかけて
Harveyの「Donna? I need to talk to Louis.(ルイスと喋りたいんだけど)」のシーンから
Louisがやらかした事を認めて射撃場に1人で来て「I come here when I need to be alone.(1人になりたい時に来ているんだ。)」
からの更にまたHarbeyの 「44 Magnum?」から少しからかいながら始まるのが最高すぎる。
最終的にはHarbeyが 「I respect you.」と言って Luisが「You need my help.(手伝いが欲しいんだろ)」と誤魔化すのが最高すぎる。
そしてHarvyが「Now, let's put the gun down and go get him.(今までのことは一旦置いといて一緒にやろう、超適当訳)」 そしてLouisが照れ隠しなのか「First, just stand over there for a second.(分かった、なら最初に少しの間そこに立っとけ(射撃場の的の事を指して)」と言うやりとり最高です。
ライバル同士がお互い照れ隠しながら本音を言い合うのが良すぎです。

そしてLouisがやらかした事への挽回なのか、活躍します!!
金融犯罪へのアプローチの仕方を伝授しつつ、「I'm good with numbers, too.(数字の暗記は俺も強いんだよ)」と地味にアピールしつつ。

協力して Harvey「Or a trial.(裁判にする?)」 Louis「Up to you.(あんた次第)」 と間髪入れずに相手を畳み掛けるのもこれまた最高。。。

その後、LouisがHarveyの方をチラチラ見たりその逆もしかり。
このエピソードの締めは 「But you know what? You would.」に濃縮されていると思います。 HarvyがLouisに対して、「でも君でもそうしただろう?」って言ったシーンです。お互いがどう行動するか分かっているからこそ出てくる発言です。
今回のエピソードは後半部分がすべて最高でした。 吹替版で見るのもいいですが、字幕版で実際の俳優の雰囲気の声を聴きながら見るのも臨場感が伝わってきます!

SUITSは暇を見て、進めていきたいと思います。