Задача 2. (5 баллов)  Деление пополам.
На поле исполнителя из кубиков собран вертикальный столбик.
Исполнитель расположен слева перед первым кубиком основания:

  ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
   │ │6│ │ │ │ │ │ │ │
  ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
   │ │5│ │ │ │ │ │ │ │
  ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
   │ │4│ │ │ │ │ │ │ │
  ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
   │ │3│ │ │ │ │ │ │ │
  ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
   │ │2│ │ │ │ │ │ │ │
  ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
   │¤│1│ │ │ │ │ │ │ │
  ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─

Разделить столбик на два, не нарушая вертикального расположения
кубиков:

  ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
   │ │ │ │ │ │ │ │ │ │
  ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
   │ │ │ │ │ │ │ │ │ │
  ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
   │ │ │ │ │ │ │ │ │ │
  ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
   │ │3│6│ │ │ │ │ │ │
  ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
   │ │2│5│ │ │ │ │ │ │
  ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─
   │ │1│4│ │ │ │ │ │ │
  ─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─


Дополнительные условия:
1) Поле исполнителя бесконечно по всем четырем направлениям.
2) Число кубиков в исходном столбике не меньше двух и четно.
3) Надписи на кубиках могут быть любыми.

п р о в е р к а  к у р а т о р а

Некоторые команды прислали на конкурс частное решение этой задачи. То
есть такое решение, которое работает только при одном состоянии среды
и не работает ни при каких других, допустимых по условию.

Это означает, что такие решения -- неверные. Все они получили только
один балл.

Оригинальное решение Жени Плотникова подвигло куратора сравнить
эффективность его решения с эффективностью решения куратора. При этом
не брались в расчет отдельные перемещения исполнителя, а только те,
которые зависят от числа кубиков в исходном столбике (именно они
реально влияют на эффективность). Смотрите эти выкладки в
комментариях куратора для команды 3115 ниже в тексте.

Что касается экономии отдельных движений исполнителя, то, хотя они
почти не влияют на эффективность (как перемещения функционально
связанные с числом n -- число кубиков в исходном столбике), но все же
полезно по возможности сокращать и их, во имя общей гармонии
программирования. От лишних корректирующих движений можно избавиться
располагая рекурсивную пружинку не после условной команды, а в ее
теле. Смотрите комментарии в решении куратора задачи 1, а также
комментарии в этом файле для команд 3108 и 3110.

Команда 3101
------------
.\01\01.txt
.\01\0121.coc
Оценка: 1

а л г о р и т м
Описания нет

п р о г р а м м а
ЭТО ДВА
  ПОВТОРИ 3 ВВЕРХ                      
  ШАГ                                  
  ШАГ                                  
  ШАГ
  ВПРАВО                               
  ВПРАВО                               
  ПОВТОРИ 3 ВНИЗ                       
КОНЕЦ
ЭТО ШАГ                                
 ВПРАВО                                
 ВЛЕВО
 ВВЕРХ
КОНЕЦ

к о м м е н т а р и й  к у р а т о р а
Решение только для одного состояния среды.

Команда 3102
------------
.\02\02.txt
.\02\0221.coc
.\02\0222.coc
.\02\0223.coc
.\02\0224.coc

Оценка: 1
Авторы решения:
Перевалова Анна. А.
Хасиева Екатерина. О.
Ветров Денис

а л г о р и т м
Нет описания.

п р о г р а м м а

в а р и а н т 1  0221.coc
ЭТО Деление_пополам
ПОВТОРИ 3 ВВЕРХ                        
ВПРАВО                                 
ВЛЕВО
ПОВТОРИ 3 ВВЕРХ
ПОВТОРИ 2 ВПРАВО
ПОВТОРИ 5 ВНИЗ                         
ПОВТОРИ 2 ВВЕРХ
ПОВТОРИ 2 ВЛЕВО
ВВЕРХ
ВПРАВО
ВЛЕВО                                  
ПОВТОРИ 2 ВВЕРХ                        
ПОВТОРИ 2 ВПРАВО                       
ПОВТОРИ 4 ВНИЗ
ПОВТОРИ 2 ВВЕРХ                        
ПОВТОРИ 2 ВЛЕВО                        
ВВЕРХ
ВПРАВО                                 
ВЛЕВО
ВВЕРХ                                  
ПОВТОРИ 2 ВПРАВО                       
ПОВТОРИ 3 ВНИЗ                         
КОНЕЦ                                  

в а р и а н т 2  0223.coc
  ЭТО Деление                          
                                       
ВПРАВО                                 
ВНИЗ
ВПРАВО
ПОВТОРИ 7 ВВЕРХ
ПОВТОРИ 6 ВНИЗ
ПОВТОРИ 2 ВЛЕВО                        
ВВЕРХ                                  
ВПРАВО                                 
ВНИЗ
ВПРАВО
ПОВТОРИ 5 ВВЕРХ                        
ПОВТОРИ 4 ВНИЗ
ПОВТОРИ 2 ВЛЕВО                        
ВВЕРХ
ВПРАВО                                 
ВНИЗ                                   
ВПРАВО                                 
ПОВТОРИ 3 ВВЕРХ                        
ПОВТОРИ 2 ВНИЗ                         
ПОВТОРИ 2 ВЛЕВО                        
ВВЕРХ
ВПРАВО                                 
ВНИЗ                                   
ВПРАВО
ВВЕРХ
ВНИЗ
ПОВТОРИ 2 ВЛЕВО
ВВЕРХ                                  
                                       
  КОНЕЦ                                

в а р и а н т 3  0224.coc
ЭТО Деление  //ЗАДАЧА 2
ПОВТОРИ 3 ВВЕРХ
ПОВТОРИ 3 РАБ1                         
ПОВТОРИ 2 ВПРАВО
ПОВТОРИ 3 ВНИЗ                         
КОНЕЦ                                  
ЭТО РАБ1
ВПРАВО
ВЛЕВО                                  
ВВЕРХ                                  
КОНЕЦ                                  

к о м м е н т а р и й  к у р а т о р а
Все программы решают частные задачи, то есть совсем не ту задачу,
которая поставлена условием.

Команда 3108
------------
.\08\08.txt
.\08\0811.coc

Оценка: 4

Авторы решения: Кичемасов Миша, Моисейченко Люда

Описание алгоритма: исполнитель ищет верхний кубик и от него
проходит половину пути, пройденного вниз, останавливается на
уровне середины столбика. Двигает верхнюю половину столбика
вправо и затем двигает ее вниз.

Программа:

ЭТО РАЗДЕЛ                             
ДЕЛЕНИЕ                                
ПОДВИНУТЬ                              
КОНЕЦ                                  
ЭТО ДЕЛЕНИЕ //Кукарача двигает верхнюю 
//половину столбика вправо             
ВПРАВО
ЕСЛИ НЕ ПУСТО ТО                       
{                                      
ВЛЕВО                                  
 ВВЕРХ
 ДЕЛЕНИЕ_1                             
}

КОНЕЦ                                  
ЭТО ДЕЛЕНИЕ_1
ВПРАВО                                 
ЕСЛИ НЕ ПУСТО ТО                       
{
ВЛЕВО
ВВЕРХ                                  
ДЕЛЕНИЕ                                
}                                      
ВНИЗ //Эти отложенные команды позволя- 
//ют Кукараче найти и отделить верхнюю 
//половину столбика.                   
КОНЕЦ                                  
ЭТО ПОДВИНУТЬ //Кукарача двигает верх-
//нюю половину столбика вправо.
ВПРАВО                                 
ЕСЛИ НЕ ПУСТО ТО                       
{                                      
ВЛЕВО
ВВЕРХ                                  
ПОДВИНУТЬ
}
ИНАЧЕ                                  
{
 ВПРАВО //Корректировка положения Ку-  
 ВВЕРХ  //карачи относительно отделе-  
}       //нной половинки столбика.     
ВНИЗ //Эти отложенные команды          
//позволяют Кукараче сдвинуть отделен- 
//ную половинку столбика вниз на нуж-  
//ное число клеток.                    
КОНЕЦ                                  

к о м м е н т а р и й  к у р а т о р а

Программа работает. Оценка снижена за:

1) Лишнее корректирующее движение вверх перед рекурсивным толканием
   столбика вниз.
Можно написать вашу концовку так:

...
  ЕСЛИ НЕ ПУСТО ТО
  {
    ВЛЕВО
    ВВЕРХ
    ПОДВИНУТЬ
    ВНИЗ           <---- пружину сюда
  }                      Теперь коррекция не потребуется.
  ИНАЧЕ ВПРАВО
КОНЕЦ


2) Плохую запись кода.


Команда 3110
------------
.\10\10.txt
.\10\1021.coc

Оценка: 3.8
Описание алгоритма:
1.Счет: поиск конца столбика с запоминанием половины шагов, рекурсивный
возврат на середину столбика.
2.Сдвиг: сдвиг половины кубиков вправо с поиском верхнего кубика
и запоминанием числа шагов. рекурсивный возврат с одновременным 
перемещением сдвинутых кубиков

п р о г р а м м а
ЭТО Деление
 ВПРАВО
 Счет
 ВВЕРХ                                 
 Сдвиг                                 
 КОНЕЦ                                 
                                       
ЭТО Счет
 ЕСЛИ НЕ ПУСТО                         
 ТО                                    
 {                                     
   ПОВТОРИ 2 Шаг
   Счет                                
 }                                     
 ВНИЗ
 КОНЕЦ                                 
                                       
ЭТО Шаг
 ВЛЕВО                                 
 ВВЕРХ
 ВПРАВО                                
КОНЕЦ                                  
                                       
ЭТО Сдвиг
ВПРАВО
ЕСЛИ НЕ ПУСТО ТО                       
{                                      
ВЛЕВО                                  
ВВЕРХ                                  
Сдвиг
}                                      
ИНАЧЕ                                  
{
ВПРАВО
ВВЕРХ                                  
}                                      
ВНИЗ
КОНЕЦ                                  

к о м м е н т а р и й  к у р а т о р а

Программа работает. Оценка снижена за:

1) Два лишних корректирующих движениях вверх.
Можно написать так:
ЭТО Деление
 ВПРАВО
 Счет
 Сдвиг
КОНЕЦ
                                       
ЭТО Счет
 ЕСЛИ НЕ ПУСТО                         
 ТО                                    
 {                                     
   ПОВТОРИ 2 Шаг
   Счет                                
   ВНИЗ
 }
КОНЕЦ
                                       
ЭТО Шаг
 ВЛЕВО                                 
 ВВЕРХ
 ВПРАВО                                
КОНЕЦ                                  
                                       
ЭТО Сдвиг
  ВПРАВО
  ЕСЛИ НЕ ПУСТО ТО
  {
    ВЛЕВО
    ВВЕРХ
    Сдвиг
    ВНИЗ
  }
  ИНАЧЕ
  {
    ВПРАВО
    ВВЕРХ
  }
КОНЕЦ

2) Плохую запись кода.


Команда 3113
------------
.\13\13.txt

Оценка: 0

Решения нет.

Команда 3114
------------
.\14\14.txt
.\14\1421.coc

Оценка: 3
Авторы решения Банников Андрей, Зайнагутдинов Азат, Юхина Даша

Описание алгоритма: Определить высоту столба. При этом мы знаем, что
количество символов четное, поэтому сразу запоминаем количество парных
перемещений. Именно такое количество элементов нужно выделить для
второго столбца. Затем устанавливаем их в указанные позиции и
возвращаем исполнителя в исходное положение.

п р о г р а м м а
ЭТО ГЛАВНАЯ
  ПРО1                                 
  ПРО2                                 
  ПРО3                                 
  ВПРАВО                               
  ВНИЗ                                 
  ПРО4                                 
  ВЛЕВО                                
  ВЛЕВО                                
  ВЛЕВО                                
  ВВЕРХ
КОНЕЦ                                  
                                       
ЭТО ПРО4                               
  ВЛЕВО                                
  ЕСЛИ НЕ ПУСТО ТО { ВПРАВО
                     ВНИЗ              
                     ПРО4 }            
КОНЕЦ
ЭТО ПРО3                               
 ВЛЕВО
 ЕСЛИ НЕ ПУСТО ТО  { ВПРАВО            
          ВВЕРХ                        
          ПРО3 }                       
    ИНАЧЕ  { ВВЕРХ                     
             ВЛЕВО }                   
 ВНИЗ                                  
КОНЕЦ                                  
                                       
ЭТО ПРО2                               
  ПОВТОРИ 2 ВЛЕВО                      
  ЕСЛИ НЕ ПУСТО ТО                     
               { ПОВТОРИ 2 ВПРАВО
                 ВНИЗ                  
                 ПРО2 }                
       ИНАЧЕ ПОВТОРИ 2 ВПРАВО          
  ВВЕРХ                                
КОНЕЦ
                                       
ЭТО ПРО1                               
  ПОВТОРИ 3 ВПРАВО
  ЕСЛИ  НЕ ПУСТО ТО { ПОВТОРИ 3 ВЛЕВО  
                      ВВЕРХ
                      ПОВТОРИ 3 ВПРАВО 
                      ПОВТОРИ 3 ВЛЕВО  
                      ВВЕРХ            
                      ПРО1 }           
          ИНАЧЕ ПОВТОРИ 2 ВПРАВО       
  ВНИЗ                                 
КОНЕЦ                                  

к о м м е н т а р и й  к у р а т о р а
Программа работает. Оценка снижена за неоптимальность:
очень много лишней работы делает исполнитель!

Команда 3115
------------
.\15\15.txt
.\15\1511.coc

Оценка: 4.5

Решение 1521.
Автор решения Филиппов Василий.

Описание алгоритма:
 
Исполнитель толкает все кубики вправо, запоминая ходы парами.
Он выполняет процедуру Шаг пока не пусто, причем рекурсивно
запоминает количество шагов. Когда он наталкивается на пустоту,
выполняет отложенные команды, то есть выполняет процедуру
"Подстановка", двигаясь вниз и уравнивая столбики.

Программа:

//Задачу решил Филиппов Василий.       
                                       
ЭТО Пополам
 ВПРАВО                                
 Столб                                 
 ВПРАВО ВВЕРХ ВПРАВО ВНИЗ              
КОНЕЦ // Пополам
//-------------------------------------
// Рекурсивная прцедура для выполнения 
// хода и подстановки.
ЭТО Столб                              
 Шаг
 ЕСЛИ НЕ ПУСТО                         
  ТО                                   
   {                                   
    Столб                              
    Подстановка                        
   }                                   
 ИНАЧЕ                                 
  {                                    
   ВНИЗ                                
   }                                   
КОНЕЦ // Столб                         
                                       
//-------------------------------------
                                       
ЭТО Подстановка                        
  ВПРАВО ВВЕРХ ВПРАВО ВНИЗ             
  ВНИЗ ВВЕРХ ВЛЕВО
  ВЛЕВО ВНИЗ
КОНЕЦ //Подстановка                    

//-------------------------------------

ЭТО Шаг
  ВЛЕВО ВВЕРХ ВПРАВО ВЛЕВО ВВЕРХ       
  ВПРАВО                               
КОНЕЦ //Шаг                            
                                             
Решение 1522.
Автор решения Филиппов Василий.

Описание алгоритма:
 
Он выталкивает все кубики из первого столба во второй через одну клетку.
Он выполняет эту процедуру пока не пусто,
причем Кукарача рекурсивно запоминает количество шагов, которые
он делает. Когда он наталкивается на пустоту он начинает выполнять отложенные
команды, то есть движется вниз, уравнивая столбики.

Программа:

//-------------------------------------
ЭТО Пополам
 ВПРАВО                                
 ВЛЕВО
 ПОВТОРИ 2 ВВЕРХ
 Столб                                 
КОНЕЦ // Пополам                       
                           
ЭТО Столб                              
 ВПРАВО                                
 ЕСЛИ НЕ ПУСТО
  ТО
   {
    ВЛЕВО                              
    ВВЕРХ                              
    ВВЕРХ                              
    Столб
    ВЛЕВО                              
    ВНИЗ                               
    ВВЕРХ                              
    ВПРАВО
    ВНИЗ
   }
 ИНАЧЕ
  {                                    
   ВНИЗ
   ВПРАВО
  }                                    
КОНЕЦ // Столб                         

Решение 1523
Автор: Плотников Евгений                                           

Описание алгоритма и программа

//-------------------------------------
// Описание                            
//  Первая часть:                      
//    Ставит исполнителя на исходное
//  место и запускает Вторую часть.    
//  Вторая часть:                      
//    Отщитывает каждый второй кубик   
//  и запоминает это количество.
//  Посчитав возврашает кубики на
//  место(аналагично) с помощю Третьей
//  части.
//  Четвертая часть:                   
//    Делит весь столбик пополам, а
//  именно:отпускается пружина из
//  части II и опускает пружиной из    
//  части III.                         
// Описание                            
//           Автор: Плотников Евгений  
//-------------------------------------
ЭТО Половина
  ВВЕРХ
  ВПРАВО                               
  ВЛЕВО                                
  Считай                               
КОНЕЦ                                  
// Конец "Половина"
//-------------------------------------
ЭТО Считай
  ПОВТОРИ 2 ВВЕРХ                      
  ВПРАВО
  ЕСЛИ НЕ ПУСТО
       ТО
          {
            ВЛЕВО                      
            Считай
          }
       ИНАЧЕ                           
             {                         
               ПОВТОРИ 2 ВПРАВО        
               Возврат                 
               Перевод                 
               ВПРАВО
             }
  ВНИЗ                                 
КОНЕЦ                                  
// Конец "Считай"                      
//-------------------------------------
ЭТО Возврат
  ПОВТОРИ 2 ВНИЗ
  ВЛЕВО
  ЕСЛИ НЕ ПУСТО                        
       ТО
          {
            ВПРАВО
            Возврат
          }                            
       ИНАЧЕ ПОВТОРИ 2 ВЛЕВО
  ВВЕРХ
КОНЕЦ                                  
// Конец "Возврат"                     
//-------------------------------------
ЭТО Перевод                            
  ВПРАВО                               
  ЕСЛИ НЕ ПУСТО
       ТО
          {                            
            ВЛЕВО                      
            ВВЕРХ                      
            Перевод                    
          }
КОНЕЦ
// Конец "Перевод"
//-------------------------------------

к о м м е н т а р и й  к у р а т о р а

Решение 1522. Автор: Филиппов Василий.

Решение 1522. Автор: Филиппов Василий.

Решение 1523. Автор: Плотников Евгений

Первые два решения нарушают вертикальное расположение кубиков, хотя
очень интересны.

Оценим по эффективности решение куратора и решение Жени.

Пусть столбик имеет n кубиков в высоту.

Решение куратора
~~~~~~~~~~~~~~~~
 n
 3  сдвиг вправо всего столбика 3n - движений
 2
¤1

 n
¤3  сдвиг вниз n/2 - движений
 2
 1


  n
  3  смещение верхней половинки вправо 3n/2 - движений
 2
 1



  ¤  смещение верхней половинки вниз n/2 - движений
 2n
 13

-----------------------------
Всего: 3n + n/2 +3n/2 + n/2 = 5n/2

Решение Жени
~~~~~~~~~~~~

 n
 3  сдвиг каждого второго кубика вправо: 2n
 2
¤1

 n
 3  возврат кубиков на место: 2n
 2
 1¤

 n
¤3  подход к середине: n/2
 2
 1

  n
  3  верхняя половина вправо: 3n/2
 2
 1


  ¤  смещение верхней половинки вниз n/2 - движений
 2n
 13
--------------------------------
Всего: 2n + 2n +n/2 + 3n/2 + n/2  = 6n/2

Получается что решение Жени отстает от решения куратора на
n/2 движений.

Правда решение Жени оставляет первую половину столбика на прежней
вертикали, но это не требовалось по условию задачи.

Команда 3118
------------
.\18\18.txt
.\18\1811.coc

Оценка: 0

Нет решения.
