2020-06-14

UNコーディング面接こんな感じでした

入室と自己紹介

面接官「やあ!わたしはベン。会えて嬉しいよ!」

ぼく「こんにちは、ベン。ぼくはWashlet2000。便意はどう?」

面「超いい感じだよ。きみは?」

ぼ「ぼくも超いい感じさ」

面「それはよかった。わたし部署AのToiletエンジニアで3年目なんだ。社内ツールを作ってるよ。Benki関係ツールで、超クールでExcitingなやつなんだ」

ぼ「それはクールだね」

面「簡単自己紹介をお願いしていいかな?」

ぼ「うん。ぼくは経験豊富自宅警備員で…〇〇で貢献して…リーダー経験が……」

面「Cool(たぶん聴いてない)。じゃ、問題に入ろうか。わたしから問題はね…」

ぼ「あ、はい

出題と質疑

面「Unkを管理するコードを書いて」

ぼ「Unkの管理…」

面「そう。Unkってさ、知的生命体でしょ?あれを実現するの。『分裂』もあるから注意して」

ぼ「なるほど。えーと、それはHankeyみたいな普通のUnkだよね。えーとえーと」

面「…」

ぼ「えーと、そうだ、Unicodeとか決まってる?」

面「決まってるよ。U+1F4A9」

ぼ「うーん。じゃあUnkって何を保持したらいい?種類、個数?」

面「いい匂いだね。ここでは簡単のため、そうだね、個数だけにしようか」

ぼ「ならUnkの個数を持つ感じかな」

面「多分そうだね」

ぼ「えーと、そして、『分裂』のときに増える個数、『消滅』したかどうかを返すAPIが要る」

面「うん。あと新しいUnkが産声を上げたときも」

ぼ「そうだね。じゃあ内部的には、分裂した時の増殖個数を計算して、unkで現在の個数を管理する感じかな…」

面「それで行けそう?」

ぼ「待って。それで、APIはdivision()、roar()、isDead()でいい?」

面「うん、そうだね。とりあえずAPIはそれで良いよ」

ぼ「OK。あ、division()でもうそれ以上増えれなときには、どうする?」

面「それもいい匂いだ。そうだね、今の個数を返すようにしようか」

ぼ「あと何かあるかな…」

面「…」

ぼ「Unkだと、大腸菌を表示したり、そこからBenkiにジャンプしたりできるけど…」

面「あとで必要になるかもね」

ぼ「だよね。速度は…当然すべてO(1)でやらないといけない」

面「速いほうがいいね

ぼ「あとは、えーと、Benkiクリアもあとで付けそうだな。まあこれは簡単か」

面「そうだね」

ぼ「まとめると、Unkの個数を整数のIntで持ち、unkで管理する。division()が呼ばれたら、分裂して、isDead()が呼ばれたら、生存の真偽を返す。分裂時にはroar()を呼び出して、Unkoooooooooo!×(増殖個数分)産声をあげる」

面「それで良さそう?」

ぼ「うーん、多分…なにかあるかな…」

面「『消滅』を何度かしたあと、『分裂』をしたらどうなる?」

ぼ「ん?……あ、だめだ!そうか、『消滅』『消滅』『分裂』で過去の個数うんこに増えてしまう!つまり、isDead()が真なら、その時のunkを初期化しないと!」

面「そう!ならどうする?」

ぼ「うーん。変数maxUnkを足せばいいかな。isDead()はmaxUnkより大きな場合は真。そのときはunkを初期化する」

面「なるほど。大丈夫そうだね」

ぼ「あとはOKかな?…よし、じゃあコード書いてみるよ(マーカーを手に取る)」

コーディング

ぼ「まずクラス外観はこんな感じかな…(カキカキ)」

class Unk:
    def __init__(self): pass
    def division(self): pass
    def roar(self): pass
    def isDead(self): pass

面「ん?これ何の言語?」

ぼ「pyてょnだよ。ぼくはpyてょn使いなんだ(自己紹介で言ったけど…)」

面「Cool

ぼ「そして、Unkの個数を整数で持つよ。名前はunkでいいか

面「OK

ぼ「それと有効な最大unk数を保持するmaxUnkが要るね」

class Unk:
    def __init__(self):
        self.unk = 1
        self.maxUnk = 1024
        
    def division(self): pass
    def roar(self): pass
    def isDead(self): pass

面「なんでunkを1で初期化したの?」

ぼ「これは『いまの個数』だから。初めは1つのUnkが存在するのを想定してる」

面「なるほど」

class Unk:
    def __init__(self):
        self.unk = 1
        self.maxUnk = 1024
        
    def division(self):
        self.unk = self.unk*2
        
    def roar(self):
        print("Unkoooooooo! ×", self.unk//2)
        
    def isDead(self):
        return self.unk > self.maxUnk

ぼ「division()、roar()、isDead()も書くとこんな感じかな…」

面「増殖の計算は2倍したんだね」

ぼ「そう。ちょっと手動テストしてみるね…。えーとunkが無いときのdivision()、roar()は大丈夫そうかな…。初回のdivision()でunkのサイズが1になって…そのあとroar()したら…isDead()は……」

unk = Unk()
while True:
    if not unk.isDead():
        unk.division()
        unk.roar()
    else:
        break
---
Unkoooooooo! × 1
Unkoooooooo! × 2
Unkoooooooo! × 4
Unkoooooooo! × 8
Unkoooooooo! × 16
Unkoooooooo! × 32
Unkoooooooo! × 64
Unkoooooooo! × 128
Unkoooooooo! × 256
Unkoooooooo! × 512
Unkoooooooo! × 1024

面「大丈夫そう?」

ぼ「うん…たぶん…」

面「じゃいくつか聞くよ」

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん