約 1,636,817 件
https://w.atwiki.jp/abwiki/pages/297.html
名称 |Pset 読み |ぽせっと 定義 |Pset(x,y) [,color] 説明 |点を打つ。#N88BASICの時にのみ有効。 x,yにcolor色の点を打つ。 参照 |
https://w.atwiki.jp/thehunter/pages/23.html
ミッション Doc Spot a Mule deer 説明 Spot a Mule deer Mule deer をspot しろ 目的 Spot a Mule Deer 名前 コメント
https://w.atwiki.jp/c21coterie/pages/589.html
問い171 正の整数nについて、f(n)を各桁の数字(10進数)の平方の和と定義する。例えば、 f(3) = 3^2 = 9, f(25) = 2^2 + 5^2 = 4 + 25 = 29, f(442) = 4^2 + 4^2 + 2^2 = 16 + 16 + 4 = 36 0 n 10^20について、f(n)が平方数となるようなnの和の末尾9桁を求めよ。 f(n)が平方数となる数の個数なら簡単にもとまるんだけどな、、 ひと工夫必要だな。 と思ったら色々試行錯誤した結果1時間ほどで正答。 意外と簡単なコードになった。 1時間、かかり過ぎなのでもっと精進せねばなるまい。 memoは組み合わせ数の動的計画法、sumsは和の合計値の動的計画法。 memo[各桁の2乗の和]=となるのが何通りか、sums[各桁の2乗の和]=合計がいくつか,。 この問題正答者だけが見れる掲示板で見たらPythonで何か恐ろしいコードをあげている人がいた。 29とか41とか意味不明なマジックナンバーを使って問題を解いている。 ああいうのをハッカーというのだろう。 あれから見たら私のコードなんか子供じみた発想のお坊ちゃんコードだな。 その代わり私のコードは教科書通りで丁寧なつもり。 #include stdio.h #include string.h #include iostream const int up=2000; int main(){ __int64 memo[up+2],sums[up+2],base=1000000000,mul=0,t2; int t; memset(memo,0,sizeof(memo)); memset(sums,0,sizeof(sums)); memo[0]=1;//20桁について動的計画法で解く for(int i=0;i 20;i++){ if(i==11)mul=base;//sumsによる動的計画法の解禁 mul/=10; //std cout i " " mul "\n"; for(int num=up;num =0;num--){ for(int k=9;k =1;k--){ t=k*k; if(t+num up)continue; t2=((mul*(k*memo[num])%base)%base+sums[num])%base; memo[t+num]=(memo[t+num]+memo[num])%base; sums[t+num]=(sums[t+num]+t2)%base; } } } __int64 ans=0; for(int i=1;i*i =up;i++){ ans=(ans+sums[i*i])%base; } std cout ans "\n"; } 問い172 saiki関数で18桁で使う各数字の個数を決めたら、deep==ketaでその数字の配置個数を計算するだけです。 内容的には高校数学の延長ですね。 #include stdio.h #include string.h #include iostream const int keta=18; int count[10]={0}; __int64 ans=0; __int64 nCr(int n,int r){ __int64 re=1; for(int i=0;i r;i++){ re*=(n-i); } for(int i=1;i =r;i++){ re/=i; } return re; } void saiki(int deep,int p){ if(deep==keta){ //0を先頭以外の17か所に配置する __int64 a=nCr(17,count[0]); int b=18-count[0]; //残りの数字の配置を計算する for(int i=1;i 10;i++){ a*=nCr(b,count[i]); b-=count[i]; } ans+=a; }else{ for(int i=p;i 10;i++){ if(count[i] 3){ count[i]++; saiki(deep+1,i); count[i]--; } } } } int main(){ saiki(0,0); std cout ans; } 問い173 http //odz.sakura.ne.jp/projecteuler/index.php?cmd=read page=Problem%20173 解法 サイズnの正方形の真中に穴をあけた場合の計算式n^2-(n-2)^2 =100万を満たす範囲がnの最大値となるのでこれを計算して後は2乗した数をmapに入れておくだけです。 メモリをぜいたくに使ったこの一品。 贅沢に使いすぎてるかもしれませんがそのかわりコードがシンプルになってます。 n=3から真中の穴の範囲を広げていけばメモリ使用量を抑えられる気もしますが少しコードが複雑になります。 #include stdio.h #include map #include iostream #include time.h int main(){ __int64 tile=1000*1000; __int64 limit=tile/4+1; __int64 S,ans=0,herf; std map __int64,int sqrtTable; for(__int64 i=0;i =limit-2;i++){ sqrtTable[i*i]=i; } for(__int64 i=3;i =limit;i++){ S=i*i-tile; int k=(*sqrtTable.lower_bound(S)).second; k=k==0?(i-1)/2 (i-k)/2; ans+=k; } std cout ans; } 問い178 45656を考えよう. 連続する2桁の数は全て差の絶対値が 1 である. 連続する2桁の数の差の絶対値が全て 1 である数をステップ数と呼ぶ. Pandigital数では0から9の各数が少なくとも 1 回出現する. 10^40未満の数でPandigital数かつステップ数であるものの数を答えよ. この問題も動的計画法でいいと思うけど3次元なのですこし処理がめんどくさい。 2次元だと紙にかいて確認できるから楽でいいなと思う次第。 まあ3次元といっても動的計画法の実質各ターンは2次元みたいなものか。 #include stdio.h #include iostream #include string.h //memo[i桁目][出た数字の数][先頭桁の数字]少し多めに確保してるのは私の癖です __int64 memo[42][1026][11]; int main(){ memset(memo,0,sizeof(memo)); for(int i=0;i 10;i++)memo[1][(1 i)][i]=1;//一ケタ目の設定 __int64 ans=0; for(int k=1;k 40;k++){ //桁数 for(int p=0;p 1024;p++){ //出た数字の組み合わせ for(int i=0;i 10;i++){ //手前の数 if(0 i){ memo[k+1][p|(1 (i-1))][i-1]+=memo[k][p][i]; } if(i 9){ memo[k+1][p|(1 (i+1))][i+1]+=memo[k][p][i]; } } } for(int i=1;i 10;i++){ ans+=memo[k+1][1023][i]; } } std cout ans; } 問い179 n と n + 1 の正の約数の数が同じになる 1 n 107 の整数は幾つあるか。 例として, 14 の正の約数は 1, 2, 7, 14 であり, 15 の正の約数は 1, 3, 5, 15 である. うーん愚直に求めてみたけどもっと賢い方法がありそう、、、 #include stdio.h #include math.h int calc(int n){ int k=sqrt(n); int p=1; while(n%2==0){ n/=2; p++; } for(int i=3;i =k;i+=2){ int r=1; while(n%i==0){ n/=i; r++; } p*=r; } if(n!=1)p*=2; return p; } int main(){ int old=0,now,ans=0; for(int i=2;i 10000001;i++){ now=calc(i); if(old==now){ printf("%d %d\n",i,now); ans++; } old=now; } printf("%d",ans); }
https://w.atwiki.jp/ssdmset2/pages/112.html
採用する幕間SS これまでの、これからのすべて 第8試合SSその1 雲の海 波の国の名 詠みの国 千切るには 末永すぎて 【目次】 一:五〇〇〇億(Half Trillion)の雲(Cloud)は 二:紡ぎ車(Wheel)の鼠(Mouse) 三:寝子の夢(Sleeping Beauty) 四:目覚めには丁度がいい(Trillion) 一:ハーフ・トリリオンのクラウドは ≪Requiescat in Pace(安らかに眠れ)≫ “あなた”はここにいる。ここは夢と現の境目、辻には通り悪魔が棲み憑いて交差路に事故を招く。 そんな危険地帯で、あなたはここ下水処理場を歩いている。 下水処理場と一言に述べても大多数の人類は行ったこともない場所であると思うのであなたと共に歩きながら説明していこうと思う。脇目に沈殿槽を見れば、黄色く淀んだ水の中に白、灰色に赤みを帯びた塊が幾層にも幾重にもなって積み重なっていることがわかる。 硝子(ガラス)質の水槽を叩いてみれば、水族館よりずっと厚い。 水族館とは言いえて妙だと思う。きっと、老若男女を問わず水族館に行ったことのない人間はいないだろうから。ゆうらりゆらり、海月(くらげ)に似て死んだプディングを見て君は顔をしかめるのだろう。 病院で嗅いだ消毒液の臭いが溝(どぶ)のそれと混じり合う。鼻腔の奥に鎮座する悪魔がこんな悪臭をと言えばわかりやすいだろう。 あなたが魔人であってもそうでなくてもこれを叩き割るのは無理そうだ。それ以前に、唐突に飛ばされて右往左往していたら見学客と間違われ、案内役として職員らしき女性が宛(あて)がわれたのだから仕方がない。 もちろん彼女を無視して邪魔だと振り払うことはたやすいけれど。 “あなた”はそんな人ではないでしょう? 夢幸(ゆめさき)と名乗ったその女性は歳若く、橘色の寝間着(パジャマ)を着ていた。 歳は二十には届かないか、十代も半ばなそのくらい。頭には押し付けられたようなナイトキャップ、隠しきれない黒髪が肩の辺りにまでこぼれていた。瞳の色は――閉じているのでわからない。 「マンホール のぞいたよ 地下の雲梯(うんてい) 掴めずに 奈落を見たよ」 目蓋(マンホール)を開けて閉じて、辿っていった先にあったのは下水処理場だった。歌いながら落ちていくことに疑問を抱かないのは寝ぼけているからに他ならない。 「短歌は五七五七七というわずか三十一字の中で世界を表現する“魔法”ですよーzzz……」 夢の中にふさわしく、眠りながらの登場であった。寝言という以外に表現する方法が無いのだが、夢に遊ぶ病だとしてもこれが夢の中なら単に仕事中に遊ぶ不真面目な職員で片付けられるのかもしれない。 「殿下は奥の奥、そこでお待ちですよーzzz……」 あなたは夢に遊ぶ案内人に従って歩みを続けるほかない。 仔獏がどこかで哂った気がした。水中に浮かぶ雲もまた、煙に似ている。餌にはうってつけなのかもしれない。 二:紡ぎ車の鼠(寝ず見)(マウス・ホイール) 扉を開けるとそこは一面が真新しい畳で舗装された趣味のいい一室であった。 ただし、その中央は一本の巨木によって畳をぶち抜かれ、まるで天蓋を垂らすかのように木陰を作っていた。あなたはそこに絵に描いたような美少女を目撃する。 まるで――彼女のためにこしらえたように(事実そうなのだが)清潔で、ここだけは清涼な風が吹き抜けていくその感覚。 やや丸みを帯びてそれでいてほっそりとした指先は日に焼けない。陽を透かす肌色のかんばせに添え、残る半身は文机(ふづくえ)に預けながらほそやかに、ひそやかに、しとやかに寝息を立てている。 もし、その薄い、薄い――まるで紙のような胸板を上下する運動を見逃していなければ、眠ったままに時を止めていたものと早合点してしまっただろう。 ≪死んでません≫ 即興詩人(アンデルセン)に倣(なら)った注意書き。死後は歌葬に処せられるなら尚更外せない。髪に書かれたメモを枕に噛ませて彼女は眠る。生きている限り、紙色の髪の明滅がやむことはない。 それでも――まばたきの音さえ幻聴する静寂の中で殊更に開け閉めする。実は寝たふりをしていたのだろうか、ああ目覚めた。伸びをひとつ、ふたつ。打って変わって活発になると、いつ頃の前だろうか巨大なパソコンを正面に向き直ると作業を始めた。 銀色(Silver)のキーボード(Keyboard)を熱心に叩き、モニターを睨んで黒いマウスがちょこまか動き回る。女王(にょおう)の掌に収まるまで幾度もどす黒い金の流れに晒されて黒く染め上がったドブネズミめが何とする。 ここは夢の国、電気が行列(エレクトリカル・パレード)を走らせる。静電気で逆立つ髪が頭から胸、腹、下腹の秘所、両の手足にかかっている。幾つもの歌が髪を通して見て取れた。 銀河を統べる帝国の皇女のために並べ立てられた祭典を小さな窓(Windows)越しに覗いていた。 それはひとつに夢の戦いの記録であり、もうひとつにさらなる夢の戦いの記憶である。 クリック? クラック! 姫衣裳の一部となった四次元振袖を軽く揺する。ころりと小さなマッチ箱が転び出る。 気付いただろうか箱の側面には『夢のマッチ棒(Dream Match)』と書いてあった。プリンターから吐き出される紙の束をくるくると丸めて火を付けようとしたところでふと気付(き・づ)く。 今の今まで慌てたしぐさも打って変わって落ち着こうとするやり方も実にわざとらしく口を開く。 「いざと聞け 黄泉(詠み)の国なる 祭神は 波の狭間に たゆたうものぞ」 「夜は皆 女の子なら 寝る時間 常夜(とこよ)の国へ ようこそおいで」 「妖精に 導かれば 夢の国 ガラスの靴を 磨き続けよ」 歌詠みとしての力を載せた歌ではない。けれど、否応なきにも知らされる。 ――ここは夢の世界であり、夜の世界……常に変わらぬ死後の世界であることを。 魔人の業(わざ)をもってして人の為したことと言うのならここは人工の世界と言えるのだろう。果たして、内戦中の彼女の国において造幣局(ぞうへいきょく)、造兵廠(ぞうへいしょう)に続いて取り込んだ上下水道局はよい仕事をした。 だが、たった今この世界が下水設備と等分で結ばれたとして何の誉があるだろうか? まっさらの更地、なんにもないなんにもなんにもない地平に、らしきものがぽつんと建っている。 それ以外はなんにもない。無色の夢というカンバスに一々絵を描いては塗りつぶす。地形、戦闘空間という形で一々描き直している。 畢竟(ひっきょう)、それが真実。どれだけ言い繕ってみても本質は悍ましい。 此処(ここ)は醜い! だって無色の夢が生まれるゆりかごは棺桶に等しいのだから。 夢の世界など恐ろしい現実を塗りつぶすため戦闘者(さんかしゃ)が各々の脳内で作り上げ、すり合わせた共通の幻想に過ぎぬ。 ≪はじめましての人にははじめまして。こんばんわの人にはこんばんわ。きっと私はおそらく同じことをおんなじ人にいう。誰にだっていうだろう。 私の名前は口舌院焚書、水に浮いた脂のように、海月(くらげ)のように浮かんだこの臣民どもを統べる者であり、神(紙)代の最後の住人にして写し世の最初の神。崇め奉れ、人の子よ。 ……生憎と、ここには私の言葉を代弁してくれる誰かなど居はしないからこの有機型頭髪織り込みデータべース『ひとまるくん』が私の思考を代筆してくれるのだけど。 ここを訪れたあなたのために言葉を紙に仕立て直す時間は無いかもね。何しに来たの? 夢売(ゆめうり)誘子(ゆうこ)。≫ 頭から忘れていた、“あなた”の名前は夢売誘子。 いいえ、もしかすると違うのかもしれない。だが、焚書はそのつもりで話を進めるし異論に遮られたりもしない。だから覚悟して。 三:スリーピング・ビューティ ≪天を翔る神の端くれとして幽冥主掌大神(かくしごとしろしめすおおかみ)(※大国主命の別名。夢、冥界など目に見えない世界を司る)の職掌を侵すは本意でないけれど、生憎のところ私は物質主義者なの。『生きているなら、神様だって』なんとやら――よ≫ あなたは「髑髏(しゃれこうべ)に悪魔が宿る」と悪夢を評したと言う。それを聞いて焚書は手を叩いて喜んだという。 我が意を得たり! と。 違う≪系≫、≪理系≫の宇宙銀河≪系≫に生まれてしまった≪文系履修者(口舌院焚書)≫はこの銀河を許さない。だから公然と反旗を翻し、二〇〇億人を己の旗下に加える一方で罪もない二〇〇〇億の魂を消却し尽くした。 その経緯について語るとするならネオ宇宙大辞林の「く」からはじまって「ぜ」で(中略)「ん」で終わる分量が必要となる。よって誌面の都合上、かいつまんで説明することにしよう。 無慈悲なAI(けいさん)の果てに希望を乗り越えられた人類は機械が提示した内では考えられる限り幸福な終末を選択した。それは肉体を捨てて見る永遠の瑞夢であった。 理想的な人類史の綴(と)じ方であっただろう。彼らは夢の中で生まれて死んでいく。 遺された者からすれば現実の光景は、正しく悪夢にしか見えないということを除けば、だが。 臣民から永遠の週末(終末)(エンドレス・ホリデー)を奪った彼女は現代人からすれば忌むべき存在なのだろう。皇統と言う美名で祀り上げられた墓守の一族を離れて人々の見る『無職の夢』を『無色の夢』に挿げ替え、永久に変わらぬ白夢によって目覚めを促した。 灰色な現実より、色の無い夢がもっともっと退屈であったことに絶望した焚書は期待する。これで目覚めてくれる! と。 だが、期待は裏切られた。 「もう――お気づきでしょうーzzz……」 ≪たとえあなたの実体が水槽に浮かんだ脳髄で、今感じていることが電気信号と薬剤の微細な調合が見せる夢のようなものとしても私の知ったことでは無い。≫ 今や夢の住人は下水処理場の処理槽を遊弋する脳髄、ホルマリン漬けでは無く死んでいない(灰色では無い)。 どこぞの悪趣味な妖精作家ならば食らう口を持たせ、鰭(ひれ)で水を叩かせたかもしれない。プランクトンを食む術さえなく生存手段を外部に依存して退化し尽くした成れの果て(下等生物)のことを口舌院焚書は蔑(さげす)んだ。 彼らは、彼女らの大多数は順応した。二〇〇億の子ども達が目覚め、二〇〇〇億の大人たちが意識を消失させてなお夢を見続けることを望み、現実に復帰することを拒んだ。 現実に負けない立派な肉体は用意した。同じ肉の器でも瓶詰の地獄(ボトル・メイル)を選んだことに口舌院焚書が何を思ったか、次の一言を聞けば一目瞭然だろう。 「なら、悪夢を見て頂戴?」 自分より年下の子供たちを保護した、人類のお姉様は七五調も忘れてそうぽつりと呟いたという。 それは、たった三月前の出来事。丁度――、ごく短時間で終わる『無色の夢』をありとあらゆる次元にばら撒き、参戦者が揃った頃であった。 「釈尊(しゃくそん)告げる 天上天下(てんじょうてんげ)で 尊しは 私の地平を 述べるものなり」 「時の前 位相の前に 私いる 足並み揃え 二次元の地」 「階(きざはし)を 踏む段階で 人図る 歩む私に 何の意味問う」 打って返って歌声はまるで凱歌、門を開いた勇者を讃えるように詠い上げる。私がいるこの地点が基準であると傲慢にも断じる。階下を見下ろすその立場に未だ座っていないのに、頼もしく思えるそんな声の色に色は無かった。 普段の――アニメで聞くような声とも違う声をハッキリ聴いたと証言する者は意外と少ない。 口舌院の探偵も異常に流される方が早く、その声の持ち主が姪っ子でスぺオペの住人であることに気付けるかと言えば否であるし、面識も何もない学生であるならたとえはっきりと会話をしたところで尚更である。 「何がそんなに楽しそうなんでしょうかーzzz……」 その言葉は夢幸――夢幸みこと。一人の少女が四つの体と心に分かたれた内のひとつであり、顧みられることのなかった漂着神のものだ。 彼女は小さな舟に乗ってやってきた。焚書にとってはここ現実と夢の境で上手く事が運ぶようやって来た事代主(ことしろぬし)(※大国主命の子である託宣を司る神。蛭子神や恵比寿としばしば同一視される)に等しい存在であり、寝間着を着せてやりなど甲斐甲斐しく世話をしたという。 ≪だって面白いじゃない! ただの頭のおかしいオッサンの頭の中に五兆の人格があるですって? 何が……理系よ(笑)。 あーははは! そいつ一人殺せば歴史上最高の虐殺者になれるっていうのならやってやろうじゃない。魔人能力って意味不明で多種多様で無限大過ぎて……ほんとにサイコー!≫ 音(こだま)、光(ひかり)、希望(のぞみ)――、かつて日ノ本が敗戦より立ち上がった象徴である新幹線、それに続く名を焚書は見つけてしまった。段々と早くなっていく列車、彼女のための銀河鉄道(お召列車)に名付けることを決めている。 確(しっか)りとした条理に屈して夢を見ることも忘れた人類に未来は無い。 だから口舌院焚書は魔女になった。すべての人類を魔人に変えるまで彼女は死ぬことはないだろう。 「成り成りて 成り合はぬところ 一處(ところ) 汝(なれ)また成り 餘(あま)れる處なし」 国産みの真似事か、おもむろに焚書は立ち上がるとご丁寧に天之御柱(あめのみはしら)に見立てて巨木を反時計回り、先神の知恵にならう気はなかったか、それとも真っ当な子は欲しくないというのだろうか。 足りぬ足りぬは工夫が足らぬと言うが、女同士で子を作るにはいささか設備が足りなかった。さもありなん。 「『イザナミだ』」 これが言いたかっただけだろうというツッコミはあえて置いておく。 小さな茨姫も呪いをかけられた姫もいる。だと言うのになぜ呪いを解くための実に古典的な方法――レズセックスお姫様とのキスを試さないのか、焚書にはわからなかった。 積極的に何かを間違えている気もするが、かの国学者本居宣長(もとおりのりなが)も古事記の矛盾点を聞かれた時に「深く疑うべきにあらず(=こまけーことはいいんだよ)」と返している。 よって、この言葉を座右の銘としている焚書もまた、細かいことは気にしない性質であった。 つまり――、夢売誘子の唇は口舌院焚書に奪われる。 四:目覚めには兆度がいい 「きゃーzzz……」 「!!!」 なんというか、寝ているというのは設定だけのような気がするが、それでも夢幸みことは目覚めない。 両目を古典的な仕草で塞いでいるが、しっかり合間から覗いているのだから徹底している。 そして、あなたは目が覚めた。 ファーストキスであった。もちろん一度もしたことがなかったという意味で。 目が覚めたということは、これまで寝惚けていたか眠っていたかのどちらである。逆説的にあなたは眠っていたことになる。夢売誘子は夢を見ることができない、これは厳正な事実である。 最初に述べた通り、ここは夢と現実の境目。 ネオ宇宙帝国下水局が設計し、無防備な五〇〇〇億の魂を収容する檻として皇女「口舌院焚書」がアビメルムに発注をかけた特殊な空間である。ここは無色の夢ではない。 無色の夢もルール説明のアナウンスも先に説明したが、地形(戦闘空間)の成り立ちについて伝えるのを忘れていた。喰らった悪夢を現実と変えるアビメルムの権能、それは実に都合が良かった。 そもそもが無色の夢、これは偶発的に焚書の手元に入ったものだった。経緯については別の機会に語られることもあるだろう。魔人は死んでも能力を何らかの形で残すことがあり、時に生命体や世界法則のように一人歩きすることがある。 それだけわかれば十分だった。夢売誘子を通して接触は向こうから行われた。 契約内容は戦闘空間の作成、参戦者への完全な形での治療、報酬は――生きる意志の無い魂。 つまり、一見セットとなっている『無色の夢』という現象は寄せ集めであって、焚書がルール説明のアナウンスを間違えたことも一度や二度では無いはずである。 とにかく、多彩な魔人能力が織りなす戦いは娯楽に飢えた焚書を愉しませた。もちろんそれだけではない。気に入った魔人がいればスカウトし、夢から魔人能力に覚醒する手段を模索し……と滅びを回避するためにありとあらゆる手を打った。 愛なきAIの未来予測の演算を魔人の可能性で覆すにはそうするしかなかった。 アビメルムの目的はわからない。だが、夢を現実に変えるシステムはひどく魅力的だった。 そして、魂は彼らも欲するところであった。彼女たちの間で魂は円やドル同様に通貨として扱われた。 夢売誘子が夢を売るなら、口舌院焚書は魂を融資する。ひどくビジネスライクな戦いの中、焚書が誘子を欲したのは当然のことなのかもしれない。 希望崎短編百人一首(選者:口舌院(くぜついん)焚書(ふんしょ)) 読み手:夢幸みこと 三.日谷(ひや)創面(そうめん) 姉がため 腑(ふ)を砕くも 厭(いと)わぬか 奈落飛び込む 笛吹き童子 すべては魔人を産みだし、銀河を……宇宙を彼(女)で満たすため。詳細な能力原理などはそれこそどうでもよかった。 故に、平手も甘んじて受けることにする。 「はいっ!」 騙ルー……じゃなかったカルターとしてこの快音は自分自身で発したかった。 だが、唐突に読まれた一首に反応する時間が唇を塞がれていてはあるはずもなく。当て身から翻った半身が脇腹の札へ突き刺さっていた。 競技カルタとは百人一首から五十枚を抜きだし、二十五枚ずつ相手の体の前面に張り付けて取り合う競技である。 殴る蹴るは当たり前、鋭利に尖ったカルタは刃物と化して時に死傷者をも出す激しさから「畳の上の格闘技」と言われている。小柄な体躯ながら焚書も銀河で五本の指に入る実力者でであるのだが……。 焚書は歌詠みの誉である銀河かるたクイーンの座を三年連続で同族の口舌院五六八に奪われていた。幼少期からこれまでの戦いで失明一回、右腕切断一回、内臓破裂三回、大量出血二回、左足、右足骨折一回ずつ、トラウマ、痔、打撲、突き指、脱臼、脳震盪、鼻血は数知れず……と凄惨たる怪我を負ってきている。 超未来で死兆星を見る羽目になるとは思わなかったが、うっかり天に還るところであったという。 話を戻そう。 これが、慰みに競技カルタをやってきて、夢売誘子が取った最初の一枚であった。無論、力は弱く公式戦では浅いと判定される腕の振りであっただろう。だが、その心意気を買って受け身を取らずに耐える。 流石に倒れ込みこそしなかったが、体幹はわずかに傾いだ。 夢売誘子、彼女はふっと笑うと同じくふっと消えた。 してやったりと言いたげだった。キスの代償は高くついたらしい。 「そう……、このために来たのね」 口舌院焚書は自分がアニメの主人公のように振る舞えぬことを恥じた。こうすれば嫌がりつつも女の子は応えてくれると思ったのに現実は厳しい。二次元は三次元を伴侶に出来ぬのかもしれないなと考えて、ちょっと黄昏る。 「振られちゃいましたねーzzz」 寝ている少女の茶化しも今は遠い。 けれど、目的はひとつ果たした。夢売誘子のポケットは少し重くなっているはずだ。 ≪ドリームマッチ売りの少女「夢売誘子」。黄泉戸喫(ヨモツヘグイ)に興味ある?≫ 巨木から、言葉と時同じくして落ちてきた果実は赤く萌えていた。 「ひょっとしてそれは……柘榴の実? ……zzz」 ≪わざと言っているんでしょうけど、これは黄泉の国と同一視される常世の国で採れる非時香果(トキジクノミ)よ≫ 「ああ。食べると永遠の命が約束されるというあれ……zzz」 ≪そう、垂仁(すいにん)天皇が求めたという橘の実、不老にして不死になれるけど食した瞬間この地から出られなくなるという呪われた食品よ。 だけど、外界に持ち帰ると本来の効能を失う代わりにあるいきものを世界に放つ。 それが――」 「花提灯(はなちょうちん) 妖精の実は 紅く萌え 燃え上がるは 妖精の郷(アヴァロン)」 ≪正解。これは妖精ちゃんの卵でもあるの。想像力=応援と共に生き、意識の表層に根を張って、やがて人々の間に実を落とす。孵った妖精ちゃんは人々を鼓舞し、より一層世界は豊かなものとなる――はずだった。≫ 「人間の欲は恐ろしい……ですか。zzz……」 ≪妖精界はいつか、何千年後かはわからない。だけど必ずかつての姿を取り戻してみせるわ。目覚めることが出来ないあなたのために花園を用意しましょう。≫ イザナギが黄泉の国から持ち帰った穢れを洗い流すことで三貴神を産んだ。穢れとは無とは違って満ち満ちたなにかであるのかもしれない。一見、汚濁に満ちたこの下水処理場も目線を変えれば数多の恵みを生んでくれる。 けれど、女神は気付いているだろうか? もっと手っ取り早く世界を創造する方法を。 たとえば一兆度、宇宙が無から爆発的に増大する瞬間の温度を口舌院焚書は再現出来るだろう。 『紙は死んだ -歌氏〇〇〇〇-』から『紙は死んだ -歌氏∞-』。 時の概念を持たず、虚無と根源の両義を内包するアビメルムならば――だけどそれは夢だ。忌み嫌う理系の手段だ。 口舌院焚書は夢を見ない。夢見る時間を現実に当てる。 この夢も現実の延長と認識していて、瑞夢も悪夢も趣味と実益を兼ねた娯楽に過ぎない。 夢幸みことのために作った紙の棺を見つめながら、彼女は目覚めることにした。この一瞬だけは夢を見てもいいなと思いながら――。 (GK注) 本稿は試合時に公開された版に誤字訂正を加えたものです。
https://w.atwiki.jp/unknown37r5/pages/37.html
クォータニオンの軸方向ベクトルの計算 project018でミスが発覚しましたので、それ以前のコードでは注意してください クォータニオンの軸方向ベクトルの計算では、クォータニオンの回転が使われます 変換前のベクトルを,変換後のベクトルを,回転を表すクォータニオンをとすると だと思っていたのですが違うようで、 で計算するとうまい事いきました ググると前のほうが正しいはずなんだけどなぁ… オブジェクト座標のZ軸方向のベクトルを計算するコード 間違い Math Quaternion QtTmp;Math Vector3D VecZ;Math Quaternion QtZ;QtZ.Mul(m_Direction,Math Quaternion(0.0f,0.0f,1.0f,0.0f));QtTmp.Conjugate(m_Direction);QtZ.Mul(QtZ,QtTmp);VecZ=Math Vector3D(QtZ.x,QtZ.y,QtZ.z); 訂正 Math Vector3D VecZ;Math Quaternion QtZ;QtZ.Conjugate(m_Direction);QtZ.Mul(Math Quaternion(0.0f,0.0f,1.0f,0.0f));QtZ.Mul(m_Direction);VecZ=Math Vector3D(QtZ.x,QtZ.y,QtZ.z);
https://w.atwiki.jp/wnt0/pages/41.html
http //www.dofactory.com/Patterns/PatternProxy.aspx のC#コードをC++にした Structural example #include iostream using namespace std; // The Subject abstract class class Subject { public virtual void Request() = 0; }; // The RealSubject class class RealSubject public Subject { public virtual void Request() { cout "Called RealSubject.Request()" endl; } }; // The Proxy class class Proxy public Subject { private RealSubject *_realSubject; public Proxy() { _realSubject = NULL; } virtual ~Proxy() { if (_realSubject) delete _realSubject; } virtual void Request() { // Use lazy initialization if (_realSubject == NULL) { _realSubject = new RealSubject; } _realSubject- Request(); } }; // Entry point into console application. int main() { // Create proxy and request a service Proxy *proxy = new Proxy; proxy- Request(); delete proxy; return 0; } Real World example #include iostream using namespace std; // The Subject interface class IMath { public virtual double Add(double x, double y) = 0; virtual double Sub(double x, double y) = 0; virtual double Mul(double x, double y) = 0; virtual double Div(double x, double y) = 0; }; // The RealSubject class class Math public IMath { public double Add(double x, double y) { return x + y; } double Sub(double x, double y) { return x - y; } double Mul(double x, double y) { return x * y; } double Div(double x, double y) { return x / y; } }; // The Proxy Object class class MathProxy public IMath { private Math *_math; public MathProxy() { _math = new Math; } virtual ~MathProxy() { delete _math; } double Add(double x, double y) { return _math- Add(x, y); } double Sub(double x, double y) { return _math- Sub(x, y); } double Mul(double x, double y) { return _math- Mul(x, y); } double Div(double x, double y) { return _math- Div(x, y); } }; // Entry point into console application. int main() { // Create math proxy MathProxy *proxy = new MathProxy; // Do the math cout "4 + 2 = " proxy- Add(4, 2) endl; cout "4 - 2 = " proxy- Sub(4, 2) endl; cout "4 * 2 = " proxy- Mul(4, 2) endl; cout "4 / 2 = " proxy- Div(4, 2) endl; delete proxy; return 0; } 参考サイト デザインパターンを“喩え話”で分かり易く理解する http //www.netlaputa.ne.jp/~hijk/study/oo/designpattern.html TECHSCORE http //www.techscore.com/tech/DesignPattern/index.html/ Programing Place http //www.geocities.jp/ky_webid/index_old.html デザインパターンの骸骨たち http //www002.upp.so-net.ne.jp/ys_oota/mdp/
https://w.atwiki.jp/lslwiki/pages/311.html
llSetPrimURL llSetPrimURL(string url) 機能概略 サンプル Tips 詳細な説明 History 来客数: - 選択肢 投票 役に立った (0) 役立たずだった (0) 名前 コメント
https://w.atwiki.jp/sethmars/
@wikiへようこそ ウィキはみんなで気軽にホームページ編集できるツールです。 このページは自由に編集することができます。 メールで送られてきたパスワードを用いてログインすることで、各種変更(サイト名、トップページ、メンバー管理、サイドページ、デザイン、ページ管理、等)することができます まずはこちらをご覧ください。 @wikiの基本操作 用途別のオススメ機能紹介 @wikiの設定/管理 分からないことは? @wiki ご利用ガイド よくある質問 無料で会員登録できるSNS内の@wiki助け合いコミュニティ @wiki更新情報 @wikiへのお問合せフォーム 等をご活用ください @wiki助け合いコミュニティの掲示板スレッド一覧 #atfb_bbs_list その他お勧めサービスについて 大容量1G、PHP/CGI、MySQL、FTPが使える無料ホームページは@PAGES 無料ブログ作成は@WORDをご利用ください 2ch型の無料掲示板は@chsをご利用ください フォーラム型の無料掲示板は@bbをご利用ください お絵かき掲示板は@paintをご利用ください その他の無料掲示板は@bbsをご利用ください 無料ソーシャルプロフィールサービス @flabo(アットフラボ) おすすめ機能 気になるニュースをチェック 関連するブログ一覧を表示 その他にもいろいろな機能満載!! @wikiプラグイン @wiki便利ツール @wiki構文 @wikiプラグイン一覧 まとめサイト作成支援ツール バグ・不具合を見つけたら? 要望がある場合は? お手数ですが、お問合せフォームからご連絡ください。
https://w.atwiki.jp/sawan50/pages/20.html
SettingsProviderの作成 My.Settingsでは格納変数のスコープとして、ユーザー単位又はアプリケーション単位の2種類がある。 ユーザー単位の特徴 1 プロラムからデータの読取り及び書込みが行える 2 アプリケーション単位の特徴 ユーザー ユーザ単位でデータを保管し、プログラムからデータの読取り及び書込み行える アプリケーション アプリケーション単位でデータを保管し、プログラムからは読取りのみ行えるで値を保存することは出来ない Imports System.Configuration Imports System.Xml Public Class LocalXMLSettingsProvider Inherits SettingsProvider summary 実行中のアプリケーション名 /summary remarks /remarks Private gApplicationName As String summary プロバイダ名 /summary remarks /remarks Private Const gProviderName As String = "LocalXMLSettingProvider" summary データ格納ファイル /summary remarks /remarks Private gSettingsFileName As String Private gXMLSettingsNode As String summary コンストラクタ /summary Public Sub New() Me.gApplicationName = String.Empty gSettingsFileName = Me.GetType.Assembly.Location ".XMLConfig" End Sub Public Overrides Sub Initialize(ByVal pname As String, _ ByVal config As System.Collections.Specialized.NameValueCollection) 設定プロバイダ名を指定する MyBase.Initialize(gProviderName, config) gXMLSettingsNode = My.Settings.ToString End Sub summary 現在実行中のアプリケーション名 /summary value /value returns /returns remarks /remarks Public Overrides Property ApplicationName() As String Get Return gApplicationName End Get Set(ByVal value As String) gApplicationName = value End Set End Property summary /summary param name="context" /param param name="collection" /param returns /returns remarks /remarks Public Overrides Function GetPropertyValues( _ ByVal context As System.Configuration.SettingsContext, _ ByVal collection As System.Configuration.SettingsPropertyCollection) As System.Configuration.SettingsPropertyValueCollection Dim colSettingsValues As New SettingsPropertyValueCollection() XMLファイル読み込み準備 Dim xmlPathDom As XPath.XPathDocument = New XPath.XPathDocument(gSettingsFileName) Dim xmlPathNavi As XPath.XPathNavigator = xmlPathDom.CreateNavigator() Dim xmlPathNode As XPath.XPathNodeIterator For Each settingsPropery As SettingsProperty In collection SettingPropertyValueを取得する Dim settingsValue As SettingsPropertyValue = New SettingsPropertyValue(settingsPropery) XMLファイルからデータを検索する xmlPathNode = DirectCast(xmlPathNavi.Evaluate(String.Format("//Settings/{0}/setting[@name= {1} ]", gXMLSettingsNode, settingsPropery.Name)), XPath.XPathNodeIterator) If xmlPathNode.Count 0 Then xmlPathNode.MoveNext() settingsValue.SerializedValue = xmlPathNode.Current.Value End If settingsValue.IsDirty = False colSettingsValues.Add(settingsValue) Next Return colSettingsValues End Function summary /summary param name="context" /param param name="collection" /param remarks /remarks Public Overrides Sub SetPropertyValues( _ ByVal context As System.Configuration.SettingsContext, _ ByVal collection As System.Configuration.SettingsPropertyValueCollection) Dim xmlsettings As XmlWriterSettings = New XmlWriterSettings() Dim xmlWriter As XmlWriter xmlsettings.Indent = True xmlsettings.IndentChars = " " xmlWriter = xmlWriter.Create(gSettingsFileName, xmlsettings) xmlWriter.WriteStartElement("Settings") xmlWriter.WriteStartElement(gXMLSettingsNode) For Each settingsValue As SettingsPropertyValue In collection xmlWriter.WriteStartElement("setting") xmlWriter.WriteAttributeString("name", settingsValue.Name) If settingsValue.SerializedValue Is Nothing Then xmlWriter.WriteAttributeString("serializeAs", settingsValue.PropertyValue.GetType.Name) xmlWriter.WriteStartElement("value") xmlWriter.WriteValue(settingsValue.PropertyValue.ToString) xmlWriter.WriteEndElement() Else xmlWriter.WriteAttributeString("serializeAs", settingsValue.SerializedValue.GetType.Name) xmlWriter.WriteStartElement("value") xmlWriter.WriteValue(settingsValue.SerializedValue) xmlWriter.WriteEndElement() End If xmlWriter.WriteEndElement() settingsValue.IsDirty = False Next xmlWriter.WriteEndElement() xmlWriter.WriteEndElement() xmlWriter.Flush() End Sub End Class
https://w.atwiki.jp/ltts/pages/36.html
version6.6にてscript(Lua Scripting)に対応しました この機能によりある程度のオートメーション化に役立つと思われますが現時点でサンプルが少なく(2016/02/21現在11件) 初心者は手が出しにくい状態になっています どなたかわかる方は記述をお願いいたします。 参考ページ イントロダクション API サンプル(BlackJack) (参考アドレス) http //steamcommunity.com/sharedfiles/filedetails/?id=714904631 Introduction 導入 This guide is designed for those with limited experience scripting with LUA. このガイドはLUAスクリプトに限って作成されています。(それ以外の言語では対応していません) It will review the basics of how to format code, 基本的なフォーマットコードの見方は the building blocks for you to base your code on and provide some examples. いろいろな例をもって説明します It is designed to be hands-on, so you should have Tabletop Simulator open and your LUA editor up to follow along. 実践ながらLUAエディターを使ってみましょう Before The First Keystroke はじめに First, I would highly recommend getting Atom if you intend to script in Tabletop Simulator. はじめに、スクリプトをいじるために、「Atom」の知識が必要です It knows what functions can be used and will import/export code into/out of TS. 「TS」のインポート、エクスポートを知るために下のアドレスを確認しましょう。Instructions on installation and setup of Atom[berserk-games.com] ↑「Atom」の説明アドレス Next you should 次に下のアドレスをブックマークしておきましょう。 bookmark the documentation knowledge base[berserk-games.com]. You will be referencing this site often once you start to write your own scripts. スクリプト作っていくうちにこのサイトが役にたつでしょう。 Its where you go to find Tabletop Simulator specific functions and how they work. ここにはTTSでのスクリプトがどのように動いているかわかります。 You will most often use the API and Objects pages, at least in my experience. 特に「API」と「Object」のページはよく使うでしょう。 Setting Up 準備 When you save your scripts in Tabletop, あなたのスクリプトをTTSで保存するとき it will use your most recent save and then load the script into it. 最新のセーブ、スクリプトがはいったものを使うこと So for any script you intend to write, you will need to do the following スクリプトを書き足す時には下の事に注意しましょう。 Set up the table the way you want it. テーブルを立てる Save the table. テーブルをセーブする(上の「Menu」から Load the table. テーブルをロードする For this exercise, take a blank table and spawn two objects (I used a square block and rectangle block) as well as a red checker. たとえば右の画像みたいに赤と青のブロックと 赤い確認用コインがあります。 Remember to save/load then open up the scripting in Atom Atomでセーブする前にセーブ ロードすること、 or go to Host Scripting in Tabletop Simulator to begin. ホストとしてTTSをはじめることを覚えておいてください 1) Global.lua ファイルの編集 Global.lua is the scripting which is a part of the save file. 「Global.lua」はセーブデータのスクリプトの一部です。 It is where we will be working for most of this tutorial. 練習の最初としてここをやります。 On a new save, it always starts with some text saved into the editor. 新しいセーブをテキストエディターで開きましょう。 Just delete it, we will not be using it. いったん閉じましょう。これは今回使いません。 It is also possible to write scripts and attach them to objects instead of Global. スクリプトを書くこともできますし、グローバルデータの代わりにも使えます。 That way if you save and object it will save its LUA right along with it. セーブすると自動的にLUAデータとして保存されていきます。 You can perform most functions using either Global or Item scripts but we will be working in Global. このデータは「Global」データか「Item」データとして使うことができますが、 ここでは「Global」データとして使っていきます。 2) Functions 機能 Functions[berserk-games.com] are what trigger groups of code. 「Functions」はコードの1グループとして機能します。 Some of them are built into the scripting system (ex. onload()) while others can be created by the user.Every function will start with the word function and end with the word end. 右の図でいうピンク文字の「function」から「end」までが1グループとなります。 A common function built into Tabletop Simulator is onload(). This function triggers every time the script is loaded (like if Undo/Redo is pressed). TTSでよく使う「onload()」はゲームの読み込み時に機能します。 So let us get started by using it to activate a function we will create. Functions should start with a lowercase letter, and cannot contain spaces. We ll use exampleFunction. 「Functions」の機能は「小文字で表記」し、「スペースを含めてはいけません」 function onload() exampleFunction() end Now our script, when it loads, will try to run a function named exampleFunction. But we haven t written one yet! So now we will create our own function, right after the onload function has ended. 上のままじゃ特に何もおきません。 function exampleFunction() print( Hello, World. ) end The command of print() is also a function. But instead of triggering a section of code in LUA, it activates programming inside of Tabletop Simulator to produce a desired effect. In this case, printing a message to the host of the game, in chat.The message is called a string, and is always surrounded by quotes to indicate that. A string is a series of characters. (Ex This is a string. or So is this! )When you save and upload your script, it should now print Hello, World. to chat. 【print( 表示させたい文字 )】 :「表示させたい文字」がチャット欄に表示されます。 このメッセージは「string」とよばれます Extra Credit When you create your own function, you can also pass variables along with it for the function to use. Another way to write our starting exercise would be 応用編:下の通りにやってみましょう。 function onload() exampleFunction( Hello, World. ) end function exampleFunction(passedString) print(passedString) end We created a variable to represent the string (passedString) and then printed what was contained in that variable. 「passedString」は? 3) Objects オブジェクト Objects[berserk-games.com] are the physical entities that exist within tabletop. In our example, our objects currently are two blocks and a checker (what a terrible game we are making). Using scripting, we can manipulate objects, move them, add buttons to them or perform other various actions. We re starting our Global.lua over fresh. Erase all text in it. 「オブジェクト」はTTSでは物理的なものになります。 たとえば、さっきつくった赤と青とコインがあるだけの謎のゲーム。 これにスクリプトを使って追加したボタンで動きをあたえてみましょう Global.luaを開いて全てのテキストを一度けしましょう。 GUIDs ガイド To affect and object, first we must identify it in LUA. There are several ways to do this, such as identifying items being picked up or put down by players, finding objects inside of a scripting zone and more. We will be identifying these objects by their GUID. まず「プレイヤーがそのオブジェクト」を「持っている」か「持っていないか」を見極めることが大切です。 そのために「GUID」の機能を使いましょう。 A GUID is a unique identifier which each spawned item in TS will have. Even 2 of the same item will have different GUIDs. To locate an object s GUID, right click on it and go to Scripting. If you click on its GUID there, it will copy it to your clipboard. A GUID is always a string, so remember strings are always in quotes. Lets create some variables with the GUIDs of our objects. REMEMBER Your GUIDs will be different than mine. object1_GUID = 195868 object2_GUID = 333365 checker_GUID = 7dc60d TTS上で作られたオブジェクト毎に上のような「GUID」のコードが設定されている。(見た目が同じものや、コピーしたものでも違うGUIDになる) このGUIDはオブジェクトを右クリックしたとき、上記のように、チャット欄に出てくる (上のGUIDのコードはあなたが実際に試したものとは違う数字になるでしょう) Defining Objects オブジェクトの定義 Then, using onload so this happens when the script is loaded, we will make variables to represent our objects. All of these variable names we ve been making must start with a lower case letter and not contain spaces, but other than that you are fairly free to make up variable names yourself. You want to make it clear what it represents. I will be using object1, object2 and checker to represent my objects. The function we will use to identify will be getObjectFromGUID(string). We place the GUID in the spot for the string. 次に、onloadを使用して、スクリプトがロードされたときに、オブジェクトを表す変数を作成します。 これらの変数名はすべて小文字で始まり、空白を含まないようにしなければなりませんが、 変数名を自分で作ることはかなり自由です。 今回は、何を表しているかを明確にしたいので、オブジェクトを表すためにobject1、object2、checkerを使用します。 識別に使用する関数は「getObjectFromGUID(string)」です。 GUIDを文字列の場所に配置します。 function onload() object1 = getObjectFromGUID(object1_GUID) object2 = getObjectFromGUID(object2_GUID) checker = getObjectFromGUID(checker_GUID) end Manipulating Objects オブジェクトの名前設定 Now we need to manipulate these objects somehow. We will give them a name. In onload(), after we defined our objects, we will use the function of setName(string). Notice that setName, like other object functions, must be tied to an object. Otherwise the script will not understand what object s name we want to change. The string in setName will be what we set the name to. これらのオブジェクトを何らかの形で操作する必要があります。 そのため、これらに名前をつけます。 onload()では、オブジェクトを定義した後、setName(string)の関数を使用します。 setNameは、他のオブジェクト関数と同様に、オブジェクトに結びつけられなければならないことに注意してください。 それ以外の場合、スクリプトはどのオブジェクトの名前を変更したいのか理解しません。 setNameの文字列は、名前を設定する文字列になります。 object1.setName( Object1 ) object2.setName( Object2 ) checker.setName( That Stupid Checker ) Extra Credit You may be curious as to why we didn t put the object GUIDs directly into getObject (EX object1 = getObjectFromGUID( 195868 ) ). We could have, it would work. This example was to show you that, sometimes, it is more convenient to set a variable early on so you can reference it later. That way, if that variable needs to change (new GUID) you don t have to try to track it down to fix it throughout your code. If you wanted to, for the checker, there is no reason you couldn t write it like 追記:なぜオブジェクトGUIDを直接getObject(EX:object1 = getObjectFromGUID( 195868 ))に入れなかったのか 疑問をもたなかったでしょうか? そのままでもうまくいくでしょう。 この例では、後で参照できるように、変数を早期に設定する方が便利な場合があることを示しています。 そうすれば、その変数を変更する必要がある場合(新しいGUID)、 コード全体で修正するためにそれを追跡する必要はありません。 あなたが途中のチェック用に使うのでなければとめませんが・・・ function onload() getObjectFromGUID( 7dc60d ).setName( That Stupid Checker ) end The reason I do not encourage that for learners is partially an aesthetic choice, and partially for code clarity. You want it to be easy for someone else to understand your code, and once you start doing things more complex than changing the name of an object it can get VERY difficult to see what is going on. It can also make future revisions to your code a chore. 「先に名前の定義を書く」ことで、やりやすくなるでしょう。 4) Buttons ボタン While there are many ways to activate functions, buttons are a convenient way to activate sections of code at the player s choosing. All buttons must be attached to an object, and are created using parameters. The object we want to attach our button to is our checker, and those parameters are found on the Objects page in the Knowledge Base. Many are optional, here they are for reference. 機能を有効にする方法はたくさんありますが、ボタンはプレーヤーがボタンを押したときにスクリプトを起動するわかりやすい機能です。 すべてのボタンはオブジェクトに関連付けする必要があり、パラメータを使用して作成されます。 ボタンを関連付けするオブジェクトはチェッカーであり、これらのパラメータはナレッジベースのObjectsページにあります。 多くはオプションです。ここでは参考にしています。 click_function = String --The name of the function which will activate when this button is pressed. ボタンを押したときに起動します function_owner = Object --Determines where the function that the button activates lives (global or an object s script). ボタンが有効になる機能(グローバルまたはオブジェクトのスクリプト)を決定します。 labels = String --The name on the button. ボタン自身に名前をつけます position = Table --X, Y and Z coordinates for where the button appears, from the center of the object it is attached to. ボタンが表示される場所のX座標、Y座標、Z座標を、オブジェクトが取り付けられているオブジェクトの中心から取得します rotation = Table --Pitch, Roll and Yaw in degrees, relative to the object it is attached to. 投げる勢い、転がりかた、振り方を、添付したオブジェクトを基準にした角度で表します。 width = Number --How wide the button is, relative to the scale of its object. ボタンの広さを設定します height = Number --How tall the button is, relative to the scale of its object. ボタンの高さを設定します font_size = Number --Size of the text on the button, relative to the scale of its object. ボタン上に表示されるフォントのサイズを設定します。 Tables Tables in LUA are collections of entries. You can store most anything inside of a table and reference it later. All tables are indicated by curly brackets {}. You can reference entries in a table by a name or by an index number (what number entry it is, indexes start at 1 in LUA.). We will be creating a table right beneath where we established our GUIDs and then filling it with entries to use with the createButton(table) function. The name we are choosing for our table is button_paramiters LUAのテーブルはエントリの集合です。 ほとんどのものはテーブルの中に格納し、後で参照することができます。 すべてのテーブルは中括弧{}で示されます。 テーブル内のエントリは、名前またはインデックス番号(どの番号エントリか、LUAのインデックスは1から始まります)によって参照できます。 GUIDを作成した場所の直下にテーブルを作成し、createButton(table)関数で使用するエントリを入力します。 テーブル用に選択している名前はbutton_paramitersです。 button_parameters = {} button_parameters.click_function = buttonClicked button_parameters.function_owner = nil button_parameters.label = Press Me button_parameters.position = {0,0.8,0} button_parameters.rotation = {0,0,0} button_parameters.width = 500 button_parameters.height = 500 button_parameters.font_size = 100 Now we have a table with the paramiters listed within it. So lets use the object function to create a button on the checker. Enter this inside of function onload() before its end. 今度は、その中にリストされたパラメータを持つ表があります。 オブジェクト関数を使用してチェッカーにボタンを作成させます。 終了する前にfunction onload()の中でこれを入力してください。 checker.createButton(button_parameters) Check Your Work 動作確認 Save and apply your code. You should now have a button which floats a few inches above your checker. If you don t see it and didn t get an error, try flipping your checker over. It might be upside down so the button is hiding inside the table! If you did flip the checker over, remember to save over your old save with the checker correctly positioned. コードを保存して適用します。 チェッカーの上に数インチ上に浮かぶボタンがあります。 表示されず、エラーが表示されない場合は、チェッカーを裏返しにしてみてください。 それは、ボタンがテーブルの中に隠れているので、逆さまになっているかもしれません! チェッカーを裏返しにした場合は、チェッカーが正しく配置された状態で古いセーブを保存してください。 Add Button Function ボタン追加 Now we need to add the button s function into our code. To test the function out, we ll print ourselves a message. We ll add this user-defined function to the end of our script. 今度はボタンの機能をコードに追加する必要があります。 関数をテストするために、メッセージを表示します。 このユーザー定義関数をスクリプトの最後に追加します。 function buttonClicked() print( Learning is fun. Sort of. ) end After uploading our script, pressing the button should print our message once for each click. スクリプトをアップロードした後、ボタンを押すと、クリックごとにメッセージが1回表示されます。 Click it repeatedly because of course you will. 同じコードを繰り返すので、繰り返しクリックした表記になります EXTRA CREDIT 追記 When you create tables, there are several ways to accomplish it[www.lua.org]. The way used here was to provide visual clarity. However, creating button parameters like this, if you are going to have many buttons, takes up A LOT of space. I prefer to create my tables in such a way that it saves space but doesn t create a run-on line that goes well off the right side of the screen. Using our example, I would have created my parameter table like this テーブルを作成するときに、テーブルを作成するにはいくつかの方法があります[www.lua.org]。 ここで使用される方法は、視覚的な明快さを提供することでした。 しかし、このようなボタンパラメータを作成すると、多くのボタンを使用する場合は、多くのスペース(広さ)が必要になります。 私はスペースを節約するが、画面の右側からうまくいくランオンラインを作成しないような方法でテーブルを作成することを好みます。 私の例を使って、私は次のように私のパラメータテーブルを作成したでしょう: button_parameters = { click_function= buttonClicked , function_owner=nil, label= Press Me , position={0,0.8,0}, rotation={0,0,0}, width=500, height=500, font_size=100 } EXTRA CREDIT This is the perfect point to start playing with different things you can do with objects. Go to the Object page in the Knowledge Database and try stuff. Move the objects, make them switch positions, change their colors, whatever you can think of. これは、オブジェクトで行うことができるさまざまな作業を開始するのに最適なポイントです。 ナレッジデータベースのオブジェクトページに移動して試してみてください。 オブジェクトを動かす、位置を切り替える、色を変える、何でも考えることができます。 EXTRA CREDIT Also, any time you press a button, its click_function triggers with 2 parameters. The first is an object reference, specifically the reference to the object the button is attached to. The second is a color (ex. Blue ) in string format of the color player who pressed the button. また、ボタンを押すたびに、そのclick_functionが2つのパラメータで引用されます。 1つはオブジェクト参照です。具体的には、ボタンがアタッチされているオブジェクトへの参照です。 2番目のボタンは、ボタンを押したカラープレーヤーの文字列形式の色(例: Blue )です。 5) Logic Statements Logic statements[www.lua.org] are generally called if statements . They are used to tell your code what you want it to do in a given situation. When the statement is activated (say, by pressing a button) the logic contained in its statement will only be activated if the condition given is true. They are always formatted as 論理文[www.lua.org]は、一般に「if文」と呼ばれます。 彼らはあなたのコードを与えられた状況で何をしたいのかを伝えるために使われます。 ステートメントがアクティブになると(たとえばボタンを押すことによって)、ステートメントに含まれるロジックは、指定された条件が真である場合にのみアクティブになります。 それらは常に次のようにフォーマットされます。 if CONDITION then --Activates if condition was true end You can also add else to that, so that if the statement is false, something ELSE happens instead. Notice here I added commenting using two minus signs in a row. The engine will ignore anything on a line after --. また、 else を追加することもできます。その結果、文が偽であれば、代わりにELSEが発生します。 ここでは、2つのマイナス記号を連続して使用してコメントを追加しました。 エンジンは〜の後の行の何かを無視します。 if CONDITION then --Activates if condition was true else --Activates if condition was false end What you place in the area I labeled CONDITION in these examples are called relational and conditional operators.[www.tutorialspoint.com] Using them, you can compare many things to eachother. They produce what is called a boolian value (a variable value that is either true or false ). これらの例でCONDITIONというラベルを付けた領域に配置するものは、リレーショナルおよび条件付き演算子と呼ばれます。[www.tutorialspoint.com]これらを使用して、多くのことをお互いに比較できます。 ブーリアン値(「真」または「偽」のいずれかの可変値)を生成します。 Our First Logic Statements We will try a few of these out. Erase the current contents in your buttonClicked() function. Now enter into that function these statements これらのうちのいくつかを試してみましょう。 buttonClicked()関数の現在の内容を消去します。 その関数に次の文を入力します。 if 5 6 then print( 5 is greater than 6 ) end if 6 4 then print( 6 is greater than 5 ) end if 5 == 0 then print( Five is equal to ZERO?! ) else print( No, five isn t equal to zero. ) end When those lines are used and the button pressed, you will see that only the print functions located in the TRUE statement were printed. Also, because 5==0 is a false statement it activated the print function located in the else part of the logic. これらの行が使用され、ボタンが押されると、TRUEステートメントにある印刷機能だけが表示されます。 また、5 == 0は偽の文であるため、ロジックの「else」部分にある印刷機能を有効にしました。 Comparing Variables Once again, erase all of the scripting inside of the buttonClicked() function. We are going to be creating a new variable, then altering it. The new variable will be a bool. Bool values can only be true, false or nil (nil means neither). Bool values are always written in all lower case. First, we will create our variable just beneath our object and checker GUIDs being established. もう一度、buttonClicked()関数内のすべてのスクリプトを消去します。 私たちは新しい変数を作成し、それを変更します。 新しい変数はboolになります。 Boolの値はtrue、false、またはnil(nilはどちらも意味しません)のみです。 ブール値は常にすべての小文字で記述されます。 まず、オブジェクトとチェッカーのGUIDが確立される直前に変数を作成します。 trueOrFalse = true Then, in buttonClicked, we will establish some logic to check if trueOrFalse is, well, true or false. If it is true, we ll print that it was true and switch it over to false. If the button is clicked again, it will print that it was false and switch it to true. 次に、buttonClickedでは、trueOrFalseがtrue、falseまたはfalseであるかどうかを確認するロジックを確立します。 真であれば、それが本当であることを表示し、それを偽に切り替えます。 ボタンを再度クリックすると、falseであることが表示され、trueに切り替えられます。 if trueOrFalse then print( trueOrFalse was true. ) trueOrFalse = false else print( trueOrFalse was false. ) trueOrFalse = true end We could have also written that as if trueOrFalse == true then but that is unnecesary. Remember, the IF statement just needs to be fed True or False. And since trueOrFalse is already one of those, we can skip the operators. 以下のように書くこともできます」trueOrFalseが、その後真==場合は、「それはunnecesaryであるように、その。IF文がちょうどTrueまたはFalseに供給する必要があることを覚えておいてください。trueOrFalseは既にそのうちの一つであるので、私たちは、事業者をスキップすることができます。 6) Loops Loops are sections of code that can run multiple times/continuously when activated only once. These are some of the more complex elements you will use in LUA. They often go hand-in-hand with tables, allowing you to run code on each entry in the table. ループは、1回だけ起動すると複数回/連続して実行できるコードのセクションです。 これらは、LUAで使用するより複雑な要素の一部です。 彼らはしばしばテーブルと手を携えてテーブルの各エントリにコードを実行させます。 Numeric For Loops A numeric for loop[www.lua.org] is one which runs a set number of times. You give it 2 or 3 numbers and a unique variable name (I will use i , which stands for index) and it starts at the first number, then goes until it hits the second number. If a third number is used, it will count by that. So normally it counts up from 1 by 1, but if you put, as a third number, a 2 it would count by 2s. Each number is separated by a comma. Replace the code in your buttonClicked function with this and give it a try. i , the index, will be equal to 1 on the first run, then it will go up by 1, and be equal to 2 and run again, and keep doing that until it hits 10. ループ[www.lua.org]の数値は、設定された回数だけ実行される数値です。 2つまたは3つの数字と一意の変数名(私は i を使用します)は最初の数字から始まり、2番目の数字に当たるまで続きます。 3番目の数字が使用されている場合は、それによってカウントされます。 通常は1から1までカウントアップしますが、3番目の数字として2を入れると2になります。 各番号はコンマで区切られています。 buttonClicked関数のコードをこれに置き換えて試してみてください。 索引「i」は最初の実行では1になり、次に1になり、2に等しくなり、再び実行され、10に達するまでこれを続けます。 for i=1, 10 do print(i) end print( Loop Finished ) What the output is upon pressing the button ボタンを押したときの出力は何ですか? Generic For Loops A generic for loop[www.lua.org] is one which runs through entries in a table. For example, the button_parameter table we created. We would set two variables, one for index and one for value, in the loop and then it would run through each entry in the provided table. For each entry in the table, it would make index equal the name of the variable (Ex position, width, etc) and value equal that values we gave each entry. Add this after your current for loop in buttonClicked. 一般的なforループ[www.lua.org]は、テーブル内のエントリを実行するものです。 たとえば、作成したbutton_parameterテーブルです。 ループ内に2つの変数(インデックス用と1つの値用)を設定し、提供されたテーブルの各エントリを実行します。 テーブル内の各エントリについて、変数の名前(例:位置、幅など)と同じになり、値は各エントリに与えた値と等しくなります。 buttonClickedの現在のforループの後にこれを追加します。 for i, v in pairs(button_parameters) do print(i) end What the output is upon pressing the button ボタンを押したときの出力は何ですか? Break Break[www.lua.org] will end a for loop as soon as it is activated. For instance, if you added to your numeric for loop, just after its print function, the line if i==3 then break end, it would end the loop after it had printed 1, 2, 3. Break [www.lua.org]は、forループがアクティブになるとすぐに終了します。 たとえば、数字のforループに追加した場合、その印刷機能の直後に、i == 3の場合は行末が終了し、1,2,3の場合はループが終了します。 7) Scripting Outside of Global In order to write a script directly into an object, right click that object in game, go to Scripting, and select Lua Editor (if you use Atom, this will open a window in Atom for it). スクリプトをオブジェクトに直接書き込むには、ゲーム内でそのオブジェクトを右クリックし、Scriptingに行き、Lua Editorを選択します(Atomを使用している場合は、Atomのウィンドウが開きます)。 When you write LUA here, it is just like global. Except if you need to reference the object the script is a part of, you simply write self without the quotes, all lower case. So to create a button on itself, you would use self.createButton(table_of_paramiters). ここでLUAを書くと、それはまるでグローバルに似ています。 スクリプトが含まれているオブジェクトを参照する必要がある場合を除いて、引用符なしにすべて小文字の self と書くだけです。 そのため、ボタン自体を作成するには、self.createButton(table_of_paramiters)を使用します。 Closing I hope this introduction to LUA has helped you better understand some of the underlying mechanics of scripting. If not, then I hope you get lost on your way to throttle me. LUAの紹介が、スクリプトの基本的な仕組みの一部を理解するのに役立ちました。 もしそうでなければ、私はあなたが私を抑えるためにあなたの道に迷ってくれることを願っています。 Remember, the Knowledge Base has information on all the functions which are a part of Tabletop Simulator. That, and some basic practice with if/else/then and for loops will let you accomplish most anything you want. Good luck. 知識ベースには、卓上シミュレータの一部であるすべての機能に関する情報があります。 それと、if / else / thenとforループを使ったいくつかの基本的な習慣は、あなたが望むほとんどのものを達成できるようにします。 がんばろう。 Also, if you are on you way to coding, I have started a list of functions to take care of some more complex processes in Lua. You can find it here. また、あなたがコーディングする方法を知っているなら、私はLuaでもっと複雑なプロセスを扱う関数のリストを開始しました。 ここで見つけることができます。