Twoim zadaniem - jeśli zdecydujesz się to zaakceptować - jest zbudowanie programu, który analizuje i ocenia ciąg (od lewej do prawej i dowolnej długości) tokenów, które podają kierunki - w lewo lub w prawo. Oto cztery możliwe tokeny i ich znaczenie:
> go right one single step
< go left one single step
-> go right the total amount of single steps that you've gone right, plus one,
before you previously encountered this token and reset this counter to zero
<- go left the total amount of single steps that you've gone left, plus one,
before you previously encountered this token and reset this counter to zero
Jest jednak pewien haczyk - tokeny kierunków, które Twój program powinien być w stanie przeanalizować, zostaną przedstawione w tej formie:
<<->-><<->->>->>->
... innymi słowy, są one połączone, a Twoim zadaniem programu jest ustalenie prawidłowego pierwszeństwa wskazówek i liczby kroków do podjęcia (patrząc w przyszłość). Kolejność pierwszeństwa jest następująca (od najwyższej do najniższej):
->
<-
>
<
Jeśli napotkasz <-
gdy od początku lub od ostatniego resetu nie było żadnych kroków w lewo, wykonaj jeden krok w lewo. Ta sama zasada obowiązuje ->
, ale wtedy, gdy idzie się w prawo.
Twój program powinien zaczynać się od 0, a jego wynikiem powinna być liczba całkowita ze znakiem, reprezentująca końcową pozycję końcową.
Możesz oczekiwać, że dane wejściowe będą zawsze prawidłowe (więc nic podobnego <--->>--<
na przykład ).
Przykładowe dane wejściowe:
><->><-<-><-<>>->
Kroki w tym przykładzie:
step | token | amount | end position
------+-------+--------+--------------
1. | > | +1 | 1
2. | < | -1 | 0
3. | -> | +2 | 2
4. | > | +1 | 3
5. | <- | -2 | 1
6. | < | -1 | 0
7. | -> | +2 | 2
8. | <- | -2 | 0
9. | < | -1 | -1
10. | > | +1 | 0
11. | > | +1 | 1
12. | -> | +3 | 4
Dla wyjaśnienia: wyjściem programu powinna być tylko końcowa pozycja końcowa jako liczba całkowita ze znakiem. Powyższa tabela jest tylko po to, aby zilustrować kroki, które podjął mój przykład. Nie trzeba generować takiej tabeli, wiersza tabeli, a nawet samych pozycji krańcowych kroków. Wymagana jest tylko końcowa pozycja końcowa, jako liczba całkowita ze znakiem.
Najkrótszy kod po tygodniu wygrywa.
<-
to jeśli zaraz po nim następuje a<
lub a->
. Nie sposób w tym języku do reprezentowania sekwencji<-
następnie>
- co byłobygo left the total amount of single steps that you've gone left, plus one, then go right one single step
. Czy jest to poprawne i zgodne z projektem?