2010-10-12 4 views
1

Вложены, когда петли разбиты в golfscript или я не знаю, как их использовать?golfscript вложенные в то время как петли

Я хочу повторить 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 печати дважды, похоже, есть только один текущий условный блок, и любое исполнение «а» переписывает его.

В любом случае, как я мог бы выполнить этот подвиг в golfscript?

ответ

5

Похоже, что (только) интерпретатор, к сожалению, не обрабатывает вложенные do/while/until петли правильно. Проблема, похоже, возникает только тогда, когда у вас есть две из этих циклов того же времени, вложенные, а не когда циклы - разные типы.

Например:

{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}/ 
}/