* +演算子だけで四則演算 @ Python

元気ですか

どうも、お久しぶりです。

実はまたまた企業さんのインターンに参加させていただいてまして

昨日今日の2日間でやってます。

テーマが「アルゴリズムクイズをひたすら解く」という非常にシンプルなもの。

わかりやすくてよいね。

その中で1つ面白い問題があったので紹介します。

一番乗りで解けたのが嬉しかったから紹介するわけではないからね。

+演算子だけで四則演算をするプログラム

まぁまんまその通りです。

足し算はまぁそのままやるとして、引き算、掛け算、割り算を全部+演算子だけで解けというもの。

その際の条件としては以下の感じ。

  • 割り算は整数で返しておk
  • 止む終えなかったら計算以外でなら-演算子使っていいよ
  • ビット演算はなし

おもしろそう。解けた順に解説。

掛け算

これは楽勝ですね。

a,b2つの引数があったら、ans += aをb回ループで回せばおk。

              # !/usr/bin/env python
              # -*- coding: utf-8 -*-
              
              def multiply(a, b):
                  ans = 0
                  for i in range(b): ans += a
                  return ans
              

僕のPython力ではこれが限界かなぁ。

もっと短く書けそう。

割り算

一瞬悩んだけど、引数a,bのうちaを超えるまでbを足し続ければ整数の答えは出せる。

早く終わって暇だったので小数第一位まで出す関数も書いた。

              # !/usr/bin/env python
              # -*- coding: utf-8 -*-
              
              # integral number ver
              def devide(a, b):
                  ans = 0
                  bb = b
                  while b < a:
                      ans += 1
                      b += bb
                  return ans
              
              # decimal number ver
              def devide_d(a, b):
                  ans = 0
                  bb = b
                  while b < a:
                      ans += 1
                      b += bb
                  b -= bb
                  # 小数第一位
                  while b < a:
                      ans += 0.1
                      b += multiply(0.1, bb)
                  return ans
              

これでできた。

※ multiply()は先ほどの掛け算の関数

引き算

周りの様子を見てるとみんなここで詰まってるっぽかった。

最初は+だけでいかに引き算を表現するか考えてたけど、整数の引き算って条件があるんだから1ずつ足してカウントすればいいじゃん!と気付き、こんな感じに書いた。

              # !/usr/bin/env python
              # -*- coding: utf-8 -*-
              
              def minus(a, b):
                  ans = 0
                  flag = 'a' if a > b else 'b'
                  while a != b:
                      ans += 1
                      if a > b: b += 1
                      else: a += 1
                  return ans if flag == 'a' else int('-'+str(ans))
              

答えがマイナスになる時はハイフンを使わざるを得ない。

しかし-演算子を使ってはいけない。

じゃあString型でハイフンくっつけてint型に直せばよくね?って感じで書いた。我ながらわろた。

いい方法待ってます。

インターン

自己紹介のとき、周りがガチガチの理工学部ばっかで死にたくなったけどなんとか渡り合えてる感じがして楽しいです。

言うても前のハッカソンとは違って競技プログラミングみたいな感じなのでいかにスマートに解けるか、ってとこが評価ポイントみたい。

ゴリゴリに実装したコード見せたら微妙な反応された。

明日も頑張ってきますぜ。


※この記事は WordPress に投稿した記事を変換したものです。一部不自然な表示があるかも知れません。ご了承ください。また、記事タイトル先頭の * は WordPress から移行した記事である印です。

comments powered by Disqus