HANOI.RIG 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. -- Hanoi tower problem
  2. #MAIN
  3. OPEN S ' ';
  4. LOOP
  5. $Count:=#CALL_PAS(1 ' Rings count = ') ;
  6. IF #NUMBER($Count) -> BREAK FI;
  7. END;
  8. $STATE:=#INIT($Count); -- Global variable
  9. #VIDEOSHOW(T);
  10. #H( $Count 1 3 );
  11. ##
  12. #H
  13. $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 ' Press Enter')/##
  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. /##