2015年12月26日土曜日

SHOW BY ROCK!!ガチャ2

ドーン!50個たまっても少し我慢しようと思っていたんですがダメでした。
そして、前回のレトリーに続きチュチュもきました!!
ただ・・・なんでクリスマス版が来ないんだ・・・。(期間的に3回目の10連は無理そう)

そして前回話していた通り光が飽和しすぎている。
ですがさらに今回はなんとURがもう一枚。「うるとらすたっど!フェネリィ」が一緒にでました。
前回10連で出なかった分を考えると確率の収束と考えるべきでしょうか。

光:UR:テンションMAX・チュチュ♪
火:UR:うるとらすたっど!フェネリィ
火:SR:梅にでゅらでゅら
火:R:すたっど・れいんぼー!L
火:R:ゼブリ・ナレコーディング中
火:R:吽の趣味
火:R:フェネリィ・ヒマを持て余し中光:R:負けるな!バイガンバーV!
闇:R:今はやってませんけど。デモンスモッグ
緑:R:文化祭本番!しばりん

うーんこれで覚醒可能ブロマイドが4枚に!

現在の編成

2015年12月25日金曜日

Xperia Z5とSHOW BY ROCK!!

どうも黒い野良猫です。

ついに・・・スマホを契約してきました。
と言うのも「SHOW BY ROCK!!」のBD全巻・予約特典・CD全巻と大量のチケットコードがあり、最も早くきれるのが予約特典の12月25日だったため。

えぇ、完全にゲーム機ですね。
それでチケットの内容について

■まずBDは固定URブロマイド

光:UR:ぷるぷる♪シアン&レトリー
光:UR:ぴゅるちゅ♪チュチュ&モア♡
光:UR:ぷるぷる!夏合宿♪
火:UR:徒然なる豪華特典でありんす♪
光:UR:クリクリ♪JCアイドル宣言!
光:UR:ぷるぷる!み~んなありがとにゃん♪

各巻の表紙がブロマイドになっています。
4巻以外は全て光で、4巻のみ火となっています。

属性に偏りがありすぎて光はALLBD特典編成となりました。
まぁ、現在クリスマスイベントが光イベントなので凄くはかどります。

また、全ブロマイド3ミス帳消しがパッシブなので始めたばかりの私には重宝しています。
逆にアクティブがPリズムワイドが2つ被っていたりするためいずれ変える事にはなりそうです。



■次に予約特典UR確定チケットx3

水:UR:コリエンテ・SSマインド
水:UR:タートルBIG・SSマインド
光:UR:テンションMAX・レトリー♪

欲しかったのはもちろんクリスマスURでしたが、まぁコリエンテとレトリーは覚醒できるようなのでまずまずの結果。
光がBD特典で飽和気味です。
水は2枚もURが来たのでしばらくはこれで乗り切ろうと思います。



■最後にCD特典SSR以上確定チケットx9(一枚多くCD購入してます)

闇:SSR:漆黒の翼・クロウ
水:SSR:オールナイト・ミックス
水:SSR:オールナイト・アシッドモンド
水:SSR:ワンマンライブ・キンタウルス
水:SSR:天空遺跡ライブ・ミトミトン
火:SSR:つぎはぎ・ワンマンライブ
火:SSR:がしがし・ワンマンライブ
緑:SSR:森然と光のサダフルン
光:SSR:光の戦士・バイオレッド

まぁわかっていましたがSSRしか出ませんでした。
URが一枚でもきてくれればなぁ・・・。
バイオレッドは属性アップで割と良いのですが光はUR5枚以上あるので



■初めての10連ガチャ

序盤ツアーとビンゴだけで取り敢えず50個かろうじてたまって即10連。

闇:SSR:漆黒の翼・アイオーン
水:SSR:シャボボン・シークレットライブ
緑:SR:音の森のサダフルン
他残りはN

UR確率アップとは一体・・・ぐぬぬ。・・・ぬぬぬ・・・。



◆現行編成

・闇
闇:SSR:漆黒の翼・アイオーン
闇:SSR:漆黒の翼・クロウ
闇:N:Lv15 ビンゴ用の奴
闇:N:Lv15 ビンゴ用の奴
闇:N:Lv15 ビンゴ用の奴


・火
火:UR:Lv50:徒然なる豪華特典でありんす♪
火:SSR:つぎはぎ・ワンマンライブ
火:SSR:がしがし・ワンマンライブ
火:N:Lv15 ビンゴ用の奴
火:N:Lv15 ビンゴ用の奴

・水
水:UR:コリエンテ・SSマインド
水:UR:タートルBIG・SSマインド
水:SSR:オールナイト・ミックス
水:SSR:オールナイト・アシッドモンド
水:SSR:シャボボン・シークレットライブ
予備
 水:SSR:ワンマンライブ・キンタウルス
 水:SSR:天空遺跡ライブ・ミトミトン


・緑
緑:SSR:森然と光のサダフルン
緑:SR:音の森のサダフルン
緑:N:Lv15 ビンゴ用の奴
緑:N:Lv15 ビンゴ用の奴
緑:N:Lv15 ビンゴ用の奴

・光
光:UR:Lv50:ぷるぷる!み~んなありがとにゃん♪
光:UR:Lv50:ぷるぷる♪シアン&レトリー
光:UR:Lv50:ぴゅるちゅ♪チュチュ&モア♡
光:UR:Lv50:ぷるぷる!夏合宿♪
光:UR:Lv50:クリクリ♪JCアイドル宣言!
予備
 光:UR:テンションMAX・レトリー♪



◆始めて5日程度の感想

ゲームシステムはだいたい理解しました。
ただ音ゲーマーではない私には現状イージーがなんとかなる程度。
星4くらいをミスキャンセル3回込みでフルコンって所です。

ハードは現状だとだいぶキツイ。
少なからずチャレンジクリアできる率は限りなく低い。

クリスマスイベントに合わせ光バンドは全てLv20に
ただまだ平日しかプレイしてないので譜面が無い為今はこれが精いっぱい。

ブロマイドの光は取り敢えず金曜でALL Lv50となりました。
BD特典URがあレトリーを持て余してる感。

緑と闇は現状所持ブロマイド的に特に鬼門

こんなところですかね。

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


眼帯まだましな方


例の邪道版

2015年10月8日木曜日

Pythonのリスト内包表記その2

リスト内包表記を知らなかった私が、前回(http://blackstraycatreboot.blogspot.jp/2015/10/python.html)リスト内包表記はリストの条件付き再リスト化と覚えたばかりだが他にも直接文字列を列挙したりできるらしい。

つい最近
【漫画版: 女子高生プログラマーの大バトル!〜コボール文明の逆襲〜|paizaオンラインハッカソン6】>【遺跡発掘ゲームで古代コボール王Ⅳ世を撃破せよ!|緑川つばめ】
(https://paiza.jp/poh/joshibato/tsubame)の簡単な問題にて

入力値+その値左側(10の位)+その入力の右側(1の位)を足して終わりという簡単な問題
初回は単純に


n=raw_input()
print int(n[:1])+int(n[1:])+int(n)


一度変数に格納してスライスで分解し、intへ変換しつつprint出力しました。
しかし、面白味が無かったので入力値を直接回答叩き込みたくなった。

ところが変数は分解しなければならず、入力値に直接スライスでは値をそのまま返せない。
変数のコピーさえあれいいのに・・・

そこで指定値for系で学んだリストの生成方法を思い出した
ループさせる場合【 for x in range(N) 】みたいな生成が一般的だが【 for x in[0]*N 】の方が生成が早くさらに【 for x in[None]*N 】の方が速い。
今回速度はさて置き、リストは【 [指定値]*数値 】でリストを生成すれば元値を複製できる。


[raw_input()]*3


これで入力値を3つに複製できた。
ですが値を切り出し、さらに数値にして合算する必要がある。

そしてついに話戻ってリスト内包表記!これならリストを列挙しつつしかも最終的な値を直接返せる!
リストに対するint変換は入力値周りで覚えたmapによりintに変換できるし、さらにそれに対して他の問題でやったリスト合算sumが使える。

なるほどこれは簡単に見えて総合問題なんだな(絶対違う)という事に。
だがしかし、ここで少し手が止まる。


print [x for x in[raw_input()]*3]


三回入力値を得られたが処理に変化を加える為の方法がない。
ここで1・2分くらい悩んでenumerateを思い出した。
リスト要素に対し値と要素番号を得られる。これでどうにかしよう。


print [b[::] for i,b in enumerate[raw_input()]*3]

スライスで切り抜くには【 変数[開始インデックス:終了インデックス:ステップ] 】となる。
だがここでまた思案。

iに入ってくるのは0・1・2これを要所に設定した場合格納値は(入力が27の場合)

b[i::]→["27","7",""]
b[:i:]→["","2","27"]
b[::i]→エラー(ステップに0は指定できない

んー惜しい・・・。

開始+0、終了+1なら(入力が27の場合)

b[i:i+1:]→["2","7",""]

んーこれでは全体が入らない。
同時に平行で移動する関係上範囲が一定なのは仕方がない

今が
b[0:1] #2
b[1:2] #7
b[2:3] #""


なので
b[0:1] #2
b[1:2] #7
b[0:2] #27
とかになってくれれば・・・ん?

これ、オーバー通る?
b[0:3] #27
通る

0・1の交互なんて連番なら簡単じゃないか数値の÷2のあまりでいい
じゃあ・・・

b[i%2:i+1:]→["2","7","27"]

キター。
それじゃあ、これにmapかけて

print map(int,[b[(i%2):(i+1)] for i,b in enumerate([raw_input()]*3)])
>>>[2,7,27]

sumで合算してやれば

print sum(map(int,[b[(i%2):(i+1)] for i,b in enumerate([raw_input()]*3)]))
>>>36

できたーーー!時間にして10分なんて難しい総合問題なんだ・・・。




今回の落ち(と、言うか今回はこれの為)
別な問題をやっている時にヒントとかいうのに気付いた

print ''.join([v for k,v in enumerate(raw_input()) if k%2 == 0])

なんか近いのを見たなぁこの黒魔術な感じ、と言うかさっきこの絶対やる必要のない遠まわりな感じの回答したよ。



さておき、今回の落ちが本編なのだが頭に書いた通り、直接文字列を列挙できる。
リスト内包は「リストを再リスト化」しかできないという理解だったが文字列を要素として一文字ずつ取り出すことができる。
上の式では一文字ずつ取り出し、カウンタを2で割ってあまりが0か1かで格納する値を決めて最後に空文字でリストを結合している。

というわけで、リスト内包はリストも文字列もリスト化できるという事でした。
これを書くのに長い毎ふりだったぜ・・・。




蛇足:
ただ、まぁもしもこういう感じにするならわざわざ0を判定するのはあれなので

print ''.join([v for k,v in enumerate(raw_input()) if not k%2])

こうでしょ?・・・いやまあこう言うのが可読性を落とす原因なんだけどね。
(値の返りが何と一致しているから処理されるという明示がなくなる為)
いやでもそもそもこの問題リスト内包してる時点で可読性激落ちですからね。

じゃあどうするのって話だがPythonですからそこは

print raw_input()[::2]

これだけでいいんですよ。

2015年10月7日水曜日

デフォPython高速化

Python2x系で数値読み込みループにinput()は使うな!

何故かと言うとinput()は式を求めているから。

数値を直接得るのに【 num=input() 】はメジャーな使い方である。
だが、これを数千数万とループで受ける場合話は別である。

最初に述べた通りinput()は式を求められている。
「つまりどういうこと?」と言う話だが
【 input() 】=【 eval(raw_input()) 】なのである。

たとえば300,000回程度forで数値入力の読み込みループを行い配列で受ける場合

=input()約2.1秒
=eval(raw_input())約2.1秒
=int(raw_input())約0.5秒

かなりおおざっぱな検証だがこれくらい差がでる。
【 input() 】と【 eval(raw_input()) 】が同じなのは同等の処理を行っているから当然の結果。
【 input() 】と【 int(raw_input()) 】では【 input() 】の方が簡潔に見えるが行わる処理は遠まわりしている事になる。
結果的に2倍以上の差が発生する。
※ちなみにintでは端数切捨てなのでそこは注意。


そもそも読み込みループを行うな!

何故かと言うとPython自体がもうループ処理自体が遅い。
「じゃぁどうするんだよ!」確かにそう言うのも仕方がない。

だが標準入力はほかにもある事を思い出してほしい。
具体的にはには以下のようにする。

import sys
mylist=list(map(int, sys.stdin.read().splitlines()))

readで連続で受け取りsplitlinesで分割。それをさらにmapを使い一括でintに変換する。
どれくらい早くなるのかというと

約0.17秒!int(raw_input())のさらに倍以上早い。
ただし、これは実際のケースではそんなにないのではないかと思う。
この問題に気付かされたのはPOHなので課題専用処理と言っていい。


ループはwhileよりもforを使え!

ループ回数が増える程whileよりもforのほうが処理速度が速い。
処理は処理として使いやすい方を使うのが正しいが処理速度がどうしても欲しい場合whileで行っている処理をforに置き換える事を検討すると良い。



リスト化はリスト内包を使え!

通常forでリストを追加する場合appendをチェックしている。
だがリスト内包を使った場合はリスト化前提の為その処理がない分速い。
しかもその処理時間は6割程度違う。つまり、通常forでリスト化して10秒ならリスト内包なら4秒で終わらせる事が出来る。

とにかく要素追加が遅いという事。逆にリスト等の要素追加でなければここまで差はでない。
ただしmap等forすら回さなくて良い場合はそちらの方が速い。

ループカウンタが不要なら[None]*数値を使え!

forの構造上値を渡しながらループする事になる。
通常であれば
【 for x in range(数値) 】だが、それよりも
【 for x in[0]*数値 】の方が速く、さらにそれよりも
【 for x in[None]*数値 】とした方が速い。

あくまでも大量のループを回すときにに空のリスト生成の方が速いという事。
ただし、rangeと[0]では割とさが出る様だが[0]と[None]では大きな差は無い。

ソートするならlist.sort()を使え!

自身を並べ替える為list.sort()はsorted()よりも若干ですが効率が良いです。
list.sort()の戻り値はNoneでsorted()との混乱を回避する為らしい。
といっても受けた値をソートできる為sorted()使っちゃうよなぁ。







後で追記する

2015年10月6日火曜日

Pythonは黒魔術であってはならない・・・だが

まぁもちろん魔術というのは揶揄した言い方なのですが今回コードゴルフでなるほろーと思ったこととか。

Pythonとは

Pythonはリーダビリティ(可読性)特化言語である。
その為、普通に打ち込みを行っている分にはみなが均一に読みやすいコードになり改修も楽で自身が忘れたコードでも読み返して見やすいそういう作りの言語です。

だが・・・黒魔術はなくならない。

ここで言う黒魔術はリーダビリティを失った何が書いてあるのかぱっと見ではわからないコードの事を指します。
黒魔術の主成分は主にワンライナーとコードゴルフです。
これに特化する事で新たな発見や効率化を生み出しますが基本的には何が書いてあるか解り難い魔術言語となります。
特にRubyは上級黒魔術と言っていいでしょう(何あれ?ホントぱっとみなんだか意味不明)。

と、どうでもいい前置きでしたが、つまりはPythonでも言語方針に反しリーダビリティを投げ捨て、さらには処理速度すら投げ捨ててでも暗黒面に身を染めようじゃないか!というお話。



私は初めからPython 3x系で独学したためほとんどPython 2x系との違いなんて気にしたことがありませんでした。
知ってた違いは
・2系ではxrangeの方が処理が早く、3系ではデフォルトでrangeは2のxrengeの処理で行われる。
・関数等が【 ()括弧 】が必須で2系では【print "aa"】とできたが3系では【print("aa")】でなければエラー
・2系のraw_input()は3系ではinput()になった
程度です。なのでまさか2系に「input()」があるとは・・・閑話休題。


コードテクニック

では闇Python黒魔術を始めましょう。
と言っても「or・and」あたりは胡散臭い処理ですがそれ以外はわりと普通のコードテクだったりします。
また、主にPython 2x系の話となります。

1.使いまわす関数を減らす

Pythonでは関数を変数に代入する事でその変数を関数として使う事が出来ます。
【i=raw_input】と定義すれば今後【i()】だけで呼び出せるのです。

たとえばraw_input()を2回以上使う場合4byte違いがでます。
p=raw_input;a=p();b=p()
a=raw_input();b=raw_input()

rangeの場合は2回では同byteですがメインコードが薄くなります。
r=range;a=r(6);b=r(9)
a=range(6);b=range(9)

intでは2回程度では2byte損です。
int=i;a=i("10");b=i("10")
a=int("10");b=int("10")

2.input()とraw_input()の違いを知る

これは完全にPython 2x系の話になります
input()とraw_input()の違いはinput()は式をそのまま評価します。
【input()】は【eval(raw_input()) 】とするのと同じです。
入力される式が正しくないとエラーが複数発生したり扱いが少し難しいですが入力が文字か数値かだけの場合【input()】で数値として値を受け取る事が可能になります。

今回の様に一度目のみ数値の入力、二回目以降は文字列等の場合かつその数値は数値として受け取りたい場合に非常に有益です。

一度目の入力を数値の5、二度目の入力が文字列”ABC”であれば
使い分けた場合23byte、通常のままの場合32byte、一文字定義で26byteとなり、使い分けた場合が最短になります。

a=input();b=raw_input()
a=int(raw_input());b=raw_input()
p=raw_input;int(i());b=i()

3.暗黙型変換と評価で格納値を変える

暗黙の型変換はifなどの評価において0をfalse、0以外の数値(not 0)がtrueになります。
また、空文字「""」はfalse、文字に値がある場合trueとなります。
それと同時に、リスト番号での評価式はfalseが0となり、trueが1になります。


・数値や文字列がboolで処理される

if 0:print"表示" #表示されない
if 1:print"表示" #表示される
if "":print"表示" #表示されない
if "a":print"表示" #表示される


・評価が値数値で処理される

print ("A","B")[true] #Bが表示される
print ("A","B")[false] #Aが表示される


4.orとandの遅延評価でifを減らす

主に行数を減らすワンライナー向け

orは「どちらか条件ならば」であり処理は左から行われる。
つまり、左が条件に達した時点て確定する。
逆に左がfalseで場合右が値として確定する。

True or "a"
上では左がTrueで確定しTrueとなり、後ろが評価されない。

False or "a"
上では左がfalseとなり"a"が値として確定する。


andはorの逆で「両方が条件ならば」であり同じく左から処理される。
つまり、左が条件に達せない場合後続は処理されない。

True and "a"
上では左がTrueの次の評価に入り"a"が値として確定する。

False and "a"
上では左がFalseであり、その後ろは評価されない。


ifの代わりに使う場合はこのようになる
条件 and True時 or False時


5.リストや配列追加にappend等を使わない

a=[];a.append("ABC")
ではなく

a=[];a+=["abc"]
と記述すれば5byte短くなる

6.処理系以外はセミコロンで並べる

行にif・for・whileが無いなら【 ; 】セミコロンで処理を並べる事が出来る。
だが、リスト内包表現は代入式の為セミコロンで並べる事が出来る。


7.複数の同じ内容の初期化

a=0;b=0;c=0 #これよりも
a,b,c=0,0,0 #これよりも
 a=b=c=0  #こう
 a=b=c="" #文字列ならこう

 a,b,c='1','2','3' #文字限定でよりも
a,b,c='123'      #こう

8.exec('処理'*数値)でループの代替をする

ループ速度と言うか繰り返し実行速度が有益か怪しいが普通にループ処理を書くより短くなる。
また、文字列として処理が入る為一行で書くことが可能になる。

a=0
for x in[None]*10:print(a);a+=1

a=0;exec('print(a);a+=1'*10)

この様に書ける。forがなくなる事でaの初期化をセミコロンで処理を後続に並べる事も出来る。
【 '処理' 】を連続で投げている事になる。
execはきた文字列を処理として展開実行する。
これにより疑似ループが完成するがスコープ周りなど注意が必要。

9.カウンタ無ループfor x in[0]*数値

ル―プカウンタが不要なら

for x in[0]*数値

とする。
inの後に【 [ 】を隣接することで1byte短くなるし、0リスト生成は処理も速い。
ただし[None]*nの方が最速。







後で追記する

【lambda】無名関数さえあれば短くなるしワンライナーもry
【三項演算子】でif・elseを一行にさらに入れ子も
【リスト内包表現】再リスト化・抜出し。for系なのに代入式なので「;(セミコロン)」でつなげる事も可能
【リスト内包表現が1つの場合両端の[]を消しても良い?】


最後に

それ、Pythonじゃなくていいよね?
処理速度ならC++、コード圧縮したい(とにかく短く書きたい)ならRubyで書きませんか?

やっぱり邪道なのです。
折角このPythonという言語自体がリーダビリティをが良いのこれを失わせるなんてとんでもない。
・・・だが(以下ループ)

以上です。

2015年10月5日月曜日

Paiza Online Hackathon略して「PHO」らしいよ

回文からそもそもこれなんなんだろうと思ってちょっとだけ調べた。
ちょっと触ったのはファーストコードだけ載せておく。
基本的にPython3のコードが好きなのだけれどこのサイトは処理速度を求められるため処理速度が気になった場合Python(Python2系)です。

・・・暇つぶしが必要な時にちょっと少しやろう。

新人女子プログラマの書いたコードを直すだけの簡単なお仕事です!|paizaオンラインハッカソンVol.1

https://paiza.jp/poh/ec-campaign

・概要:
第1入力は【「N (1 ≦ N ≦ 200000)」半角スペース「D (1 ≦ D ≦ 75)」】(NもDも整数)
第2入力はN回「p_i(10 ≦ p_i ≦ 1000000)」の入力(改行区切りで渡されるの意)
第3入力はD回「m_j(10 ≦ m_j ≦ 1000000)」の入力(改行区切りで渡されるの意)
(※C,C++のみ処理性能が高い為かNの最大は500000、Dの最大は300テストケースも異なる)

「p_i」リスト2つの組み合わせ合計が「m_j」以下で最も近い値をDのパターンだけ出力する。
「p_i」の組み合わせ全てが「m_j」の値を越える場合は「0(整数ゼロ)」を出力する。
「p_i」の組み合わせは「p_0+p_0」といった自身同士の組み合わせは含まない。

・ファーストコード(Python):

※テストケース1 : 2.30 秒。2以降はタイムアウト。制作者の意図に嵌り過ぎ

・途中コード1

※テストケース1 : 0.70 秒。2以降はタイムアウト。dequeなら?とお試しぐっと早くはなったがダメ

・途中コード2

※テストケース1 : 0.88 秒。2以降はタイムアウト。遅くなってゆく


・ラストコード(Python):

テストケース1 : 0.02 秒。
テストケース2 : 0.03 秒。
テストケース3 : 0.16 秒。

最終的に他の問題をやってきてから戻ってきた。forによる読み込みは遅いという事がほかの問題で知ったためsysをインポート。

ここら辺の入出力はCscriptと同じ感じ。
wscript.stdin.readline()
cscriptではこんな感じ。


更に指定値に割り込む要素番号をどうすれば早く知る事ができるかというのを調べてbisectにあたった(これ便利ー)。


処理要点のみ説明すれば以下
 campaignsの値段を商品一覧右挿入点取得(bisect_right同意味
 best&temp初期化
 strtよりendが大きい間
 エンド特定商品・最低値+最高値がcampaignsより低くなるまでendを下げる
 tempとして値段保持
 temp bestがtempを下回る間
 現状best
 一致で終了
 一致しない場合最小値を繰り上げ

それで後で調べたら最終問題はキャンペーン価格のみで通るらしい。
どういう事かと言うと、価格リストが増えるとキャンペーンへ価格の組み合わせが完成する率が高くなる。
今回の問題でいうと結果的に最終ケースはキャンペーン価格を表示するだけで良いとの事。ぐすん。


女子大生とペアプロするだけの簡単なお仕事です!|paizaオンラインハッカソンVol.2 

https://paiza.jp/poh/paizen

・概要:
第1入力は設置面【「H (1 ≦ H ≦ 130)」半角スペース「W (1 ≦ W ≦ 130)」】(HもWも整数)の
第2入力は設置可能行【D_i(1 ≦ i ≦ H)】「1が配置済」「0が空き領域」で0と1のW桁
 (例:Wが5の場合「01010」や「11110」の様に入力される)
第3入力は設置数【N(1 ≦ N ≦ HW)】最大は1x1が全マスとなるHxW
第4入力は設置種【「S_i (1 ≦ i ≦ N)」半角スペース「T_i (1 ≦ i ≦ N)」】
 サイズは【「S_i (1 ≦ S_i ≦ 300)」半角スペース「T_i (1 ≦ T_i  ≦ 300)」】
(※Java,C,C++,C#の場合「H」「W」の最大は130ではなく300)

上記条件で初期配置に対し、設置種それぞれ配置可能数を出力する。

・ファーストコード(Python):

・コードは後で書くとして、問題の所見:
値は1か0で来るので画面を越えない範囲でスライスの合計0なら配置可能。
左から右、上から下へ処理対象を移動し「A行B文字目」において、「B+T<=H」範囲内で「D_A行目[B:T]」をスライス。「A+S<=H」範囲内でA~A+S行目までを足して0ならば設置可能


天才火消しエンジニア霧島「もしPMおじさんが丸投げを覚えたら」|paizaオンラインハッカソンLite 

https://paiza.jp/poh/kirishima

マンガ版「エンジニアでも恋がしたい!」〜転職初日にぶつかった女の子が同僚だった件〜|paizaオンラインハッカソン4 Lite 

https://paiza.jp/poh/enkoi

■ドッキドキの転職初日、最初の仕事は炎上PJの鎮火!?

・ファーストコード(Python3):58 byte


■野田さんと飲みに行ける!?クソコードをささっと修正!

・ファーストコード(Python3):114 byte


■ゲームアプリ「パズウナ」の作成に挑戦!野田さんはよろこんでくれるかな!?

・ファーストコード(Python):181 byte

ちなみにsleepで検証してみたらテストケース4と5は最大の「300,000マス」区間は共に「150000マス」です。


マンガ版「俺の許嫁と幼なじみが修羅場すぎる」|paizaオンラインハッカソン5

https://paiza.jp/poh/enshura

■レナたんが俺の許嫁!?手紙の暗号を解読せよ!

・概要:奇数番目の文字列のみ表示

・ファーストコード(Python3):19 byte

解説:入力値を直接ステップ2でスライスする。19byteで済む。

■レナたんのパパが経営する会社の入社試験に挑戦だ!

概要:
第1入力は【N(1 ≦ n ≦ 210)】(Nは整数で必ず7の倍数)=【N(7 ≦ n=7*? ≦ 210)】
第2入力はN回「p_i(0 ≦ s_n ≦ 1000000)」の入力
1~7入力を1セットとして、各何番目の合計を7つ出力する。

・ファーストコード(Python):94 byte

先に↑を書いたけどいっそベタでもいいんじゃないかと↓を思いついたが長くなったのでやめた

■ミナミとレナ、どちらを選ぶか究極の選択です・・!

・ファーストコード(Python):12 byte

・ファーストコード(Python):14 byte

・そりゃレナでしょ?2byte短いもの(ぇ)

■障害が起きている会社のメインシステムを改修だ!!(レナルート)

・ファーストコード(Python): byte


■会社を辞めて、一から自分でアプリ開発を頑張るぜ!(ミナミルート)

・ファーストコード(Python): byte


漫画版: 女子高生プログラマーの大バトル!〜コボール文明の逆襲〜|paizaオンラインハッカソン6

https://paiza.jp/poh/joshibato

■ちょうどいい濃度のコーヒーを淹れ、古代コボール王Ⅳ世を撃破せよ!|食いしん坊ハッカー:六村リオ

https://paiza.jp/poh/joshibato/rio
・概要:

■古代コボールすごろくで古代コボール王Ⅳ世を撃破せよ!|天才ハッカー:霧島京子

https://paiza.jp/poh/joshibato/kirishima
・概要:

■遺跡発掘ゲームで古代コボール王Ⅳ世を撃破せよ!|なでしこハッカー:緑川つばめ

https://paiza.jp/poh/joshibato/tsubame
・概要:2ケタの整数N(10 ≦ N ≦ 99)に対して、N+Nの10の位+Nの1の位の合計
・例:27が入力された場合【27+2+7】となり【36】が回答となる

・ファーストコード(Python3):

・ラストコード(Python):



「え、妻が松江?」松江Ruby会議07協賛 回文作成プログラミングコンテスト|POH6+ 

https://paiza.jp/poh/joshibato/matsue-ruby

■最強の復活の回文

・概要:これを最初にやったので概要についてはこちら

・提出コード(Python):211 byte

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おっそい!!」って所に尽きますね。
また、こういう機会があれば頭の体操程度にやってみようかと思います。


Pythonのリスト内包表記

例の回文の件で処理速度を早くするためにforが早くするにはとしらべていたらリスト内包表記がわりと速いらしい。
先に処理の比較を見た限りifを入れると結局は微妙な早さっぽい。

でもまぁまずは「リスト内包表記」なるものを使ったことが無い為調べる事に。
要約すると「作成済みのリストから条件をつけつつリストアップしながらさらに値に変更を加えつつ新しいリストを作成する事が出来る」です。

解りずらいので実際の式
mylist=range(5)
newlist=[x+2 for x in mylist if x > 2]
みたいな感じです。

変数=[xに変更を加えて格納 if x in 抽出元リスト if xが~なら]

処理順は右側、左側、中央
上の処理を順にみていきましょう

mylist=range(5)
newlist=[x+2 for x in mylist if x > 2]
先ずは右の処理からここはmylistからの抽出条件です。
forとinの間にある変数が対象各処理における変数で指定できます。

初回ループは0なので
if 0 > 2
となる為スキップします。
if 1>2
if 2>2
もスキップ

ついに抽出条件になりました。
if 3>2

続けて格納する前に処理を加える事が出来ます。
newlist=[x+2 for x in mylist if x > 2]
続けて左側、今回の場合は
3+2つまり5がリストに格納されます。

同じように次は4が処理され
4+2で6が格納されます。

>>>print(newlist)
[5,6]
となります。



・・・なるほどこれは便利そう。ただ、なかなか見づらいですね。

2015年9月30日水曜日

回文処理没案!その2

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

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

Python 200byte


結果:https://paiza.jp/poh/joshibato/matsue-ruby/result/76d98589
Test case 1 通過 実行時間: 0.02 秒
Test case 2 通過 実行時間: 0.02 秒
Test case 3 通過 実行時間: 0.02 秒
Test case 4 通過 実行時間: 0.03 秒
Test case 5 通過 実行時間: 0.03 秒

元々こっちの案で作ってたやつですね。
といっても基本的な処理はおなじで消込型です。

■for n in r:l+=[w()];
先ずは入力される文字の読み込み、リスト(いわゆる配列)を生成

■l.sort()
リストをソート

■for i in r:
Pythonのforは処理構造がforeach文のそれです。
「r」には最初にrangeで生成した整数の連番が入ったリストが入っており順次「i」カウンタへ格納されていきます。

■k=l[i];t=k[::-1];l[i]=""
「k」に文字列を格納。「t」にはリバース文字列を格納。最後に配列を空文字列に。

■if k != "":
格納された文字が空でない場合のみ処理

■if t in l:m=m+k;l[l.index(t)]=""
「l」のリストからリバース文字列「t」があるか調べある場合、左文字列として追加。
同時に対になるリストを空文字に置き換えます。
indexはその要素が最初に出てくる番号を返します。
このリストで複数回出現しても個々に処理されます。

■elif k==t:c=k
単品でありなおかつ文字列とリバース文字列が一致数る場合中央文字が確定します。
一種類しかない事前提なので若干邪道かもしれません。

■print(m+c+m[::-1])
最後に出力しておしまいです。


「&#009;」

2015年9月29日火曜日

回文処理没案!

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

■問題の要約
・回文に必要な文字列を入力してくる。

・一度目の入力は何回文字列を何回入力するかの数値。値は1以上1000以下

・二度目以降の入力は文字列が入力される
 入力される文字列の条件として、1文字以上10文字以下。
 また、テストケース毎に文字列の長さは固定。

・入力条件として必ず回文が成立する文字列が入力される
 つまり、最低入力は1回でその文字列は必ず単品回文。「aba」や「oo」等
 中央が無い場合の最低入力は二回で必ず対になる。「abc」「cba」等

・オフレコな条件を追加すると
 中央文字は複数回くる可能性がある。
 中央文字は1種類しかない。
 中央文字はは毎回あるわけではない。
 その逆で中央文字しかない場合もある。
 最終テストケースは無論最大値、1000入力の文字列の長さは10。



今回は没案だけを紹介します
Python 174byte

l=[];c=a="";w=raw_input
for n in range(int(w())):l+=[w()];l.sort
while l!=[]:
 o=l[0];del(l[0]);t=o[::-1]
 if t in l:a=a+o;l.remove(t)
 elif t==o:c=t
print(a+c+a[::-1])

ちなみにraw_inputをinputにすればPython3で処理可能。
ただし、処理速度はPython2xの方が早い(少なからずあのサイトでは)。


では、何をどう処理するのか?

■for n in range(int(w())):l+=[w()];l.sort
まずリスト(いわゆる配列)の生成。そして最後にソート。
これによりソートされたリストを取得できます。

■while l != []:
while条件はリストの中身が空になるまで行います。
つまり消込型です。有意点は処理が進むほど高速になります。

■o=l[0];del(l[0]);t=o[::-1]
先ずリストの0番目を取得し、そのままリストの0番目の要素を削除。
これにより中央strであった場合でも自身が検索対象になりません。
それと同時に文字の逆順を【 o[::-1] 】で取得しています。

■if t in l:a=a+o;l.remove(t)
ifの条件はlのリストの中にt(逆順文字)があるか?です。
有る場合この時点で回文の左文字列として結合していきます。
さらに【l.remove(t)】で逆文字の要素を削除します。
removeは最初に出てくる要素を消す為リストで複数回出現しても個々に処理されます。

■elif t==o:c=t
左文字列ではない場合において自身単品が中央文字列(回文)かをチェックします。
ここで回文として成立する文字列は必ず1つしかありません。
今回は中央の種類が1つしかない事前提になっている為若干邪道ではあります。

■print(a+c+a[::-1])
最後に出力しておしまいです。




それで今回の落ちなのですが、うまく行ったコードより、こちらの方が高速だろうと書いたこっちが4以降のテストケースでタイムアウトするっぽいと言う話。
おめでとうございます!でも大きいサイズのデータではタイムアウトしてしまうようです。全テストケースクリア目指してみましょう!
ですって。

2015年6月14日日曜日

「作りたかったもの」と「聲の形」

「聲の形」全7巻を衝動買いしてきました。
連載してる時にだいたい読んでいたのですが抜けがあるなぁと思って。

面白かったです。やはり最後の最後あたりが抜けていました。
最後どうなったっけ?というか最後を見ていなかったパターンでした。


- - - - - - - - - -

事前に述べておきますが「かたわ少女」には性的描写を含む為、年齢制限があります(今回年齢制限のかかわる内容は含みませんが)。
また、気を付けはしますが今から書く内容に不快感を覚える可能性があります。
特に「かたわ」という単語に過剰な反応や障害の字に議論を持ちかけたくなる方はブラウザバックしてください。

- - - - - - - - - -

それでなんで急に全巻買ってきたかと言うと、私が作りたいと思っていたものの中に障害者が主体となるものがあったからです。

それで「聲の形」はだいたいやりたい事をやってくれていて、そちら側の内容で私が新しく何か作るのは難しそうになりました。
と、いうと何か色々語弊を生みそうなのですが・・・。

かなり前に一度色々調べた際は「かたわ少女」というゲームが作成されているというあたりだったかと思います。
「かたわ少女」は身体障害をもつキャラクターが多く登場するノベルゲームです。
障害を前面もってくるなんて何かにてるなぁでもたぶん自分の作る方向と違うなぁと言う感じで思ってました。
内容を別にしてこれの面白い事はこのプロジェクトが立ち上がるきっかけが日本の同人誌である事。
そしてそれが逆に日本まで届く形である事。
その為、設定が日本だったりキャラ名が日本風であり、(海外では血液型占いとかはあまりないが)キャラづけに血液型を利用していたりする。
(性的表現については賛否あり、それは影響が大きいとしてスキップ機能がある。※ただし、そこまでであれが駄目・これが駄目の指示に従うものではない。)

今検索したところ「かたわ少女」のプロジェクト開始が2007年みたいなので、私がプロットを練ってた時はそれより後で、(初出・読み切り?)「聲の形」がマガジンに『別冊少年マガジン』2011年2月なのでそれより前あたりっぽいです。


そもそも、なんで障害者をヒロインにとか考え始めたの?って所なんですけどぱっと特徴あるヒロインを生み出せなかったからって所が大きいですね。
何らかの特別(それが良いもの、悪いもの関係なく)を持つというのはそれだけである程度の設定・・・ひいては内容の肉付けになるので。
ラノベとかではその特別ていいうのが「能力」だったり「魔法」だったりするのでしょうけども、もうちょっと身近な「何か」という感じです。


まぁ、それでどんなものを作ろうとしていたとかの話ですが、Nスクが触れたのでまぁ短めのゲームの予定でした。
かたわ少女は身体障害を持つヒロインが数人いる様でしたが、私に人数を描くだけのシナリオは無理だとして、ヒロインは一人。

また、身体の欠損を描くには直接的すぎて(表現的に重い)、難しいと思い見かけ上身体に異常がわからない範囲での設定予定でした。
その為「喋れない」か「聞こえない」が初期案、次に「見えない」パターンや、見かけ上は分からないが体の一部部位が動かないと言った感じ。

ただ、体が動かない事で車いす等は割とライトな表現で、意思の疎通で苦労する感じの内容を描きたかったので(話を膨らませるだけの力が無かったとも言う)身体が動かないとパターンはやめました。

それで後にでたもう一つの「見えない」パターン、この場合意思疎通には手に書く場合や専用の手話に触れてもらって意思疎通するなどがありましたがこちらは先ほどと逆に難しすぎるかなと。

結局初期に戻り、「喋れない」か「聞こえない」側がほぼ確定。
最初は筆談を行い、主人公が手話を覚える事でヒロイン側に寄り添う展開を予定していました。

筆談であれば相互の意思が間違いなく通じ、そのひと手間は程よい距離を生み出し、それは一つの壁でありそれを取り払う事が必要になる。
手話という会話はある程度の距離でも有効で使いやすく、「より早く」「より正確」に「意思」が「気持ち」が伝わりやすくなっていく展開というのはかなり良いのではと。

それとゲームなので選択肢に手話を入れる予定でした。
いっそのこと手話を覚えれる恋愛ゲーみたいな、ただ流石にシステムを組むのが大変かなとは思いますが・・・それでもやればできなくはないと思う。

これは最初普通の選択肢が、(ある程度妥協して簡単な)手話の選択肢が混ざるようになる事でプレイヤー側が近づく感覚になればと思ったのですが・・・まぁやっぱり難しそう。

それと同じ理由で立絵をなめらかにとはいかないまでも手話の動きをさせれればと思っていました。
後は手話に対して文章ではいれるものの多少足りない箇所を作り、手話の動きに対してプレイヤーが今の手話はなんて言う意味なんだろう?といった感じ。

たとえば序盤で筆談で会話終了しわかれる際に手話で「またね」の動きをさせる。
それで、ヒロインは気づいたように止めて、手をふって「バイバイ」と主人公に解り易い動きにする。
話の展開上しばらくするとその動きが「またね」だとわかる等。

この時はたぶん「動かすのいいなぁ」と「無理じゃない?」があたまでぐるぐるしてた気がする。
余りに動くなら出力するコンテンツをゲームではなく映像作品でもいいんじゃない?とか。
最近のゲームのように立絵が3Dで会話でなめらかに動かせればベストだなぁとか。




最初「聲の形」を見た時に「これは・・・」と思いました。
序盤のなかなかえぐい感じの内容程ではないですが、障害における差別な部分や手話を覚えて寄り添う展開とか。
不協和音になる状態のヒロインが「はたして主人公を一緒にいていいのだろうか?」という葛藤とか。
一度やってみたいなぁと思っていた事がだいたい入っていて、私が組み立てにふわふわした箇所も良くおさえられていて「・・・良いな」と。

勿論私が作ったとしてももっと残念な事になる気はしますが「作りたいものを作る」というのは割と普通な思考でしょう。
ただ「無いなら自分で作ればいい」という感覚は、逆に欲しいものがそこにあってやりたかった事が大体できた作品があるなら、「それでいいんじゃないの?」という事で、もう蛇足に蛇足をつくような感じがしてもう満足しちゃった感が大きいのです。

それが前文側の「そちら側の内容で私が新しく何か作るのは難しそう」なのです。
アニメ化もするみたいなのでそうなると私の動かしたい欲まで満たされて万々歳。
他に障害者を含む作品は少々デリケートで無理に踏み込んでいかなくてもいいのではという感じもしてもういいかなと。

- - - - - - - - - -

まぁ、だからと言って別途企画してる内容がそんな新しい感じかと言えば全然全く持ってそんな事はなく、ざっくり言うと「吸血鬼もの」と「人外もの」です。

前者はもう馬鹿みたいに作品がありますが自分ならこうかなというものです。
後者はちょっとした考えの元にできるならちょっとやってみたい事というか長期的なコンテンツが持続できるか的なものです。

ありていにいえば、前者が完結を考えているのたいして、後者はだらだらやる用と言ったところです。




ようは・・・最終的に「面白いものや面白い事が何かできればいいな」という事なんでしょうけど。

2015年5月4日月曜日

EDF4動画今後について

攻略動画の為一応1から順番に攻略をアップしていこうと思っていたのですが4.1もでて今更4なんて感があふれており、この前のアンケートでもやはり投稿速度を上げてほしいという事もあり。
(まぁ他にも色々あったのですが)


【 少し投稿速度を上げようと思います!! 】

コメ返しで書いた通り、編集練習が主目的なので実際ミッションはどこでも良い事と
興味を持ってもらえても次動画待ちが長く、忘れられそう。
なので少し閲覧できる動画数を増やしておきたい。
と言うのが大きいです。

それで具体的にどうするの?なのですが


①ミッションのアップロードが順不同になります。
 基本的にはクリア速度が速いものからになります(編集が少なくて済む為)。
 ただし、逆にこれはプレイ時間が長いものが後になる為後程遅くなります。
 四足耐久などは10分近く予測可能回避不能なミッションなど。


②自前でやっている体力検証を基本的に止めます。
 地球防衛軍4 敵耐久値 : http://edf4foreigner.ari-jigoku.com/
 M2から既に参照して検証値と理論値を個々に記述していましたが
 画面のスペースや主に検証時間を省くため
 今後全て理論値で表記は1の位以下を繰り上げで表示させます。
 ただし、レタリウスの巣などは耐久がミッション内ですら固定でない為検証します。


③基本的に既にマップ作成済みのミッションが優先されます
 マップを作成するのにほぼまるまる1・2日くらいはかかる為できるだけ避けたい為です。
 ただ、2分台の動画いくつかは未作成のマップの為気分次第で先に作成する可能性は高い。


④文章の流し込み量の増加
 これは既にリトライ版M1とM5で行っていますが文章のテキストエリアが明朝系三段から
 ゴシック系四段になっています。
 これによって一気に文章が流し込めるようになった為だいぶ楽になりました。


⑤爆破系を後回しに
 別撮りが無いため編集が短く。ただ爆破スキーの私が耐えれる間。
 ちなみに、動画時間が短く爆破が無い動画は基本的にグング無双ミッション多め。


・個人的に某ノーダメージ縛り動画の2Pで行っているミッションに挑戦
 これは合間にやりたいもので動画をみながらそのうちいくつかは1Pでもクリアできそう
 いやもうなんか1Pでこの2Pより殲滅効率上げれるんじゃないかなぁと(いや、まさかね

具体的には以下
13 円盤撃墜作戦
17 谷に潜む影
32 雷鳴
41 殲滅
44 虚無の船
53 輸送船急襲作戦
59 炎上する山
67 巨神船
78 天の兵団
84 灼熱


以上。

投稿速度が上がらなかったらまぁもうあきらめてください。
主に編集でもうちょっとやりたい事とか増えた場合、遅延する可能性は高いです。

上に含まれますが専用編集の場合も少し遅くなります。
 ・両手同武装などではどちらの武器のがいくつ残弾があるか等の編集。
 (M01REのリムペットの残弾表示・M03のC爆の残ボムの表示等)

 ・本編とは別にワイプで紹介したい攻略動画がある場合。
 (殲滅効率が高くても「誰でも」というにはPSに偏っている攻略ワイプの同時編集等)

 ・M05のような特殊な出現と検証が含まれる場合。
 これはほんと例外な検証ですのでそうそう無いとは思いますが・・・。

また、M1・M5のリトライ版の様に大幅な効率の更新要素がある場合、むずむずして我慢できない為恐らくまた遅れる可能性があります。

そういえば最近自分でも忘れそうになってますが、この動画シリーズは別にノーダメージ攻略ではないですよ。一応言っておきます一応。


動画編集基準は以下M01リトライ版あたり



敵 :出現条件・体力
味方:出現条件・体力・人数・移動・ダメージカット時間とダメカの発生条件
市民:出現条件・持続秒数・移動
無線:発生条件(味方や敵発生に絡みます)・プレイ側の文字表示
マップ:キャラのリアルタイムマップ
武装:武装詳細
爆破:爆破の別撮り



すっごい要約すると、極力投稿時間が短くなるようにします。
・・・が、駄目だったらごめんね。って事でお願いします。

2015年3月30日月曜日

著作権はどこだ?

どーも黒い野良猫です。

現在地球防衛軍4(以下EDF4)の動画作成を行っていますが
最近ゆっくりでも動画で使おうかとおもったので調べますかってとこですね。


──────────────────────────────
それはそれとしてそもそもEDF4の動画って作っていいの?
YES

EDF4は数多くのゲームと違い元から動画等に対するガイドラインがあります
──────────────────────────────
生放送、動画・静止画のアップロードは「2013年9月6日以降」DLC含み全ミッション可能。
難易度制限なし、プレイ人数制限なし、兵科制限なしとなっております。

動画や静止画の投稿には以下を必要とします。
1)作品タイトルの先頭に【地球防衛軍4】を記載する。
2)動画説明文に著作権マーク(©2013 SANDLOT ©2013 D3 PUBLISHER)を記載する。

詳しくはこちら http://www.d3p.co.jp/edf4/info/index.html

──────────────────────────────



──────────────────────────────
既に東北ずん子でボイスロイド使ってるんじゃ?そっちはいいの?
YES

こちらもガイドラインがあります
ボイスロイド(東北ずん子)は非商用内で利用可能です
──────────────────────────────
Q:ボイスロイドの音声素材は使えるの?

ボイスロイド(VOICEROID+東北ずん子)の音声は非商用の範囲内でしか
利用出来ません。

詳しくはこちら http://zunko.jp/guideline.html

──────────────────────────────
VOICEROID+ 東北ずん子 EXを同人活動で使いたいのですが?

VOICEROIDは非営利目的による配布が前提となりますが、
弊社サイトにて申請を行うことで同人活動での有償配布を許可しています。
詳しくは有償配布申請ページ(http://www.ah-soft.com/licensee/)をご覧ください。
なお、非営利目的で同人作品を無償配布する場合につきましては申請は不要となります。

──────────────────────────────



──────────────────────────────
さてではSofTalkは使っていいの?
YES

ただし、AquesTalk・AquesTalk2
──────────────────────────────
再生・録音した音声を映像作品や自作アプリに組み込んでもいいの?
再生・録音した音声を企業や商用目的で利用してもいいですか?

SofTalkについては特に制限はありませんが、
ご利用になった声の種類によっては音声合成エンジン・ライブラリの提供元より何らかの制限が設けられている場合があります。

AquesTalk・AquesTalk2を選択した場合、非営利かつ個人に限り無償でご利用になれます。
(音声を使用した動画をYouTubeにアップする場合など、音声データの2次利用についても同様です。)
シェアウェアでご利用になる場合や、企業でご利用になる場合などは、ライセンスのご購入が必要になります。
詳しくはAquesTalkの公式サイトをご覧下さい。

SAPI・Speech Platformを選択した場合は各メーカーにお問い合わせ下さい。

いずれの声がAquesTalkやSAPIなどにあたるのかはメニューのオプション-環境設定-声質を選び、一覧の右端の種類にてご覧になれます。

尚、もし可能であればSofTalkを利用したことをヘルプや字幕などでご紹介いただければ幸いです。
(強制ではありません。)


詳しくはこちら http://www35.atwiki.jp/softalk/pages/16.html
──────────────────────────────




2015年2月23日月曜日

おのれ「リパース ポイント」め!

最近ハードディスクが圧迫してきたのでどこが重いのか調べる事にしました。

まさか、エクスプローラーで一つ一つ容量を確認するなんてかったるいので
簡単なスクリプトを組むことに
取り敢えず一階層におけるフォルダーの列挙ととサイズの表示すればいいかというわけで


fo=inputbox("folder path")

with createobject("scripting.filesystemobject")
for each fos in .getfolder(fo).subfolders
wsh.echo fos.name & " : " & fos.size
if err.number then wsh.echo fos.name & " : " & "err"
next
end with



適当なフォルダーでテストして問題事を確認して、いざC配下でCscriptで実行
「書き込みできません」


ん?んんん?コードに間違えはない。
じゃぁ、どこでこけているのか調べる事に


fo=inputbox("folder path")

with createobject("scripting.filesystemobject")
for each fos in .getfolder(fo).subfolders
On Error Resume Next
wsh.echo fos.name & " : " & fos.size
if err.number then wsh.echo fos.name & " : " & "err"
On Error goto 0
next
end with



先ずは「google」フォルダーこれはどうやら配下の「CrashReports」フォルダーにアクセス権限が無かったことが問題らしい。
でもこれエクスプローラーでは容量でるのになんでfilesystemobjectじゃ駄目なんだろうか・・・
いやまぁこれは(あまり納得できないけども)権限の永続許可で解決したので良いとして




次に「Windows NT」フォルダーでこけました。中に入ってさらにsubfolderでリストを出力してみると「アクセサリ」というフォルダーに弾かれているらしい。
エクスプローラーからアドレス直打ちしてみたところ弾かれた。
どれもこれもアクセスが拒否される。という事で調べてみたところ

以下記事が見つかった
カテゴリ「Visual Studio Express Editions  >  Visual C# Express Edition」
タイトル「ファイル検索プログラム作成でアクセス拒否」

ここに出てくる「earch.txt」のリストと会話の流れで「リパース ポイント」が原因なのがわかりました。


普通一般家庭じゃwindowsしか使ってないだろうから
シンボリックリンクの方は知っているって方が珍しいかもしれないけどまぁシンボリックリンクのほうは知ってたのでこんなツイートに


まぁ、そして今に至るわけです。
とにかく解決するのであれば、一階層でサイズが取得できなかった場合下のフォルダへ入って行って延々と再帰でフォルダーの容量を漁るればいい。

たーだー、容量をちょっと確認したいだけなのに面倒すぎる。
エクスプローラーはだって容量見れるじゃないか・・・ぐぬぬ←今ここ









2015年2月7日土曜日

続・flacタグの事


現状で個人的に最高に使いやすいタグエディタはTtageditorです
現バージョンは「ver. 1.3.6.0 (2014/11/21)」

・アートワークの埋め込み
・複数のアーティスト埋め込み(Shift+Enterで可能)
・カスタムタグの埋め込み


タグは何を埋め込む?
タグは管理の為にあるので、基本的に聞く人が管理しやすいタグだけ入れればよいし正解は無い。

──────────
ALBUM
ALBUMARTIST

アルバム名だと同名の可能性がある為、最近のプレイヤーは「アルバムアーティスト+アルバム名」が複合主キー方式である。
その為アルバム名だけを入れると表示が分断される為この二つは最低入れる
アルバムアーティストは複合主キーにさせる為に近い基本的にアーティストを入れるのがベターかなと思う。

ちなみに
ALBUMARTIST
ALBUM ARTIST
といった感じにこのタグに限らずプレイヤ・タグエディタのモノによってはスペースを入れられるがこれはメインプレイヤに合わせると良い。エディタが複数に対応しているならor条件で表示してもらうと良い。

──────────
ARTIST

アーティストこれは種類で分けている。
ざっくり言うとボーカルつまり歌を歌う人物がいる場合はその人を入れている
逆にサウンドトラックなどBGMメインの場合は作曲者を入れている
仮にゲームサントラ内にメインテーマ等でボーカルがある場合は主体は作曲者だがアーティストにはボーカルを入れてアルバムアーティストに作曲者と言った感じ。
こういう場合は他のアーティスト部分はアーティスト空っぽにしているか全て入れて、複数のアーティストに入れる時もある

歌手が複数でユニット名等がある場合はそれを入れる。
だが、複数いるがユニット名等が無い場合は単純に複数入れる
Ttageditorならば(Shift+Enterで可能)アーティストタグを複数埋め込める。
内部的には
ARTIST=歌手A
ARTIST=歌手B
ただ特定の歌手のみではなく、特定の歌手も含まれているのは全てを聴きたい場合などはユニット名等があっても複数のアーティストでいれてアルバムアーティストにユニット名を入れる。

キャラクターと声優
アニソンだとまぁ割と多いがキャラ名でアーティストが歌詞カード等に載っている事もある
だがタグは管理の為と割り切っているのでキャラ名ではなく基本的に全て声優名としている
代わりにコメントタグにキャラ名(CV:声優名)で埋め込んでいる

ただこの基本外、まぁつまり例外で管理するものもある。
アイドル系のアニメやゲームでとにかくキャラでの曲数が多数ある場合(アイマスとかね)はもうキャラ名でアーティストを埋め込んでいる

──────────
DISPLAY ARTIST

MusicBeeを使い始めて成程と思ったタグ。
Ttageditorではカスタムタグとして追加する必要がある。
これはもう単純に表示のためのタグとなっている。そのため絞る為に使っている「ALBUMARTIST、ARTIST」とは違い自由でいい。
たとえば「ユニット名(歌手A、歌手B)」と入れたり、「キャラ名(Cv:声優)」と言ったようにばらっばらでいい。

──────────
TITLE
曲名

DATE
年だけ入れる場合も多いがDATEという単語を考えると日付まで入れておくといいのかもしれない。
基本的にアルバム名だけ管理している場合はまぁ入れなくてもさして問題ないかもしれない。

LYRICIST
作詞、ただデフォルトではない。

COMPOSER
作曲、割と入れていない。サントラ等ではALBUMARTISTかARTISTに入れてしまうので。

ARRANGER
編曲

GENRE
ジャンル

DISCNUMBER
ディスク番号。サントラでは必須だがシングルだと入れていない。

TRACKNUMBER
トラック番号。これは必須かなと思う。

TRACKTOTAL
何トラックあるか一つの曲でわかる。ただしわざわざ入れる事は無いような気がする。












2015年1月24日土曜日

EDF蟻カウンタ

EDFミッション3にて黒蟻が噛み付きと酸の二種類が居るので数える事にしました。
既存のカウンタをDLするのすら面倒だったので蟻専用誰得カウンタを自作。

ちなみに高速連打しても反応しきれないのは仕様。
テキストボックスをひたすら+1するだけなので数え間違えた時に直接値を修正できる。
エラー処理はしていないので文字などを入力すると確実にこけるのも仕様。

以下をメモ帳に張って、htaの拡張子で保存するだけ。



<html lang="ja-JP">
<HEAD><title>蟻カウンタ</title>
<HTA:APPLICATION SCROLL= "no">
<SCRIPT Language="VBScript">
Sub Window_onLoad:window.resizeTo 250,150:end sub
sub cl1():co1.value=co1.value+1:end sub
sub cl2():co2.value=co2.value+1:end sub
sub r():co1.value=0:co2.value=0:end sub
</SCRIPT>
</HEAD><body>
<input type="text" name="co1" size="10" value="0">
<input type="button" value="噛み付き蟻" onClick="cl1()" />
<br><br>
<input type="text" name="co2" size="10" value="0">
<input type="button" value="酸蟻" onClick="cl2()" /><br>
<input type="button" value="リセット" onClick="r()" />
</body>
</html>

2015年1月23日金曜日

動画編集始めました

まぁタイトル通りなのですが動画編集を始めました。
地球防衛軍4の攻略動画ですね。
やったことの備忘

順番に

■Ae
・コンポジション
簡単に言えばマトリョーシカ的なもの、フラッシュを使ったことがあるならどんどん中にデータを格納できると言えば分るだろうか?・・・わからないかもしれない。
コンポジションに入れておけばいくらでもデータをまとめられる。



・タイムリップ
http://ae-style.net/basic/b27.html
対象素材を選択してる状態でメニューの「レイヤー」→「時間」→「タイムリマップ使用可能」
対象にしたデータのキーフレーム間で部分的な加速やスローができる。

・ループ処理
http://ae-style.net/tutorials/t09.html
「エクスプレッション」を追加してキーフレーム領域にコマンド「loopOut(Type="cycle")」を入力する。

別のサイトで解り易くなんかあったようなどこだったか・・・
素材をコンポジションに入れて動かしたい動作を作り
更に新しいコンポジションに今作成したコンポジションを入れてエクスプレッションを設定する。
するとエクスプレッションで速度調整しつつ指定の動作をループで延々と動かすことができる。

ずん子のまばたきと爆弾のEDF4風ロックオン表示の回転に利用

・モーションパス
https://helpx.adobe.com/jp/after-effects/kb/cq10230034.html
円状に動かすときに利用
元となるパスは割とどこからでもよく、それをコピーして、「トランスフォーム>位置」の場所にペーストすると自動でモーションパスが設定される

・トラックマット
フォトショップでいうクリッピングマスクみたいなもの
ただし対象は下のレイヤー1つ、まぁ複数を同じ枠に入れたいならコンポジションに纏めればいい。
シェイプレイヤーを作りそのレイヤーは非表示にする。
そのシェイプレイヤーにクリッピングしたい画像や動画等をその下に配置し、メニューから「レイヤー>トラックマット>アルファマット」

■Pr
・速度変更
http://hangar7.jp/Premiere/Premiere-b-L001-Fast-forwarding/Premiere-b-L001-Fast-forwarding.html
対象素材を選択してる状態で右クリック「速度・デュレーション」
爆発の別撮りを重ねる時に爆風を直視した側はなんと2倍ほど時間経過が遅く処理落ちしていた為2倍速で表示するときに使用した。



・トランスフォームエフェクト>クロップエフェクト
http://helpx.adobe.com/jp/premiere-pro/using/video-effects-transitions.html#transform_effects
動画の表示領域をトリミングして、ようはワイプ(小窓)。
爆弾の別撮りを爆発部分だけ表示するのに使った。


















2015年1月5日月曜日

lenovoを買ってみた

メインPCにMicrosoft Officeを入れたくなかった為だけにノートパソコンを買ってきました。
更に言えばメールをOutlookに設定して少し送受信する為だけにノートが欲しかったのです。

中古でも良かったんですが割と中古も高く、Officeが入ってるノートは5・6万までいけば割と有るのですが高いなぁと足踏みしてました。
4万台だとOfficeが入ってないのばかりうーんと色々見ていたら。

━━━━━━━━━━
「Lenovo IdeaPad Flex 10」
RAM :2GB
CPU :インテル® Celeron® プロセッサー N2830
HDD :500GB
OS  :Windows 8.1 with Bing 64bit 日本語版
付属 :Microsoft Office Home & Business 2013
━━━━━━━━━━

性能は別に必要なくOfficeが入っていて店頭でも4万台という事で買ってきました。
当初の予定通りのことは問題なくできているので満足はしています。
ですが、私以外の用途では恐らく不満が出そうなところがいくつかあります。

1.メモリが2GBと少なく遅い。
まぁでも値段が値段なので割と納得できる。
もう少しお金がだせるなら4GB版もあるみたいなのでそちらを買えばいいんじゃないかな?

2.タッチパネルなので指で操作できるけども解像度的にどう考えても小さい
タッチパネルwindowsはわりとこんなものなのかもしれない。
なのでwin8だけどそもそもタッチパネル必要ない気もする。

3.矢印(アロー)キーが小さい。矢印・ページアップ・ページダウンが近くに密集した配置
これが割とイライラする。
外出時に小さいため持ち運びには凄く楽で、少し触るだけとなると外付けでマウス・キーボードをもっていかないわけです(そもそも個人的にはタブではなくノート買うのはキーボードとディスプレイがセットだから)。
そうすると「タッチパネル・トラックパット・矢印キー」がメイン操作になるのですがトラックパットは範囲が狭いのでファイルの選択やら文字の移動程度だと矢印キーを使うのですが凄く誤爆します。

下で述べるFキーの件含め、外で1・2時間しか使わないのに少しのテキスト編集とファイル変更とかだけでどっとストレスがたまりました。

4.F(1~12)キーがファンクションキーを使わないといけない
タブレット端末のくっつけるキーボードでもあるまいしなんでデフォルトから削ったのかと、ミュートや音量増減キー等なんてデフォルトでそんな頻繁に使わないよ!
3で述べた矢印キーを複合して酷くストレスがたまります。
せめてF6~F10まででいいからデフォルトにして欲しい・・・打ち込みの速度がこうガクッと落ちます。

かなり個人的視点ですがこんな感じ。


逆に良い点は、
Officeが入って4万前半という圧倒的安さ。
軽さと小ささ。つまるとこ携帯性が良い。

以上。ちょっとしたレビューでした。




頭にも述べた通り個人的には満足です。
今回はたまたま外にもっていく予定があっただけで、たぶんもう外に持っていく予定が無いのでバッテリーに困る事は無く、キーボードもマウスも外付け。
家にいる以上この端末ではメールしか見ないし、他作業は全部メインPCですからテキスト編集でイラつくこともないでしょう。
あるとすれば寝転がってネットサーフィンしてるときに少しイラッとなる可能性は捨てきれないけれども・・・。