牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

簡単な問があったのでPythonでやってみた

訂正:簡単な問と言いつつ間違ってたので訂正(||゚Д゚)
追加:反省
追加:また間違い見つけたので反省(´・ω・`)

問のあったサイト

2つの引数をもらうと次のReturnsが返る関数

#引き数
#引き数
#Returns:返り値


3
"123123123"
Returns: ["111","222","333"]


4
"123123123"
Returns: ["12","23","31","12"]


6
"012345012345012345"
Returns: ["000", "111", "222", "333", "444", "555" ]


4
"111122223333"
Returns: ["123", "123", "123", "123" ]


1
"012345012345012345"
Returns: ["012345012345012345" ]


6
"01234"
Returns: ["", "", "", "", "", "" ]


2
""
Returns: ["", "" ]

自分的解答

簡単な問と言いつつ間違ってたので訂正
誤deal(4, "123123123") => ['123', '23', '31', '12']
正deal(4, "123123123") => ["12","23","31","12"]
スマンヌ(´・ω・`)
(thanks id:mincemakerさん)

# *-# -*- coding: utf-8 -*-

def deal(member, data):
    result = []
    for i in range(member):
        #result.append(data[i::member])                                 修正前(´・ω・`)
        result.append(data[i:len(data) - (len(data) % member):member])  #修正後
    return result if not "" in result else len(result) * [""]

print deal(3, "123123123")
print deal(4, "123123123")
print deal(6, "012345012345012345")
print deal(4, "111122223333")
print deal(1, "012345012345012345")
print deal(6, "01234")
print deal(2, "")

実行結果

['111', '222', '333']
['12', '23', '31', '12']
['000', '111', '222', '333', '444', '555']
['123', '123', '123', '123']
['012345012345012345']
['', '', '', '', '', '']
['', '']

反省

:mincemakerさんのコードをパクって、doctestしてみた。

#!/usr/bin/env python
# *-# -*- coding: utf-8 -*-

class Cards:
    def deal(self, member, data):
        """
        >>> a = Cards()
        >>> a.deal(3, "123123123")
        ['111', '222', '333']
        >>> a.deal(4, "123123123")
        ['12', '23', '31', '12']
        >>> a.deal(6, "012345012345012345")
        ['000', '111', '222', '333', '444', '555']
        >>> a.deal(4, '111122223333')
        ['123', '123', '123', '123']
        >>> a.deal(1, '012345012345012345')
        ['012345012345012345']
        >>> a.deal(6, '01234')
        ['', '', '', '', '', '']
        >>> a.deal(2, '')
        ['', '']
        """

        result = []
        for i in range(member):
            result.append(data[i:len(data) - (len(data) % member):member])
        return result if not "" in result else len(result) * [""]

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

また間違い見つけたので反省(´・ω・`)

10分コーディングしてみた。 - When it’s ready.』さんの解答を見てたら、自分のが間違ってるのに気づいた(´・ω・`)
っていうか必要ない行が混じってた(||゚Д゚)
要らなかったこれ「if not "" in result else len(result) * [""]」削除。
なんでいれたんだろ?

#!/usr/bin/env python
# *-# -*- coding: utf-8 -*-

def deal(member, data):
  """
  >>> deck(3, "123123123")
  ['111', '222', '333']
  >>> deck(4, "123123123")
  ['12', '23', '31', '12']
  >>> deck(6, "012345012345012345")
  ['000', '111', '222', '333', '444', '555']
  >>> deck(4, '111122223333')
  ['123', '123', '123', '123']
  >>> deck(1, '012345012345012345')
  ['012345012345012345']
  >>> deck(6, '01234')
  ['', '', '', '', '', '']
  >>> deck(2, '')
  ['', '']
  """
  result = []
  for i in range(member):
      result.append(data[i:len(data) - (len(data) % member):member])
  return result

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

これをリスト内包にすればよかったのかぁ。
とりあえず動けばいい的な発想の自分は、プログラミング向いてないなーと反省(´・ω・`)