人間初心者

人間初心者

個人的思考や経験を書き留める場所

AtCoder Beginner Contest 121

こんにちは

今日も元気に引きこもっています 笑1
なんかそこそこアクセスいただいてるみたいで、ありがとうございます。大体Twitterから来ていただいてるみたいですね。
(間違えてリンク踏んじゃった人は、ほんとごめんなさい。)

でもリアクションが全然なくて寂しかったので、自分で自分の記事にスターをつける遊びをしていました。

f:id:soraemonpockt:20200409174620p:plain
前回の記事。こんな悲しいことある?

(みんな「うんこ」とかでいいのでコメントよろしくお願いします。。。。。)

AtCoderをやるぞ

AtCoderとは、国内最大規模のプログラミングコンテストを運営している企業様です。
プログラミングコンテストというのは、なんか数学っぽい問題をプログラミングの力で解いて、その実装の早さと正確さ、実行速度で順位付けして、他者を殴ろうという大会です。うそです。2
詳しく知りたい人は、競技プログラミングとは?メリットや初心者にもおすすめな理由も解説などを見てください。
まあ、引きこもりにはうってつけのパズルゲームみたいなものです。

AtCoderさんの粋な計らいで、過去に開催されたAtCoderのコンテストの過去問は全て閲覧することができ、実際に解いて自動で正当を判定してくれるシステムが用意されています。ありがたい話

今回は、初心者用のコンテスト3であるAtCoder Beginner Contestの過去問、AtCoder Beginner Contest 121を解いたので、それについてごちゃごちゃした思考を書きます。もし解いたことない人は、1回やってみるといいかもね。知らんけど
また、内容はかなり初級者の人向け(色で言うと灰色から緑よりの茶色ぐらい?)なので、ガチプロ様はここでブラウザバックするのが賢明かもしれません。ごめんさなさい…ごめんさなさい…叩かないで…。

使用言語はPythonです。まぁ提出はPyPy3なんですけどね〜〜🐍

以下、各問題の解説ですが今回は4問しかありません。(今は6問もあるよ!大変!)
基本的には問題のアルファベットが大きくなるほどむずいです。

ABC121-A

あ、ABCはAtCoder Beginner Contestの略です。

問題はこちらから→A - White Cells

黒く塗られる部分は、1行がw個分、1列がh個分、二重に塗られる箇所がh × wなので、$$ Hw + Wh - hw $$ですわね
これを全体のマスの総数$$ H \times W $$から引けばよろしいので、下のように書けばいいですね。

H,W = map(int, input().split())
h,w = map(int, input().split())
print(H*W - (H*w + W*h - h*w))

ABC121-B

問題はこちらから→B - Can you solve this?

「1つの提出されたソースコードセットに対して、問題に正答するかどうかを判定し、正答だったら正答数に+1する」ということをN回やりましょう。ざこがよお(イキリ)

n,m,c = map(int, input().split())
ans = 0
b = list(map(int, input().split()))
for i in range(n):
    a = list(map(int, input().split()))
    total = 0
    for j in range(m):
        total+=a[j]*b[j]
    total+=c
    if total > 0:
        ans+=1
print(ans)

ABC121-C

問題はこちらから→C - Energy Drink Collector

これは実際に高橋君になった気持ちになると考えやすいです。
みなさん、同じものが手に入るならとりあえず安く売ってるお店から買っていきますよね??今回はそれをコードに起こせばおkです。

n,m = map(int, input().split())
Drink = [[] for i in range(n)]
for i in range(n):
    Drink[i] = list(map(int, input().split()))
# 値段安い店順にソート
Drink.sort(key=lambda x: x[0])
ans = 0 # 総額
count = 0 # 総数
ind = 0 # 回る店
while count < m:
    p,num = Drink[ind] # 価格と数
    if count+num < m: # まだ栄養足りねえ
        count+=num
        ans+=p*num
        ind+=1        # 次の店へ
        continue
    else:
        ans+=p*(m-count) # 栄養足りた
        count=m
print(ans)

価格が安い順にお店のリスト(Dorink)をソートしてますが、ここで「Drink.sort(key=lambda x: x[0])」をいう風にlambda式を用いて、ソートに用いる値を指定しているのが、唯一のポイントでしょうか。(偉そうに言ってますが、ググりました。ごめんなさい。)
こちらのブログが大変参考になります。

ABC121-D

問題はこちらから→D - XOR World

え〜〜知らんけど 笑

愚直にAからBまでを排他的論理和で計算していくと、確実に死にます(遅すぎて時間制約に引っかかる。)
しょうがないから、実験をします。これは、本当に大事で、こういうとっつきにくい問題は、簡単そうな値を入力として入れてみて実験をすると、「案外楽じゃん?」となることが多くあります。4
下は、ぼくが机の上で実験した結果です。(は?)
左から右につながっています。

f:id:soraemonpockt:20200409192746j:plain
考察。かわいい〜〜
試しに、Aに適当な奇数を入れてみると、よくわかりません(は?)
なので、Aに適当な偶数を入れてみると、$$f(A, A+1) = A \oplus (A+1) = 1 $$となります。(絶対)
いい予感がしますね(高揚感)
そのまま実験を続けてみると、 $$f(A, A+2) = f(A, A+1) \oplus (A+2) = 1 \oplus (A+2) = A+3 $$ $$f(A, A+3) = f(A, A+2) \oplus (A+3) = (A+3) \oplus (A+3) = 0 $$ $$f(A, A+4) = f(A, A+3) \oplus (A+4) = 0 \oplus (A+4) = A+4 $$ ところで、Aが偶数だからA+4は偶数ですよね?と言うことで、これと最初の式より、f(偶数, 偶数+1) = 1なので、 $$f(A, A+5) = f(A, A+4) \oplus A+5 = f(A+4, A+5) = 1$$ $$f(A, A+6) = f(A, A+5) \oplus A+6 = 1 \oplus (A+6) = A+7$$ $$f(A, A+7) = f(A, A+6) \oplus A+7 = (A+7) \oplus (A+7) = 0$$ $$f(A, A+8) = f(A, A+7) \oplus (A+8) = 0 \oplus (A+8) = A+8 $$ はい、完全に理解しましたね。
f(A, X)は、Xの周期が4でいい感じにわかります。(具体的には上の考察画像の左側を見てください。)
問題は、Aが奇数の時ですが、その時は、$$f(A, B) =A \oplus f(A+1, B)$$ とすれば、上の規則を使ってf(A+1, B)を求めた後、Aとの排他的論理和を1回取って終わりです。うおおおおおおおおおおおお
と言うわけでこの問題はO(1)。カスがよお(イキリ)

a,b = map(int, input().split())
if a%2 == 0:
    if (b-a)%4 == 0:
        print(b)
    elif (b-a)%4 == 1:
        print(1)
    elif (b-a)%4 == 2:
        print(b+1)
    else :
        print(0)
else:
    if (b-a-1)%4 == 0:
        print(a^b) # aとbの排他的論理和
    elif (b-a-1)%4 == 1:
        print(a^1) # aと1の排他的論理和
    elif (b-a-1)%4 == 2:
        print(a^(b+1)) # aとb+1の排他的論理和
    else:
        print(a) # aと0の排他的論理和

結果

ブログを書くのは本当にしんどい。
てかこのABC121、1時間で全完したんですけど誰か褒めてくれませんか?すごくね?(簡単だったかもしれないけど)

と言うわけでさいなら〜

P.S. がちで知ってたら教えて欲しいんですが、jupyter notebookでコーディングするとき改行込みの入力をバッと入れる方法はないんですか。。。???


  1. 全く元気ではないし、全く笑ってはいない

  2. ほんとです。(うそです。)

  3. 初心者用とはいえ、最後の方の問題は凡人(ぼく)だと正直かなりむずいです。今は体感月2(?)ぐらいでやってるっぽいです。

  4. そして、これでうまくいくと脳汁がドバドバ出ます。キモチェエエエエエwwwww

ブログのUIを改善(?)しました!

動機

情報系なので当然HTML, CSSが書ける。1
→書こう

概要

HTML, CSSを完全に理解した。2

やったこと

フロント知識がほぼない無課金ユーザーの状態で、何とかスマホのUIを弄り、はてなブログに抗った。3
以下詳細

ブログを開設する

はてなブログ開設ページ から、とりあえずホイホイと言われるがままに作りました。

スマホのレスポンシブデザイン4に対応しているテーマをインストール

パンピーなので、今回は無難に「ひつじの雑記帳」さんが公開している Minimalism というテーマをインストールしました。
上に貼ったリンク先で「ひつじの雑記帳」さんが書いてくれていることを全部やりました。(説明放棄)

背景とアイコン画像用のドット絵作り

「Neutral」さんが公開しているドット絵描画Webツール ミニドット絵メーカー2 を使用してアイコンと背景に使用するドット絵を作成しました。
どう森でもドット絵を作ったことあるけど、ツールとか使ったのは地味に初めて。可愛い…可愛くない?

f:id:soraemonpockt:20200407174257j:plain
作成したドット絵。かなり飼いたい。

なぜか寄り道してヘッダ部分にCSSを書き込んで「私のアカウント」ボタンたちを配置

情報系として高い意識を持っているぼくは、ブログを開設した直後からすでに、ブログとSNSとの連携を目論んでいました。
テキトーにググっていたところ、 このブログ を発見し、早速ここに書いてあるコードをコピペし、各種SNSのマイアカウントに飛ぶボタンをヘッダに付与しました。天才。5

背景を設定。。。

「設定」->「デザイン設定」->「カスタマイズ(レンチマークのとこ)」->「背景画像」 にて、上で作って保存したjpg画像をアップロード!もちろん繰り返し設定はオン!
すると。。。

f:id:soraemonpockt:20200407195451p:plain
ああああああああああああああああああ
どうして…6
とりあえずこのまま進めました(は?)

疲れたのでもういいですか?

シンプルにもう書くのが疲れたので、実装した箇所と参考にしたWebページを列挙します。ごめんなさい。
技術系のブログ書いてる人、精神力ハンパないですね笑 以下、列挙。

とりあえず完成!W

f:id:soraemonpockt:20200407203405p:plain
PC版
f:id:soraemonpockt:20200407203508p:plain
スマホ

いいんじゃないですか?

最後に

まじで、書くの疲れました。絶対実装よりブログ書くほうが体力使います。
まあ案外楽しかった部分もあるので、これからも気が向いたらぼちぼちいじっていきたいと思います。
後、ほんとにどうでもいいんですけど、最後に今日の夢日記の概要を以下に貼っておきます。(なんで?)

f:id:soraemonpockt:20200407210051p:plain
今日の夢日記です。Twitterにもあげます。最近支離滅裂気味で心配。
それでは、今日はこの辺で!(毎日は更新しません。体力的に死)


  1. 書けません。

  2. してません。コピペです。ごめんなさい。

  3. はてなブログはPC版のUIは直接いじれるけど、スマホ版のUIは課金しないと直接は無理。うんこ。なので、スマホのレスポンシブデザインをオンにして、PC版の方でCSS記述してゴリ押す。

  4. これに対応していないテーマはスマホでUIがありえん崩れる。悲しいね。

  5. よく考えたら絶対必要ないので後から消しました。

  6. ブログのほぼ全てのコンテンツ(「記事」とか「サイドバー」とか「メニューバー」とか、そういった要素)の背景はデフォルトで無色です。ぼくは解決方法として、「CSSデザイン」の中で、背景以外の全てのコンテンツを四角い枠で囲って背景を白に設定しました。(絶対頭悪い)

こんばんは。虚無です

初カキコ…ども…。

人生で初めてブログを開設しました。
今日はブログの開設作業だけで1日が終わりそうです。
なんか、スマホの方のCSSデザインは課金しないとできないみたいです。守銭奴1がよ。
↑この記事書いてる途中にPCのデザインカスタマイズの方のHTML記述欄にスマホ用にCSS埋め込んだらいけんじゃねと思って、やってみたらなんかいけました!ざ〜こ(笑)2

さて、ブログ第1回目ということで、今日は最近のぼくの1日プライベートスケジュールを特別に大公開しちゃおうと思いま〜〜す \ワーオ💗/

時間 行動
16:00 起床
~16:30 Twitter
~17:30 朝ごはん
~20:00 あつまれ どうぶつの森 or Twitter
~21:00 おべんつょ
~22:00 昼/夜ごはん
~24:00 あつまれ どうぶつの森 or Twitter
~26:00 お風呂とか色々
~わかんない あつまれ どうぶつの森 or Twitteror おべんつょ
わかんない 就寝

何だか書いてみると結構節約的ですね!
とりあえず生きているって感じ!w

はは…

今日は初めてだし、こんなところかな!3

明日からは進捗するぞ〜〜〜!!!💪💪💪


  1. お金が欲しい人。ぼくも欲しい。

  2. それでもHTML記述をスマホに反映できる箇所は記事部分だけなんで、ブログのタイトル画面は課金しないと無理っぽいです。守銭奴がよ。クオリティはPC版の方が高いからそっちもみて

  3. 多分、次からは競技プログラミング(AtCoderのABC)の感想なり、インターンの体験記だったりを書くつもりです。多分。

Copyright ©soraemonpockt All rights reserved.