トピック
受付中
Ϊċăņ ďо įт hikahikaru3

コードの短縮術交換トピック

題名どおりです OSPとかQSPってよく「これ動くのか?!」とか「その発想はなかった」っていうのありますよね。 例えばSPSET 0,1の代わりにSPSET.,1のような。 皆さんどしどしお願いします、なんでもしますから!(なんでもできるとは言ってない)
6そうだね
未プレイ
返信[1]
親投稿
最近驚いたのがEXECで無限ループです。 配列の添字に条件式とか。 A!=B がA-B とか…地味ですね。
3そうだね
プレイ済み
返信[2]
親投稿
Ϊċăņ ďо įт hikahikaru3
こういちさん いえいえ、そんなことないですよ! それだけでも一字縮まるじゃないですか。
2そうだね
未プレイ
返信[3]
親投稿
!!AはA==TRUEの短縮形じゃ無かった。 (正しくはA!=0)
2そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
短縮方法は非常にたくさんあるためそれだけで本が1冊書けるレベルとなります。 実際、私もQSPで同人誌を2冊作りました。 リスト短縮もA==0を!Aにするなどの無条件で単純置き換えが可能なものだけではなくIF A THEN ?"ABC"を?"ABC"*Aにするなどの特別な条件下でのみ置き換えが可能なものもあります。むしろ、後者の方が圧倒的に多いです。 例えばMID$(A$,X,1)はA$[X]に無条件で置き換えができそうですが、実は置き換えができるのはXが範囲外に出ないということが前提となります。 スペース、コロンの省略、引数の省略などは地味ですが多用が可能なリスト短縮法です。
4そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
QSPを作る場合には「実際は異なるけど大体同じような動作のもの」も結構リスト短縮として用いられます。(これは厳密に言えば短縮ではないのですが) 例えばAボタン入力待ちなどがこれに相当します。 Aボタン入力待ちはREPEAT:WAIT:UNTIL BUTTON(2)==#Aと記述できますが、QSPではDIALOG""やLINPUT A$などが良く使われます。これによって何と20文字以上が短縮です。 実際にプログラムを作る場合は仕様が満たせるのであればどんな方法を用いても問題ないので「完全置き換え」を考える必要はないです。
3そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
というわけで、実際の短縮例を見ていきます。 1つ目はSIMPLE PAINT QSPです。 https://miiverse.nintendo.net/posts/AYMHAAACAAADVHkuvFo95w このプログラムはQSPでありながらカラー対応、擬似筆圧対応というお絵かきツールです。 このプログラムは限界まで短縮されているだけあってリスト短縮は随所で行われていますが、目立つ短縮ポイントといえばON GOTOの多用です。 これによってIF~THEN~ELSEやWHILE~WENDを使うよりもリスト短縮が可能です。
2そうだね
プレイ済み
返信[7]
親投稿
おちゃめ ochame_nako
2つ目は連射計測QSPです。 https://miiverse.nintendo.net/posts/AYIHAAAEAAASVZKc070TUA 注目すべきはGFILL 50,40,350,Y,-75E5の部分です。 定数リテラル#Yが使われていますが、128、256、512という値が欲しい場合には定数リテラル#Y、#L、#Rを使うことで1文字短縮可能です。ただし、命令の末尾の引数ではコロンが必要になるため短縮には繋がりません。 あと、色コードは白を-1とするというのは良く使用されますが、-256で黄色、そして指数を使うことで特定色の近似色が表現可能です。-73E5は緑がかったグレーですが、モノクロ液晶の背景っぽい色にしたかったけどRGB(144,156,96)とするよりも10文字も短縮できています。
2そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
3つ目はPETIT PAINT QSPです。 https://miiverse.nintendo.net/posts/AYIHAAAEAAArVRTsk6CEtg このプログラムはSIMPLE PAINT QSPと同じくお絵かきツールですが、こちらは単色ということで一見劣って見えますが、円形ブラシというアドバンテージがあります。 というわけで、このPETIT PAINT QSPの最大のリスト短縮ポイントは塗りつぶし円です。 GCIRCLE M,N,R,8 GPAINT M,N,C,8 GCIRCLE M,N,R,C これは普通に自前で作った塗りつぶし円と比べて数分の1~数10分の1のサイズとなります。(この方法を用いずに単にGCIRCLEをGPAINTで塗りつぶすだけでは塗り漏らしが出てしまう) さらに円描画によってペンのカーソルも表現できています。(これが非常に使いやすい)
2そうだね
プレイ済み
返信[9]
親投稿
おちゃめ ochame_nako
というわけで、実際の使用を見て短縮例を書いていきましたが、当然ながらこんなのはほんのごく一部です。(書き出したらキリがない) まだまだ無数の短縮法が存在しますが、これ以外のものは私が過去に作ったQSPを見て貰うのが一番です。 もちろん他の方が作ったQSP、OSPには私が使用していない短縮法が用いられたりする場合もあるのでそれも参考になると思います。 個人的には「何のために短縮するのか」が重要だと思います。コードゴルフであれば短縮することに意義がありますが、QSPを作る場合にはそうではないと私は考えます。(下記リンク先参照) https://miiverse.nintendo.net/posts/AYMHAAADAAB2V0erQWuGiw 長くなりましたが、私は以上のような感じですね。
2そうだね
プレイ済み
返信[10]
親投稿
おちゃめ ochame_nako
一部訂正 × IF A THEN ?"ABC"を?"ABC"*Aにする      ↓ ○ IF A THEN ?"ABC"を?"ABC"*!!Aにする ○の方でも完全置き換えではないのは?"ABC"*!!AというのはIF A THEN ?"ABC" ELSE ? の置き換えだからです。(Aが0の時もPRINT自体は実行されてカーソル位置が変わり改行されたりする) これと同じくIF A THEN BEEP 3はBEEP 3,,!!A*99に不完全置き換えが可能です。
3そうだね
プレイ済み
返信[11]
親投稿
「実用上は完全」なら手元にあった X=X+!(4AND B)-!(8AND B) の代わりに X=X+((12AND B)-6)/2 ※Bはボタン値 左右移動に使うやつ。 左右同時押しが3DSの設計上、物理的にできないので「実用上は」完全。
4そうだね
プレイ済み
返信[12]
親投稿
おちゃめ ochame_nako
あまさとしおんさんへ 十字ボタンにおいて12AND Bという値は0、4、8という3通りの値を返します。 X=X+((12AND B)-6)/2に置き換えが可能なのはBの値が4もしくは8の場合(12AND Bが0以外の場合)のみです。 したがって、置き換えを狙うならばC=12AND B:X=X+(C-6)/2*!!Bとなります。したがって、リスト短縮にはなりません。(というか、比較対象となっている元の形がすでにリスト短縮された状態だし) 12AND Bが0、4、8の値を返すのを0、-1、1に変換できれば置き換えが可能なので X=X-((B AND 12)+1)MOD 3+1とすることができますがこれでもリスト短縮にはなりません。
2そうだね
プレイ済み
返信[13]
親投稿
おちゃめ ochame_nako
(続き) MODが%の1文字で済んでいたプチコンmkIIならばこの方法でX=X-((B AND 12)+1)%3+1と記述できるためリスト短縮が可能なのですが、mkIIならばここからさらにX=X-(B%16-B%4+1)%3+1という感じでリスト短縮が可能です。 リスト短縮という側面から見るとプチコン3号では%(1文字)がMOD(4文字)になったのは痛いですね。(%が整数型のサフィックス記号に使われているため仕方がないことですが)
1そうだね
プレイ済み
返信[14]
親投稿
おちゃめ ochame_nako
訂正 C=12AND B:X=X+(C-6)/2*!!B → C=12AND B:X=X+(C-6)/2*!!C
1そうだね
プレイ済み
返信[15]
親投稿
れい rei-nntnd
「リスト短縮」って何?
1そうだね
プレイ済み
返信[16]
親投稿
あ、ほんとだ。 押してないときの処理を忘れてたorz... ボタン押下時のみ実行する箇所でしか使えないんだった
1そうだね
プレイ済み
返信[17]
親投稿
おちゃめ ochame_nako
れいさんへ 「リスト短縮」というのは「プログラムリストの短縮」の略語です。 昔はよく使われていた言葉ですが、最近は「ソースコードの短縮」という言い方の方が多いでしょうね。 前者はインタープリタ系の言語、後者はコンパイル系の言語でよく用いられている言葉(80年代でもC言語は「ソースコード」と呼んでいた)ですが、これは厳密な定義があるわけではなく私は「プログラムリスト」という言葉に「ソースコード」という言葉を包含するという認識を持っているというのもあるし、長年使ってきたので言い慣れているというのもあります。とはいえ、「プログラムリスト」と「ソースリスト」を厳密に使い分けている人もいることでしょう。
1そうだね
プレイ済み
返信[18]
親投稿
おちゃめ ochame_nako
(続き) そのコードの「短縮」ですが、基本的に記述される文字数が減ったら「短縮された」という判断で問題ありません。したがって、スペースやコロンといった文字も減らせればコードの短縮といえます。1文字=1バイトとは限らないためコードの短縮は必ずしもメモリ使用量を減らせるとは限らないものの昔のポケコンは1KB前後のメモリという機種も多く短縮できなければゲーム作りで不利になるほどのメモリしか搭載されてないため短縮すること自体に大きな意味がありました。 とはいえ短縮によるメリットよりも可読性が下がるデメリットが多く(例外的に短縮によって可読性が上がる場合もある)普通にプログラミングを行うのに十分なメモリが搭載されている昨今では短縮を行う意義もほとんどはなく短縮は個人の嗜好や趣味の世界と考えた方が良いかもしれません。(長くても短くても自分が思った通り動けばすべて正解だし)
1そうだね
プレイ済み
返信[19]
親投稿
おちゃめ ochame_nako
(続き) 例えば「コードゴルフ」みたいに短くするのが目的というものもありますが、プチコン3号のOPS(1画面プログラム)やQSP(WIDTH 16使用時の1画面プログラム)では短くすることが目的ではなく制限内に収めることが目的です。 したがって、「短くする」というのはより「多くのゲームを面白くする要素を搭載する」ということに繋がるため短縮は間接的にゲームやツールの出来をアップすることに繋がると私は思っています。もちろん、これはQSPやOSPといった制限付きプログラムに限った話ですが。 というわけで、「リスト短縮」という言葉の意味や目的について初心者でも分かるように長々と書いてみました。(れいさんが「リスト短縮」という言葉が分からないのではなく「リスト短縮」という言葉が分からない初心者もいるという意味で書いたのだと思うし)
1そうだね
プレイ済み
返信[20]
親投稿
ちなみに実際のお仕事でのコード短縮はあんまり意識されることなくて、 開発期間に間に合うように動くモノを作るのがお仕事で、 なおかつ何人かでプログラムを作るので「短さ」より「わかりやすさ」が優先されます。 なので、プチコン以外のほとんどの言語では、難解で短くするより、みんなが見てもわかりやすいプログラムが良いとされます。 ポケコンとメモリと短縮はおちゃめさんが書かれてるとおりで、BASICはコンパイルされて実行コードが短くなるわけでは無く、入力されたコードそのものが実行プログラムとなるので 同じように動くプログラムでも1文字でも短ければ短いほどさらにメモリが使えて追加でコードも書くことができるのです。 QPSなどは実用的と言うよりは、プチコンとBASICを使ったパズルで、 パズル自体は生活してて実用的ではないけど、なにかと考え方は役には立つので、どうすれば短縮できるかを考えるのが大切です
1そうだね
プレイ済み
返信[21]
親投稿
おちゃめさんのコードで使われてるのをちょっと説明 ・前の命令と次の命令を1行で書く場合に「:」でつなぐけど、 数字→英字、記号→英字など、命令の切り替わりが判断出来る場合は「:」は無くてもいい(引数の最後が#Yだと次の命令も英字なので:が必要になる) ・数値の書き方は数字だけではなく「-2E3」「-73E5」など、「E」を使った書き方がある(常用対数) 「E」は「10の何乗か」を表すので「-2E3」は「-2*1000=-2000」となる 「-73E5」は HEX$(-73E5)=&hFF909C60 なので、色の値として有効な値となる ※「&H」で16進数値が表せるように「-2E3」は文字ではなく数値なのです(数字以外でも数値を表せます) ※数値なので「A=3:B=-2EA」みたいに変数は使えません ※10のマイナス2乗は 1/100 なので「1E-2」は「0.01」になります
1そうだね
プレイ済み
返信[22]
親投稿
・「IF A THEN ?"ABC"」 を 「?"ABC"*A」に BASICのプログラムとしては「Aが成り立つならABCを表示」と「ABCをA回表示する」だけど この目的としては「A(条件)が成り立つならABCを表示したい」 プチコンでは条件式が成り立たない場合は 0 で、成り立つ場合は 1 となります。 A(条件)が成り立てば「?"ABC"*A」は ABCを1回表示するので、結果的に ABC が表示されます Aは条件式の結果なので「X=3:?"ABC"*(X>2)」は条件成立で ABCが表示されます 条件式が成り立つ場合の 1 を 表示するための1回として使っているので、目的が違うけど、プチコンでの短縮として使っているのです ※本当は目的が違う同士は使っちゃダメで「BUTTON() AND #BLUE」はABXY→ボタン判定として動くけど文章として理解すると間違いなのと同じ
1そうだね
プレイ済み
返信[23]
親投稿
最近QSPを作ったのでペタリ。 短縮ポイントはスプライトの管理番号に4で割った数を利用している点です。 スプライトの管理番号に4で割った数を利用しているのは、 IF!(T MOD 4)THEN SPSET (以下略) と似たような効果を狙いました。 ただし、画面上部がうるさくなります。 そして、SPOFSの代わりにSPANIMを利用している点も短縮のポイントと言えると思います。 SPANIMはアニメーションをする方法としてはかなりの短さを持っているだけでなく、SPOFSと似たような効果を持っているため、 わざわざSPOFS S,RND(400),0SPANIM S(略) と書かずに SPANIM1つにまとめることが出来ます。 ただ、アニメーションに1フレームが必要になるため、画面上部がうるさいです。
1そうだね
プレイ済み
返信[24]
親投稿
A=(A+1)MOD 256 よりも A=A+1AND 255 の方が短く書けます。 (MODは+より優先度が高いが、ANDは+より優先度が低いため)
0そうだね
プレイ済み
返信[25]
親投稿
ボタンで分岐 ON LOG(B+1,2)-4GOTO@A,@B,@X,@Y
0そうだね
プレイ済み