Я выполняю следующее упражнение по программированию: Killer Garage Door . Заявление:
Ситуация
Вы были наняты компанией, производящей электро c гаражные ворота. Несчастные случаи с существующей производственной линией привели к многочисленным поврежденным автомобилям, сломанным конечностям и нескольким убитым домашним животным. Ваша миссия состоит в том, чтобы написать более безопасную версию программного обеспечения их контроллера. Спецификация
Мы всегда начинаем с закрытой двери. Пульт дистанционного управления имеет ровно одну кнопку со следующим поведением:
If the door is closed, a push starts opening the door, and vice-versa
It takes 5 seconds for the door to open or close completely
While the door is moving, one push pauses movement, another push resumes movement in the same direction
Для того, чтобы сделать дверь более безопасной, он был оснащен обнаружением препятствий на основе сопротивления. Когда дверь обнаруживает препятствие, она должна немедленно изменить направление движения. Input
Строка, в которой каждый символ представляет одну секунду со следующими возможными значениями.
'.' No event
'P' Button has been pressed
'O' Obstacle has been detected (supersedes P)
Например, «..P ....» означает, что ничего не происходит в течение двух секунд, затем кнопка нажата, то больше никаких событий. Выходные данные
Строка, где каждый символ представляет одну секунду и указывает положение двери (0, если полностью закрыт, и 5, полностью открыт). Дверь начинает двигаться немедленно, поэтому ее положение изменяется в ту же секунду, что и событие. Пример
.. P ... O ..... в качестве ввода должен выдавать 001234321000 в качестве вывода
Я написал следующий код:
public class Door {
public static String run(String events) {
System.out.println("\n\n\nevents: "+events);
int count = 0;
StringBuilder result = new StringBuilder();
boolean movingUp = false;
boolean movingDown = false;
for(char c : events.toCharArray()){
System.out.println("movingUp: "+movingUp);
System.out.println("movingDown: "+movingDown);
System.out.println("c: "+c);
System.out.println("count: "+count);
System.out.println("result: "+result);
if(c=='.'){
if(movingUp){
result.append(count < 5 ? ++count : 5);
}else if(movingDown){
result.append(count > 0 ? --count : 0);
}else{
result.append(count);
}
}else if(c=='P'){
if(count==5){
movingUp = false;
movingDown = true;
result.append(count > 0 ? --count : 0);
}else if(movingUp){
movingUp = false;
result.append(count);
}else if(movingDown){
movingDown = false;
result.append(count);
}else{
movingUp = true;
result.append(count < 5 ? ++count : 5);
}
}else if(c=='O'){
movingUp = false;
movingDown = true;
result.append(count > 0 ? --count : 0);
}
}
return result.toString();
}
}
Мне было интересно, как мы можем справиться, когда есть пауза, а затем дверь возобновляется, чтобы можно было продолжать подниматься или опускаться, как это было до паузы?
Вот некоторые тесты те, которые отмечены знаком →, - это те, в которых поведение паузы или препятствия терпит неудачу из-за того, что в настоящее время код предполагает, что после паузы он должен go вверх, а после препятствия он должен go вниз.
import static org.junit.Assert.*;
import org.junit.Test;
public class MainTest {
@Test
public void testNormalOperation() {
test("should stay closed unless button is pressed (no buttonpresses)", "..........", "0000000000");
test("should start opening on buttonpress", "P..", "123");
test("should open completely and stay open", "P....", "12345");
}
@Test
public void testPause() {
test("should start opening and pause on second buttonpress", "P.P..", "12222");
test("→ should resume closing on third buttonpress", ".....P......P.P..P....", "0000012345554333321000");
}
@Test
public void testObstacles() {
test("should reverse while opening", "P.O....", "1210000");
test("→ should reverse while closing", "P.O....", "12345554345555");
}
@Test
public void testObstaclePlusPause () {
test("→ should reverse while opening (and allow pause)", "P..OP..P..", "1232222100");
}
@Test
public void testExample() {
test("should start opening and reverse when obstacle", "..P...O.....", "001234321000");
}
private void test(String description, String events, String result) {
assertEquals(description ,result, Door.run(events));
}
}
Я также прочитал:
Как мы можем реализовать дверь гаража, отслеживая то, что было ее последним направление движения?