When it’s ready.

出来るまで出来ない

PythonHakathonの課題(not義務)をやってみた。

「1以上100未満の『2個の素数の積』である整数を列挙しなさい」

というやつが、8月のPythonHackathonのアンケートの所に書いてあったがその場で分からなかったので空白で提出した。(そういえばまだ、確認のメールが来てないな。登録できてないのか?)

やらないままも気持ち悪いので、やってみようと思った。
だけど、素数の積ってめちゃくちゃいっぱいありそうとか、素数求めるの重いじゃないの?気になることは沢山あるが、まぁ、やってみれば分かるでしょう。と言うことでやってみた。

もちろん、リスト内包表記のワンライナー

  def getPrim2(cnt):
    return list(set([x * y for x in 
      [num for num in  [num for num in range(2, cnt+1)] if 0 not in 
        [num % nume for nume in range(2, num)]] for y in 
      [num for num in [num for num in range(2, cnt+1)] if 0 not in 
        [num % nume for nume in range(2, num)]] if x * y < cnt ]))
  print getPrim2(100)

結果は

[4, 6, 9, 10, 14, 15, 21, 22, 25, 26, 33, 34, 35, 38, 39, 46, 49, 51, 55, 57, 58, 62, 65, 69, 74, 77, 82, 85, 86, 87, 91, 93, 94, 95]

さすがにココまで来ると訳分からなくなってしまったので、未来の自分の為に解説のforも添付

def getPrim(cnt):
  '''
  >>> getPrim(10)
  [2, 3, 4, 5, 6, 7, 8, 9, 10]
  [2, 3, 5, 7]
  [9, 4, 6]
  '''
  # 2からcntまでの数字を列挙>nums
  nums = [num for num in range(2, cnt+1)]
  print nums

  # numsから一個ずつ抜いたnumを、2からnumまでの数字で
  # 割り切れないならprimsに格納する
  prims = [num for num in nums if 0 not in [num % nume for nume in range(2, num)]]
  print prims 

  # set() 配列にprims配列の相互に掛けたモノを代入する
  # ただし、掛けたモノはcnt未満であること
  res = list(set([x * y for x in prims  for y in prims if x * y < cnt ])) 
  print res 

if __name__ == '__main__':
  import doctest
  doctest.testmod()