Cep Telefonu Klavye Yazma


17

Cep Telefonu Klavye Yazma

Bu soru bir süre önce soruldu , ancak zayıf özellikler nedeniyle kapatıldı. Yani, daha iyi özelliklerle yeniden yapıyorum. Bu soru ilişkilidir, ancak tam tersi yönde gider.

T9 gelmeden önce, bir metin mesajına bir karakter yazmak için, istediğiniz karakteri elde etmek için sayı tuşlarından birine birkaç kez basmanız gerekiyordu. Referans olarak, standart eşleme şöyledir:

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

*backspace, 0boşluk ( ' ') veya sayıdır 0ve #geçerli karakteri onaylar. Sadelik için tüm karakterler büyük harflidir.

Bu anahtara için olası karakterler aracılığıyla bir anahtar birden çok kez, seçilen karakter döngülerini basıldığında: 2 -> A, 22 -> B, 222 -> C, 2222 -> 2, 22222 -> A, vb. Çünkü unutmayın *tek seçeneği vardır, tekrar tekrar basarak girilecek birden backspaces neden olur. #Arka arkaya birden çok kez basmanın bir etkisi yoktur. Bir takip #gereksizdir.

Ayrıca, bir tuşa basıldıktan hemen sonra farklı bir tuşa basılırsa, önceki tuşa basma otomatik olarak onaylanır. Böylece, 223işlevsel olarak aynıdır 22#3.

Zorluklarınız, bir dizi tuşa basmanın bir cep telefonunun görüntüleyeceği ilgili dizeye dönüştürülmesidir.

Örnekler

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

kurallar

  • Bu , bu yüzden en kısa doğru çözüm (bayt cinsinden) kazanır
  • Kazanan cevap bir hafta içinde seçilecek
  • Standart boşluklar yasaktır
  • Cevabınız, standart yöntemlerden birinde girdi alan ve çıktı üreten tam bir program, adlandırılmış bir işlev veya anonim bir işlev şeklinde olabilir

Liderler Sıralaması

Bu yazının altındaki Yığın Parçacığı, a) her dil için en kısa çözümün listesi ve b) genel bir lider panosu olarak cevaplardan lider tablosunu oluşturur.

Yanıtınızın göründüğünden emin olmak için lütfen aşağıdaki Markdown şablonunu kullanarak yanıtınızı bir başlıkla başlatın:

## Language Name, N bytes

Ngönderiminizin büyüklüğü nerede . Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğu veya yorumlayıcı bayrak cezalarını ayrı olarak listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra snippet'te görünecek bir bağlantı da yapabilirsiniz:

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


1
Sayıları nasıl üretiyorsunuz? Bir örnekte '9' rakamına sahipsiniz, ancak belirtiminiz ( 2 -> A, 22 -> B..., 2222 -> A....) herhangi bir sayının üretilmesine izin vermiyor.
C. Quilley

1
@ C.Quilley Bu diyagramı körü körüne kopyalamak için aldım, şimdi düzeltildi.
Mego


1
@AlexA. Bir dupe değil, standart telefon numpad girişi, T9 sözlük araması değil.
Mego

Yanıtlar:


3

K5, 112 bayt

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

Bu gerçekten bir karmaşa, ama sanırım onu ​​golf için oda adil bir miktar var.

Öncelikle, tuş haritası için bir arama tablosu oluşturmamız gerekiyor. Kendilerine eşlenen 2, 4 ve 5 karakterli tuşlar vardır, bu nedenle her girişi 20'ye doldurmak, bu tabloyu daha sonra döngüsel olarak dizine ekleme işlemini basitleştirir:

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

Sonra girdiyi çalışmalara böldüm:

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

Herhangi bir # koşuyu bırakın ve her karşılaştığımda şerit izlemesi çalışır *:

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

Ve sonra, her bir çalışmanın uzunluğuna ve ilk öğesine dayalı olarak bu arama tablosuna dizin oluşturmaya hazırım.

Hep birlikte:

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

Düzenle:

5 bayt kaydet:

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

Sen kısaltabilir (20#'((" ";".?!"),0 3 6 9 12 15 19 22_`c$65+!26),'$!10)için (20#'((" ";".?!"),((3*!6),19 22)_`c$65+!26),'$!10).
kirbyfan64sos

Evet, bunu birkaç dakika önce buldum.
JohnE

3

Piton 2, 230 206 bayt

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

Bu, bir tuş basma dizesini bağımsız değişken olarak alan ve bir cep telefonunun görüntüleyeceği karşılık gelen dizeyi döndüren bir f işlevi yaratır . Ayrıca isteğe bağlı ikinci argümanı karşılık gelen karakterlerine sözlük eşleme anahtarları olarak alır, örneğin {"0": "0", "1": ".?! 1", ...} .

İlk olarak, tuşlara basma dizisi, [[8 ”,“ # ”,“ 99999 ”,“ # ”, ...] gibi karakterlerin tekrarlanmasıyla gruplandırılır . Ardından, her bir grubun ilk karakteri ikinci argüman olarak iletilen sözlükte eşlenir, örneğin 9 WXYZ9 ile eşleşir . Son olarak, grubun uzunluğu sözlükteki değerde ofset olarak kullanılır.

Ofsetin, yinelenen karakter grubunun uzunluğu üzerinde modulo kullanması gerektiğine dikkat edin, çünkü tuşa basma döngü yapabilir. Ayrıca, # karakterinin \ 0 ile eşlendiğini ve yalnızca 99 # 99'un 9999 ile aynı olmadığı için kaldırıldığını unutmayın .

Sorudaki örneklerin her biri için işlevin çıktısı şöyledir:

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

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)

Bu muhtemelen biraz daha küçük yapılabilir, ancak sonuçtan oldukça memnunum. Karakterleri bir veya daha fazla yinelenen gruplara böler, ardından dizide adım adım ilerler, her karakteri karma değerine eşler ve son dizeye ekler. Herhangi bir sayıda '#' ile karşılaşırsa, onu yok sayar. Herhangi bir '*' ile karşılaşırsa, bu sayıyı son dizenin sonundan kaldırır.


0

Python 2,237 bayt

Cr3 sözlüğünü kullanarak, ancak re olmadan.

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 bayt

Çok uzun. 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])

Üçüncü örnek olan 7 ## 222 # 222 ** 7 # 222 # 4 , komut dosyanızın 10 ('*' tabanı ile bir ValueError : int () için geçersiz değişmez değeri yükseltmesine neden olacaktır .
cr3
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.