プレイ日記
まげ MAGE_LOVEMARINE
イルカ鑑賞プログラム「ドルフィン・ダンス」の軽量化に成功。37495KBだったのが、6516KBになりました(約5分の1!)。内容の変更はありません。 公開キー【 2R24VWQE 】
21そうだね
プレイ済み
返信[1]
親投稿
nobu divine-creator
まさか、イルカがハリボテに変わっていたとは…|д゚)?!(←勘違いw!) どおりで軽くなったわけだ!(←まだ言うかww!) え?!結果にコミットしただけ?(←イルカが減量w?) マッチョなイルカだったのかー?(←何だそれww?)
0そうだね
プレイ済み
返信[2]
親投稿
まげ MAGE_LOVEMARINE
>nobuさん そんなまさか。単に、1つ1つの命令に付けていた「Heavy」を取ったら軽くなったってだけの話ですよー。(←そんなまさか(^^;)) …マジレスしちゃうと、例えばAAAAAだったところをA*5としたような、そんな感じです。
0そうだね
プレイ済み
返信[3]
親投稿
nobu divine-creator
たぶん、私が現在作成中のプログラムも無駄が多そうなので、きっと減量ができるのだと思います…(´・ω・`)。 ただ、やせさせる方法が分からないだけで…orz。
1そうだね
プレイ済み
返信[4]
親投稿
まげ MAGE_LOVEMARINE
>nobuさん 「同じ処理をする命令群があちこちにある→サブルーチン化する」なんてのも、プログラム簡略化の方法のひとつですね。あとは、プチコン3号で使える命令とその働きを、ひとつでも多く学び、場面に応じて「使い分け」できるようになるか、ですね。
0そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
プログラムを短く記述するスキルを高めようとするならばOSPやQSPといった文字数制限プログラムを作るのが一番ですね。 制限があることで短く書く必然性が出てくるし短くすることで同じ文字数でも様々なことができるようになり完成度アップにもつながります。 他の人が作ったそういったプログラムを見て技術を盗むと良いです。 私のプチコン3号本「QSP完全マニュアル」では詳細な解説をしています。
1そうだね
プレイ済み
返信[6]
親投稿
nobu divine-creator
そのプログラムの簡略化が苦手で、単純な省略はできても複雑な省略ができないという…orz。
0そうだね
プレイ済み
返信[7]
親投稿
おちゃめ ochame_nako
複雑な省略というのがどいういうものかよく分かりませんが同じ結果になる処理を別の命令や演算子を使って記述するだけなので難しいことは何もありません。 ただし、普通に動くプログラムを作るのが精一杯ならば無理に短く記述する必要性はないと思います。
1そうだね
プレイ済み
返信[8]
親投稿
出来ることやればええんやでえ~。 っと、おおちゃくものが言ってみる。
1そうだね
プレイ済み
返信[9]
親投稿
Hanzo rzsense
プチコン3号はユーザーが使えるメモリーが潤沢にあるので、プログラムを短くできないからと言って悩む必要はないと思いますが、一方で、長かったプログラムを、努力や工夫の末に短くできると、テトリスがうまくハマるのに似たカタルシスが得られるんですよねー。
1そうだね
プレイ済み
返信[10]
親投稿
nobu divine-creator
うわっ!いつの間にか複数のアドバイスが…Σ(゚Д゚)! 皆さん、参考になる御意見をありがとうございます(^◇^)♪ とりあえず正常に動けば良いとは思っているのですけど、あまりにも似たような形式の命令をたくさん並べていると、もっとまとめて省略できるのだろうなぁ…と思ってしまいます(´・ω・`)。 けれど、X軸だけとかY軸だけとか一方が揃っているのをまとめることはできても、同時にまとめることができない…という感じです…orz。
0そうだね
プレイ済み
返信[11]
親投稿
まげ MAGE_LOVEMARINE
動けばいい、というのは私も同意するところですが、でもせっかく省略してみたいという気持ちがあるのなら、あきらめないでほしいなと思います。 BT=BUTTON() IF BT==4 THEN X=X-1 IF BT==8 THEN X=X+1 なんてのも、 BT=BUTTON() X=X-(BT==4)+(BT==8) と書くことで、1行減らせるわけですから。
1そうだね
プレイ済み
返信[12]
親投稿
nobu divine-creator
えーっΣ(゚Д゚)!それって、同じ意味になるんですか(?_?)? (BT==4)や(BT==8)が1と同じなんですか?(たぶん、違う気がする…。) でも、続いていたらX=X-1+1になって、+-0になってしまうから、1になるわけじゃないのでしょう…。 う~ん…、何故同じになるのか?全く分からない…OTL。
0そうだね
プレイ済み
返信[13]
親投稿
まげ MAGE_LOVEMARINE
カッコの中身は「条件式」で、基本的に条件式は、結果が成立しているなら1(TRUE)を、成立していないなら0(FALSE)を返します。 BT=BUTTON() X=X-(BT==4)+(BT==8) の場合、例えば十字ボタン左(ボタンID:4)を押すと、式の中身は、 X=X-(4==4)+(4==8) となります。で、(4==4)は成立しているから1、(4==8)は成立していないから0になり、 X=X-1+0 という式となり、結果としてXから1を引くことになるのです。ちょいとややこしいけど、色々応用の利くワザですよ♪
1そうだね
プレイ済み
返信[14]
親投稿
まげ MAGE_LOVEMARINE
DIRECTモードで「PRINT 1==1」や「PRINT 1==2」等を試すとわかりやすいですよ。もちろん「PRINT」を「?」と略しても構いません。
0そうだね
プレイ済み
返信[15]
親投稿
おー、日経ソフトウエアでサラーっとやってたことが、まげさんの説明でわかった気がします、ありまとう☆
0そうだね
プレイ済み
返信[16]
親投稿
nobu divine-creator
おおっ!分かりやすい解説ありがとうございます♪ 確かに、それなら1と0になりますね! ただ、続けて書いても問題ないのは、片方しか入力されないからですか? 左右の同時押しは通常不可能なのでOKだと思いますが、上下と左右の組み合わせなら同時に押せてしまいますよね?その場合でも、その書き方で大丈夫なのでしょうか?
0そうだね
プレイ済み
返信[17]
親投稿
まげ MAGE_LOVEMARINE
>うぎゃ〜さん やったー! 日経ソフトウェアに勝ったー! え? 違う?(^^;) ちなみに例えのプログラムに、 X=X*(X>=0)*(X<=9)+(X>9)*9 と付け加えると、Xが0以上9以下の範囲を超えないようになります。条件式は、ホントに便利ですよ〜♪
0そうだね
プレイ済み
返信[18]
親投稿
まげ MAGE_LOVEMARINE
>nobuさん そこで登場するのが「ビット演算」なのです。よく使われるのは「AND」で、例えば「IF BT AND 16 THEN…」等ですね。ここで注意ですが、論理演算子としてのANDとは意味が全然違います。…ってこの説明じゃわかりづらいんですが(^^;)、とりあえずANDには2通りの使い方があるとだけご記憶ください。さて、結論から言いますと、 BT=BUTTON() X=X-((BT AND 4)==4)+((BT AND 8)==8) Y=Y-((BT AND 1)==1)+((BT AND 2)==2) これで、十字キー左右でXが、上下でYが増減するようになり、さらに右上、左下などのナナメ入力にも対応します。なぜそうなるかは…かなり難しい説明になってしまいます(^^;)。同じく「? 4 AND 4」「? 8 AND 4」「? 1+4 AND 4」等と試してみてください。
1そうだね
プレイ済み
返信[19]
親投稿
nobu divine-creator
うぎゃ~Σ(゚Д゚)!(←さんではありません!) 0以上9以下の式は分かるけれど、それ以外の部分が全く分からない…OTL。 0をかけたら全て0になるけれど、右のほうの式を足しているから0以下にはならない…ということらしいということしか分からない…。 他人が書いた式が分からない人間が、自分でその式を書けるはずはない…(´・ω・`)!
0そうだね
プレイ済み
返信[20]
親投稿
Hanzo rzsense
私も、条件式演算は頻繁に使います。昔のBASICではどういうわけか、IF分岐より条件式演算の方が高速と信じられていたので、それが習慣化されているんですよね。 例えば、カウントアップして1000でカウンターを止めたいときは、 C=C+(C<1000) または INC C,C<1000 カウントダウンして、0でカウンターを止めたいときは、 C=C-(C>0) または DEC C,C>0 なんてやります。 ところで、SmileBASICでは、条件「真」は「1」ですが、昔のパソコンのBASICでは、条件「真」は「-1」だったのです。(機種にもよるかも知れませんが、少なくともMSX BASICではそうでした) ゆえに、条件式演算は全て符号を逆にして考える必要があり、ちょっとだけややこしかったんですよね。
0そうだね
プレイ済み
返信[21]
親投稿
MIKI ifconfig
文献によるとある種の basic では、 goto の飛び先は goto 命令の内部で、プログラムの先頭から行番号を線形サーチするといった実装になってたらしいですね。 「よく使うサブルーチンはプログラムの最初に置け」 みたいな know how があったとのこと。 プチコンは中間コードにコンパイルしてから実行するらしいので、そのようなマヌケなことは無いでしょう。(ただし乗算・goto・配列・incの激遅四天王あり)
0そうだね
プレイ済み
返信[22]
親投稿
すぎ field2050
イルカがかわいいので、少し圧縮してみました。10%ぐらい減ります。プログラムの修正は37行目だけで、あとデータの&H808080を&H80とか&H505050を&H50とか全置換を10回ぐらいすれば完成です。
0そうだね
プレイ済み
返信[23]
親投稿
まげ MAGE_LOVEMARINE
>nobuさん 今回、簡略化がテーマだったので、なるべく短くなる記述を選びましたが、 BT=BUTTON() IF BT AND 4 THEN X=X-1 IF BT AND 8 THEN X=X+1 IF BT AND 1 THEN Y=Y-1 IF BT AND 2 THEN Y=Y+1 とプログラミングしても同じ動作をしますし、動作に体感できる差はありません。どうか焦らずに、ステップアップしてください。
1そうだね
プレイ済み
返信[24]
親投稿
まげ MAGE_LOVEMARINE
>Hanzoさん TRUEが-1って、何か憶えがあります。-1は16進数だと&HFFFFFFFF。&H00000000と真逆ってコトなのかもしれませんね。 >MIKIさん 線形サーチ…行番号時代のGOTOについて考えたことはありませんでしたが、言われるとナルホドな仕組みですね。昔はそういう「スペックの不足を知恵で補う」的な工夫も、楽しみのひとつでした(^^)。 >すぎさん うかつでしたー! グレイスケールだからRGBのどれか1要素で充分なんですよね。まさに「知恵」! せっかくなのでさらに追求すると、2ケタの最大「&HFF」は、10進数なら「255」。さらに1バイト削れます!(^^) その結果を…お見せしたかったのですが、なぜかさっきから3DSでネットにログインできず難儀してます(^^;)。なので文章だけですが、結果は、すぎさん案からさらに100KBほど軽量化できました。感謝感服です♪
0そうだね
プレイ済み
返信[25]
親投稿
Hanzo rzsense
そう言えば、C言語でも「TRUE」は「-1」で定義されてますね。おっしゃるとおり、「0」の全ビット反転の意味でしょう。 ところで、まげさんも3DSでMiiverseにログインできませんか!実は私もなんですよ。何かあったんですかね。
0そうだね
プレイ済み
返信[26]
親投稿
まげ MAGE_LOVEMARINE
>Hanzoさん 調べたら、12月17日の15:01頃から今(21:30)に至るまで復旧できずにいる、任天堂のトラブルらしいです。今夜はあきらめたほうがよさそうですね。
0そうだね
プレイ済み
返信[27]
親投稿
Hanzo rzsense
ところで、プチコンでは、RGB各&H00~&HFFの256階調で色を指定しますが、内部的にはRGB各&H00~&H1Fの5ビット32階調しかないんですよね。その意味では、さらに3ビット削れることになりますが、その3ビット分を詰めたり、再び展開したりする処理が若干ややこしいですね。
0そうだね
プレイ済み
返信[28]
親投稿
nobu divine-creator
イルカがかわいいので、圧縮?! かわいい⇒圧縮?! 何か納得できない言葉が…(´・ω・`)。 イルカ「何するんじゃー!圧し潰す気か?!(^言^)」
0そうだね
プレイ済み
返信[29]
親投稿
まげ MAGE_LOVEMARINE
>Hanzoさん FOR Y=0 TO 255:GLINE 0,Y,399,Y,RGB(Y,Y,Y):NEXT これで段差ができちゃう現象のことですね。なるほどとは思うものの、そこまで踏み込めるほど修羅ではないので、私はこのへんで(^^;)。 >nobuさん ほら、「ねんどろいど」だって、等身のあるキャラを縮めてかわいいじゃないですか(^^)。
0そうだね
プレイ済み
返信[30]
親投稿
MIKI ifconfig
Hanzoさん > C言語でも「TRUE」は「-1」で定義されてますね。 どの C 言語ですか???
1そうだね
プレイ済み
返信[31]
親投稿
nobu divine-creator
なるほど!確かに、デフォルメされたキャラはかわいくなる……って、それは「圧縮したらかわいくなった♪」であって、「かわいいから圧縮しよう!」ではないはず…(?_?)? 「可愛い子には旅をさせよ」と同じ?……違うかー?!(笑)
0そうだね
プレイ済み
返信[32]
親投稿
おちゃめ ochame_nako
プチコン3号はRGB指定できるのが32bit、実際の表示は16bitなのですが、これはシフト演算で簡単に変換できるため変換関数を作っておけば難しいことは何もありません。(大量に変換するならば自作関数での対応は速度がネックになるけど) 詳しくは「プチコン3号入門講座」に書いてあります。 プログラムリストの短縮法については初心者であっても論理式のような汎用性が高いものは知っておくと良いかもしれませんね。 とはいえ、短さを追求すると可読性が激しく下がってしまうためそのような短縮法は文字数制限プログラム以外は使わない方が無難です。 例えば256という数字は#Lとすることで1文字短縮できる場合があります。 ただし、限界に挑戦するというのは面白いので興味があればチャレンジしてみてもいいと思います。
0そうだね
プレイ済み
返信[33]
親投稿
すぎ field2050
言葉が足りませんでした。 イルカがかわいい→ソースが気になる→変数を変えて、イルカを増やしたりサイズを変えたりしてみる→データ部分に同じ2桁の数字が3個ずつ並んでいることに気がつく→コーディング魂に火がつく→圧縮してみる こんな流れです。
1そうだね
プレイ済み
返信[34]
親投稿
まげ MAGE_LOVEMARINE
>MIKIさん 調べると、C言語の場合はFALSEが0、それ以外がTRUEだそうです。 で、プチコンもそうでした。道理でIF BT AND 16等が成り立つわけですね。 >nobuさん ま、一種の「言葉のお遊び」と理解するのがいいと思いますよ。 >おちゃめさん GSPOITで値を得てRGBREADでバラして8でDIVったら、一発でした(^^;)。 結果、さらに200KBほどダイエット成功です。試してみるものですね。 >すぎさん フォローありがとうございます。イルカたちも喜んでおります♪
0そうだね
プレイ済み
返信[35]
親投稿
まげ MAGE_LOVEMARINE
ということで、再軽量化+タイトルや色合い等を少し変えたバージョンです。 公開キー【 Q3253XTD 】
0そうだね
プレイ済み
返信[36]
親投稿
Hanzo rzsense
>MIKIさん あっ・・・すみません!堂々とウソをついてしまいまして恐縮です。 ・・・と、ミスをして落ち込んだときは、この作品を鑑賞して、イルカたちに癒されるに限ります。
0そうだね
プレイ済み
返信[37]
親投稿
まげ MAGE_LOVEMARINE
>Hanzoさん 階調の件、多いに参考になりました。ありがとーございます。 ピーピーピー、ピーキッピー♪(←イルカ語のなぐさめ(^^))
0そうだね
プレイ済み