...なぜそうではないのか!
REPORT z.DATA:a(16),c TYPE qfranint.a = 'bugs in the code'.data(b) = 99.WRITE:/ b,a.WHILE b > 0.WRITE:/ b,a,/'Take one down and patch it around'.CALL FUNCTION
'QF05_RANDOM_INTEGER' EXPORTING ran_int_max = 21 IMPORTING ran_int = c.b = b + c - 17.IF b < 1.b = 0.ENDIF.WRITE:/ b,a,/,/ b,a.ENDWHILE.
確かに他の言語に比べて競争力はありませんが、最初に書いた330バイトからスリム化することさえできたので、個人的な勝利としてカウントします。
ABAPでは255文字を超える行を許可しないため、スペースを改行に置き換える必要がありました。Windowsでは、CRLFにより最初はサイズが296バイトに増加しましたが、LFのみで問題なく動作します。ABAPは確かに多くのスペースを必要とするため、これは大した問題ではありません。
WRITEは単にテキストをGUIにダンプするだけなので、それは標準出力に似ていると思いますか?おそらく構造またはテーブルを使用することでここでいくつかのバイトを節約できますが、SAPが混合構造(文字と数字を含む)を処理する方法のため、私が想像したアプローチは非Unicodeシステムでのみ機能します...両方にアクセスできるにもかかわらず、行きます。
乱数用の汎用モジュールは、私たちのシステムで見つけることができる唯一のものです。短い名前またはパラメーターを持つものがあると思います。わからない!
多かれ少なかれ読みやすいコード、コメントが含まれています:
REPORT z.
"Define a (text) and c (random)
DATA: a(16),
c TYPE qfranint. "A stupid data type for a random INT
"This is shorter than using VALUE (saves 3 bytes)
a = 'bugs in the code'.
"This is slightly shorter than doing ',b TYPE i' and 'b = 99'. (saves 2 bytes)
data(b) = 99.
"first line has to be outside of loop due to our exit condition (saved me ~5 bytes)
WRITE: / b,a. "\n xx bugs in the code
WHILE b > 0.
WRITE: / b,a, "\n xx bugs in the code
/'Take one down and patch it around'.
"This ridiculous function for random numbers...
"To save some bytes, I leave ran_int_min at it's default
"of 1, and set the max to 21 instead, from which I remove
"17 later on, resulting in a range of [-16,4]
"Compare:
" ' - 17' = 5 bytes
" ' ran_int_min = -16' = 18 bytes
"(saves 13 bytes)
CALL FUNCTION 'QF05_RANDOM_INTEGER'
EXPORTING ran_int_max = 21
IMPORTING ran_int = c.
"Maximum number of bugs added: 4 = 21 - 17
"Maximum number of bugs removed: -16 = 1 - 17
b = b + c - 17.
IF b <= 0.
b = 0.
ENDIF.
WRITE: / b,a,/,/ b,a. "\nxx bugs in the code\n\nxx bugs in the code
ENDWHILE.
挑戦してくれてありがとう!
私の上司に:私を解雇しないでください、私はただ自分自身を教育しています!