Вторая по списку игра на сайте codingame.com проверяет умение примата пользоваться условными операторами, интуицией и программой по физике за десятый класс. По легенде, на постапокалиптических просторах Земли будущего раскинулась зловещая империя враждебных человеку роботов, но инженерный гений непокоренных программистов-взломщиков дает человечеству шанс на выживание. Подрывная деятельность начинается с малого: под дистанционный контроль удалось взять кремниевые мозги скоростного робота, внешностью и повадками напоминающего модифицированный мотоцикл. Наша задача — создать алгоритм управления, позволяющий машине преодолевать препятствия.
Инициализация: 
Каждый уровень поделен на три этапа: 
- Движение по стартовой площадке.
- Прыжок через пропасть.
- Торможение на финишной прямой.
До начала игрового цикла программа считывает данные о длине каждого из элементов уровня и сохраняет соответственно в переменные [latex]R, G, L[/latex].
Игровой цикл
На каждой итерации входной поток содержит:
- Координату мотоцикла [latex]X[/latex].
- Мгновенную скорость мотоцикла [latex]S[/latex].
В выходной поток необходимо вывести одну из четырех команд:
- JUMP — совершить прыжок.
- SPEED — увеличить скорость на единицу.
- SLOW — уменьшить скорость на единицу.
- WAIT — ждать следующего хода.
Прежде чем приступить к решению, проанализируем и формализуем задачу.
- Размеры мотоцикла не играют роли, потому его движение в рамках рассматриваемой задачи эквивалентно движению материальной точки.
- Движение равномерное ([latex]a = 1 \vee a = -1 \vee a = 0[/latex]).
- Скорость движения должна быть достаточно большой, чтобы успешно перемахнуть через пропасть, но и достаточно маленькой, чтобы успеть затормозить на финишной прямой. И первое, и второе условие нетрудно рассмотреть аналитически: [latex]S > G + 1 \wedge L > \frac {S^{2}}{2}[/latex]. В первом условии скорость взята «с запасом», так как мотоцикл не обязательно прыгает с края платформы. Второе условие нетрудно получить из уравнения равнозамедленного движения по финишной платформе: [latex]L = vt — \frac {t^{2}}{2} => t^{2} — 2vt + 2L = 0 \quad D = v^{2} — 2L \ge 0 => L \ge \frac {v^{2}}{2}[/latex]. Таким образом, оба условия обоснованы.
- Если условие [latex]X+S > R[/latex] истинно, мотоциклисту следует совершить прыжок.
Резюмируя: для успешного прохождения полосы препятствий необходимо:
- Привести скорость мотоцикла к значению, удовлетворяющему условию (3).
- Прыгнуть через пропасть, когда значения координаты и скорости удовлетворяют условию (4).
- Затормозить.
Программная реализация алгоритма:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include <iostream> using namespace std; int main() { 	int R; // the length of the road before the gap. 	cin » R; cin.ignore(); 	int G; // the length of the gap. 	cin » G; cin.ignore(); 	int L; // the length of the landing platform. 	cin » L; cin.ignore(); // game loop 	while (1) { 		int S; // the motorbike's speed. 		cin » S; cin.ignore(); 		int X; // the position on the road of the motorbike. 		cin » X; cin.ignore(); 		if (X + S > R && X <= R) //if next step can be the last - JUMP! 			cout « "JUMP" « endl; 		if (X < R-1) //some additional space must always be 		{ 			if (L < S*S/2 ) 				cout « "SLOW" « endl; //lower the speed to safe limit 			else 			{ 				if (S < G+1) //we can jump before the road ends, so we need some additional speed to avoid falling down 					cout « "SPEED" « endl; //or accelerate 				else 					cout « "WAIT" « endl; //if everything is OK, just wait 			} 		} 		else 			cout « "SLOW" « endl; //slow down, the goal is reached 	} } | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import java.util.*; import java.io.*; import java.math.*; class Player {     public static void main(String args[]) {         Scanner in = new Scanner(System.in);         int road = in.nextInt(); // the length of the road before the gap.         int gap = in.nextInt(); // the length of the gap.         int platform = in.nextInt(); // the length of the landing platform.         // game loop         while (true) {             int speed = in.nextInt(); // the motorbike's speed.             int coordX = in.nextInt(); // the position on the road of the motorbike.              if(coordX + speed > road && coordX <= road)             	System.out.println("JUMP");             if(coordX < road-1){             	if(platform < speed*speed/2)             		System.out.println("SLOW");             	else{             		if(speed < gap+1)             			System.out.println("SPEED");             		else             			System.out.println("WAIT");             	}             }             else{             	System.out.println("SLOW");             }         }     } } | 
Эффективность предложенного алгоритма:
Программа успешно проходит все четыре испытания. В процессе тестирования ни один робот не пострадал.
Технические детали реализации:
В коде использованы инструменты потокового ввода-вывода из заголовочного файла iostream и условные операторы.
 
						
Принято. только если уже есть решения этой задачи, то нужно дать ссылку и обосновать почему важно рассмотреть ещё раз.
Лучше избегать повторов, просто при необходимости писать комментарии и дополнения к уже имеющейся работе.
Понял, учту. Игр ещё много, буду проходить те, к которым пока нет решений на нашем сайте.
Java версия засчитана, 10 баллов.