近況報告

なんやかんや前回の投稿から2週間経ちましたが いきなりブログ丸投げ放置してました。

ブログは1日坊主になってましたが、 AtCoder等は取り組んでました。

最近の取り組みはこんな感じ

f:id:llenar:20190523161157p:plain

天下のGoogleさんのスプレッドシートを使って取り組みを管理しているのですが、 これがなかなか私には合っていたようで、珍しく続いてます (日系大手に長くいるせいでexcelライクなものを好むようになってしまったのかもですが・・・苦笑)

いい感じなガントチャートもテンプレートをちょこっと変えただけですぐにできました。 今までgoogleの機能はGmailくらいしか使ってませんでしたが、これから重宝しそうです。

AtCoderは、 AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ - Qiita

の記事を参考にしながらAtCoder Beginners Selectionを解き、昨日ようやく10問解き終わったので、 同記事の"ここまで解いたら"で薦めている問題に取り組み始めたところです。

最近はガントチャートに書いている通りなんですが、 AtCoder, LeetCode, 銀のフレーズ(TOEIC対策。5/26にある・・・orz)の3つに重点をおいて 取り組んでました。

AtCoder以外についてはまた別記事で書こうと思います。(気が向いたら・・・)

状況に余裕が出てきたら取り組みの内容についても書けたらと思います。

では今日はこのへんで〜

自己紹介と、AtCoderはじめます宣言

こんばんは。0歳と3歳の男の子のママをしている、neoです。 院の修士を出てから某IT企業に就職し、クラウド系アプリ基盤エンジニアを4年ほどしています。 (が実際は、2人分の産休育休で2年弱のブランク有) 今も産休中で、そろそろ復帰の予定です。子供達は可愛いがすぎるほどの溺愛ぶりですが、男の子2人は想像を絶するパワフルさで身も心もズタボロです笑

そんな状況で急に本タイトルでブログを書こうと思い立ったのは、以下の理由です。

  • 転職のためのスキルアップ
  • ただAtCoderを一人で黙々とやると続かないのでモチベーション維持のために&記録用
  • 育休のブランク解消のため

実は会社ではコーディングをほとんどしていないため(苦笑)、ブランク解消はオマケですが、3日に1記事目標で続けていけたらベストだなぁといったゆるゆるな感じで頑張ります。(基本3日坊主に定評がありますが苦笑)

見る人がいるかよくわかりませんが、これからよろしくお願いします〜

udacityはじめました

udacityの以下のコースを、2018年4月開始回で受講しはじめました。

www.udacity.com

約3ヶ月半のコースで8万円・・・!!

高い買い物してしまったので、頑張りたいと思います・・・ 最近勉強という勉強をさぼりまくってきたので

もう自分も28歳。十数年後、悔いのないようにこれから1つ1つやっていきたいです。

受講し終えたら復習の意味を込めてまとめれたらと思います〜

去年からアルゴリズムの勉強のためにtopcoderSRMをたまに解いたり、時間が合えばちょこちょこ参加したりしていました。 今回解いた内容を自分用に記録。

今回解いたのはSRM711 DIV2 250 Easy. 問題文は、「4本の棒の長さについてそれぞれ自然数a,b,c,dが与えられ、1コインを棒製造店に持っていくと1本の棒の長さを-1か+1することが可能である。(この操作は何度でも可能)4本の棒を使って正方形を作るには(つまり4本の棒の長さを同じにする)、何コイン必要か?ただし棒の長さは正であることに注意」といった内容。

※ちなみにtopcoderの問題文は全て英語だが、英語が読めない人(私もです)も、最近のgoogle翻訳では全コピペで十分内容を読み取ることができるので、取り組んでみたいけど英語だからちょっと…と思っている人は最初はそれで問題ないと思います。Let’s try topcoder.

今回の問題、簡単だとタカをくくっていたら、数学の問題として間違えていた…この問題のポイントは、「4つの値のうち、どの値に揃えるか」です。

4つの値の平均値 ( ( a + b + c + d ) / 4 ) の切り捨てor切り上げのいずれかに揃えるのが最小と考え解いたが、これが間違いでした。

f:id:llenar:20170629000918p:plain (↑図1)

図1のような場合、平均値mに揃えると以下のようになります。(図の平均値の場所はテキトウだけど、とにかくbとcの間の場合)

棒の長さの増減のを行なった回数(最終的なコインの枚数)をsとおくと、a<b<c<dとして、a=0とすると(4値すべてを-aすればよい)、平均値に寄せた場合は、図1よりs = d + (c - b) になります。

f:id:llenar:20170629001026p:plain

(↑図2)

これは平均値でなくともbc間であれば、b,cいずれかの値に揃えた場合(例えばbに揃えた場合、図2)でもs = d + (c - b)になることがわかります。

f:id:llenar:20170629001622p:plain (↑図3)

ですが図3のようにbc間以外の点に揃えようとすると、d + (c - b) > sとなるのがわかります。揃える値mはb<=m<=cの範囲である必要があるため、b or c(つまり中央値)に揃えるのがコード的にシンプルです。以下、一応サンプルコード。

~~~

coding:utf-8

import numpy as np

class SquareMaking():

def init(self): self = self

def getMinimalPrice(self, a, b, c, d): list_answer = [] abcd = [a, b, c, d] data = np.array(abcd) med = np.median(data) answer = (abs(a - med) + abs(b - med) + abs(c - med) + abs(d - med)) return int(answer)

S = SquareMaking() a = 705451 b = 751563 c = 608515 d = 994713

answer = S.getMinimalPrice(a, b, c, d) print answer

~~~

numpyのmedianで中央値を求めて、abs()で4値と中央値との差の絶対値を全て足し合わせているだけの単純なロジックになります。

直感で平均値という考えが甘かったです。図にすれば一目瞭然でした。。

Easyは確実に解けるように、これからはミスに気をつけよう