プログラマ脳を鍛える数学パズルをひたすらPythonで:Q3[カードを裏返せ]

Q3:カードを裏返せ

今回もプログラマ脳を鍛える数学パズルの問題をPythonで解いてみました。 ちなみに、こちらのブログでも同じようにPythonで問題を解いてる方がいました!

pythonista.hateblo.jp

目標としては全問Pythonで解いてブログにアップしていきたい。

問題文

1~100までの番号が書かれた100枚のカードが順番に並べられています。 最初、すべてのカードは裏返しの状態で置かれています。 ある人が2番のカードから、1つおきにカードを裏返していきます。 すると、2, 4, 6, … , 100番のカードが表を向いています。 次に、別の人が、3番のカードから2つおきにカードを裏返していきます。 (裏向きのカードは表を向き、表向いているカードは裏返しされます。) また、別の人が、4番のカードから3つおきに、カードを裏返してきます。 このようにn番目のカードからn-1つおきにカードを裏返す操作を、 どのカードの向きも変わらなくなるまで続けたとします。 裏向きになっているカードの番号をすべて求めてください。

Code

まずはrubyでの模範回答

N = 100
cards = Array.new(N, false)

(2..N).each{|i|
    j = i - 1
    while (j < cards.size) do
        cards[j] = !cards[j]
        j += i
    end
}

N.times{|i|
    puts i + 1 if !cards[i]
}

rubyの模範回答をpython

N = [True]*100
for i in range(1, 101):
    j = i - 1
    while j < 100:
        N[j] = not N[j]
        j += i

print([k + 1 for k in range(100) if N[k] == False])
#1, 4, 9, 16, 25, 36, 49, 64, 81, 100

まぁそこまで長くなく無難なCodeになったのではないでしょうか??

rubyのように簡単に

  • cards[j] = !cards[j]
  • puts i + 1 if !cards[i]

と書くにはどうしたらいいのかとかなり悩みました...。

プログラマ脳を鍛える数学パズルをひたすらPythonで:Q1[回文数]

プログラマ脳を鍛える

PaizaのスキルチェックにおいてBランクからなかなか抜け出せないので 気分転換も含めプログラマ脳を鍛える数学パズルをPythonで解いていこうと思います!

この書籍は基本的に一つの問題に対して3つのStepが用意されています。

  1. 問題の説明
  2. 解説とCodeの記載(Rubyが多い)
  3. Point説明&コラム

ざっと見た感じわかりやすく面白い。 まさに暇つぶしにもってこいって感じです。

問題[1]:回文数

問題内容は10進数でも2進数でも8進数でも上から読んでも下から読んでも同じ数字になること。

(例)

  • 10進数:9
  • 2進数:1001
  • 8進数:11

では、9より上の10進数で回文数になる値は何? というのが問題です。

Code

まずはruby

num = 11
while true
    if num.to_s == num.to_s.reverse &&
        num.to_s(8) == num.to_s(8).reverse &&
        num.to_s(2) == num.to_s(2).reverse
        puts num
        break
    end
    num += 2
end

同じことをPython

num = 11

while True:
    if str(num) == str(num)[::-1]\
    and str(format(num, 'b')) == str(format(num, 'b'))[::-1]\
    and str(format(num, 'o')) == str(format(num, 'o'))[::-1]:
        print(num)
        break
    num += 2

もう少し簡単にしてみる

def palindrome(x):
    return str(x) == str(x)[::-1]

n = 11

while True:
    if palindrome(n) and palindrome(format(n, 'b')) and palindrome(format(n, 'o')):
        print(n)
        break
    n += 2

and とか or で記述が長くなるときに改行で"\"を使うのをはじめて知りました...。