Twoim zadaniem jest obliczenie całkowitej liczby naciśnięć klawiszy wymaganych do wprowadzenia danego tekstu na starym telefonie komórkowym.
Mapy klawiszy to:
1:1
2:abcABC2
3:defDEF3
4:ghiGHI4
5:jklJKL5
6:mnoMNO6
7:pqrsPQRS7
8:tuvTUV8
9:wxyzWXYZ9
0:<space><newline>0
Aby pisać exaMPle TExt 01
, naciśnij 33 99 2 6666 77777 555 33 0 8888 33333 99 8 0 <a 1-sec pause here in real life but we'll ignore it>000 1
łącznie 37 naciśnięć klawiszy.
*
Klucz przywołuje mapę znaków specjalnych:
.,'?!
"-()@
/:_;+
&%*=<
>£€$¥
¤[]{}
\~^¡¿
§#|`
z .
podświetloną pierwszą ( ). Możesz poruszać się, aby podświetlić wymagany znak, używając prostokątnych klawiszy nawigacyjnych, a wybranie zajmuje kolejne naciśnięcie klawisza.
Aby wstawić $
, naciśniesz, *↓↓↓↓→→→<select>
tj. Łącznie 9 naciśnięć klawiszy.
- Dane wejściowe będą pochodzić z pliku o nazwie
source
umieszczonego w bieżącym katalogu / katalogu twojego programu. EDYCJA: Na żądanie w komentarzach dodajęSTDIN
jako prawidłową metodę wprowadzania. Przepraszamy za zmianę specyfikacji po otrzymaniu odpowiedzi. - Musisz wyprowadzać
Total key presses <total_keypresses>
- Jeśli plik wejściowy zawiera znak spoza podanej mapy klawiszy, wówczas program musi wyjść
Invalid character <character> in source
i wyjść.
Krótko mówiąc, dane wejściowe i wyjściowe programu muszą przypominać ten (nieoznakowany) skrypt Pythona:
# This Python file uses the following encoding: utf-8
from __future__ import print_function
import sys
general_dict = { '1':1,
'a':1, 'b':2, 'c':3, 'A':4, 'B':5, 'C':6, '2':7,
'd':1, 'e':2, 'f':3, 'D':4, 'E':5, 'F':6, '3':7,
'g':1, 'h':2, 'i':3, 'G':4, 'H':5, 'I':6, '4':7,
'j':1, 'k':2, 'l':3, 'J':4, 'K':5, 'L':6, '5':7,
'm':1, 'n':2, 'o':3, 'M':4, 'N':5, 'O':6, '6':7,
'p':1, 'q':2, 'r':3, 's':4, 'P':5, 'Q':6, 'R':7, 'S':8, '7':9,
't':1, 'u':2, 'v':3, 'T':4, 'U':5, 'V':6, '8':7,
'w':1, 'x':2, 'y':3, 'z':4, 'W':5, 'X':6, 'Y':7, 'Z':8, '9':9,
' ':1, '\n':2, '0':3
}
special_chars = ['.',',',"'",'?','!','"','-','(',')','@','/',':','_',';','+','&','%','*','=','<','>','£','€','$','¥','¤','[',']','{','}','\\','~','^','¡','¿','§','#','|','`']
for x in special_chars:
general_dict[x]=(special_chars.index(x)/5) + (special_chars.index(x)%5) + 2
key_press_total = 0
with open('source') as f: # or # with sys.stdin as f:
for line in f:
for character in line:
if character in general_dict:
key_press_total+=general_dict[character]
else:
print('Invalid character',character,'in source')
sys.exit(1)
print('Total key presses',key_press_total)
Jest to golfowy kod, wygrywa najkrótszy program w bajtach.
Bezwsteczne zrzeczenie się odpowiedzialności: Podjąłem wyzwanie, aby mieć tłumaczenia powyższego skryptu Pythona na różne języki, które zostaną użyte do zaliczenia tego wyzwania w piaskownicy .
1ce5a2fdd0316e37c0a07d151d02db766a3adbb7
.Odpowiedzi:
GolfScript, 219 znaków
Podstawowe podejście przy użyciu tabeli przeglądowej:
Spróbuj tutaj .
źródło
source
, a nie STDIN"#{File.read('source')}"
"#{File.read'source'}"
Ruby 2.0, 232
Dotychczas bardzo prosty schemat kodowania: ponad 75% znaków jest używanych w literałach łańcuchowych / tablicowych ...
źródło
CJam, 207 bajtów
Ten program ma 207 znaków. Przy odpowiednim kodowaniu (Windows-1252) mieści się w 207 bajtach.
Zauważ, że Stack Exchange konwertuje karty (których używam jako separator w tabeli odnośników) na spacje, więc nie możesz skopiować i wkleić powyższego kodu.
Stosowanie
Kodowanie Windows-1252
Kodowanie UTF-8
źródło
PHP,
711708676 znaków (teraz czytanie ze STDIN)Mój pierwszy golf do tej pory :)
Chciałem wypróbować niekonwencjonalne podejście. Zamiast listy wszystkich znaków i liczby kliknięć potrzebnych do ich utworzenia, używam wartości ASCII postaci i obliczam wymagane naciśnięcia klawiszy. Pomyślałem, że najpierw zaoszczędzi mi kilka postaci, a teraz myślę, że to nawet dłużej niż podejście tablicowe.
Moim głównym problemem są klawisze 7 i 9, które mają 4 litery zamiast 3. Dlatego musiałem stworzyć kilka rezerw, które wysadziły mój kod o prawie 200 znaków.
Wersja bez golfa
Zakładam, że jest jeszcze wiele do zrobienia, ale jestem z tego bardzo zadowolony.
Kolejną złą rzeczą jest wymagane użycie
iconv()
listy znaków specjalnych. Niektóre z nich (€
,¥
...) nie są natywnie obsługiwane przez PHP.źródło
utf8_decode
będzie działać dobrze dla każdego znaku z wyjątkiem od€
. Dlatego musiałem użyćiconv
zamiast tego. Mój kod nie oblicza tych znaków specjalnych, jak ma to miejsce w przypadku zwykłych znaków, ponieważ nie są one uporządkowane i nie mogę wiarygodnie pracować z ich odpowiednimi wartościami ASCII. Używa dla nich normalnej listy.Python 3, 239 znaków
źródło
JavaScript (E6) 291
Edytować
Wersja powłoki z wykorzystaniem powłoki spydermonkey. Odczyt z pliku „źródłowego”, zapis do sdtout
Pierwsza próba działa w konsoli FireFox przy użyciu wyskakującego okienka dla danych wejściowych i wyjściowych
Czytelny
źródło
VBScript 435
Nie obsługuje znaków spoza ASCII. Byłem dość daleko od mojego kodu, więc pomyślałem, że opublikuję go w celach informacyjnych. Nie sądzę, żeby ktokolwiek inny zastosował to podejście.
źródło