2015年12月11日金曜日

Paiza Online Hackathon 7

恋愛SLG:プログラミングで彼女をつくる|paizaオンラインハッカソン7

https://paiza.jp/poh/ando

※【眼帯・ニーソ】は2015/12/14あたりに問題追加実装された
※【猫耳・猫セット・メイド服】は2016/03/??あたりに問題追加実装された
上記は後から実装されたされたため追記しています。

<言語:Python2>(※注意:二段になっているコードも全て一行です)
釣り目   
眼帯    
ショートヘア
ロングヘア 
ポニテ   
ツインテ  
セーラー  
カーディガン
追加問題  2015年12月追加
ニーソ   
追加問題  2016年3月追加
猫耳    
猫セット  
メイド服  

さて、上の問題はたぶん各1・2分でとけるんじゃないかと思います。(まぁ、眼帯が少し考えるかもしれない)

問題らしい問題はアクセサリだけ。

■眼帯が意味不明な人向け解説
左端にprintが来るという事は処理を全て右側処理しきっているわけですがごちゃごちゃしすぎ・・・。

確かに。と言うわけでこのゴミみたいなコードのリスト内包をちゃんと変数に代入して表示してみましょう


これでだいぶ処理が解り易くなりました。更にリスト内包を展開します。


見ての通り、最初のリスト内包以外はforの意味は有りません。
2回目のリスト内包はinputで得た集合を代入せず直接取り出し計算するために使い、
3回目のリスト内包は集合の解除→ソート→リスト内文字列化を行いつつifの変わりに使っています。
最後にjoinでリストをスペース区切りに結合してprintから出力しています。

当たり前ですがリスト内包の使い方としてはあまり正しくありません。
リスト内包の特徴はリストを生成に特化したforでだからです。
しかも処理毎にリストに格納される為「listdata[0]」として都度リストから展開する必要もあります。


めがね

概要:


サンタ服

概要:
「前面:X」x「側面:Y」x「高さ:Z」の立方体から切り分けた時に最も小さい立方体の体積を求める。
ただし上面と水平方向には切り分けない為最も小さい平面に高さZをかければよい。
切り分けの入力は「0or1 距離」で
0の場合は側面と並行に切り分ける場合。
1の場合は前面と並行に切り分ける場合。
距離はその端からの距離が入力される。
条件として0センチの切り分けは無い。二度同じ場所は切り分けない。片方向しか切り分けない場合がある。値は全て整数。

図形をぱっと見た時に三方向に切り分けるのかなと思って後回しにしていましたが高さの切り分けがないのでなんて事は無い面積問題ですね。
切られる距離は前か横からなので順番がわからない以上最後にソートして各距離間をだせばOK。

https://paiza.jp/poh/ando/share/3c2d1b45
提出言語:Python2
提出コードバイト数:329
Test case1 成功実行時間: 0.03 秒
Test case2 成功実行時間: 0.03 秒
Test case3 成功実行時間: 0.02 秒
Test case4 成功実行時間: 0.02 秒
Test case5 成功実行時間: 0.04 秒



水着

概要:
入力Nの階乗の答えから末尾にある0を全て取り除き、その値から末尾9ケタを取得する。
取得した9ケタの頭が0の場合はその頭の0も取り除く。
Nの範囲「1 ≦ N ≦ 1000000」

考え方は「カーディガン」問題の延長にある。
ただし、Pythonでは桁が多すぎて安直な回答では問題4からタイムアウトする確率が非常に高い。

たとえば【階乗の値を文字列化rstripで末尾0削除し、後ろから9ケタ取得後int化により先頭0を除去】と、した場合

Test cace1:○ 0.02秒
Test cace2:○ 0.02秒
Test cace3:○ 3.97秒
Test cace4:× 15.00秒 ※タイムアウト
Test cace5:× -秒
全く持って処理速度が足りない。

さて、「math」で「1000000」の時点で処理速度が追いつかない。
階乗処理は自作しなければならないことが確定した。
0がどんどん増えていくため先ずそれを抑止する事を考えてみる。
かける前に自身に0が付く場合先に除外しておけば良い。
階乗では全て掛け算で、0が増える場合は「2*5」が含まれる場合である。 それを取り除けば末尾0の数を調べる必要が無い。

考え方
・かける前に10で割れるだけ割っておく。
・2で割れるだけ割り、それをカウントしておく。
・5で割れるだけ割り、その分だけ2のカウントを減らしていく。
・最後に2のカウント分累乗をかければ末尾に0の無い階乗結果になる。
・末尾9ケタを取りintで先頭0を削除する。

Test cace1:○ 0.02秒
Test cace2:○ 0.02秒
Test cace3:○ 3.55秒
Test cace4:× 15.00秒 ※タイムアウト
Test cace5:× -秒
微妙に早くなった。たぶんこれは2の掛け算をギリギリまで行わずに最後に累乗で追加するからからだろう。
だが、結局全く持って処理速度が足りない。


まともにやりあっていては駄目だ・・という事で今回たまたまツイッターでこの問題について少しリプライのやり取りがあり、手直しして組み直したものがあるのでそれを紹介します。
考え方的には上位の桁を無視して下の桁だけで計算させるというもの。
殆ど元のツイートを参考に短く組み直しただけに近いので偉そうなことは言えませんがなんだかんだでそれなりの長さと速度になったのではないでしょうか。
9桁ギリギリだと桁ぶれが発生してエラーになる為11桁にする事で全ケース通過をするようにしてある。
85byte https://paiza.jp/poh/ando/mypage/5e7d53b6

Test cace1:○ 0.03秒
Test cace2:○ 0.02秒
Test cace3:○ 0.10秒
Test cace4:○ 0.70秒
Test cace5:○ 0.84秒

蛇足等
ニーソ短い版 https://paiza.jp/poh/ando/mypage/5e7d53b6?c=8047e40d
提出言語:Python2 提出コードバイト数:43 All cace:0.02秒

カーディガン短い版 その他版
提出言語:Python2 提出コードバイト数:41


眼帯まだましな方


例の邪道版

0 件のコメント:

コメントを投稿