読者です 読者をやめる 読者になる 読者になる

行の回転

python code golf

気分転換。
ちょうどローテーションのアルゴリズムを学んだばっかりなのでトライ。

rotate lines

スペースもカウントされる事に気付いたので(最初から気付けよ(- -#)不要なスペース・インデントはカットしてみた。結構サイズが小さくなった。

汎用的なアルゴリズムならこんな感じかな。

import sys
S=[]
r=1
def v(s,e):
 for i in S[s:e][::-1]:
  S[s]=i
  s+=1
while 1:
 l=sys.stdin.readline().rstrip('\n')
 if not l:
  break
 else:
  S.append(l)
n=len(S)
v(0,r)
v(r,n)
v(0,n)
for i in S:
 print i

実行結果。

size: 226
time: 0.056416 sec
status: 0

size: 226
time: 0.015453 sec
status: 0 

サイズを小さくするためだけのセコイやり方ならこう。実行速度の差も興味深い。

import sys
S=[]
while 1:
 l = sys.stdin.readline().rstrip('\n')
 if not l:
  break
 else:
  S+=l
S+=S[0]
for i in S[1:]:
 print i

実行結果。

size: 139
time: 0.059642 sec
status: 0

size: 139
time: 0.097427 sec
status: 0

2番目の Sample Input の実行速度に大きく差異があります。前者の方法が速いのは、アルゴリズムの違いが顕著に影響している気がします。
さらに後者は S.append(l) を S+=l に変えて7バイト削減してます。が、これ、実は違う処理で append() メソッドを使う場合、元のオブジェクトに変更を加えます。S+=l の場合、新たにリストを作成してそのオブジェクトへリンクされます。新たにオブジェクトを作成する必要がないため append() の方が速いそうです。この結果に影響を与えているかどうかについては検証してませんが。

あと python の1番は 48 バイトのようです。
give me a chocolate!

広告を非表示にする