Gõ bàn phím điện thoại di động


17

Gõ bàn phím điện thoại di động

Câu hỏi này đã được hỏi một lúc trước, nhưng đã bị đóng do thông số kỹ thuật kém. Vì vậy, tôi đang làm lại nó, với thông số kỹ thuật tốt hơn. Câu hỏi này có liên quan, nhưng đi theo hướng ngược lại.

Trước khi T9 xuất hiện, để nhập một ký tự trong tin nhắn văn bản, bạn phải nhấn một trong các phím số một số lần để có được ký tự bạn muốn. Để tham khảo, đây là ánh xạ chuẩn:

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

*là backspace, 0là khoảng trắng ( ' ') hoặc số 0#xác nhận ký tự hiện tại. Để đơn giản, tất cả các ký tự là chữ hoa.

Khi bạn nhấn một phím nhiều lần, các chu kỳ nhân vật được lựa chọn thông qua các nhân vật có thể cho khóa đó: 2 -> A, 22 -> B, 222 -> C, 2222 -> 2, 22222 -> A, và vân vân. Lưu ý rằng, vì *chỉ có một tùy chọn, nhấn liên tục sẽ khiến nhiều khoảng trống được nhập. Nhấn #nhiều lần liên tiếp không có hiệu lực. Một dấu vết #là không cần thiết.

Ngoài ra, nếu một phím khác được nhấn ngay sau khi nhấn phím, phím nhấn trước đó sẽ tự động được xác nhận. Như vậy, 223là chức năng giống hệt như 22#3.

Thách thức của bạn là dịch một loạt các phím bấm thành chuỗi tương ứng mà điện thoại di động sẽ hiển thị.

Ví dụ

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

Quy tắc

  • Đây là , vì vậy giải pháp chính xác ngắn nhất (tính bằng byte) sẽ thắng
  • Câu trả lời chiến thắng sẽ được chọn trong một tuần
  • Sơ hở tiêu chuẩn bị cấm
  • Câu trả lời của bạn có thể ở dạng chương trình đầy đủ, hàm được đặt tên hoặc hàm ẩn danh, lấy đầu vào và sản xuất đầu ra theo một trong các phương thức tiêu chuẩn

Bảng xếp hạng

Đoạn trích Stack ở cuối bài này tạo bảng xếp hạng từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

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


1
Làm thế nào để bạn sản xuất số? Bạn có số '9' trong một ví dụ, nhưng đặc điểm kỹ thuật của bạn ( 2 -> A, 22 -> B..., 2222 -> A....) không cho phép bất kỳ số nào được tạo ra.
C. Quilley

1
@ C.Quilley Đó là những gì tôi nhận được khi sao chép sơ đồ đó một cách mù quáng, đã được sửa ngay bây giờ.
Mego


1
@AlexA. Không phải là một bản dupe, đó là đầu vào numpad điện thoại tiêu chuẩn, không phải tra cứu từ điển T9.
Mego

Câu trả lời:


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}

Điều này thực sự là một mớ hỗn độn, nhưng tôi nghĩ rằng có một số lượng khá lớn để chơi golf.

Đầu tiên chúng ta cần xây dựng một bảng tra cứu cho sơ đồ bàn phím. Có các khóa có 2, 4 và 5 ký tự được ánh xạ tới chúng, do đó, việc đệm mỗi mục nhập ra 20 để đơn giản hóa quá trình lập chỉ mục theo chu kỳ bảng này sau:

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

Sau đó, tôi chia đầu vào thành các lần chạy:

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

Thả bất kỳ # chạy và thoát dải chạy mỗi khi tôi gặp *:

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

Và sau đó tôi sẵn sàng chỉ mục vào bảng tra cứu đó dựa trên độ dài và phần tử đầu tiên của mỗi lần chạy.

Tất cả cùng nhau:

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

Biên tập:

Lưu 5 byte:

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

Bạn có thể rút ngắn (20#'((" ";".?!"),0 3 6 9 12 15 19 22_`c$65+!26),'$!10)để (20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10).
kirbyfan64sos

Vâng, tôi thực sự chỉ thấy rằng một vài phút trước đây.
JohnE

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

Hàm này tạo một hàm f lấy một chuỗi các phím bấm làm đối số và trả về chuỗi tương ứng mà điện thoại di động sẽ hiển thị. Nó cũng xảy ra khi lấy một đối số thứ hai tùy chọn làm khóa ánh xạ từ điển cho các ký tự tương ứng của chúng, ví dụ {"0": "0", "1": ".?! 1", ...} .

Đầu tiên, chuỗi các phím bấm được nhóm lại bằng cách lặp lại các ký tự, ví dụ ["8", "#", "99999", "#", ...] . Sau đó, ký tự đầu tiên của mỗi nhóm được ánh xạ trong từ điển được truyền dưới dạng đối số thứ hai, ví dụ 9 ánh xạ tới WXYZ9 . Cuối cùng, độ dài của nhóm được sử dụng làm phần bù trong giá trị từ từ điển.

Lưu ý rằng phần bù phải sử dụng modulo trên độ dài của nhóm các ký tự lặp lại vì nhấn phím có thể quay vòng. Cũng lưu ý rằng ký tự # được ánh xạ tới \ 0 và chỉ bị xóa ở cuối vì 99 # 99 không giống với 9999 .

Đây là đầu ra của hàm cho mỗi ví dụ trong câu hỏi:

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

Điều này có thể được làm nhỏ hơn một chút, nhưng tôi khá hài lòng với kết quả này. Chia các ký tự thành các nhóm lặp lại của một hoặc nhiều, sau đó bước qua mảng, ánh xạ từng ký tự thành giá trị của nó trong hàm băm và thêm nó vào chuỗi cuối cùng. Nếu nó đi qua bất kỳ số '#' nào, nó sẽ bỏ qua nó. Nếu nó bắt gặp bất kỳ '*' nào, nó sẽ loại bỏ số đó khỏi cuối chuỗi cuối cùng.


0

Python 2, 237 byte

Sử dụng từ điển của cr3, nhưng không có.

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

Nó quá dài. 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])

Ví dụ thứ ba, 7 ## 222 # 222 ** 7 # 222 # 4 , sẽ khiến tập lệnh của bạn tăng ValueError : chữ không hợp lệ cho int () với cơ sở 10: '*'.
cr3
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.