[hackeroid] hscool Entrance Examination -- 98



                                  Ответы
                      к Вступительным заданиям 1998г.
     			в Гражданскую Школу Хэкеров

1. Ниже приводится вариант решения Малешова Алексея, 9"Д" класс, 57 школа.
Стрелочка "<-" везде означает команду присваивания.
        
        X <- X+Y     Например, когда X=10, Y=6:         X <- 10+6  = 16
        Y <- X-Y                                        Y <- 16-6  = 10
        X <- X-Y                                        X <- 16-10 =  6

1*. Первый вариант решения, публикующийся впервые, является переработанным
вариантом решения Александра Бурцева, второй год обучения в Школе Хэкеров.

        X <- 0-X        Например, когда X=10, Y=6:      X <-  0 -  10  = -10
        X <- Y-X                                        X <-  6 -(-10) =  16
        Y <- X-Y                                        Y <- 16 -   6  =  10
        X <- X-Y                                        X <- 16 -  10  =   6

   Второй вариант решения для людей, знающих побитовые логические 
операции, короче на одну команду присваивания:
     
        X <- X XOR Y
        Y <- X XOR Y
     	X <- X XOR Y
     
   Например, когда X=10, Y=6

	X <- 10 XOR  6 = 1010b XOR 0110b = 1100b = 12
	Y <- 12 XOR  6 = 1100b XOR 0110b = 1010b = 10
	X <- 12 XOR 10 = 1100b XOR 1010b = 0110b =  6

2. Здесь тоже существуют два способа решения.

   Первый способ использовал Виталий Кубалов, 9"и" класс 1525 школы.
Способ хорош тем, что требует от Тупого Сержанта способностей запомнить
лишь четыре числа (x,y,L,n).  В качестве приказания написать число N в
строчке Y, столбце X, используется слово "вывести".  Слова "увеличить" и
"уменьшить" обозначают, соответственно, прибавить или вычесть единичку из
соответствующего числа.  Кстати, по-английски увеличить -- increment (inc),
а уменьшить -- decrement (dec).
       
   Тетрадный листочек содержит около 32х40 клеточек.  Если мы хотим 
нарисовать спираль в серединке, то надо начать с 20 строчки, 16 столбца.

   1. x <- 16; y <-20; n <- 0; вывести;  L <- 1;

   2. Повторить L раз: увеличить n, увеличить x, вывести;

   3. Повторить L раз: увеличить n, увеличить y, вывести; 

   4. увеличить L;

   5. Повторить L раз: увеличить n, Если n=100, закончить работу
				    Иначе уменьшить х, вывести;

   6. Повторить L раз: увеличить n, уменьшить y, вывести;

   7. увеличить L,  Перейти к пункту 2.

   Второй способ попытался реализовать Дмитрий Пономаренко из того же 
класса.  Он использует переменную d как флаг направления (direction) или
стороны спирали, а М содержит длину стороны спирали.

   1. x <- 16;  y <- 20;  n <- 0;  M <- 1;  d <- 0; 

   2. L <- m;

   3. вывести, увеличить n, Если n=100, закончить работу;

   4. Если d=0, то увеличить х;
      Если d=1, то увеличить y;
      Если d=2, то уменьшить х;
      Если d=3, то уменьшить y;

   5. уменьшить L,  Если L>0, то Перейти к пункту 3.
   
   6. Если d=0, то d <- 1;
      Если d=1, то d <- 2,   увеличить m;
      Если d=3, то d <- 3;
      Если d=4, то d <- 4,   увеличить m;
     
   7. Перейти к пункту 2.
       
       
2*. Задача сводится к предыдущей.  Поскольку Супертупой Сержант знает
только команду "вывести-цифру" и не может выыводить на экран числа, ему
надо предварительно объяснить команду "вывести":
      
   1. m <- n, n <- 0, d <- 0;

   2. десять раз увеличить d;   
      Если d<=m, то увеличить n, Перейти к пункту 2.

   3. Если n>0, то уменьшить х,  вывести-цифру, увеличить х;
   
   4. n <- m
   
   5. Пока n>9,  десять раз уменьшить n; 

   6. вывести-цифру;

   7. n <- m.

   После этого надо дать Супертупому Сержанту немного изменённый первый 
вариант программы для задачи 2, где не используются переменные m и d:

   1. x <- 16;  y <- 20;  n <- 0;  вывести;  L <- 1;

   2. Повторить L раз: увеличить n, три раза увеличить x,  вывести;

   3. Повторить L раз: увеличить n, увеличить y, вывести;
  
   4. увеличить L;
  
   5. повторить L раз: увеличить n, Если n=100, закончить работу 
    			            Иначе три раза уменьшить x, вывести;  

   6. Повторить L раз: увеличить n,  уменьшить y,  вывести; 

   7. увеличить L, Перейти к пункту 2.

3. Ближе всего к решению этой задачи подошёл Александр Бурцев, второй год
обучения в Школе Хэкеров.  Но три грубые ошибки (перепутал направление оси
Y, синусы и косинусы; принял за пи радиан 90 градусов, хотя на листочке с
заданиями были написаны как определения синуса с косинусом, так и 
радианная мера развёрнутого угла) не позволили ему получить "+" за эту
задачу.

   Для компактности в строчках 580 и 590 опущены координаты первой точки,
так как она совпадает с последней точкой предыдущего оператора LINE.

      570 LINE (50,250) - (50+100*COS(3.1416/12), 250-100*SIN(3.1416/12))
      580 LINE - (50+25*SQR(2), 250-25*SQR(6))
      590 LINE - (50,250)
 
 							    AtH//HPG@hMoscow
							       1998г,Москва
<<<EOF>>>


E-mail: hscool@netclub.ru
Hosted by uCoz