Wszyscy wiemy, że programiści są zwykle leniwi. Aby zmaksymalizować czas wolny, decydujesz się napisać program, który generuje minimalną liczbę naciśnięć klawiszy dla wprowadzanego do niego tekstu.
Wejście : tekst, który należy przekonwertować na naciśnięcia klawiszy. Możesz zdecydować, jak wprowadzić tekst (STDIN / odczyt z pliku podanego w argumentach)
Dane wyjściowe : Niezbędne działania w następującym formacie:
- Muszą być ponumerowane
H
it: Naciśnięcie klawisza i natychmiastowe zwolnienie goP
ress: Naciśnięcie klawisza i nie zwolnienie go (nigdy nie będzie to optymalne, gdy klawisz zostanieR
zwolniony jako kolejne naciśnięcie klawisza)R
elease: ZwolnienieP
klucza ressed
Przykład :
Wejście:
Hello!
Wynik:
Naiwnym rozwiązaniem byłoby:
1 P Shift
2 H h
3 R Shift
4 H e
5 H l
6 H l
7 H o
8 P Shift
9 H 1
10 R Shift
Byłoby to bardziej wydajne:
1 P Shift
2 H h
3 H 1
4 R Shift
5 H Left
6 H e
7 H l
8 H l
9 H o
Środowisko:
- Edytor używa czcionki o stałej szerokości
- Tekst jest miękko zawijany do 80 znaków
- Strzałki w górę i Strzałka w dół zachowują kolumnę, nawet jeśli pomiędzy nimi są krótsze linie
- Zakłada się, że schowek jest pusty
- Zakłada się, że Num Lock jest włączony
- Zakłada się, że Caps Lock jest wyłączony
- Caps Lock działa tylko na litery (tj. Bez Shift Lock)
Skróty klawiszowe / skróty :
- Home: Przejdź na początek bieżącej linii
- End: Przejdź do końca bieżącej linii
- Ctrl+ A: Zaznacz wszystko
- Ctrl+ C: Kopiuj
- Ctrl+ X: Wytnij
- Ctrl+ V: Wklej
- Shift+ Przesunięcie kursora: znakowanie
- Ctrl+ F: Otwiera okno wyszukiwania.
- Głupie dopasowanie tekstu, brak wyrażeń regularnych
- Wielkość liter ma znaczenie
- Wyszukiwania się zawijają
- Jednowierszowy tekst do wyszukiwania
- Dane wejściowe są wstępnie wypełnione bieżącym wyborem, chyba że pomiędzy nimi znajduje się nowa linia, wybierane jest pełne wejście
- Kopiowanie / wklejanie działa jak zwykle
- Naciśnięcie powoduje Enterwyszukiwanie, wybranie pierwszego dopasowania po bieżącej pozycji kursora
- F3: Powtórz ostatnie wyszukiwanie
- Ctrl+ H: Otwiera okno dialogowe zamiany
- Głupie dopasowanie tekstu, brak wyrażeń regularnych
- Wielkość liter ma znaczenie
- Zamień wszystko z zawijaniem
- Wprowadzanie tekstu w jednym wierszu
- Dane wejściowe wyszukiwania są wstępnie wypełnione bieżącym wyborem, chyba że pomiędzy nimi znajduje się nowa linia, wybierane jest pełne wejście
- Zamień wejście jest puste
- Kopiowanie / wklejanie działa jak zwykle
- Tab przeskakuje do wejścia zamiany
- Naciśnięcie powoduje Enterzastąpienie wszystkich. Kursor zostanie umieszczony po ostatniej zamianie
Zasady :
- Rozwiązania muszą być kompletnym programem, który kompiluje / analizuje i wykonuje bez żadnych dalszych modyfikacji
- Klawiatura wyświetlana powyżej to klawiatura, z której należy korzystać
- Nie jest wymagana obsługa znaków, których nie można wpisać za jej pomocą
- Każdy klucz musi zostać zwolniony na końcu
- Kursor nie musi znajdować się na końcu pliku na końcu
Punktacja :
Twój wynik to suma działań wymaganych do wpisania następujących tekstów. Zwycięzcą jest rozwiązanie o najniższym wyniku. Używam mojego naiwnego rozwiązania 1371 + 833 + 2006 = 4210
. Pokonaj to! Wybiorę zwycięzcę za dwa tygodnie.
1 Moje naiwne rozwiązanie
number = 1
H = (char) -> console.log "#{number++} H #{char}"
P = (char) -> console.log "#{number++} P #{char}"
R = (char) -> console.log "#{number++} R #{char}"
strokes = (text) ->
shiftActive = no
for char in text
if /^[a-z]$/.test char
if shiftActive
R "Shift"
shiftActive = no
H char
else if /^[A-Z]$/.test char
unless shiftActive
P "Shift"
shiftActive = yes
H char.toLowerCase()
else
table =
'~': '`'
'!': 1
'@': 2
'#': 3
'$': 4
'%': 5
'^': 6
'&': 7
'*': 8
'(': 9
')': 0
'_': '-'
'+': '='
'|': '\\'
'<': ','
'>': '.'
'?': '/'
':': ';'
'"': "'"
'{': '['
'}': ']'
if table[char]?
unless shiftActive
P "Shift"
shiftActive = yes
H table[char]
else
H switch char
when " " then "Space"
when "\n" then "Enter"
when "\t" then "Tab"
else
if shiftActive
R "Shift"
shiftActive = no
char
R "Shift" if shiftActive
input = ""
process.stdin.on 'data', (chunk) -> input += chunk
process.stdin.on 'end', -> strokes input
2 Łatwe powtórzenie
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
3 Bardziej złożone powtórzenie
We're no strangers to love
You know the rules and so do I
A full commitment's what I'm thinking of
You wouldn't get this from any other guy
I just wanna tell you how I'm feeling
Gotta make you understand
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
We've known each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it
And if you ask me how I'm feeling
Don't tell me you're too blind to see
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
(Ooh, give you up)
(Ooh, give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)
(Ooh)
Never gonna give, never gonna give
(Give you up)
We've know each other for so long
Your heart's been aching but
You're too shy to say it
Inside we both know what's been going on
We know the game and we're gonna play it
I just wanna tell you how I'm feeling
Gotta make you understand
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Never gonna give you up
Never gonna let you down
Never gonna run around and desert you
Never gonna make you cry
Never gonna say goodbye
Never gonna tell a lie and hurt you
Możesz użyć napisanego przeze mnie programu do odtwarzania , aby przetestować swoje rozwiązania (uwaga: nie obsługuje jeszcze wyszukiwania / zamiany, wszystko inne powinno działać).
źródło
Odpowiedzi:
Haskell 1309 + 457 + 1618 = 3384
Wreszcie odpowiedź (wynik znacznie się poprawił, gdy zdałem sobie sprawę, że w pierwszym teście są zakładki - musiałem edytować pytanie, aby je zobaczyć). Kompiluj z
ghc
, dostarcz wejście na standardowe wejście. Przykład:Próbowałem oczywistych rzeczy, takich jak Dijkstra, ale było to o wiele za wolno, nawet po zredukowaniu rozgałęzienia do jedynych użytecznych ruchów, którymi są: wypisz następny klucz lub skopiuj od początku linii (Shift + Home, Ctrl + C, End) lub wklej.
Podejście to wykorzystuje schowek o stałej długości, kopiuje, gdy prefiks linii stanie się „użyteczny”, i używa tego prefiksu, o ile można go wkleić na większej liczbie linii niż prefiksy linii, które osiągnie w następnej kolejności. Kiedy nie może korzystać ze schowka, opiera się na naiwnym rozwiązaniu, więc na pewno go pobije, gdy wybrana długość przekroczy koszt kopii.
Minimalny wynik jest osiągany, gdy długość prefiksu jest dopasowana do „Nigdy nie będę”. Są sposoby, aby to poprawić, ale mam już dość czytania Ricka Astleya.
źródło