2010-10-12 11 views
1

Sont imbriqués alors que les boucles sont cassées dans golfscript ou que je ne sais pas comment les utiliser?golfscript imbriqué en boucle

Je souhaite parcourir Q de 5 à 0, et pour chaque itération, j'analyse Z de 10 à 0. Les boucles simples fonctionnent bien séparément, et elles semblent indépendantes (ne reposant pas sur la pile entre les opérations):

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

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

sortie:

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

Mais si je mets la boucle Z dans la boucle Q, je reçois des résultats étranges:

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

    Q 1- :Q; 
}while 

Sortie:

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

Basé sur Z imprimer, il semble deux fois comme il n'y a qu'un seul bloc conditionnel actuel, et toute exécution de « tandis que » l'écrase.

En tout cas, comment pourrais-je accomplir cet exploit dans golfscript?

Répondre

5

Il semble que l'interpréteur (seulement) ne gère malheureusement pas correctement les boucles do/while/until imbriquées. Le problème ne se pose que lorsque deux de ces boucles de la même heure sont imbriquées, et non lorsque les boucles sont de types différents.

Par exemple:

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

Étrangement, je ne l'ai pas remarqué cette erreur avant. En général, l'utilisation des constructions { }% et { }/ sera préférable à l'utilisation des boucles do/while/until si elles sont applicables. Pour votre exemple, il serait préférable d'utiliser:

6,-1%{:Q"Q: "\+p 
11,-1%{:Z"Z: "\+p}/ 
}/