コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
キルル2 ◆rGE712Ruejv7
2019/7/6 2:03
質問
シンプルなループ
以下のプログラムがあります
VAR a[0],b
READ b
WHILE b>=0
PUSH a,b
READ b
WEND
DATA 1,2,3.-1
このプログラムを動かすと、配列Aの中身は[1,2,3]となります
DATAが-1だけのときは、配列Aの中身は空です
このプログラムを、挙動を全く変えないで、より短くする方法を探しています(READの記述を1回だけに減らしたい、もしくは何らかの別の方法)
回答よろしくお願いします

コメント

アバター
でんぺん 2019/7/6 12:22 ◆HfSy5ayxtyTa
短くはなってませんがこういうケースで僕がよく書くパターンだけ載せておきます。

VAR a[0],b
WHILE 1
READ b
IF b>=0 THEN BREAK
PUSH a,b
WEND

無限ループを作ってしまうところが人によっては気になるかもしれませんが…。あとプチコン4では無限ループ用の命令があるっぽいのでそっちに置き換えてもいいかもですね。
アバター
ZEX 2019/7/6 12:24 ◆RrwFtq39WJM3
プチコン4ならX-BASICやC言語みたいに配列の初期値を設定することもできるよ
DIM A[]=[1,2,3]
アバター
しんいち 2019/7/6 15:11 ◆lHy.hAWXbthn
VAR a[0],b
@L READ b
IF b>=0THEN PUSH a,b:GOTO@L
DATA 1,2,3,-1
アバター
でんぺん 2019/7/6 17:27 ◆HfSy5ayxtyTa
そういえばBASICなのだからGOTOを使えばしんいちさんのように書けましたね。でもそこまでしたならなぜいっそ、

@L READ b:IF b>=0THEN PUSH a,b:GOTO@L

そして1行で出来るみたいにしなかったのかな? まあマルチステートメント使ってるだけなので意味があるかはともかく使わないという方針でも無さそうなのでふと思っただけで、プログラムがシンプルという点ではしんいちさんのはかなりシンプルだと思います!
アバター
キルル2 2019/7/6 22:31 ◆rGE712Ruejv7
あきとさん
そういえばCOPYでもDATA読み込みできましたね
でもダメです
DATAの書き換えが面倒くさくなるためです
何個のデータが置いてあるのか、手動ではなく、自動で数え上げるべきだと考えます
アバター
キルル2 2019/7/6 22:34 ◆rGE712Ruejv7
イスターリャさん
DEF化すれば可読性が上がるのは確かにそうですが、この質問は、そのDEFの中身をどう短く書くかというのが本質です
アバター
キルル2 2019/7/6 22:41 ◆rGE712Ruejv7
ツララさん
REPEATならREADは一回になりますよね
でもこれだと、IF文で条件判断1回、UNTILでも1回で計2回の条件判断をしてるじゃないですか
そこがもったいないなと、どうにかできないかなと思うんですよね
アバター
キルル2 2019/7/6 22:42 ◆rGE712Ruejv7
ZEXさん
プチコン4って便利ですね…
アバター
Na 2019/7/6 22:46 ◆QoELVrBXBQCI
WHILE 1
READ b
IF b==-1 THEN BREAK
PUSH a,b
WEND
私は普段こう書いています

追記 あ、上に同じのあった
アバター
Na 2019/7/6 22:51 ◆QoELVrBXBQCI
思いついたっ
REPEAT
READ b
PUSH a,b
UNTIL b==-1
c=POP(a)
アバター
キルル2 2019/7/6 22:51 ◆rGE712Ruejv7
でんぺんさん
「今のでも最短に近い」自分もそう感じてます
質問することで、何か新しい発見があればいいなと思ってます
COPYは長さが決まってれば楽ですね
今回は長さが決まってないパターンなのでCOPYは使えないのです
でんぺんさんがよく書くパターン、私も以前まではそれでした
ですがやはりどうしてもWHILE 1が気になりますし、IF THEN BREAKと書くのも面倒くさいと感じてしまうようになったのです
プチコン4ではWHILE〜WENDがLOOP〜ENDLOOPになるんだと思いますが、それでもIF THEN BREAKは残りますし頭が痛いですね
アバター
キルル2 2019/7/6 23:06 ◆rGE712Ruejv7
しんいちさん
大変申し訳ないですがラベルとGOTOは使いたくないです
その理由は主に3つあります
1、ラベル名の長さによってプログラムの長さが左右される
2、ラベル名を考えるのが面倒くさすぎる
3、@で始まるのが文字列になるとかいうラベル周りの仕様を覚えたくない

自分は、ラベルを使うのはRESTOREを使うときだけにしたいと考えています
でも、頭から抜けていたメソッドを提示していただいて本当にありがたいです
アバター
Na 2019/7/6 23:09 ◆QoELVrBXBQCI
(参考)new3DSで速度比較
DATA100000個×10回実行した平均ミリ秒

WHILE,READ2回型(キルル2さん)→257.5
REPEAT,条件判断2回型(ツララさん)→286.1
WHILE,BREAK型(でんぺんさん)→288.5
GOTO1行型(でんぺんさん)→259.5
POP型(自分)→252.5
アバター
キルル2 2019/7/6 23:13 ◆rGE712Ruejv7
Naさん
確かに1回だけPOPをすれば良いですね
READの記述も条件判断も1回だけになっていて素晴らしいと思います
あとは実際の動作ですが、最初のコードと比べてNaさんのコードは、PUSHとPOPが増えてる分(1回ずつ分だけ)変わるでしょうね
それでも、1つの最適解かもしれませんね
そういうのがパッとひらめくのって凄いことだと思います
アバター
キルル2 2019/7/6 23:15 ◆rGE712Ruejv7
Naさん
速度比較もしてくださったんですね
ありがたいです
POP型が最速とは驚きです…
アバター
キルル2 2019/7/6 23:22 ◆rGE712Ruejv7
そういえばプチコンはWHILEよりREPEATの方が実行速度が速いとかあったような無かったような
アバター
ツララ 2019/7/8 10:12 ◆ArUdBYOYME1V
最後にPOPで要素削るの、ガーっと一気食いして最後にゲップしてるみたいで面白いですね。

閃くというか、疑問に思った箇所を無視しないで蓄積しつつ丁寧に考えていけば
自ずと辿り着ける地点なだけで
美味しいところだけしか見ない雑な思考をする人には、思考がジャンプしてるように見えるってだけですな。

ループの出口でREADしたDATAが-1という条件でループを抜ける

つまり要素の末尾は必ず-1になる配列ができる

そしてこの末尾の要素は要らない

PUSH命令を使ってるなら、リファレンスを参照していれば同様の配列操作命令のPOPやSHIFTやUNSHIFTの存在も知っているはず

ならば「加える」の反対の操作で削ればいいのでは…

結果的に何かいい感じ

キルル2さんの「READ命令を一回にしたい」って要望に
変な理由付けてはぐらかすようなコメントが最初の方にあって不安になりましたけど
Naさんのおかげで理想的な流れになりましたね。
アバター
キルル2 2019/7/9 10:25 ◆rGE712Ruejv7
ツララさん
私は雑な思考をしてましたか…精進します
よく考えたら、末尾が常に-1だから、ループに使うときとか要素数-2までアクセスするようにすれば、POPも要らなくなってスッキリですね
アバター
ツララ 2019/7/12 11:57 ◆ArUdBYOYME1V
私だって普段は雑な思考してますよ。
閃くのがすごいって思うのはいいんですけど、そこに至った過程を推察してくれた方が
閃いた本人的にも嬉しいんじゃないかと思っただけですし。

速度重視だったら一々ループ内で配列操作すらしないで
DATA文にラベルを付けて

VAR a[0],b,c
RESTRE "@1"
c=0
REPEAT
 READ b
 c=c+1
UNTIL b<0
COPY a,"@1",c
@1
DATA 1,2,3, … ,-1

ってやると良いかも
精進は大切ですな。
アバター
Na 2019/7/12 20:16 ◆QoELVrBXBQCI
雑な思考をしてるのは自分も同じですよ。

上のツララさんのプログラム→93.1ミリ秒
そうか、その手があったかー

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -