Этап 1.1
Этап 1.1
Сначала я хочу преобразовать вещи вида 10 operators : GOTO 20 — то есть безусловный переход. Просматривая листинг сверху вниз делаем следующее:- 70 PRINT "стекло":GOTO 90 # линейный переход
- 80 PRINT "пальцы":R=1:GOTO 40
- 90 IF K=0 THEN K=1:GOTO 30
- 70 PRINT "стекло" # GOTO заменяем на 90 строку
- IF K=0 THEN K=1:GOTO 30
- 80 PRINT "пальцы":R=1:GOTO 40 # не на 90 строку
- 90 IF K=0 THEN K=1:GOTO 30 # недостижимый код, никогда не выполнится
На самом деле более общая замена GOTO 90 должна быть на блок от 90 строки до конца кода, но так как в 90 строке стоит GOTO 30 (30 < 90), то весь остальной код можно обрезать.
Итак, имеем:
- 10 Y=0:K=0:R=0
- 20 IF Y=0 THEN GOTO 100
- 30 PRINT "как шоколад в руке"
- 40 IF Y=1 AND K=1 AND R=0 THEN GOTO 80
- 50 IF Y=1 AND K=1 AND R=1 THEN GOTO 110
- 70 PRINT "стекло"
- IF K=0 THEN K=1:GOTO 30
- 80 PRINT "пальцы":R=1:GOTO 40
- 100 Y=1:GOTO 70
- 110 PRINT "не могут прикоснуться к тебе"
- 120 REPAINT:SLEEP 5000
Этап 1.2
Этап 1.2
После того как я удалил GOTO в 70 строке, мне хочется сделать то же самое и в 80 строке, там тоже безусловный переход:- 30 PRINT "как шоколад в руке"
- 40 IF THEN ...
- 50 IF THEN ...
- 70 IF THEN ...
- 80 PRINT "пальцы":R=1:GOTO 40
- 30 PRINT "как шоколад в руке"
- while (true) {
- 40 IF THEN ...
- 50 IF THEN ...
- 70 IF THEN ...
- 80 PRINT "пальцы":R=1
- }
Имеем:
- 10 Y=0:K=0:R=0
- 20 IF Y=0 THEN GOTO 100
- 30 PRINT "как шоколад в руке"
- while (true) {
- 40 IF Y=1 AND K=1 AND R=0 THEN GOTO 80
- 50 IF Y=1 AND K=1 AND R=1 THEN GOTO 110
- 70 PRINT "стекло"
- IF K=0 THEN K=1:GOTO 30
- 80 PRINT "пальцы":R=1
- }
- 100 Y=1:GOTO 70
- 110 PRINT "не могут прикоснуться к тебе"
- 120 REPAINT:SLEEP 5000
Этап 1.3
Этап 1.3
С этого момента я буду лишь писать преобразования, их можно делать в любом порядке, разница лишь в том, насколько запутанным получится выходной код.- 10 Y=0:K=0:R=0
- if (Y != 0) { # можем заменить if.
- 30 PRINT "как шоколад в руке"
- while (true) {
- 40 IF Y=1 AND K=1 AND R=0 THEN GOTO 80
- 50 IF Y=1 AND K=1 AND R=1 THEN GOTO 110
- 70 PRINT "стекло"
- IF K=0 THEN K=1:GOTO 30
- 80 PRINT "пальцы":R=1
- }
- }
- 100 Y=1:GOTO 70
- 110 PRINT "не могут прикоснуться к тебе"
- 120 REPAINT:SLEEP 5000
1.4
1.4
- 10 Y=0:K=0:R=0
- if (Y != 0) { # можем заменить if.
- 30 PRINT "как шоколад в руке"
- while (true) {
- if (! (Y==1 & K==1 & R==0) ) { # можем заменить это
- 50 IF Y=1 AND K=1 AND R=1 THEN GOTO 110
- 70 PRINT "стекло"
- IF K=0 THEN K=1:GOTO 30
- }
- 80 PRINT "пальцы":R=1
- }
- }
- 100 Y=1:GOTO 70
- 110 PRINT "не могут прикоснуться к тебе"
- 120 REPAINT:SLEEP 5000
1.5
1.5
Применим трансформацию, вынесем goto из if.- 10 Y=0:K=0:R=0
- if (Y != 0) {
- 30 PRINT "как шоколад в руке"
- while (true) {
- if (! (Y==1 & K==1 & R==0) ) {
- [bool] goto_50_110 = (Y==1 & K==1 & R==1);
- if (!goto_50_110) { # заменили GOTO 50, выходим из условия
- 70 PRINT "стекло"
- IF K=0 THEN K=1:GOTO 30
- }
- }
- if (goto_50_110) then goto 110 # вынесли GOTO 50 сюда
- 80 PRINT "пальцы":R=1
- }
- }
- 100 Y=1:GOTO 70
- 110 PRINT "не могут прикоснуться к тебе"
- 120 REPAINT:SLEEP 5000
Далее вынесем goto из цикла:
- 10 Y=0:K=0:R=0
- if (Y != 0) {
- 30 PRINT "как шоколад в руке"
- while (true) {
- if (! (Y==1 & K==1 & R==0) ) {
- [bool] goto_50_110 = (Y==1 & K==1 & R==1);
- if (!goto_50_110) {
- 70 PRINT "стекло"
- IF K=0 THEN K=1:GOTO 30
- }
- }
- if (goto_50_110) break; { # вынесли из while и из if'a (дальше нет операторов).
- 80 PRINT "пальцы": R=1
- }
- }
- if (goto_50_110) then goto 110
- 100 Y=1:GOTO 70
- 110 PRINT "не могут прикоснуться к тебе"
- 120 REPAINT:SLEEP 5000
Вынесем из if'a:
- 10 Y=0:K=0:R=0
- if (Y != 0) {
- 30 PRINT "как шоколад в руке"
- while (true) {
- if (! (Y==1 & K==1 & R==0) ) {
- [bool] goto_50_110 = (Y==1 & K==1 & R==1);
- if (!goto_50_110) {
- 70 PRINT "стекло"
- IF K=0 THEN K=1:GOTO 30
- }
- }
- if (goto_50_110) break; # вынесли из while и из if'a (дальше нет операторов).
- 80 PRINT "пальцы": R=1
- }
- }
- if (goto_50_110) then goto 110
- 100 Y=1:GOTO 70
- 110 PRINT "не могут прикоснуться к тебе"
- 120 REPAINT:SLEEP 5000
Следующим шагом заменим обычный if (cond) goto 110; ... 110 PRINT.
- if (!goto_50_110) {
- 100 Y=1:GOTO 70
- }
- 110 PRINT "не могут прикоснуться к тебе"
- 120 REPAINT:SLEEP 5000
Открыть спойлер
Закрыть спойлер
- int Y = 0, K = 0, R = 0;
- if (Y != 0) {
- 30 PRINT "как шоколад в руке"
- while (true) {
- if (! (Y==1 & K==1 & R==0) ) {
- [bool] goto_50_110 = (Y==1 & K==1 & R==1);
- if (!goto_50_110) {
- 70 PRINT "стекло"
- IF K=0 THEN K=1:GOTO 30 # Вот это нужно пропустить вниз, после while.
- }
- }
- if (goto_50_110) break;
- print("пальцы"); R = 1;
- }
- }
- if (!goto_50_110) {
- Y = 1;
- GOTO 70; # Вот это нужно закинуть наверх, перед if.
- }
- print("не могут прикоснуться к тебе");
- repaint(5000);
Открыть спойлер
Закрыть спойлер
- if (Y != 0) {
- 30 PRINT "как шоколад в руке"
- while (true) {
- if ( .. ) {
- [bool] goto_50_110 = ( ... );
- if (!goto_50_110) {
- 70 PRINT "стекло"
- [bool] goto_70_30 = (K == 0);
- if (!goto_70_30) { }
- }
- }
- if (goto_50_110) break;
- if (goto_70_30) break;
- ...
- }
- GOTO 30;
- }
- ...
- 30 PRINT "..."
- ...
- GOTO 30
- ###
- while (true) {
- 30 PRINT "..."
- ...
- }
Остаётся прокинуть GOTO 70 наверх перед циклом, там дальше есть способы, которые позволяют просунуть его в цикл, в условия.