Ситуация < /p>
Вы были наняты компанией, производящей электрические двери гараж. Ваша миссия состоит в том, чтобы
написать более безопасную версию их программного обеспечения для контроллера. Спецификация < /p>
Мы всегда начинаем с закрытой двери. Пульт дистанционного управления имеет ровную кнопку
со следующим поведением. < /P>
Код: Выделить всё
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
< /code>
Чтобы сделать дверь более безопасной, она была оборудована
на основе устойчивости обнаружения препятствий. Когда дверь обнаруживает препятствие
, она должна немедленно изменить направление движения. Ввод < /p>
Строка, где каждый символ представляет одну секунду, с
следующие возможные значения. < /P>
'.' No event
'P' Button has been pressed
'O' Obstacle has been detected (supersedes P)
< /code>
в качестве примера, '..p ....' означает, что ничего не происходит в течение двух секунд,
, затем нажата кнопка, затем никаких дальнейших событий. Выход < /p>
Строка, где каждый символ представляет одну секунду, и указывает положение
двери (0, если он полностью закрыт и 5 полностью открыт). Дверь
начинает немедленно двигаться, следовательно, ее положение изменяется в том же
секунду, что и событие. Пример < /p>
.. p ... o ..... как вход должен дать 001234321000 как выход < /p>
< /blockquote>
Я написал следующий код: < /p>
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();
}
}
< /code>
Мне было интересно, как мы могли бы справиться, когда есть пауза, а затем дверь снова возобновляется, чтобы иметь возможность поддерживать ее вверх или вниз, как это было до паузы? Вверх, и после препятствия оно должно идти вниз. < /p>
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));
}
}
[*]https://users.cs.jmu.edu/bernstdh/web/c ... attern.php
Подробнее здесь: https://stackoverflow.com/questions/601 ... t-moving-d