พิมพ์ดีดคีย์บอร์ดโทรศัพท์มือถือ


17

พิมพ์ดีดคีย์บอร์ดโทรศัพท์มือถือ

คำถามนี้ถามกลับในขณะที่ แต่ถูกปิดเนื่องจากรายละเอียดไม่ดี ดังนั้นฉันจะทำซ้ำโดยมีรายละเอียดที่ดีกว่า คำถามนี้เกี่ยวข้อง แต่ไปในทิศทางตรงกันข้าม

ก่อนที่ T9 จะมาถึงในการพิมพ์ตัวอักษรในข้อความคุณต้องกดปุ่มตัวเลขหนึ่งครั้งเพื่อรับตัวอักษรที่คุณต้องการ สำหรับการอ้างอิงนี่คือการทำแผนที่มาตรฐาน:

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

*เป็น backspace 0เป็นช่องว่าง ( ' ') หรือตัวเลข0และ#ยืนยันอักขระปัจจุบัน เพื่อความเรียบง่ายตัวละครทุกตัวจะเป็นตัวพิมพ์ใหญ่

เมื่อคุณกดคีย์หลายครั้งรอบตัวละครที่เลือกผ่านตัวละครที่เป็นไปได้สำหรับการสำคัญที่: 2 -> A, 22 -> B, 222 -> C, 2222 -> 2, 22222 -> Aและอื่น ๆ โปรดทราบว่าเนื่องจาก*มีเพียงหนึ่งตัวเลือกการกดซ้ำหลายครั้งจะทำให้มีการสำรองข้อมูลย้อนกลับหลายรายการ การกด#หลายครั้งในแถวไม่มีผล การติดตาม#ไม่จำเป็น

นอกจากนี้หากกดปุ่มที่แตกต่างกันทันทีหลังจากกดปุ่มปุ่มกดก่อนหน้านี้จะได้รับการยืนยันโดยอัตโนมัติ ดังนั้นจึงเป็นหน้าที่เหมือนกับ22322#3

ความท้าทายของคุณคือการแปลชุดของการกดปุ่มเป็นสตริงที่สอดคล้องกันโทรศัพท์มือถือจะแสดง

ตัวอย่าง

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

กฎระเบียบ

  • นี่คือดังนั้นวิธีแก้ปัญหาที่สั้นที่สุดที่ถูกต้อง (เป็นไบต์) ชนะ
  • คำตอบที่ชนะจะถูกเลือกในหนึ่งสัปดาห์
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • คำตอบของคุณอาจอยู่ในรูปแบบของโปรแกรมเต็มรูปแบบฟังก์ชั่นที่มีชื่อหรือฟังก์ชั่นที่ไม่ระบุชื่อรับอินพุตและสร้างเอาต์พุตในหนึ่งในวิธีมาตรฐาน

ลีดเดอร์บอร์ด

สแต็คส่วนย่อยที่ด้านล่างของโพสต์นี้สร้างกระดานแต้มนำจากคำตอบ a) เป็นรายการคำตอบสั้นที่สุดต่อภาษาและ b) เป็นกระดานแต้มนำโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของไฟล์สองไฟล์หรือคุณต้องการแสดงรายการบทลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

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

คุณยังสามารถตั้งชื่อภาษาให้เป็นลิงค์ซึ่งจะปรากฏในตัวอย่างข้อมูล:

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


1
คุณสร้างตัวเลขได้อย่างไร คุณมีหมายเลข '9' ในตัวอย่าง แต่สเปคของคุณ ( 2 -> A, 22 -> B... , 2222 -> A.... ) ไม่อนุญาตให้สร้างหมายเลขใด ๆ
C. Quilley

1
@ C.Quilley นั่นคือสิ่งที่ฉันได้รับจากการคัดลอกไดอะแกรมนั้นไปแล้ว
Mego

ที่เกี่ยวข้องอย่างใกล้ชิดล่อไปได้
Alex A.

1
@AlexA ไม่ใช่ผู้ล่อลวงมันเป็นหมายเลขโทรศัพท์ที่ป้อนเข้ามาตรฐานไม่ใช่การค้นหาพจนานุกรม T9
Mego

คำตอบ:


3

K5, 112 ไบต์

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

อันนี้ยุ่งเหยิงจริง ๆ แต่ฉันคิดว่ามีพื้นที่พอที่จะตีมันได้

ก่อนอื่นเราต้องสร้างตารางการค้นหาสำหรับ keymap มีปุ่มที่มี 2, 4 และ 5 ตัวอักษรที่แมปไว้ดังนั้นการเติมเต็มทุกรายการถึง 20 ทำให้กระบวนการจัดทำดัชนีแบบวนรอบในตารางนี้ง่ายขึ้น:

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

จากนั้นฉันแบ่งอินพุตเป็นการทำงาน:

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

ดรอป # วิ่งใด ๆ และตัดการวิ่งที่ต่อท้ายทุกครั้งที่พบ *:

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

จากนั้นฉันก็พร้อมที่จะทำดัชนีลงในตารางการค้นหานั้นตามความยาวและองค์ประกอบแรกของการวิ่งแต่ละครั้ง

ทั้งหมดเข้าด้วยกัน:

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

แก้ไข:

บันทึก 5 ไบต์:

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

คุณสามารถร่นไป(20#'((" ";".?!"),0 3 6 9 12 15 19 22_`c$65+!26),'$!10) (20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10)
kirbyfan64sos

ใช่ฉันเพิ่งพบจริง ๆ ไม่กี่นาทีที่ผ่านมา
JohnE

3

Python 2, 230 206 ไบต์

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

อันนี้สร้างฟังก์ชั่น fซึ่งใช้สตริงของการกดปุ่มเป็นอาร์กิวเมนต์และส่งกลับสตริงที่เกี่ยวข้องโทรศัพท์มือถือจะแสดง นอกจากนี้ยังเกิดขึ้นที่จะใช้อาร์กิวเมนต์ที่สองตัวเลือกเป็นกุญแจทำแผนที่พจนานุกรมตัวอักษรที่สอดคล้องกันของพวกเขาเช่น{ "0": "0", "1":".? 1" ... }

ครั้งแรกสตริงการกดแป้นจะถูกจัดกลุ่มโดยตัวละครซ้ำเช่น[ "8", "#", "99999", "#" ... ] จากนั้นอักขระตัวแรกของแต่ละกลุ่มจะถูกแมปในพจนานุกรมที่ส่งเป็นอาร์กิวเมนต์ที่สองเช่น9แผนที่WXYZ9 ในที่สุดความยาวของกลุ่มจะถูกใช้เป็นออฟเซ็ตในค่าจากพจนานุกรม

โปรดทราบว่าการชดเชยจะต้องใช้โมดูโลกับความยาวของกลุ่มอักขระที่ซ้ำกันเนื่องจากการกดปุ่มอาจวนซ้ำ โปรดทราบด้วยว่าอักขระ#ถูกแมปกับ\ 0และนำออกเมื่อสิ้นสุดเนื่องจาก99 # 99ไม่ได้เป็นเช่นเดียวกับ9999

นี่คือผลลัพธ์ของฟังก์ชันสำหรับแต่ละตัวอย่างในคำถาม:

>>> 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 ไบต์

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)

นี่อาจทำให้เล็กลงเล็กน้อย แต่ฉันก็พอใจกับผลลัพธ์ แยกตัวละครออกเป็นกลุ่มซ้ำ ๆ ตั้งแต่หนึ่งตัวขึ้นไปจากนั้นผ่านอาร์เรย์ทำแผนที่แต่ละอักขระให้เป็นค่าในแฮชและเพิ่มลงในสตริงสุดท้าย ถ้ามันเจอจำนวน '#' มันก็จะไม่สนใจมัน หากพบเครื่องหมาย '*' ใด ๆ ก็จะลบจำนวนนั้นออกจากจุดสิ้นสุดของสตริงสุดท้าย


0

Python 2, 237 ไบต์

ใช้พจนานุกรมของ cr3 แต่ไม่มีอีก

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 ไบต์

มันยาวเกินไป 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])

ตัวอย่างที่สาม7 ## 222 # 222 ** 7 # 222 # 4จะทำให้สคริปต์ของคุณเพิ่มValueError : ตัวอักษรที่ไม่ถูกต้องสำหรับ int () ด้วยฐาน 10: '*'
cr3
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.