Translate

BTemplates.com

Powered by Blogger.

2019年2月27日水曜日

2019-02-11、12、15、25、27 到達点メモ


コマンドプロンプト

入力を受け付ける
set /p testdata=

値を代入する
echo %testdata%

参考サイト:バッチファイルでよく使う書き方まとめ


Node.js

コマンドプロンプトから入力した値を使いたい。
例えば以下のように入力した場合、testdataという文字列を使いたいとします
node index.js testdata

この場合、index.js上では以下のように指定する必要があります
var data = process.argv[2];

参考サイト:Node.jsでコマンドライン引数を取得する


ruby

downto
大きい順から特定の値まで一づつカウントダウンする
大きい値から調べたい時は便利。

String[0,x]
左がインデックス番号で、右が文字数。

計算の順番

a=1
b=5
puts a+b > 9 ? "Fin" : a+b

で10以上の時はFinと表示するもしくは、10未満の時は
aとbの合計結果を出したいとする

その際に、毎回a+bって書くのが嫌ので
これを一行に纏めようとした。

a=1
b=5
puts result = a+b > 9 ? "Fin" : result

例えば、上記のように書くと、結果は空になる。
計算の順番的に代入は後になっているものと思われる。
そこで以下のように書けば、ちゃんと合計結果が出る

a=1
b=5
puts (result = a+b) > 9 ? "Fin" : result

正直な所、競技プログラミング以外でこのように一行で書く意味はあまりないと思うが
やり方として覚えておくとよいと思う。

重複の削除の仕方

処理速度の問題は置いておくとして
結果だけ見れば配列の重複したものを削除したい場合
s="testcase".to_a
s.uniq と s | [] と s|s
は全部同じ結果になる

[n..m]と[n...m]の違い

[n..m]
ピリオド二つの奴は、n番目からm番目という意味

[n...m]
ピリオド三つの奴は、n番目からm-1番目という意味。つまり、m番目を含まない

[n..(m-1)]ってやるよりは見た目的には奇麗だが
見逃しが起きそうではある。

参考サイト
[] (Array)

検証してみた話。

rubyで配列のユニークな奴を取りたい場合は
array.uniq か array|[]のどちらかを使えばよいのだが
結局どちらが早いのだろうか?
と思ったので、以下の条件でテストしてみた。
・文字列は1000文字で、AからCのランダムな文字が入る
・同じ文字列を一万回重複削除し、そのタイムを取得する
・100個のタイムを取得し、最大値、最小値、平均値を求める

以下が実際に検証したコードである

valueRandom = Random.new(1024)
alphabet=("A".."Z").to_a
moji = 1000.times.map{alphabet[valueRandom.rand(3)]}

uniqTimes = []
100.times do
    stratTime = Time.now.to_r
    10000.times.map{moji|[]}
    endTime = Time.now.to_r
    uniqTimes << endTime - stratTime
end
puts "array|[]"
puts "FastTime:#{uniqTimes.min.to_f}"
puts "SlowTime:#{uniqTimes.max.to_f}"
puts "AverageTime:#{(uniqTimes.inject(:+)/100).to_f}"

uniqTimes = []
100.times do
    stratTime = Time.now.to_r
    10000.times.map{moji.uniq}
    endTime = Time.now.to_r
    uniqTimes << endTime - stratTime
end
puts "array.uniq"
puts "FastTime:#{uniqTimes.min.to_f}"
puts "SlowTime:#{uniqTimes.max.to_f}"
puts "AverageTime:#{(uniqTimes.inject(:+)/100).to_f}"


結果は以下のようになった。

array|[]
FastTime:0.525499
SlowTime:0.669585
AverageTime:0.55385082

array.uniq
FastTime:0.524965
SlowTime:0.602402
AverageTime:0.55188603

ある意味分かり切った事ではあったが
正直誤差の範囲内だと思う。

今回は、uniqの方が早いが処理順番が逆だった時は
array|[]の方が早かったのでもっと回数をこなすとまた違う結果が出るのかもしれない。

ただ、単純に重複削除をするのであれば
分かりやすいuniqが一番無難なのでは?と思った。

2019年2月8日金曜日

2019-01-30、02-01、02-07、02-08 到達点メモ


AtCoderのRubyでのB - Minesweeperのネタバレあり。


何故か2019/1/30にイスラエルから700くらいアクセスがあった。
普段10くらいしかないのに、一体何があったし・・・。
ざっと調べてみたが、何か事件があった訳ではないようだ。
VoiceTimerでググってみたが、何か特別なことがあった訳でないようだし・・・。
本当に謎だ。

Android

エミュレーターで720dpの画面のテストをしたい場合
xlargeが720dp

Node.js

ワンクリックで特定のサイト群を一括起動する機能が作りたかったので作った。
運用していくと色々やりたいことが出てきそうだが、
ひとまずはnpmのライブラリにあるopenerで十分実現できる
var opener = require ('opener');

opener ('chrome');
opener ('http://yahoo.co.jp);
opener ('http://google.com');
opener ('https://www.nononagainfo.com/');

上記の通りにやるとタブが増える感じで
起動することができる。
他のブラウザを立ち上げていると特に立ち上げたいものが多い場合だと
そっちにが立ち上がる時があるので注意。
やり方がなかなか見つからなかったから
案外難しいのかと思ったが凄く簡単だった。

参考サイト:openerを使ってnpmスクリプトからブラウザを開いてみる
参考サイト:opener
参考サイト:npm script を試す (サンプル付き忘備録)

AtCoder Ruby

B - Minesweeper
動作が上手く行かない時の検証の仕方が凄く下手だ。
今回の問題は文字列の中に含まれる"."が、0の時になることがありえるので
本来は、"#"で検索をかける前に、"."を全て0に変換する必要があるのだが
それを最初にやらなかった為、出力結果が本来加算されるべきところで加算されていなかった。

最初に変換をやっとけと言われてしまえばそれまでなのだが
そもそも変換がきちんと行われていないということに気づくのが遅すぎた。
デバッグの仕方が悪いのはわかるのだが、具体的にどう理屈をつけてやればいいんだろう?

いや、そもそもPrintデバックから卒業する時なんだと思う。
と、下のサイトを見て思いました。
printデバッグにさようなら!Ruby初心者のためのByebugチュートリアル

あと、メモとして書いておくが
事前に0の数値の配列を作っておくという手法は盲点だった。
確かにそれをやったほうが速そうではある。

rubyだと nil || "AAA" だと "AAA"が採用されるようである

具体例

puts nil || "BBB"
結果はBBB

puts "AAA" || "BBB"
結果はAAA