hanoi.rig 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. -- Hanoi tower problem
  2. #MAIN
  3. OPEN S ' ';
  4. $Count:=4; -- Count of rings in first tower
  5. S<<' Rings count =' $Count ;
  6. $STATE:=#INIT($Count); -- Global variable
  7. #VIDEOSHOW(T);
  8. #H( $Count 1 3 );
  9. ##
  10. #H
  11. $Num $From $To
  12. /
  13. S<< ' $Num $From $To =' $Num $From $To ;
  14. IF $Num=1 ->
  15. S << 'FROM' $From 'TO ' $To;
  16. #VIDEOMOVE ($From $To);
  17. #VIDEOSHOW (T)
  18. ELSIF T->
  19. $Middle := 6-$From-$To ;
  20. #H( $Num-1 $From $Middle );
  21. #H( 1 $From $To );
  22. #H( $Num-1 $Middle $To )
  23. FI / ##
  24. #INIT $Count
  25. / $V:=(.
  26. <. LEN : COPY($Count), BODY : (.COPY($Count).) .>
  27. <. LEN : 0 , BODY : (.0.) .>
  28. <. LEN : 0 , BODY : (.0.) .> .);
  29. LOOP
  30. IF $Count=1 -> BREAK FI;
  31. $Count:=COPY($Count-1);
  32. $V[1].BODY!.:=$Count;
  33. $V[2].BODY!.:=0;
  34. $V[3].BODY!.:=0;
  35. END;
  36. RETURN $V;
  37. / ##
  38. #VIDEOMOVE
  39. $From $To
  40. /
  41. $S_from := LAST #MAIN $STATE [$From];
  42. $S_to := LAST #MAIN $STATE [$To];
  43. $Ring:=COPY( $S_from.BODY[$S_from.LEN]);
  44. $S_from.BODY[$S_from.LEN]:=0;
  45. $S_from.LEN+:=-1;
  46. $S_to.LEN+:=1;
  47. $S_to.BODY[$S_to.LEN]:=$Ring;
  48. /
  49. ##
  50. #VIDEOSHOW
  51. / $X:=LAST #MAIN $STATE;
  52. $I:=1;
  53. LOOP
  54. S<<$I ' ';
  55. #STR($X[1].BODY[-$I]);
  56. S<]' ';
  57. #STR($X[2].BODY[-$I]) ;
  58. S<]' ';
  59. #STR($X[3].BODY[-$I]);
  60. IF $I>=LAST #MAIN $Count -> BREAK;FI;
  61. $I+:=1;
  62. END;
  63. S<<;
  64. #CALL_PAS(1 '<<<<<>>>>>>')/##
  65. #STR
  66. $N
  67. / $E:=LAST #MAIN $Count-$N;
  68. #FILL(' ' $E);
  69. #FILL('O' 2*$N);
  70. #FILL(' ' $E)/ ##
  71. #FILL
  72. $SYM $CNT
  73. /LOOP
  74. $CNT:=$CNT-1;
  75. IF $CNT<0 -> BREAK FI;
  76. S<]@$SYM;
  77. END;
  78. /##