2

シェル スクリプトがあり、dc(1) を使用して計算を行います。

先頭にゼロを付けて 1 つの数値を出力する必要があります。dc 自体でこれを行う簡単で簡単な方法を見つけることはできませんが、マンページには次のように記載されています。

Z
スタックから値をポップし、その桁数 (文字列の場合は文字数) を計算し、その数値をプッシュします。数値の桁数には、基数の右側にある場合でも先行ゼロは含まれません。

これは、簡単で簡単な方法があることを意味します...

これを実現する方法は無数にあることを私は知っており、スクリプトはそのうちの 1 つを使用して問題なく実行されています。私はただ興味があります;-)

4

3 に答える 3

3

これを試してください:

入る:

[lc1+dsc0nld>b]sb
[sddZdscld>bp]sa
999
12lax

出力:

000000999

入る:

3lax

出力:

999

マクロの終了後、元の番号はスタックに残されます。使用されるレジスタ: a(マクロ)、b(マクロ)、c(カウント)、d(数字)。

説明:

マクロがセットアップを行い、元の番号をa呼び出して出力します。b

  • sd- 出力する桁数をレジスタに格納するd
  • dZ- 元の番号を複製し、その桁数をプッシュします
  • dsc- そのカウントを複製し、レジスタに格納しますc
  • ld>b- register から必要な数字をロードし、dそれが count より大きい場合はマクロを呼び出しますb
  • p- 元の番号を印刷する

マクロbは、カウントが目的の桁数よりも大きくなるまでゼロを出力します

  • lc1+- レジスタからカウントをロードし、cインクリメントします
  • dsc- カウントを複製し、それを保存して登録しますc
  • 0n- 改行なしでゼロを出力する
  • ld>b- register から必要な数字をロードしますd。それがまだインクリメントされたカウントよりも大きい場合は、ループバックしてマクロbを再度実行します。そうでない場合は、呼び出し元に戻ります (macro a)

任意の先頭文字を使用するには:

[lclkZ+dsclknld>b]sb
[sksddZdscld>bp]sa
999 14 [ ] lax
           999
[abc] 12 [-] lax
---------abc

他のレジスタに加えてk、文字 (実際には複数の可能性があります) を格納するために使用します。

[XYZ] 6 [def] lax
defXYZ
8 [ab] lax
abababXYZ
4 [ghjikl] lax
ghijklXYZ

埋め込み文字列は全体として使用されるため、目的の長さの数値が元の文字列の長さよりも大きく、2 つの文字列の長さ (または整数の倍数) よりも小さい場合、結果は要求したよりも長くなる可能性があります。

于 2011-03-17T17:25:15.483 に答える
0

エレガントではありませんが、以下に例を示します。これは、先頭に 2 つのゼロを付けて 999 を出力します。桁数を増やすには、コードを複製する必要があります。

#Push number to print on stack
999

# macro to print a zero
[[0]P]sa

# Print a zero if less than 5 digits
dZ5>a

# Print a zero if less than 4 digits
dZ4>a

# Print a zero if less than 3 digits
dZ3>a

# Print a zero if less than 2 digits
dZ2>a

# Print out number
p
于 2011-03-17T09:25:42.380 に答える