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

アバター
だにえる ◆m76OCAQyrWGt
2019/1/24 15:49
コンテスト
第255回非公式ぷづこん適性検査
問題:PRINT命令の挙動について1334文字以内で説明しなさい。引数の型による違いや、一部の特殊な引数による挙動に加え、カーソル位置についても考慮すること。ただし、LOCATEやCOLORやATTR等との関係性は省いてよいものとする。

コメント

アバター
ブルー 2019/1/24 16:36 ◆F30iKws/Dqrq
今までに、254回もやっていたのか...(困惑)
アバター
Ryou Tanpo 2019/1/24 19:55 ◆AI5iRr9FjmkJ
PRINT 命令は、引数をコンソールに表示する。

表示できるものは、整数値、NaN と無限大を含む倍精度実数値、文字列であり、配列変数、RETURN で値を返されなかった関数の戻り値、省略された DEF の仮引数は表示できずにエラーとなる。
表示は左から右へ向かって行われ、右端を超えようとすると改行される。改行された時点で下端に到達した場合は、自動でスクロールされる。
引数はカンマかセミコロンで区切って、複数指定することができる。セミコロンで区切られると引数はスペースなどで区切られることなくくっついて表示される。カンマで区切られた次の引数は (X座標%TABSTEP)==0 となる右に向かって次の位置から表示される。引数がない場合を除き末尾にもセミコロンとカンマを付加することができる。
末尾にセミコロンがないとき、最後に改行が行われる。また、引数が何もないときは、改行のみを行う。

整数値はそのまま表示されるが、非常に大きな数値を指定すると下位が丸められる場合がある ( 条件未検証 )
倍精度実数値は小数点第8位まで表示される。数値によっては指数表記となる場合がある ( 条件未検証 )
NaN と無限大は、それぞれ nan あるいは inf と表示し、またそれらが負である場合には符号も表示される。
文字列においては、ほとんどの文字がそのまま表示される。ただし CHR$(10) は表示されようとした時点で改行が行われる。CHR$(13) は改行マークを表示する。
アバター
Ryou Tanpo 2019/1/25 16:29 ◆AI5iRr9FjmkJ
うーん難しい……なんかあってない気がしてきた
アバター
おちゃめ 2019/1/27 12:54 ◆jH1opV6FnGyx
Ryou Tanpoさんのコメントに対する補足を書いておきます。

セミコロンを付けた時の挙動

プチコン3号は一番下の行にPRINTで表示した際には自動的に改行となりますが、セミコロンを付けることでこの自動的な改行が行われなくなります。(ただし、表示文字数が多く画面内に収まらない場合は改行処理が行われる)

なお、1つのPRINTに対して記述できるセミコロンは127個まで有効で128個目以上を書いても無視されます。
さらに詳しく書くと128個以上記述した場合の有効数は「セミコロンの数 MOD 128」となり、セミコロンが130個ならば先頭から2つのセミコロンが有効となります。ちなみに128個(もしくはその倍数)ならば「0個有効」なので何も表示されなくなります。

カンマを付けた時の挙動

標準ではTABSTEPは4なのでLOCATE 2,0:PRINT"ABC",DEF"とするとLOCATE 2,0から"ABC"と"DEF"が3キャラ分の隙間で表示されるのですが、この隙間にはCHR$(0)が自動的に表示されます。
この自動的に表示されるCHR$(0)を活用することで表示の桁数が減った際に不要な文字が残ってしまう挙動を最も短いコードで改善できます。

 FOR I=15 TO 0 STEP -1
  LOCATE 3,0:PRINT I
  WAIT 60
 NEXT

これだと「10」の後に「90」と表示(0は10の1の位の「0」が残ったもの)されますが、下記のようにカンマを付けるだけで改善できます。

 FOR I=15 TO 0 STEP -1
  LOCATE 3,0:PRINT I,
  WAIT 60
 NEXT

これはIを表示したあとで次の表示場所までCHR$(0)で埋められる挙動を利用しているので一度にたくさんの桁が減ってしまう場合などは表示座標やTABSTEPの値を調整する必要があります。

なお、カンマとセミコロンと同じく1つのPRINTに対して「カンマの数 MOD 128」が有効数となります。
アバター
おちゃめ 2019/1/27 12:55 ◆jH1opV6FnGyx
PRINTで表示する場合には文字列型や整数型の数値であれば全桁(画面内に収まらない文字数に達した場合を除く)表示されますが、実数型では全桁を表示することはできない場合があります。
例えば、小数部を含む値の場合は小数第9位で四捨五入された値が表示されます。

実数型の有効桁数は2進数で53bitとなっているため10進数換算すると16桁弱となります。
しかし、内部では2進数であるがゆえに多くの場合は10進数の値を正確に処理することができず、丸めた値となります。例えば0.1は2進数では循環小数となるためプチコン3号上では0.10000000000000001という値となっています。
これはIEEE754が定める倍精度浮動小数点に準じたものとなっていて内部では0011111110111001100110011001100110011001100110011001100110011010という2進数表記となっています。循環小数なので桁が無限に続くのですが、仮数部は52bitなのでこれからあふれた分に関しては丸め処理が行われます。この丸め処理は四捨五入ではなく「最近接偶数丸め」となっています。
これは52bitという仮数部からあふれた値に対する丸め処理であるため小数値に限らず整数値においても同様のことが言えます。
仮数部の52bitに暗黙の1bitを追加した11111111111111111111111111111111111111111111111111111(←「1」が53個)が「丸められない最大の整数値」となります。(整数値といっても整数型ではなく実数型の値)
これは9007199254740991(2の53乗-1)です。(誤差のない連続した整数値だと9007199254740992が最大)
したがって、2の100乗とかの絶対値が大きな値を表示すると全桁を正しく表示ができないため下の方に0が並んだ丸められた値を表示します。
アバター
おちゃめ 2019/1/27 12:58 ◆jH1opV6FnGyx
プチコン3号で実数型の値を表示する際には実数型の丸め処理に加えて上記の小数値の丸め表示があるのですが、この丸め表示を回避するためには私の自作関数PSTR$を使うと便利です。(公開キー 【 NKADEE93 】)
このPSTR$を使うことでプチコン3号のあらゆる数値を誤差なく文字列に変換することができ、桁数が大きいものは指数表記を行うためFORMAT$を使うよりも分かりやすい表示が可能です。(プチコン3号で普通に数値を表示した場合に指数表記になることはなく1E100のように指数表記で指定した値であって末尾に0を羅列した指数ではない表示となる)
ちなみにSTR$では絶対値が1000000以上、もしくは、0.0001未満の数値を文字列化した場合には指数表記となります。ただし、その際にはPSTR$とは異なり丸め誤差が発生します。(実数型の有効桁数は16桁弱あるので最大6桁となってしまうSTR$では値に小数を含む時点で変換時に誤差が発生してしまう)

実数型で扱える絶対値最小の値は2の-1022乗となる2.2250738585072014E-308なのですが、実は定数に限り4.9406564584124654E-324という値を表示が可能です。PSTR$を使えばこれが表示可能なのです。(4.9406564584124654E-324は0と等しい値)

なお、プチコン3号では定数値もしくは定数値の演算であれば演算結果が整数型の範囲に収まる値であれば自動的に整数型となり、それ以外は実数型となります。
しかし、変数を含む演算の場合は状況が変わります。これに関しては説明すると長くなるので省略します。


というわけで、簡単に補足を書いていきましたが、この補足部分だけで2000文字以上あるためPRINTについてすべて説明しようと思ったら1334文字ではとても足りませんね。
アバター
だにえる 2019/1/28 2:30 ◆m76OCAQyrWGt
Ryou Tanpo氏の程度で
概ね十分正解な感じです。
(細かい採点とかは考えてない)


>>『1つのPRINTに対して記述できるセミコロンは127個まで有効で128個目以上を書いても無視されます。』
これに関しては僕も知りませんでした。
一行のDATAに記述出来る数が4096個だという仕様とかに似てますね(?)。
アバター
Ryou Tanpo 2019/2/1 22:13 ◆AI5iRr9FjmkJ
まだまだ勉強不足ですね……
でも参考になりました。ありがとうございます!
アバター
カルティエコピー 2022/10/3 4:20 ◆A/jTq4fx8vP7
迅速な対応と大変丁寧な梱包をしていただきました。
スタッフさんの手書きのお手紙も添えて頂き、とても好感を持ちました。
又、ご縁がありましたら、宜しくお願いします。
カルティエコピー https://www.bagraku.com/bagraku39/index_13.html

コメントを書く

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

- WEB PATIO -