1

ゴルフスクリプトでループが壊れている間にネストされていますか、それとも使用方法がわかりませんか?

Q を 5 から 0 に反復し、反復ごとに Z を 10 から 0 に反復します。単一のループは個別にうまく機能し、自己完結型のように見えます (操作間のスタックに依存していません)。

5:Q;
{"Q:"Q+ p Q}
{
  Q 1- :Q;
}while

10:Z;{"Z:"Z+ p Z}{Z 1- :Z;}while

出力:

"Q:5"
"Q:4"
"Q:3"
"Q:2"
"Q:1"
"Q:0"
"Z:10"
"Z:9"
"Z:8"
"Z:7"
"Z:6"
"Z:5"
"Z:4"
"Z:3"
"Z:2"
"Z:1"
"Z:0"

しかし、Z ループを Q ループ内に配置すると、奇妙な結果が得られます。

5:Q;
{"Q:"Q+ p Q}
{
  10:Z;{"Z:"Z+ p Z}{Z 1- :Z;}while

  Q 1- :Q;
}while

出力:

"Q:5"
"Z:10"
"Z:9"
"Z:8"
"Z:7"
"Z:6"
"Z:5"
"Z:4"
"Z:3"
"Z:2"
"Z:1"
"Z:0"
"Z:0"

Z が 2 回出力したことに基づいて、現在の条件付きブロックは 1 つしかないように見え、「while」を実行するとそれが上書きされます。

いずれにせよ、golfscript でこの偉業を達成するにはどうすればよいでしょうか?

4

1 に答える 1

5

残念ながら、(唯一の) インタープリターはネストされた do/while/until ループを正しく処理していないようです。この問題は、これらのループが 2 つ同時にネストされている場合にのみ発生し、ループのタイプが異なる場合には発生しないようです。

例えば:

{0do 1}do       #not an infinite loop, but it should be
{0{}while 1}do  #is an infinite loop as expected
{0{"i"p}while 1}{"o"p}while
     #not an infinite loop, outputs "i" instead of continuously outputting "o"

奇妙なことに、私は以前にこのエラーに気づいていませんでした。一般に、適用可能な場合は、do/while/until ループを使用するよりも、コンストラクト{ }%を使用する方が適切です。{ }/あなたの例では、次を使用する方が良いでしょう:

6,-1%{:Q"Q: "\+p
 11,-1%{:Z"Z: "\+p}/
}/
于 2010-10-13T19:36:19.443 に答える