buyoh.hateblo.jp

残念な競技プログラミング参加者による学習記録

Python3の勉強をyukicoderでやる

pythonは正直あまり好きな言語ではなかったのですが,numpyが魅力的すぎるため,競技プログラミングで少し勉強してみました.

大学の講義内容がさっと手元で動かせないんですよね.octaveは重すぎるし.

記事を書いている人の前提知識度

昔に少しだけ書いたことがあります.簡単なゲームを作りました.

notepad.exe [WP]no.014 python独習

『なんかブロックをインデントで判定してる』『タプルとかリストとかの概念がある』という雰囲気は覚えてますが, 実用面は全く忘れました.

solve

No.268 ラッピング(Easy) - yukicoder

  • http://yukicoder.me/submissions/174424
  • 昇順,降順ソートしたい問題.
  • Python2とPython3でかなり違うらしい.input()ですら違いがある.
  • aa.sort()でリストをソートできる.reverse=Trueと指定すれば逆順になる.
    • 辞書っぽい引数の指定面白い
    • 破壊的.破壊出来ないリスト(例:10行目)に対してソートしたい場合,sorted(arr)をやる.
  • range(N)は,Rubyでいう(0...N)みたいなもの
  • print aという記法はPython3では使えない.

No.136 Yet Another GCD Problem - yukicoder

  • http://yukicoder.me/submissions/174503
  • Kは2に固定して良い.あとは全ての組み合わせを全探索する.
  • PyPy3がRuntimeError.math.gcdを使うにはバージョンが足りないらしい.
    • Python3は通った.
    • import mathすると使える.
  • 割り算をすると,例え整数同士でもFloat型になる.
    • int(nm)でキャストできる.
  • maxは普通に関数として使える.Rubyみたいなインスタンスメソッドではない.

No.80 四角形を描こう - yukicoder

  • http://yukicoder.me/submissions/174509
  • 思考停止全探索.xとyを適当に全部回す.
  • if x*2+y*2>l : continueみたいな書き方ができる.HSP*1っぽい.
  • 提出コードからは消したけれども,プログラムを中断させたいときは,import sysしたうえでsys.exit()する.
    • うっかりsys.exitと書くと終了しない.

No.204 ゴールデン・ウィーク(2) - yukicoder

  • http://yukicoder.me/submissions/174566
    • 途中で実装方針を変えたため無駄な記述がある.
  • D日すべて使う必要があるかどうかが問題文・テストケースから分からない・・・と思ってたら『最大』って書いてあった.
    • test13.txtを見れば分かるように,D日すべて使う必要は無い.
  • 有給休暇を挿入する始点xを全探索する.
  • input()は改行文字を含まない.
  • ++var+ + varとして解釈される.もちろんvar++はエラー.
  • strのi番目の文字はstr[i]として取り出せるが,書き換えは出来ない.
    • 文字列の部分書き換えをするには,str[:i]+'o'+str[i+1:]と書く必要がある.
  • Ruby同様,文字列の掛け算ができる.
  • 文字列の範囲に-1を指定すると,末尾を指定したことになる.Rubyと同じ.

No.77 レンガのピラミッド - yukicoder

  • http://yukicoder.me/submissions/174570
  • 理想のピラミッド△を作っておいて,差分を求めることでコストを得ることができる.あとは全探索.
    • 予めブロックが足りるかどうか判定したうえで,『ブロックを除去する』を1コスト,『ブロックを積む』を0コストとして計算.
  • sample5.txtのように,フィールドは無限大に広いものとして考える必要がある.しかし,制約から199で抑えて良い.
    • 提出コードではaa+=[0]*100という感じで無理やり増やしてる.
  • sum(aa)で総和が取れる.
  • 0Falseとして解釈される.

No.290 1010 - yukicoder

  • http://yukicoder.me/submissions/174571
  • http://yukicoder.me/submissions/174573
  • 00,11,0101,1010が存在するかどうか調べる.
  • 存在するかどうか調べるために,正規表現を使う.
    • import reをしておく.正規表現リテラルなんてものは無い.
    • r'str'と書くと,\エスケープしなくなる.
    • re.match(r,s)を使うと,先頭からのマッチしか判定しない..*を加えるか,re.search(r,s)を使う.
      • re.search(r,s)なら場所が分かる.ただし,先頭マッチ時は0が返ってFalse扱いになるので,Noneと比較する.

*1:HotSoupProcessor