Wydaje się, że istnieje ciągłe szaleństwo, gdy ludzie żmudnie uczą się nowych układów klawiatury, takich jak Dvorak lub Neo, ponieważ podobno sprawia to, że są bardziej produktywni. Twierdzę, że zmiana układu klawiatury jest złym pomysłem, ponieważ przyśpieszenie może ci zająć miesiące, a kiedy jesteś ostatecznie o 5% szybszy niż reszta, wkręca cię, jeśli musisz pisać na komputerze, który nie jest twój własny.
Ponadto wszyscy ci ludzie zapominają, gdzie leży prawdziwe wąskie gardło we współczesnej komunikacji - klawiatura telefoniczna.
Oto jak wygląda przeciętna klawiatura telefonu:
Litera „r” jest trzecią literą na przycisku 7; więc jeśli miałbyś wpisać literę „r” na telefonie komórkowym, nacisnąłbyś przycisk 7 trzy razy, dla „s” nacisnąłbyś go 4 razy, a dla „a” nacisnąłbyś przycisk 2 raz.
Biorąc to pod uwagę, umieszczenie „e” po „d” było prawdopodobnie złą decyzją - „e” jest najczęściej używaną literą w alfabecie angielskim, więc jeśli miałbyś oznaczyć przycisk 3 „EDF” zamiast „DEF”, zaoszczędziłoby sporo naciśnięć klawiszy.
Co więcej, prawdopodobnie doświadczyłeś już, że pisanie 2 liter, które korzystają z tego samego przycisku, jest uciążliwe - jeśli chcesz napisać „TU”, nie możesz po prostu nacisnąć 8 trzy razy, ponieważ spowodowałoby to „V”. Tak więc zwykle piszesz „T”, następnie naciskasz spację, następnie naciskasz backspace, a następnie piszesz „U”, co odpowiada 5 naciśnięciom przycisków zamiast 3.
TL; DR
Biorąc pod uwagę te dwie zasady:
- Litera jest wpisywana przez naciśnięcie przycisku n razy, gdzie n oznacza pozycję litery na etykiecie przycisku
- Pisanie dwóch liter, które są wpisywane za pomocą tego samego przycisku, wymaga dodatkowych 2 naciśnięć przycisku
Jaki jest układ klawiatury telefonu, który wymaga najmniejszej liczby naciśnięć przycisków, biorąc pod uwagę określony tekst? Należy używać tylko przycisków 2-9, 1 i 0, które są zarezerwowane dla symboli specjalnych.
Wkład
Tekst, dla którego powinieneś znaleźć optymalny układ, jest dostarczany przez stdin. Nie musisz obsługiwać niczego innego niż małe litery i możesz założyć, że dane wejściowe składają się tylko z tego. Możesz również założyć, że tekst wejściowy jest dość duży i każda litera jest tam co najmniej raz, jeśli to pomoże.
Wydajność
Nie chcę nakładać zbyt wielu ograniczeń na dane wyjściowe, ponieważ czasami daje to jedne języki przewagę nad innymi; więc jednak twój język pokazuje, że tablice są w porządku, alternatywnie możesz oddzielić każdą etykietę nowym wierszem.
Może istnieć wiele możliwych optymalnych układów, możesz wydrukować dowolny z nich. Oto prosty przykład:
>> echo "jackdawslovemybigsphinxofquartz" | foo.sh
ojpt
avhz
cen
skm
dyf
wbq
ixu
lgr
Punkty bonusowe
-35, jeśli twój algorytm nie wymusza brutalnie wszystkich możliwych układów (tutaj patrzę na `` permutacje '' Haskella)
-3, jeśli Twój kod mieści się w wiadomości tekstowej (140 znaków), a Ty wysyłasz zdjęcie, że wysyłasz swój kod znajomemu.
To jest moje pierwsze wyzwanie na StackExchange. Z przyjemnością usłyszę, czy Ci się podoba, czy masz jakieś uwagi na ten temat!
26! / (2! * 6!) = 280,063,514,671,253,913,600,000 > 2^77
unikalne kombinacje, licząc proste przestawienie klawiszy tylko raz.Odpowiedzi:
Perl, 333
Oto próba optymalizacji dla reguły nr 2. Po moim komentarzu powyżej i zamiast odpowiedzi, które uwzględniają tę zasadę (por. Wysoka ocena pytania), pomyślałem, że jestem tutaj winien trochę wysiłku ...
Rozwiązania, które nie optymalizują się pod kątem reguły 2, mogą generować wyniki dalekie od optymalnych. Sprawdziłem długi naturalny tekst w języku angielskim (właściwie „Alicja w krainie czarów”), wstępnie przetworzony (tylko małe litery) i np. Skrypt Perla z odpowiedzi OJW, wynik był
er
sam go rujnuje, a niektóre inne pary nigdy nie powinny kończyć się na tym samym kluczu ...Btw,
zxqjvkbpfmygwculdrshnioate
są to litery posortowane z częstotliwością rosnącą od tego tekstu.Jeśli spróbujemy rozwiązać ten problem w prosty sposób (może licząc na premię -35) i umieszczać litery jeden po drugim, wybierając dostępny klucz według minimalnej liczby par, możemy zakończyć np .:
Nie zamieszczam tutaj kodu dla tego (złego) rozwiązania. Np. Uwaga
c
jest częstsza niżw
i umieszczana na pierwszym miejscu. Parytc
(ct
) są oczywiście rzadsze niżac
(ca
) - 43 + 235 w stosunku do 202 + 355. Ale potemw
kończy się naa
- 598 + 88. Kończymy paramiaw
itc
(łącznie 964), choć byłoby lepiejac
itw
(łącznie 635). Itp..Zatem następny algorytm próbuje sprawdzić każde 8 pozostałych (lub 2, jeśli ostatnie) najczęstsze litery względem liter już znajdujących się na klawiaturze i umieścić je tak, aby liczba par była minimalna.
Wynik to:
Nie podoba mi się ta
ac
para (w końcu Kot jest jedną z postaci), ale nadal jest to optymalne rozmieszczenie liter dla języka angielskiego, jeśli mój kod nie jest zły. Niezupełnie wysiłek „golfowy”, tylko jakieś działające rozwiązanie, brzydkie czy nie.źródło
Python3, czas na Montecarlo!
Aby rozwiązać ten problem, najpierw liczę, ile „kliknięć” potrzebujesz z domyślną klawiaturą (początkowo:)
abc,def,ghi,jkl,mno,pqrs,tuv,wxyz
. Następnie modyfikuję tę klawiaturę i sprawdzam, czy jest tańsza (tekst jest pisany mniejszą liczbą kliknięć). Jeśli ta klawiatura jest tańsza, staje się domyślną. Powtarzam ten proces1M
czas .Aby zmienić klawiaturę, najpierw decyduję, ile zmian wprowadzić (maksymalna liczba zmian to całkowita liczba liter w klawiaturze). Następnie dla każdego przełącznika wybieram dwa przyciski i dwie pozycje i przenoszę znak z pierwszej pozycji na drugą.
Maksymalna liczba przełączników na raz to liczba liter na klawiaturze, ponieważ jest to minimalna liczba zmian, które należy przełączyć z dwóch kompletnych różnych klawiatur. (Chcę, aby zawsze było możliwe przejście z jednej klawiatury na inną)
Dane wyjściowe
echo "jackdawslovemybigsphinxofquartz" | python .\myscript.py
to:Gdzie
61
jest liczba naciśniętych przycisków, aby utworzyć daną wiadomość.Znaki (bez spacji i komentarzy): 577
Wiem, że to długo, ale jestem naprawdę nowy w tych sprawach.
Uznałem to za tak zabawne, że postanowiłem wypróbować ten algorytm przy użyciu LO HOBBIT (mam też oryginalną kopię w domu!). Ma
383964
litery i oto kilka kliknięć w porównaniu z klawiaturą, które znajduję:Twierdzę więc, że ta ostatnia jest jedną z najbardziej praktycznych klawiatur (pod względem kliknięć).
źródło
Cóż, jeśli chcesz tylko najbardziej popularne postacie przypisane do pojemników 2-9, Perl może to zrobić w 127 znakach ...
dając coś takiego:
Lub wydrukuj wszystko w jednym wierszu, usuwając 12 znaków:
źródło
$x{$_}++for split/\s*/,<>;map$o{$n++%8}.=$_,sort{$x{$b}<=>$x{$a}}keys%x;print map"$_:".$o{$_-2},2..9
Haskell, 160–35 = 125
Przykład:
Można argumentować, że nie optymalizuje to reguły 2, ale umieszcza najczęstsze litery na różnych klawiszach.
źródło
JavaScript, 192–35 = 157
Właśnie zauważyłem zasadę powtarzania znaków; to nie bierze tego pod uwagę. Ale jak zauważył @mniip w swojej odpowiedzi:
Prawdopodobnie byłby to w Ruby, ale nie ma mnie w domu i jestem zmuszony do korzystania z Internet Explorera (eww). Ale hej, czasem fajnie jest używać języków okropnych podczas gry w golfa! ;)
Przykładowe dane wyjściowe (do wprowadzenia):
Ponieważ JS nie ma STDIN, program zakłada, że dane wejściowe są przechowywane w zmiennej
s
.źródło
'abcdefghia'
nie jest dokładnie optymalny.'azbcdefghizjklmnopqzrstuvwxyz'
b=['','','','','','','','']
dob=[x='',x,x,x,x,x,x,x]
,s.split('')
dos.split(x)
io[x]=o[x]?o[x]+1:1
doo[x]=-~o[x]
.Python (119-35 = 84):
Zakładając, że ciąg jest zmienną a i zawiera tylko małe litery:
bez golfa:
PYG (76–35 = 41):
O tak, możemy porzucić ten wspaniały import. Ponownie, zakłada to, że pozbawiony łańcucha jest w.
źródło