東北ずん子の誕生日が10月27日と言う事でしてちょうどその日が休みだったのから描き始めたんですが放送しながらぬくぬくしていたら終わらなかった…orz
途中新キャラまででてきちゃってので追加しちゃいました。
左から「漆黒のめたん、東北きりたん、東北ずん子、東北イタコ、中国うさぎ、九州そら」です
2012年11月24日土曜日
2012年11月20日火曜日
備忘:VBSのnullとemptyの違い
エラトステネスの篩でかるい配列の為にemptyとか使ってましたがそもそも空って何?という話。
まぁ空っぽいのって言う感じでしょうか。判定と状態についてです。
"" これはいわゆる空文字(日本語的におかしくなるけど)0文字数の文字列です
null これは無効な値です。(特殊な判定されがちで個人的にあんまり使いたくない)
empty これは初期化されていない変数の値です
■簡単なチェックをしましょう
多少微妙ですがこんな表になります。
・空文字は言わずもがなただ文字数が0なだけで全て文字判定です説明要らないですよね?
まぁ空っぽいのって言う感じでしょうか。判定と状態についてです。
"" これはいわゆる空文字(日本語的におかしくなるけど)0文字数の文字列です
null これは無効な値です。(特殊な判定されがちで個人的にあんまり使いたくない)
empty これは初期化されていない変数の値です
■簡単なチェックをしましょう
"" | null | empty | |
+1 | えらー | null | 1 |
*1 | えらー | null | 0 |
&"str" | "str" | "str" | "str" |
typename() | String | Null | Empty |
isnull() | false | true | false |
isempty() | false | false | true |
if 時のbool値 | えらー | false | false |
多少微妙ですがこんな表になります。
・空文字は言わずもがなただ文字数が0なだけで全て文字判定です説明要らないですよね?
・emptyについて
数値処理が来た場合0として扱われます。ゆえに+1では1を返し、*1では0となります。
文字列処理が来た場合は空文字として扱われます。
if 時のboolにおいてemptyの判定はfalseです。
if 時のboolってなんぞや?って思う人が居るかもしれませんが判定略書き字に役に立ちます。
if empty then msgbox"true" else "false"
こんな感じです。
まぁ内部でif中の判定がどんなに難しくても結果あの中で処理されるのは「0またはそれ以外の値」、「Trueまたはfalse」って事です。
それでemptyっていつ役に立つの?って話ですが初期化判定で使える事です(あまぁ当たり前だけど)。
「a=inputbox()」と処理を書いた場合にOKの場合文字数に関わらず文字列キャンセルを押した場合代入自体が行われないのです。
「if isempty(inputbox("")) then msgbox"empty" else msgbox"string"」
を試してみれば理解できるかと思います。
・nullについて
正直判定や処理が微妙です。
計算を代入などしても値はnullであり表示などではエラーします。
たとえば「a=null+1」の時点ではエラーなどはありませんがそのあとに「msgbox a」とするとエラーします。また、Cscript時に「a=null+1」後に「wsh.echo a」とした場合エラーせずに、コンソールにはnullが表示されます。
文字列処理において「msgbox null」はエラーとなり「msgbox null & ""」だと通ります。
そしてif時の判定ですが「if null then msgbox"true" else "false"」nullの判定はfalseです。
とまぁ、こんな感じです。nullは使い辛いですが逆にエラー処理とか作るときには楽しそうです。
if 時のboolってなんぞや?って思う人が居るかもしれませんが判定略書き字に役に立ちます。
if empty then msgbox"true" else "false"
こんな感じです。
まぁ内部でif中の判定がどんなに難しくても結果あの中で処理されるのは「0またはそれ以外の値」、「Trueまたはfalse」って事です。
それでemptyっていつ役に立つの?って話ですが初期化判定で使える事です(あまぁ当たり前だけど)。
「a=inputbox()」と処理を書いた場合にOKの場合文字数に関わらず文字列キャンセルを押した場合代入自体が行われないのです。
「if isempty(inputbox("")) then msgbox"empty" else msgbox"string"」
を試してみれば理解できるかと思います。
・nullについて
正直判定や処理が微妙です。
計算を代入などしても値はnullであり表示などではエラーします。
たとえば「a=null+1」の時点ではエラーなどはありませんがそのあとに「msgbox a」とするとエラーします。また、Cscript時に「a=null+1」後に「wsh.echo a」とした場合エラーせずに、コンソールにはnullが表示されます。
文字列処理において「msgbox null」はエラーとなり「msgbox null & ""」だと通ります。
そしてif時の判定ですが「if null then msgbox"true" else "false"」nullの判定はfalseです。
とまぁ、こんな感じです。nullは使い辛いですが逆にエラー処理とか作るときには楽しそうです。
素数列挙3
そろそろ絵上げないとですね。
とかいいつつ平方根的ちょちょいな方に変更。
ちなみに指定値に対する素数の数は下の通り。
秒数は下のコードじゃなく、別途篩版のです。篩は次回で。
dim n:redim n(-1)'←再配列化時の-1は値は代入できないが指定は可能非推奨だと思う多分
For i = 2 To 1000000
a = Int(i^0.5)
if a=1 then redim Preserve n(ubound(n)+1):n(ubound(n))=i
For k = 2 To a
If i Mod k = 0 Then Exit For
if k=a then redim Preserve n(ubound(n)+1):n(ubound(n))=i
Next
Next
wsh.echo join(n)
wsh.echo ubound(n)
とかいいつつ平方根的ちょちょいな方に変更。
ちなみに指定値に対する素数の数は下の通り。
秒数は下のコードじゃなく、別途篩版のです。篩は次回で。
指定値 | 素数総数 | 時間 |
10 | 4 | 0秒 |
100 | 25 | 0秒 |
1000 | 168 | 0秒 |
10000 | 1229 | 0秒 |
100000 | 9592 | 0秒 |
1000000 | 78498 | 1秒 |
10000000 | 664579 | 25秒 |
100000000 | 5761455 | 18分53秒 |
dim n:redim n(-1)'←再配列化時の-1は値は代入できないが指定は可能非推奨だと思う多分
For i = 2 To 1000000
a = Int(i^0.5)
if a=1 then redim Preserve n(ubound(n)+1):n(ubound(n))=i
For k = 2 To a
If i Mod k = 0 Then Exit For
if k=a then redim Preserve n(ubound(n)+1):n(ubound(n))=i
Next
Next
wsh.echo join(n)
wsh.echo ubound(n)
2012年11月19日月曜日
素数列挙2
さて、前回よりましな処理にしましょう。
素数は3以降「6n±1」の範囲にしか存在しないことを利用します。
・・・と言ってもそもそも「6n±1」が範囲にあるの?って話ですね。
簡単に説明すると
6n±4 は 常に2の倍数
6n±3 は 常に3の倍数
6n±2 は 常に2の倍数
素数は3以降「6n±1」の範囲にしか存在しないことを利用します。
・・・と言ってもそもそも「6n±1」が範囲にあるの?って話ですね。
簡単に説明すると
6n±4 は 常に2の倍数
6n±3 は 常に3の倍数
6n±1 は 常に奇数で3以降の全ての素数を「含み」ます。
こんな感じです。2と3の倍数を全て除外してステップするので2と3は事前に素数として登録します。
(まぁ、考え方的には素数は「6n+1」と「6n+5」なんですが、5は詰まり6より一つ小さい数なので「6n+5」→「6n-1」となり結果「6n±1」に集約されます)
処理内容は:
'#2と3は事前登録。
'#素数は常に「6n±1」の為、開始値6で6ずつ加算ループ(2と3の倍数永久除外)
'# 「-1と+1の割り切れないフラグ」をtrue
'# 登録済素数で割り算ループ
'# 値-1割れたら「-1割り切れないフラグ」false
'# 値+1割れたら「+1割り切れないフラグ」false
'# 「-1と+1の割り切れないフラグ」がfalseなら抜ける
'# 最終値でかつ「-1割り切れないフラグ」trueなら素数登録
'# 最終値でかつ「+1割り切れないフラグ」trueなら素数登録
dim n:redim n(1):n(0)=2:n(1)=3
for i=6 to 10000 step 6
mf=1:pf=1
for j=0 to ubound(n)
if mf then mf=(i-1) mod n(j)
if pf then pf=(i+1) mod n(j)
if mf+pf=0 then exit for
if j=ubound(n) then
if mf then redim Preserve n(ubound(n)+1):n(ubound(n))=i-1
if pf then redim Preserve n(ubound(n)+1):n(ubound(n))=i+1
end if
next
next
wsh.echo join(n)
mf=1:pf=1
for j=0 to ubound(n)
if mf then mf=(i-1) mod n(j)
if pf then pf=(i+1) mod n(j)
if mf+pf=0 then exit for
if j=ubound(n) then
if mf then redim Preserve n(ubound(n)+1):n(ubound(n))=i-1
if pf then redim Preserve n(ubound(n)+1):n(ubound(n))=i+1
end if
next
next
wsh.echo join(n)
2012年11月17日土曜日
素数列挙
ちょっと話に上がったので
「素数とは1以外の数で1と自分自身しか約数がない整数」
なので一番安直な方法は2より後の数で其処までに現れる素数で試し割りしていく方法である。
処理内容は:
'#2は事前登録。
'#素数は常に「奇数」の為、開始値3で2ずつ加算ループ(2の倍数永久除外)
'# 登録済素数で割り算ループ
'# 割れたら抜ける、登録済み素数で最後まで割れなかったら素数として登録
dim n:redim n(0):n(0)=2
for i=3 to 10000 step 2
for j=0 to ubound(n)
if i mod n(j)=0 then exit for else:if j=ubound(n) then redim Preserve n(ubound(n)+1):n(ubound(n))=i
next
next
wsh.echo join(n)
「素数とは1以外の数で1と自分自身しか約数がない整数」
なので一番安直な方法は2より後の数で其処までに現れる素数で試し割りしていく方法である。
処理内容は:
'#2は事前登録。
'#素数は常に「奇数」の為、開始値3で2ずつ加算ループ(2の倍数永久除外)
'# 登録済素数で割り算ループ
'# 割れたら抜ける、登録済み素数で最後まで割れなかったら素数として登録
for i=3 to 10000 step 2
for j=0 to ubound(n)
if i mod n(j)=0 then exit for else:if j=ubound(n) then redim Preserve n(ubound(n)+1):n(ubound(n))=i
next
next
wsh.echo join(n)
2012年11月16日金曜日
再起動的な感じで
うーんブログサービスも辛くなってるんでしょうかね。
ブログ自体は結構長いんですが結果的に移転を繰り返す形になってしまったので古い記事はバックアップのローカル分しかないですね。まぁいまさら古い記事をインポートしたりはしませんが。
最初のブログサービス変更により終了
二つ目のブログ(システムとサービス名が変更されただけ)サービス終了
三つ目のブログ急遽ログイン期間関係なく大き目の画像広告が・・・ぐぬぬ・・・
四つ目のブログ広告ありません!のあのブログだったんですが・・それが売りだったはずだったんですが・・・なぜかどうしてかよくわからないけど急遽サービス内容が変わり広告が付くように・・・
と、言うわけで五つ目のブログになりますがよろしくお願いします。
ブログ自体は結構長いんですが結果的に移転を繰り返す形になってしまったので古い記事はバックアップのローカル分しかないですね。まぁいまさら古い記事をインポートしたりはしませんが。
最初のブログサービス変更により終了
二つ目のブログ(システムとサービス名が変更されただけ)サービス終了
三つ目のブログ急遽ログイン期間関係なく大き目の画像広告が・・・ぐぬぬ・・・
四つ目のブログ広告ありません!のあのブログだったんですが・・それが売りだったはずだったんですが・・・なぜかどうしてかよくわからないけど急遽サービス内容が変わり広告が付くように・・・
と、言うわけで五つ目のブログになりますがよろしくお願いします。
登録:
投稿 (Atom)