2015年10月2日金曜日

回文最速版ALL0.02秒

paizaオンラインハッカソン6+
「え、妻が松江?」松江Ruby会議07協賛 回文作成プログラミングコンテスト|POH6+
https://paiza.jp/poh/joshibato/matsue-ruby

前回、前々回に引き続き例の回文です

Python 211byte


結果:https://paiza.jp/poh/joshibato/matsue-ruby/result/cf3ec175
All Test case  実行時間: 0.02 秒

最速で動かない事には話にならないという事で今回は取り敢えず速度優先。
前回、前々回でとにかく配列の増減で処理落ちが酷い事が解りました。
また、同じステップ条件のforが無駄であるという事でそこらへんから処理の高速化をめざしました。


・・・ただし、無駄が多いです!


ツイッターのハッシュを少し追うだけで【Python】【All Test case  実行時間: 0.02 秒】【135byte】らしいので絶対に何かもっといい処理方法があるはずです。

ちなみにPythonにおけるこのサイトでの最速は0.02秒より早くなりません。
第一問を直接printで回答しても0.01秒になりませんでした。



前置きが長くなりましたがそれでは説明。


■for n in[None]*int(i()):
前回説明通り、Pythonのforは処理構造がforeach文のそれです。
その為カウンタを必要としない場合rangeで数値リストを生成する必要がありません。
つまり入力の数だけループさせたい場合空のリストで問題ないとう事です。
リストの生成においては【[None]*数値】が恐らく最速です。
また、forではリストの生成が必須になる為それに処理を取られるもののwhileよりもforの方が処理が早い為forを使います。

■s=i();r=s[::-1]
入力を直接「s」に取得し、rに逆順文字列を保存。

■if s==r:
「文字列と逆順文字列が同じ=単独回文」として先に処理します。

■if c!="":l+=[c];c=""
今回も全テストケースで【重複するのが中央文字列しかなく、1種類しかない】という前提で記述してるため邪道感があります。
もし、既に文字が格納されている場合左文字列が確定するため「l」に追加します。
それと同時に「c」を空文字列戻します。

■else:c=s
「c」が空の場合、その値を代入します。

■else:
単独回文ではない場合

■if r in t:l+=[(s,r)[s>r]]
リスト「t」に逆順文字列「r」が含まれている場合「l」に追加します。
ただし、今回は取得置きに処理するため「abc」か「cba」どちらが変数「s」に格納されているかわかりません。
そこでこの処理です。【 (s,r) 】が簡易配列だと思ってください、【 [s>r] 】この条件式でTrueまたはFalseが返り、結果的にTrueで1がFalseで0として処理されます。
Pythonにおける文字列比較はa~zに従って大きいと判断されます。
これにより「abc」が格納されていようが「cba」が格納されていようが小さい方(昇順の文字列)が格納できます。

■else:t+=[s]
左文字列か除外文字列かまだわからない文字列はtempとしてリスト「t」に追加します。


■l.sort();a="".join(l);print(a+c+a[::-1])
最後に左文字列のリストをソート、さらにjoinにより空文字で結合します。
あとは出力しておしまいです。





以下蛇足
凄くどうでも良いけど所でなんで【Python】書けるの?


元々はだいぶ前に、友達が3D制御のスクリプトにPython使えるからという事で教えて的な感じで話があり、まぁ自分にも役に立つだろうと少しだけ触りました。
それまでは全く触った事がありませんでしたが普段使わない言語でも少し調べればif・for・配列くらい教えられればいいかなと。

ツイートで流れたのでちょっと面白そうと思って試しましたが、まず選べる言語で書けそうなのがPythonだけという・・・。
今回は思い出しながらと言うよりはほとんど調べ直しながらになったため苦戦しました。
結局他の言語で書いたのをPythonに置き直すようにしながら必要な関数等を調べました。


今回の落ち。
if・forで既に友達が挫折しました。



言語についてはjavaとC++それにPHPは少しだけ使ったことがありますがすっかり忘れました。
ここ最近では主にWSHのVBS、基本動作は大抵Cscript。
またHTAを合わせる事で簡易アプリを作ったりですね。
web周りではjavascriptをかなり触ったんですが最近は便利なライブラリが多く自作する事はほぼなくなりました。

あとはVBAも触りますが、VBSの知識がほとんど使いまわせるからと言う点と大抵のPCにエクセルが入っているので使い勝手が良いからです。
そういう意味でwindowsさえ入っていれば直ぐに作れて動かせるVBSとHTAは使い勝手が非常に良いです。

今後は「Windows PowerShell」とか覚えたいところではありますがついついVBSに・・・。
まぁ、今回は処理完成後も色々改善策を練ったりと勉強になりました(また忘れそうですけどね・・・)。

今回思ったことは「Rubyどれだけ短くかけるんだ・・・」って所と「Pythonおっそい!!」って所に尽きますね。
また、こういう機会があれば頭の体操程度にやってみようかと思います。


0 件のコメント:

コメントを投稿