Chuyển đổi số thành biểu tượng cảm xúc toán học [đã đóng]


13

Trong Emoji Math, một mô-đun do người dùng tạo cho trò chơi video Keep Talking And Nobody Explodes, các số được viết dưới dạng chuỗi các biểu tượng cảm xúc, trong đó mỗi biểu tượng cảm xúc đại diện cho một chữ số cơ bản 10 chữ số. Dưới đây là bảng chuyển đổi giữa các chữ số và biểu tượng cảm xúc.

Digit | Emoticon
  0   |    :) 
  1   |    =(  
  2   |    (: 
  3   |    )=  
  4   |    :(    
  5   |    ):  
  6   |    =)  
  7   |    (= 
  8   |    :|  
  9   |    |: 

Cho một số, xuất nó trong mã hóa Emoji Math. Bạn có thể giả sử sự vắng mặt của các ký tự không phải là số.

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


4
Chúng ta có được phép lấy số đầu vào dưới dạng chuỗi không?
Tàu

3
... Hoặc một mảng các chữ số.
Xù xì

1
@Tau nghe có vẻ như có ý định chấp nhận một chuỗi - "Bạn có thể giả sử không có các ký tự không phải là số."; chúng ta nên hỏi "Chúng ta có thể lấy đầu vào là một số nguyên không?"
Jonathan Allan

1
Tôi đã bỏ phiếu để đóng là không rõ ràng cho đến khi các điểm trên được giải quyết. Nhưng đừng ngần ngại ping tôi khi nó đã được sửa để tôi có thể rút lại phiếu bầu của mình hoặc bỏ phiếu để mở lại.
Arnauld

1
@Tau tôi đã hỏi vì điều này . OP cần trả lời.
mbomb007

Câu trả lời:


5

Japt , 29 24 byte

-5 byte nhờ @Shaggy

s":)=((:)=:():=)(=:||:"ò

Lấy đầu vào dưới dạng chuỗi

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


Chào mừng bạn đến với Japt :) m@có thể được thay thế bằng £để lưu một byte. Nhưng điều này có thể được thực hiện trong 24 byte bằng cách sử dụng chuyển đổi cơ sở.
Xù xì

Rất tiếc, có vẻ như đây không thực sự là giải pháp Japt đầu tiên của bạn! Tuy nhiên, bạn vẫn đủ điều kiện nhận tiền thưởng này , nếu bạn muốn thử.
Xù xì




4

TI-BASIC, 79 byte

Ans→Str1:" :For(I,1,length(Str1:Ans+sub(":)=((:)=:():=)(=:||:",1+2expr(sub(Str1,I,1)),2:End:sub(Ans,2,length(Ans)-1

Đầu vào là một chuỗi các chữ số trong Ans.
Đầu ra là số được mã hóa Emoji.

Ví dụ:

"134
134
prgmCDGF1C
:)(:)=
"2213894
2213894
prgmCDGF1C
(:(:=()=:||::(

Giải trình:

Ans→Str1                                                 ;store the input in Ans
"                                                        ;leave " " in Ans
For(I,1,length(Str1                                      ;loop over each character in the
                                                         ; input string
Ans+sub(":)=((:)=:():=)(=:||:",1+2expr(sub(Str1,I,1)),2  ;convert the current character
                                                         ; to a number and use it as the
                                                         ; index into the encoding string
                                                         ; then append the encoded digit
End
sub(Ans,2,length(Ans)-1                                  ;remove the prepended space and
                                                         ; store the result in Ans
                                                         ;implicit print of Ans

Ngoài ra, đây là giải pháp 94 byte lấy số làm đầu vào thay vì chuỗi:

int(10fPart(Ans₁₀^(seq(⁻X-1,X,0,log(Ans→L₁:" :For(I,dim(L₁),1,-1:Ans+sub(":)=((:)=:():=)(=:||:",1+2L₁(I),2:End:sub(Ans,2,length(Ans)-1

Ví dụ:

134
             134
prgmCDGF1C
:)(:)=
2213894
         2213894
prgmCDGF1C
(:(:=()=:||::(

Giải trình:

int(10fPart(Ans₁₀^(seq(⁻X-1,X,0,log(Ans→L₁     ;generate a list of the input's digits
                                             ; reversed and store it in L₁
"                                            ;leave " " in Ans
For(I,dim(L₁),1,-1                            ;loop over L₁ backwards
Ans+sub(":)=((:)=:():=)(=:||:",1+2L₁(I),2     ;use the value of the I-th element in L₁ as
                                              ; the index into the encoding string then
                                              ; append the encoded digit
End
sub(Ans,2,length(Ans)-1                       ;remove the prepended space and store the
                                              ; result in Ans
                                              ;implicit print of Ans

Ghi chú:



3

Java 8, 80 byte

n->n.forEach(i->System.out.print(":)=((:)=:():=)(=:||:".split("(?<=\\G..)")[i]))

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

Giải trình:

n->                           // Method with IntStream parameter and no return-type
  n.forEach(i->               //  For each digit `i` in the input:
    System.out.print(         //   Print without newline:
      ":)=((:)=:():=)(=:||:"  //    Push this String
        .split("(?<=\\G..)")  //    Split into parts of size 2
          [i]))               //    And print the `i`'th part

3

Mã ES6, 77 66 byte

Giảm xuống 66 nhờ các đề xuất từ ​​@Charlie Harding và @asgallant

Cuối cùng phải tạo một tài khoản trên codegolf vì đây là một thử thách nhỏ thú vị!

Dạng tối thiểu nhất của câu trả lời ban đầu, khi mong đợi đầu vào chỉ có chuỗi:

n=>[...n].map(c=>":)=((:)=:():=)(=:||:".match(/../g)[c]).join("")

Thứ hai, câu trả lời ban đầu của tôi sử dụng regex dài hơn và đầu tiên ép đầu vào thành một chuỗi, Điều này hoạt động với cả đầu vào loại số và đầu vào chuỗi chữ số.

Trước tiên tôi ép đầu vào thành một chuỗi, sau đó được hủy thành một mảng bằng cách sử dụng es6 lây lan. Sau đó, tôi ánh xạ nó thông qua một cb matcher lấy biểu tượng cảm xúc chính xác từ một mảng được tạo bằng biểu thức chính quy /.{1,2}/g. Cuối cùng, mảng kết quả của biểu tượng cảm xúc được nối lại thành một chuỗi.

n=>[...(""+n)].map(c=>":)=((:)=:():=)(=:||:".match(/.{1,2}/g)[c]).join("")

Công cụ mảng JS là thú vị. Tôi chắc chắn vẫn còn một số chỗ để tối ưu hóa, điều này phù hợp với biểu thức chính quy trên mỗi vòng lặp của map.

Thử nghiệm nhanh chóng với những điều sau đây:

let emoticonize = n=>[...(""+n)].map(c=>":)=((:)=:():=)(=:||:".match(/../g)[c]).join("")

let test = arr => 
console.log(arr.map(x => ({ask:x, ans: emoticonize(x)})))

test([1,40,3697, 2330])
test(["1","40","3697", "2330"])


1
Tại sao có khoảng trống xung quanh =>mũi tên trong bản đồ? Điều đó có thể tiết kiệm hai byte, phải không?
Charlie Harding

1
Và tôi tin rằng regex /../gcũng thực hiện công việc tương tự, tiết kiệm bốn byte khác
Charlie Harding

Cuối cùng, nếu đầu vào nhất thiết phải là một chuỗi thì [...(""+n)]có thể đơn giản hóa [...n], tiết kiệm thêm năm byte
Charlie Harding

1
mapvà tìm kiếm regex thực sự khiến bạn phải trả giá cho các nhân vật ở đây; replacevà cũng substrhoạt động tốt, với ít ký tự hơn: 58 byte : n=>n.replace(/./g,c=>':)=((:)=:():=)(=:||:'.substr(2*c,2)), giả sử đầu vào là một chuỗi các chữ số.
asgallant

Man, đó là một cách gọn gàng để sử dụng replace@asgallant! Có vẻ như tôi cũng phải biết các chức năng chuỗi của mình :)
Roope

3

Haskell, 64 56 Laikoni byte

((words":) =( (: )= :( ): =) (= :| |: "!!).read.pure=<<)

Dùng thử trực tuyến

Ung dung

Áp dụng hàm wordscho chuỗi ký hiệu ":) =( (: )= :( ): =) (= :| |: "được phân tách bằng dấu cách của chúng ta để có danh sách và lấy phần tử thứ n(!!) cho mọi n trong chuỗi đầu vào của chúng ta, kết hợp các kết quả. nb (=<<) tương đương với concatMaptrong trường hợp này, ánh xạ một chuỗi vào danh sách các chuỗi và nối các kết quả. read . purechuyển đổi một ký tự thành một int, bằng cách nâng một ký tự thành một chuỗi, sau đó reading thành một int.

f x = ((words ":) =( (: )= :( ): =) (= :| |: " !!) . read . pure) =<< x


3

[R], 59 48 byte

phương pháp khác nhau:

 substr(":)=((:)=:():=)(=:||:",n<-2*scan()+1,n+1)

cảm ơn @aaron đã chỉ đạo tôi một lần nữa :)

nguyên:

 el(strsplit(":)x=(x(:x)=x:(x):x=)x(=x:|x|:","x",T))[scan()]

nhịp đập

 c(":)","=(","(:",")=",":(","):","=)","(=",":|","|:")[scan()]

1 byte


1
Cách tiếp cận khác nhau là một chút, bạn cần thêm một vào số quét được nhân đôi 2*scan()+1, với một chút sắp xếp lại mặc dù bạn vẫn có thể giữ nó ở mức 48 byte. Hãy thử trực tuyến!
Aaron Hayman


2

PowerShell , 64 60 59 byte

-1 byte nhờ mazzy

-join($args|% t*y|%{':)=((:)=:():=)(=:||:'|% S*g(2*"$_")2})

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

Lấy một chuỗi, tách chuỗi đó toCharArrayvà sau đó lập chỉ mục vào khóa biểu tượng cảm xúc bằng cách chuyển ký tự thành giá trị số của nó, nhân đôi nó bởi vì mỗi biểu tượng cảm xúc rộng hai, và sau đó lấy substringtừ vị trí đó cộng với một điểm cao hơn. Cuối cùng, nó kết hợp tất cả lại thành một chuỗi và đẩy nó ra.



@mazzy Vâng, tôi đã tìm hiểu cách chuyển sang int mà không nhận được giá trị ASCII, cảm ơn.
Veskah


2

C # (Trình biên dịch tương tác Visual C #) , 87 , 86 , 82 , 67 byte

Đạo cụ cho @Artholl và @someone để giúp tối ưu hóa

n=>$"{n}".SelectMany(x=>":)=((:)=:():=)(=:||:".Substring(x*2-96,2))

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


1
Bạn có thể lưu 2 byte . 1 byte nếu bạn sử dụng Substringthay vì Skip& Takevà 1 byte nếu bạn mã hóa giá trị char bằng không.
Artholl

@Artholl cảm ơn bạn! Bạn có thể chỉ cho tôi ý của bạn bằng cách mã hóa giá trị char không?
Innat3

Như bạn có thể thấy trong ví dụ. Chỉ cần viết 48thay vì '0'.
Artholl

Một số tối ưu hóa đơn giản; 67 byte. Hãy thử trực tuyến!
đại từ của tôi là monicareinstate

1
@someone không biết việc thay đổi loại đầu ra được cho phép bên ngoài chức năng
Innat3

1

JavaScript (ES6), 87 byte

n=>{for(s=":)=((:)=:():=)(=:||:",i=0;i<20;)n=n.split(i/2).join(s[i++]+s[i++]);return n}

Kết quả này ):thay vì (:cho3
Herman L

@Herman L Vâng, cảm ơn!
Naruyoko


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.