Mã bàn phím để văn bản!


14

Đưa ra một Chuỗi và một mảng làm đầu vào, nhiệm vụ của bạn là xuất văn bản mà Chuỗi đầu vào sẽ in khi gõ trên Bàn phím di động thông thường. Trong Bàn phím di động, một chữ cái được gõ bằng cách nhấn nút n lần, trong đó n là vị trí của chữ cái trên nhãn của nút. Vì vậy, 22nên đầu ra b.

Bàn phím


Quy tắc

  • Mảng Helper sẽ chứa Bản đồ ký tự ( [" ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]). Điều này sẽ được đưa ra để tiết kiệm cho bạn một số byte.

  • Các #biểu tượng sẽ chuyển vụ việc. Trường hợp ban đầu sẽ thấp hơn. Vì vậy, 2#3nên đầu ra aD.

  • Các 0sẽ thêm một dấu cách. Vì vậy, 202nên đầu ra a a.

  • Sẽ có một khoảng trắng ( ) trong Chuỗi đầu vào để bắt đầu một chữ cái mới nằm trên cùng một nút số. Ví dụ để nhập aa, Chuỗi đầu vào sẽ là 2 2.

  • Điều chắc chắn là Chuỗi đầu vào sẽ luôn là Mã KeyPad hợp lệ.


Đầu vào

Bạn có thể nhận đầu vào bằng bất cứ cách nào ngôn ngữ của bạn hỗ trợ.


Đầu ra

Bạn có thể xuất kết quả theo bất kỳ cách nào bạn muốn. Chức năng returncũng được cho phép.


Các trường hợp thử nghiệm

#4440555#666888330#999#66688111 -> "I Love You!"
#6#33777 7779990#222#4477744477778627777111 -> "Merry Christmas!"
#44#27 79990#66#3390#999#332777111 -> "Happy New Year!"


Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!



4
Tôi nghĩ cách viết hoa yeartrong trường hợp thử nghiệm cuối cùng là sai.
Maltysen

1
Chúng ta có phải xem xét vòng lặp? Giống như, 2222-> không hợp lệ hoặc 2222-> b?
Kuilin Li

@Maltysen Vâng, bạn nói đúng. Tôi đã chỉnh sửa câu hỏi. Cảm ơn đã chỉ ra điều đó. :)
Arjun

Không quan tâm, làm ##hoặc tăng gấp đôi không gian cần phải được xử lý?
Neil

Câu trả lời:



3

JavaScript, 105 99 byte

f=
(s,a)=>s.replace(/#| ?((.)\2*)/g,(m,n,d)=>d?(l=a[d][n.length-1],x?l:l.toUpperCase()):(x=!x,''),x=1)

a=['  ','.,!','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz']

F=s=>console.log( f(s,a) )
F('#4440555#666888330#999#66688111')
F('#6#33777 7779990#222#4477744477778627777111');
F('#44#27 79990#66#3390#999#332777111');

  • Tắt 6 byte cảm ơn @Neil.

Bạn có thể lưu một số byte bằng cách lưu trữ chữ cái tạm thời (ví dụ l) và sau đó sử dụng c?l:l.toUpperCase().
Neil

@Neil. Xem xét các mảng đã được viết thường ... cảm ơn :)
Washington Guedes

2

Perl 6 ,  119  97 byte

giải pháp dựa trên bản đồ 119 byte

->$_,\a{my$u=0;[~] map {/'#'/??{$u+^=1;|()}()!!(&lc,&uc)[$u](a[.substr(0,1)].substr(.chars-1,1))},.comb(/(\d)$0*|'#'/)}

Thử nó

giải pháp thay thế dựa trên 97 byte

->$_,\a{my$u=0;S:g/(\d)$0*|./{$0??(&lc,&uc)[$u](a[$0].substr($/.chars-1,1))!!($u+^=$/eq'#')x 0}/}

Thử nó

Mở rộng:

->     # pointy block lambda

  $_,  # input string
  \a   # helper array

{

  my $u = 0;

  S                        # substitute (implicit against 「$_」)
  :global
  /

    | (\d) $0*             # digit followed by same digit
    | .                    # everything else

  /{

    $0                     # is 「$0」 set (digit)


    ??                     # if so then
        (&lc,&uc)[$u](     # call either 「lc」 or 「uc」

          a[$0]            # get the value from the input array
          .substr(         # select the correct character
            $/.chars - 1,
            1
          )

        )


    !!
        (
          $u +^= $/ eq '#' # numeric xor $u if 「#」 was matched
        ) x 0              # string repeated zero times (empty string)

  }/
}

2

JavaScript ES6 - 124 byte

Chơi gôn

f=h=>a=>(o=c="")+a.match(/#|(.)\1*/g).forEach(e=>e==" "?0:e=="#"?c=!c:(n=h[e[0]][e.length-1])*(o+=c?n.toUpperCase():n))?o:0;

f=h=>a=>(o=c="")+a.match(/#|(.)\1*/g).forEach(e=>e==" "?0:e=="#"?c=!c:(n=h[e[0]][e.length-1])*(o+=c?n.toUpperCase():n))?o:0;

console.log(f(["  ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"])("#4440555#666888330#999#66688111"));
console.log(f(["  ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"])("#6#33777 7779990#222#4477744477778627777111"));
console.log(f(["  ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"])("#44#27 79990#66#3390999332777111"));

Ung dung:

f=(a,h)=>{
    //out string
    o="";
    //uppercase or lowercase (initialized as "" and then inverted in golfed version)
    c=0;
    //split it into array of instructions, which are sets of repeated characters, or # solely alone
    a.match(/#|(.)\1*/g).forEach((e)=>{
        e==" "?0:
            e=="#" ? (c=!c) : ( ()=>{ //lambda added because two statements ungolfed, multiplied in the golfed version
                    n=h[e[0]][e.length-1];
                    o+=c?n.toUpperCase():n;
                })()
    })
    return o;
}

1

JavaScript, 301 byte

(a,b)=>{u="l";p=[];r="";a.split``.map((c,i)=>p.push(c!=a[i-1]?" "+c:c));p.join``.trim().replace('   ', ' ').split` `.map(l=>{if(l=="#"){u=(u=="l"?b.forEach((y,j)=>b[j]=y.toUpperCase())||"u":b.forEach((y,j)=>b[j]=y.toLowerCase())||"l")}else{if(l!="  "){r+=b[+l[0]][l.length-1]}else{r+=" "}}});return r}

f=(a,b)=>{u="l";p=[];r="";a.split``.map((c,i)=>p.push(c!=a[i-1]?" "+c:c));p.join``.trim().replace('   ', ' ').split` `.map(l=>{if(l=="#"){u=(u=="l"?b.forEach((y,j)=>b[j]=y.toUpperCase())||"u":b.forEach((y,j)=>b[j]=y.toLowerCase())||"l")}else{if(l!="  "){r+=b[+l[0]][l.length-1]}else{r+=" "}}});return r}

console.log(f("#4440555#666888330#999#66688111 ",["  ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]));
console.log(f("#6#33777 7779990#222#4477744477778627777111",["  ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]));
console.log(f("#44#27 79990#66#3390#999#332777111",["  ",".,!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]));

Tôi biết điều này rất dài, nhưng đây là điều tốt nhất tôi có thể.


1

V , 60 byte

Í /|
ͨ䩨±*©/½a[submatch(1)][len(submatch(2))]
Í|
ò/#
g~$x

(Có một không thể in được ½<Ctrl+r>a )

Hãy thử trực tuyến!

Giải thích


Í /|                                          #Replace all " " with "|"
ͨ䩨±*©                                      #Replace all (\d)(\1*)
        /½                                    #With =
          ^Ra                                 #(Inserts the passed array)
             [submatch(1)][len(submatch(2))]  #Index into the array
Í|                                            #Replace all "|" with "" (second ò implied)
ò   ò                                         #Recursively (until breaking)
 /#                                           #Go to the next #
g~$                                           #Toggle case until the of the line
   x                                          #Delete current char (#)
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.