Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2018/01/31 (水)

なでしこ3のANDやORがおかしい気がする件

| 16:26 | なでしこ3のANDやORがおかしい気がする件 - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - なでしこ3のANDやORがおかしい気がする件 - 雪乃☆雫のなでしこ日和 なでしこ3のANDやORがおかしい気がする件 - 雪乃☆雫のなでしこ日和 のブックマークコメント

~~~~~~~~~~~~~~~~~~~~~~~~~~

※ v3.0.21にて修正されました!(2/5追記)

 素早い対応に感謝ですね(≧▽≦)

~~~~~~~~~~~~~~~~~~~~~~~~~~


 マイナビ連載20目は、16進数とか2進数とかのことでした。

 この記事を、もっともっとムカシに読みたかったね。

 いや・・・タブン、それっぽいコトは見聞きしたハズなんだけどねえ・・・

 まったく理解しなかったとゆうか、なんとゆうか?(バカ;)

 10進法の暮らしに馴染んでいると、1000より1024のがキリがいいとか、ゆってる意味が分かりませんよね?!?!

 ちなみに、2進法を使えば、両手の指10本で1023まで数えることが可能なんですが・・・確実に指をつります(´д`;


 だけど、あいにく(?)わりと最近(!)ひらめいたんだよねぇ~w

 して、2進数にしてうーむと眺めれば、前々の数当てカードの手品

https://nadesiko.g.hatena.ne.jp/snowdrops89/20180102/1514902515

 が、一体どうゆう理屈で出来るのかも、ちょっと前に学んだ論理和

https://nadesiko.g.hatena.ne.jp/snowdrops89/20170331/1490975484

 で、APIのパラメーターを複数設定することの意味とかも、なんとなく見えてくる。

 こっ、コレが、こんぴゅうたぁのキモチが分かってくるってコトなんですかね(*^-^*)ポ


 ・・・それでねえ、ちょこっと数当てカードをなでしこ3で作ってみようと思ったら・・・できなかったんですぅ~。

 数当て表を作る部分だけなので、配列の書き方のルールなんかが色々変わってるからアレですけど、すぐ出来る予定だったんですけどね。

 なんか・・・なでしこ3のANDが、おかしくないですか???

 AND論理です。

 まえに論理和を学んだ時にはクラクラとめまいがしてたもんだけど、もう大丈夫(たっ、タブン…;)

 これはもう、ようするに、

全部1だった時だけ、1。

それ以外はみんな、0。

 ・・・てだけのコトです。

 この計算は、もちろん二進数でとりおこなわれます。コンピューターなんで!


 とゆうわけで、このルールに則って「1AND2」を縦計すると、こうゆうことになります。

    0000 0001
AND 0000 0010
--------------
    0000 0000

 両方1の部分がないから、0になります。

 「4AND5」だったら・・・

    0000 0100
AND 0000 0101
--------------
    0000 0100

 答えは4になりますぅ~。

 コレで、考え方はあってると思うんだけど・・・


 さて、これをなでしこで計算します。

AND(1,2)を表示AND(4,5)を表示

 あんまり、なでしこのプログラムっぽくない!w

 それはさておき、これをなでしこ1で実行すると、ちゃんと0と4が母艦表示されるんですが・・・

 なでしこ3の簡易エディタでは・・・なななんと、2と5になってしまうのですよーっ。

 なんでだ・・・(?_?;

 よくわかんないけど、v1非互換ともなっていないのに、なでしこ1となでしこ3とで答えが違ってしまうってゆうのは・・・


 ちなみに、ORもおかしくないかな。

OR(1,4)を表示

 が、1になってしまうんです。

 XORについてはまだ学んでないので検証してませんが・・(しろよ;)


 いつもいつもぼやいてばっかでスミマセン;

 でも、とてもとても応援してます!(>_<)/

通りすがり通りすがり2018/01/31 22:33ANDやORはビット演算子としての側面と、BOOL代数(真理値)としての側面があるため、ややこしい感じに。

javascriptでは、
|と||や、&と&&のように使い分けられるのですが、なでしこは1のころからこの辺が混在したままで結局使うのが難しい機能になっています。
(どちらかのみでは、意図しないことになります)

ビット演算子としては、書かれている通りです。
14&7は、6になります。
14|7は、15です。

もう一方、BOOL(ビット単位ではなく、値そのものがtrueとfalseのあれ)真と偽としては、以下のようになります。

or演算子
左辺を評価し真(非0)ならその値を返す。左辺が偽(0)ならば右辺も評価しその値を返す。左辺が真の阿合は右辺は評価されません。
0||2||3は、2なります(3は評価されません)
14||7は14です。

and演算子
左辺を評価し偽(0)ならあその値を返す。左辺が真(非0)ならば右辺も評価しその値を返す。左辺が偽の場合は右辺は評価されません。
0&&2&&3は、0です(2,3は評価されません)
1&&2&&3&&4が、4です(1,2,3,4のすべてが評価されます)
14&&7は7です。

という感じと記憶してますがいかがでしょうか。

雪乃☆雫雪乃☆雫2018/02/01 06:46・・・ナナナなんて?(*_*;
またまたなんだかよくワカンナイかんじに~(@_@)
これはもう・・・脳がフリーズしちゃうヤツだ><

しかし・・・つまり、ANDとORには実は2種類あって、おかしくはなってないんだけど、なでしこ1となでしこ3とでは、さりげなーく仕様が変わってしまった・・・というコトなのでしょうか。

あああ・・・そして、なるほど。
AND(1,2)とAND(2,1)の結果が、なでしこ3の場合違ってしまうのもナゾだと思っていましたが、こうゆうことだったのですね!

なんかもう本当に、いつもいつもありがとうございます!!!

通りすがり通りすがり2018/02/02 20:30なでしこ3ならばjavascriptベースで、javascriptには個別の演算子があるのになぁ ということで、少しひらめきました。

ABCは14
DEFは7
「{ABC}|{DEF}」をJS実行を表示
「{ABC}&{DEF}」をJS実行を表示
「{ABC}^{DEF}」をJS実行を表示
BWORは『(function(){return function(){var i=1,r=arguments[0];while(i<arguments.length-1){r|=arguments[i++];}return r;}})()』をJS実行
BWANDは『(function(){return function(){var i=1,r=arguments[0];while(i<arguments.length-1){r&=arguments[i++];}return r;}})()』をJS実行
BWXORは『(function(){return function(){var i=1,r=arguments[0];while(i<arguments.length-1){r^=arguments[i++];}return r;}})()』をJS実行
BWOR(ABC,DEF)を表示
BWAND(ABC,DEF)を表示
BWXOR(ABC,DEF)を表示

なでしこ1で似たことをするとしたら、Luaの利用でしょうか。

雪乃☆雫雪乃☆雫2018/02/04 19:58JS実行!
なんと、これを使えば、Javascriptで出来ることはだいたい、なでしこで出来ちゃうということなんですね!
といっても、Javascript部分はマッタク分かりませんが;
でも、これをこのまま使わせてもらって、上手いことできそう。
対応して頂けそうな感じにもなってますが、
https://github.com/kujirahand/nadesiko3/issues/260
バージョンアップまではコレですね。
ありがとうございます☆

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20180131

2018/01/17 (水)

ジャンケンマンってこんな画面だっけ?

| 15:25 | ジャンケンマンってこんな画面だっけ? - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - ジャンケンマンってこんな画面だっけ? - 雪乃☆雫のなでしこ日和 ジャンケンマンってこんな画面だっけ? - 雪乃☆雫のなでしこ日和 のブックマークコメント

 の後ちょこっと画像検索してみた結果によると、ワタシの知ってるジャンケンマンは、newジャンケンマンという、二代目の機種だったっぽいです。

 でっ・・・

 こんな感じ・・・デスかねえ?

http://www.geocities.jp/snowdrops890/wnako3_test/12_gamen.html

 画面だけですw

 なでしこではほとんどナニもしないのでコードも載せません。

 CSS・・・具合わるくなる!(爆)

 こんなことなら、全部なでしこで、canvasに描画した方が楽な気もするけど、まだなでしこ3では、角丸四角が出来ないしね~。(なるべく画像を使わずに、それっぽく再現したいとゆう方針)

 しかも、「<!DOCTYPE html>」を付けたら、いきなり表示が崩れました。

 HTMLの中で、個別にTOPとかLEFTの位置を指定していたのがダメだったんですね。

 HTML5的には、そうゆうことは一切HTML中に書いてくれるなと、ちゃんとCSSにすれとゆうことラシイです。しくしくしくしく。 ←単位のpxが抜けてたせいだったっぽい!

 あとは、機械側のジャンケンの手だけど、黒地に赤ランプで表示しているだけのものだから、なでしこで描画も出来そうに思いますが・・・モノスゴクめんどくさいヽ(;´Д`)ノ

 諦めて画像にしようか考え中www

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20180117

2018/01/02 (火)

ナコ様の透視術

| 23:15 | ナコ様の透視術 - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - ナコ様の透視術 - 雪乃☆雫のなでしこ日和 ナコ様の透視術 - 雪乃☆雫のなでしこ日和 のブックマークコメント

 あけましておめでとうございます。

 12月中は、ほとんどなにもしないでいるうちに年が明け、ふと気が付いたらなでしこ3がバージョンアップしていたよ!

 んな中、なでしこ1のプログラム(笑)


 吹出作成と吹出セリフ表示は、前にスクリーンセーバーの時に作ったものなので(https://nadesiko.g.hatena.ne.jp/snowdrops89/20161107/1478528925)、は、数当てカードを作っただけ。

 数当てカードは、相手が心の中で思った数を当てるという古典的な有名なマジックで、カードの最初の数を足していくだけの誰にでも出来るカンタンなものなんだけど、暗算能力が無いワタシはまったくスマートに出来ないんですね;

 して、なんでこんなことが可能なのかについては、わりと最近理解しました;;;

 全ての整数は、重複しないいくつかの2の累乗の和で表すことができる、とゆうことになってる・・・ラシイ。(結局んなに理解してない?!)

 ようするに二進数なんだけど、なんでこんなりくどい言い方しなきゃならんのか><;

 とっ、とにかく、ようく分かったのは、昔は一生懸命書き写したりしていたカードですが、実はプログラムで一瞬で作るコトの出来るシロモノだった・・・ということで、ついでにナコ様に実演してもらうようにしたものです。


 ナコさまのセリフを読んだら、吹き出しをクリックして進めて下さい。

 カードの選択は、慎重かつ正直に。

 ナコさまは違えませんので、もし、結果が思っていた数と違ったら、それはアナタが違ってるのですwww

#ナコ様の透視術
#-----------------------------------------------------------
!母艦設計=「母艦の可視はオフ母艦のタイトルは「ナコ様の透視術」

#------------------------------------------------------------
科白色=$EEBBCC
#------------------------------------------------------------

#なこ様
ナコ様とはなこ。
これについて
  可視はオフ。
  X=ナコ様の幅。//デスクトップワークエリアW-ナコ様の幅。
  Y=デスクトップワークエリアH-ナコ様の高さ。
  マウス押した時は~
    吹出の可視はオフ。吹出右の可視はオフ。
  マウス離した時は~
    もし、Y-吹出の高さ+50<0ならば、Y=吹出の高さ-50-20。
    もし、Y+ナコ様の高さ>デスクトップワークエリアHならば、Y=デスクトップワークエリアH-ナコ様の高さ
    もし、X-吹出の幅<0ならば、
      もし、X<0ならば、X=0。
      吹出右の位置=「{ナコ様のX+ナコ様の幅-80},{ナコ様のY-吹出右の高さ+50}」
      もし、吹出方向=「右上」でなければ、吹出方向は「右上」。
    違えばもし、X+ナコ様の幅*2>デスクトップワークエリアWならば、
      X=デスクトップワークエリアW-ナコ様の幅*2
      吹出の位置=「{ナコ様のX-吹出の幅},{ナコ様のY-吹出の高さ+50}」
      もし、吹出方向=「左上」でなければ、吹出方向は「左上」。
    違えば、
      吹出の位置=「{ナコ様のX-吹出の幅},{ナコ様のY-吹出の高さ+50}」
      もし、吹出方向=「左上」でなければ、吹出方向は「左上」。
    もし、吹出表示状態=オンならば、
      吹出方向で条件分岐
        左上ならば、吹出の可視はオン。
        右上ならば、吹出右の可視はオン。
    母艦位置設定。
  ダブルクリックした時は~終わる。

#なこ様吹出
C=0。クリック待ちフラグ=オフ。
吹出とはフォームこれについて
  可視はオフ。ドラッグ移動オフ。
  クリックした時は~
    もし、クリック待ちフラグ=オンならば、
      クリック待ちフラグ=オフ。
      「{シナリオ¥C}」をナデシコする。。
      C=C+1。
      クリック待ちフラグ=オン。

吹出右とはフォームこれについて
  可視はオフ。ドラッグ移動オフ。
  クリックした時は~
    もし、クリック待ちフラグ=オンならば、
      クリック待ちフラグ=オフ。
      「{シナリオ¥C}」をナデシコする。。
      C=C+1。
      クリック待ちフラグ=オン。

#カードの表示位置(ダイアログ)は母艦の中央になる。
*母艦位置設定
  母艦のX=ナコ様のX+120。母艦のY=ナコ様のY-30。
  母艦の幅=ナコ様の幅。母艦の高さ=ナコ様の高さ。
#-----------------------------------------------------------
シナリオ=「科白を喋る。
科白非表示。数当カード。
終わる」
#------------------------------------------------------------
#メインルーチン
文字サイズは12。
塗り色は科白色。
吹出方向は「右上」
母艦位置設定。
ダイアログ詳細=「文字サイズ=12」

ナコ様の可視はオン。
数当表作成。
「心の中で1~60のの数字を思い浮かべて、
ボクには見えないようにメモって置いてね。{改行}
準備が出来たら、はじめるよ!」と喋る。
クリック待ちフラグ=オン。

科白=「では、これから六枚のカードを、お見せします。
の中に、あなたの思った数字があれば{カッコ}はい{カッコ閉じ}を、
なければ{カッコ}いいえ{カッコ閉じ}のボタンを押して下さい。」

*数当表作成
  数当表=。
  60
    数=回数。
    6
      もしAND(数,(2の(回数-1)乗))=0でなければ、数当表¥(回数-1)に数を一行追加。

*数当カード
  答=0
  6
    ダイアログタイトル=「数当てカード {回数}枚目」
    (回数-1)のカード表示。
    もしそれはいならば、答=答+(2の(回数-1)乗)
  「むむ、読めました!{~}あなたが心に描いた数字は…{~}  {答}  ですね?」と喋る。

*カード表示(Aの)
  カード=。
  数当表¥Aを配列数値ソート。
  30
    もしそれ¥(回数-1)<10ならば、数=「 {それ¥(回数-1)}」
    違えば、数=「{それ¥(回数-1)}」
    もし、(回数-1)%5=4ならば、カード=「{カード}{数}{改行}」
    違えば、カード=「{カード}{数} 」
  カードで二択。
#-----------------------------------------------------------
*喋る({文字列=「」}AでSと|Sを)
  科白種別はA。
  吹出方向で条件分岐
    「左上」ならば、
      吹出にSを「左上」へ200,100で吹出セリフ表示。
      吹出の位置=「{ナコ様のX-吹出の幅},{ナコ様のY-吹出の高さ+50}」
      吹出の可視はオン。
      吹出右にSを「右上」へ200,100で吹出セリフ表示。
    「右上」ならば、
      吹出右にSを「右上」へ200,100で吹出セリフ表示。
      吹出右の位置=「{ナコ様のX+ナコ様の幅-80},{ナコ様のY-吹出右の高さ+50}」
      吹出右の可視はオン。
      吹出にSを「左上」へ200,100で吹出セリフ表示。
  吹出表示状態=オン。

*科白非表示
  吹出の可視はオフ。吹出右の可視はオフ。吹出表示状態=オフ。
#------------------------------------------------------------
●吹出作成({グループ=?}FをW,Hで方向へ)
  xx=0。yy=0。ww=0。hh=0。
  方向で条件分岐
    右上ならば、  #矢印は左下
      Fのポケットは「右上」
      x1=0。y1=H。x2=W/8。y2=H/4*3。x3=W/4。y3=H/8*7。
    右下ならば、  #矢印は左上
      Fのポケットは「右下」
      x1=0。y1=0。x2=W/4。y2=H/8。x3=W/8。y3=H/4。
    左上ならば、  #矢印は右下(吹出し変形と同じ)
      Fのポケットは「左上」
      x1=W。y1=H。x2=W/4*3。y2=H/8*7。x3=W/8*7。y3=H/4*3。
    左下ならば、  #矢印は右上
      Fのポケットは「左下」
      x1=W。y1=0。x2=W/4*3。y2=H/8。x3=W/8*7。y3=H/4。
    上ならば、  #矢印は下向き
      hh=H/10。Fのポケットは「上」
      x1=W/2。y1=H+hh。x2=W/2-W/20。y2=H-H/100。x3=W/2+W/20。y3=H-H/100。
    下ならば、  #矢印は上向き
      hh=H/10。yy=hh。Fのポケットは「下」
      x1=W/2。y1=0。x2=W/2-W/20。y2=hh+H/100。x3=W/2+W/20。y3=hh+H/100。
    左ならば、  #矢印は右向き
      ww=W/10。Fのポケットは「左」
      x1=W+ww。y1=H/2。x2=W-W/100。y2=H/2-H/20。x3=W-W/100。y3=H/2+H/20。
    右ならば、  #矢印は左向き
      ww=W/10。xx=ww。Fのポケットは「右」
      x1=0。y1=H/2。x2=ww+W/100。y2=H/2-H/20。x3=ww+W/100。y3=H/2+H/20。
  Fの可視はオフ。
  FのクライアントWはW+ww。FのクライアントHはH+hh。
  Fを$00FF00で画面クリア。
  線スタイルは透明。
  Fのxx,yyからxx+W,yy+Hへ。1秒待つ。
  Fの「{x1},{y1},{x2},{y2},{x3},{y3}」へ多角形。
  F→画像通り変形。
//  Fの可視はオン。

●吹出セリフ表示({グループ=?}FにSを{整数=100}minW,{整数=50}minHで{文字列=「」}方向へ)
  Aとは文字列=「」。Bとは文字列=「」。
  Sで反復
    Bはそれ。
    もし(Aの文字数)<(Bの文字数)ならば、A=B。
  swとは整数=Aの文字幅取得shとは整数=(Sの文字高さ取得)*(Sの要素数)
  fwとは整数=(Aの文字幅取得)*1.5。fhとは整数=(Sの文字高さ取得)*(Sの要素数)*1.8
  もしfw<minWならばfw=minW。
  もし、fh<minHならば、fh=minH。
  sxとは整数fw/2-sw/2-10
  syとは整数=fh/2-sh/2
  もし、方向=ならば、方向=F→ポケット。
  もし、方向=ならば、方向=左上。
  もし、方向=右ならば、sx=sx+fw/10  #矢印の長さ分
  もし、方向=下ならば、sy=sy+fh/10
  Fをfw,fhで方向へ吹出作成。
  Fのsx,syへSを文字表示。
#------------------------------------------------------------
トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20180102