2017-06-13 8 views
2

golfscriptでループが壊れている間にネストされているのですか?golfscriptのネストされたwhileループでエラーが発生しました

私は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 
Output: 

"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" 

しかし、私はQループ内Zループを入れて、私は奇妙な結果を得る場合:Zは二回プリントアウトに基づいて

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

    Q 1- :Q; 
}while 
Output: 

"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" 

を、それが唯一の現在の条件付きブロックがあるように思える、と任意の"while"を実行すると上書きされます。

いずれにしても、golfscriptでどのようにこの偉業を達成することができますか?

答えて

2

残念ながらネストされた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}/ 
}/ 
関連する問題