Digitazione tastiera cellulare


17

Digitazione tastiera cellulare

Questa domanda è stata posta qualche tempo fa, ma è stata chiusa a causa di specifiche scadenti. Quindi, lo sto rifando, con specifiche migliori. Questa domanda è collegata, ma va nella direzione opposta.

Prima che arrivasse T9, per digitare un carattere in un messaggio di testo, è stato necessario premere più volte uno dei tasti numerici per ottenere il carattere desiderato. Per riferimento, ecco la mappatura standard:

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

*è backspace, 0è uno spazio ( ' ') o il numero 0e #conferma il carattere corrente. Per semplicità, tutti i personaggi sono maiuscoli.

Quando si preme un tasto più volte, i cicli di caratteri selezionati attraverso i caratteri possibili per quel tasto: 2 -> A, 22 -> B, 222 -> C, 2222 -> 2, 22222 -> A, e così via. Si noti che, poiché *ha una sola opzione, premendolo più volte si immettono più backspaces. Premere #più volte di seguito non ha alcun effetto. Un finale #non è necessario.

Inoltre, se si preme un tasto diverso immediatamente dopo aver premuto un tasto, il tasto precedente viene automaticamente confermato. Pertanto, 223è funzionalmente identico a 22#3.

La tua sfida è tradurre una serie di tasti premuti nella stringa corrispondente che verrebbe visualizzata da un telefono cellulare.

Esempi

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

Regole

  • Questo è , quindi vince la soluzione corretta più breve (in byte)
  • La risposta vincente verrà scelta tra una settimana
  • Sono vietate le scappatoie standard
  • La tua risposta può essere sotto forma di un programma completo, una funzione con nome o una funzione anonima, che accetta input e produce output in uno dei metodi standard

Classifica

Lo snippet di stack in fondo a questo post genera la classifica dalle risposte a) come un elenco della soluzione più breve per lingua eb) come classifica generale.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, utilizzando il seguente modello Markdown:

## Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet:

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


1
Come si producono i numeri? In un esempio hai il numero "9", ma la tua specifica ( 2 -> A, 22 -> B..., 2222 -> A....) non consente la produzione di alcun numero.
C. Quilley,

1
@ C.Quilley Questo è quello che ottengo copiando ciecamente quel diagramma, risolto ora.
Mego,


1
@AlexA. Non un duplicato, è l'input del tastierino numerico del telefono standard, non la ricerca nel dizionario T9.
Mego,

Risposte:


3

K5, 112 byte

{(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}

Questo è davvero un casino, ma penso che ci sia abbastanza spazio per giocare a golf.

Per prima cosa dobbiamo costruire una tabella di ricerca per la keymap. Esistono chiavi con 2, 4 e 5 caratteri associati, quindi il riempimento di ogni voce su 20 semplifica il processo di indicizzazione ciclica di questa tabella in un secondo momento:

  (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")

Quindi ho diviso l'input in run:

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

Rilasciare eventuali # esecuzioni e rimuovere le esecuzioni finali ogni volta che incontro un *:

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

E poi sono pronto a indicizzare semplicemente quella tabella di ricerca in base alla lunghezza e al primo elemento di ogni corsa.

Tutti insieme:

  {(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!"

Modificare:

Salva 5 byte:

0 3 6 9 12 15 19 22
((3*!6),19 22)

È possibile ridurre (20#'((" ";".?!"),0 3 6 9 12 15 19 22_`c$65+!26),'$!10)al(20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10) .
Kirbyfan64sos,

Sì, l'ho appena scoperto pochi minuti fa.
Giovanni,

3

Python 2, 230 206 byte

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)])

Questo crea una funzione f che prende come argomento una serie di tasti premuti e restituisce la stringa corrispondente che un telefono cellulare visualizzerebbe. Capita anche di prendere un secondo argomento opzionale come dizionario per mappare le chiavi sui caratteri corrispondenti, ad es. {"0": "0", "1": ".?! 1", ...} .

Innanzitutto, la stringa di tasti premuti viene raggruppata ripetendo i caratteri, ad esempio ["8", "#", "99999", "#", ...] . Quindi, il primo carattere di ciascun gruppo viene mappato nel dizionario passato come secondo argomento, ad esempio 9 mappe su WXYZ9 . Infine, la lunghezza del gruppo viene utilizzata come offset nel valore dal dizionario.

Si noti che l'offset deve utilizzare il modulo sulla lunghezza del gruppo di caratteri ripetuti perché i tasti premuti potrebbero scorrere. Si noti inoltre che il carattere # è mappato su \ 0 e rimosso solo alla fine perché 99 # 99 non è uguale a 9999 .

Ecco l'output della funzione per ciascuno degli esempi nella domanda:

>>> 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

3

JavaScript, 214 184 168 162 byte

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)

Probabilmente questo può essere un po 'più piccolo, ma sono abbastanza contento del risultato. Suddivide i caratteri in gruppi ripetuti di uno o più, quindi passa attraverso l'array, mappando ciascun carattere al suo valore nell'hash e aggiungendolo alla stringa finale. Se viene rilevato un numero qualsiasi di "#", lo ignora. Se incontra un '*', ne rimuove quel numero dalla fine della stringa finale.


0

Python 2, 237 byte

Usando il dizionario di cr3, ma senza ri.

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

-1

Python 2, 265 byte

È troppo lungo. IO: stdin, stdout.

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])

Il terzo esempio, 7 ## 222 # 222 ** 7 # 222 # 4 , farà sì che il tuo script aumenti un ValueError : valore letterale non valido per int () con base 10: '*'.
cr3,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.