Pisanie na klawiaturze telefonu komórkowego

17

Pisanie na klawiaturze telefonu komórkowego

To pytanie zostało zadane jakiś czas temu, ale zostało zamknięte z powodu złej specyfikacji. Ponawiam to z lepszymi specyfikacjami. To pytanie jest powiązane, ale idzie w przeciwnym kierunku.

Przed pojawieniem się T9, aby wpisać znak w wiadomości tekstowej, musiałeś kilkakrotnie nacisnąć jeden z klawiszy numerycznych, aby uzyskać żądany znak. Dla porównania, oto standardowe odwzorowanie:

+-------+-------+-------+
|   1   |   2   |   3   |
|  .?!1 |  ABC2 |  DEF3 |
+-------+-------+-------+
|   4   |   5   |   6   |
|  GHI4 |  JKL5 |  MNO6 |
+-------+-------+-------+
|   7   |   8   |   9   |
| PQRS7 |  TUV8 | WXYZ9 |
+-------+-------+-------+
|   *   |   0   |   #   |
|   ←   |SPACE 0|   →   |
+-------+-------+-------+

*jest backspace, 0jest spacją ( ' ') lub liczbą 0i #potwierdza bieżący znak. Dla uproszczenia wszystkie znaki są pisane wielkimi literami.

Po naciśnięciu klawisza kilka razy wybrany przez cykle znaków możliwych znaków dla tego klucza: 2 -> A, 22 -> B, 222 -> C, 2222 -> 2, 22222 -> A, i tak dalej. Zauważ, że ponieważ *ma tylko jedną opcję, wielokrotne naciskanie powoduje wprowadzenie wielu cofnięć. Naciśnięcie #wiele razy z rzędu nie ma wpływu. Końcowanie nie #jest konieczne.

Dodatkowo, jeśli inny klawisz zostanie naciśnięty natychmiast po naciśnięciu klawisza, poprzednie naciśnięcie klawisza zostanie automatycznie potwierdzone. A zatem,223 jest funkcjonalnie identyczny z 22#3.

Wyzwanie polega na przetłumaczeniu serii naciśnięć klawiszy na odpowiedni ciąg znaków wyświetlany przez telefon komórkowy.

Przykłady

8#99999#055#33#999#22#666#2#777#3#1 -> T9 KEYBOARD
4433555#55566609666666677755533*3111 -> HELLO WORLD!
7##222#222**7#222#4 -> PPCG
00#0#00 -> 0 0

Zasady

  • To jest , więc wygrywa najkrótsze prawidłowe rozwiązanie (w bajtach)
  • Zwycięska odpowiedź zostanie wybrana za tydzień
  • Standardowe luki są zabronione
  • Twoja odpowiedź może mieć postać pełnego programu, funkcji o nazwie lub funkcji anonimowej, pobierając dane wejściowe i generując dane wyjściowe za pomocą jednej ze standardowych metod

Tabela liderów

Fragment kodu na dole tego postu generuje tabelę wyników na podstawie odpowiedzi a) jako lista najkrótszych rozwiązań dla każdego języka oraz b) jako ogólna tabela wyników.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

## Perl, 43 + 2 (-p flag) = 45 bytes

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

Mego
źródło
1
Jak tworzysz liczby? Na przykład masz liczbę „9”, ale twoja specyfikacja ( 2 -> A, 22 -> B..., 2222 -> A....) nie pozwala na tworzenie żadnych liczb.
C. Quilley,
1
@ C.Quilley To właśnie dostaję za ślepe kopiowanie tego schematu, naprawione teraz.
Mego,
1
@AlexA. To nie dupek, to standardowe wejście numeryczne telefonu, a nie wyszukiwanie słownika T9.
Mego,

Odpowiedzi:

3

K5, 112 bajtów

{(20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10)[.*x]20!#1_x}'(){$[42=*y;(-#y)_x;35=*y;x;x,,y]}/{(&~0=':x)_x}

To jest naprawdę bałagan, ale myślę, że jest sporo miejsca na grę w golfa.

Najpierw musimy zbudować tabelę odnośników dla mapy klawiszy. Istnieją klucze z przypisanymi do nich 2, 4 i 5 znakami, więc wypełnienie każdego wpisu wartością do 20 upraszcza proces cyklicznego indeksowania tej tabeli później:

  (20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10)
(" 0 0 0 0 0 0 0 0 0 0"
 ".?!1.?!1.?!1.?!1.?!1"
 "ABC2ABC2ABC2ABC2ABC2"
 "DEF3DEF3DEF3DEF3DEF3"
 "GHI4GHI4GHI4GHI4GHI4"
 "JKL5JKL5JKL5JKL5JKL5"
 "MNO6MNO6MNO6MNO6MNO6"
 "PQRS7PQRS7PQRS7PQRS7"
 "TUV8TUV8TUV8TUV8TUV8"
 "WXYZ9WXYZ9WXYZ9WXYZ9")

Następnie podzielę dane wejściowe na przebiegi:

 {(&~0=':x)_x}"8#99999#055#33#999"
(,"8"
 ,"#"
 "99999"
 ,"#"
 ,"0"
 "55"
 ,"#"
 "33"
 ,"#"
 "999")

Upuszczaj dowolne # przebiegów i usuwaj końcowe biegi za każdym razem, gdy napotykam *:

  (){$[42=*y;(-#y)_x;35=*y;x;x,,y]}/{(&~0=':x)_x}"8#99999#055#33#999"
(,"8"
 "99999"
 ,"0"
 "55"
 "33"
 "999")

A potem jestem gotów po prostu zaindeksować tę tabelę wyszukiwania na podstawie długości i pierwszego elementu każdego uruchomienia.

Wszyscy razem:

  {(20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10)[.*x]20!#1_x}'(){$[42=*y;(-#y)_x;35=*y;x;x,,y]}/{(&~0=':x)_x}"4433555#55566609666666677755533*3111"
"HELLO WORLD!"

Edytować:

Zapisz 5 bajtów:

0 3 6 9 12 15 19 22
((3*!6),19 22)
JohnE
źródło
Możesz skrócić (20#'((" ";".?!"),0 3 6 9 12 15 19 22_`c$65+!26),'$!10)do (20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10).
kirbyfan64sos
Tak, właściwie to właśnie odkryłem kilka minut temu.
JohnE
3

Python 2, 230 206 bajtów

import re
f=lambda a,b=dict(zip("0123456789*#"," 0~.?!1~ABC2~DEF3~GHI4~JKL5~MNO6~PQRS7~TUV8~WXYZ9~\b~".split("~"))):"".join([j and b[j][(len(i)-1)%len(b[j])]or b[i]for i,j in re.findall(r"((\d)\2*|.)",a)])

Ten tworzy funkcję f, która przyjmuje ciąg naciśnięć klawiszy jako argument i zwraca odpowiedni ciąg, który wyświetliby telefon komórkowy. Zdarza się również wziąć opcjonalny drugi argument jako klucze mapowania słownika na odpowiadające im znaki, np. {"0": "0", "1": ".?! 1", ...} .

Najpierw ciąg naciśnięć klawiszy jest grupowany przez powtarzanie znaków, np. [„8”, „#”, „99999”, „#”, ...] . Następnie pierwszy znak każdej grupy jest mapowany w słowniku przekazywanym jako drugi argument, np. 9 mapuje na WXYZ9 . Na koniec długość grupy jest używana jako przesunięcie wartości ze słownika.

Zauważ, że offset musi używać modulo na długości grupy powtarzających się znaków, ponieważ naciśnięcia klawiszy mogą się zmieniać. Zauważ również, że znak # jest mapowany na \ 0 i usuwany tylko na końcu, ponieważ 99 # 99 to nie to samo co 9999 .

Oto wynik funkcji dla każdego z przykładów w pytaniu:

>>> print f("8#99999#055#33#999#22#666#2#777#3#1")
T9 KEYBOARD.
>>> print f("4433555#55566609666666677755533*3111")
HELLO WORLD!
>>> print f("7##222#222**7#222#4")
PPCG
>>> print f("00#0#00")
0 0
cr3
źródło
3

JavaScript, 214 184 168 162 bajtów

x=>(x.match(/(.)\1*/g,f='').map(a=>f=(l=a.length,v=' 0#.?!1#ABC2#DEF3#GHI4#JKL5#MNO6#PQRS7#TUV8#WXYZ9'.split`#`[a[0]])?f+v[--l%v.length]:a<'*'?f:f.slice(0,-l)),f)

Prawdopodobnie można to nieco zmniejszyć, ale jestem bardzo zadowolony z wyniku. Dzieli znaki na powtarzające się grupy jednego lub więcej, a następnie przechodzi przez tablicę, mapując każdy znak na jego wartość w haszu i dodając go do końcowego ciągu. Jeśli natrafi na dowolną liczbę „#”, ignoruje ją. Jeśli natrafi na dowolne „*”, usuwa ich liczbę z końca ostatniego ciągu.

Mwr247
źródło
0

Python 2, 237 bajtów

Korzystanie ze słownika cr3, ale bez re.

def f(i):
 d=dict(zip("0123456789"," 0|.?!1|ABC2|DEF3|GHI4|JKL5|MNO6|PQRS7|TUV8|WXYZ9".split("|")))
 s,x,j='',i[0],0
 for c in i[1:]+'#':
  if c==x:j+=1
  else:
   if x>'/':s+=d[x][j%len(d[x])]
   j=0
  if c=='*':s=s[:-1]
  x=c
 return s
TFeld
źródło
-1

Python 2, 265 bajtów

To zdecydowanie za długo. IO: standardowe, standardowe.

a=reduce(lambda q,w:q+" "+[w,""][w=="#"]if q[-1]!=w else q+w,raw_input()).split()
while "*" in a:del a[a.index("*")-1:a.index("*")+1]
print"".join([(lambda a:a[len(q)%len(a)-1])(" 0:.?!1:ABC2:DEF3:GHI4:JKL5:MNO6:PQRS7:TUV8:WXYZ9".split(":")[int(q[0])])for q in a])
Hannes Karppila
źródło
Trzeci przykład, 7 ## 222 # 222 ** 7 # 222 # 4 , spowoduje, że skrypt wygeneruje ValueError : niepoprawny literał dla int () z bazą 10: „*”.
cr3