Konversi Angka Ke Emoji Math [ditutup]

13

Dalam Emoji Math, modul yang dibuat pengguna untuk permainan video Keep Talking And Nobody Explodes, angka ditulis sebagai string emotikon, di mana setiap emotikon mewakili basis 10 digit. Di bawah ini adalah tabel konversi antara angka dan emotikon.

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

Diberi nomor, tampilkan dalam pengodean Emoji Math. Anda dapat mengasumsikan tidak adanya karakter non-numerik.

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Siapa
sumber
4
Apakah kami diizinkan untuk mengambil nomor input sebagai string?
Tau
3
... Atau array angka.
Shaggy
1
@Tau terdengar seperti niatnya untuk menerima string - "Anda dapat mengasumsikan tidak adanya karakter non-numerik."; kita harus bertanya "Bisakah kita mengambil input sebagai bilangan bulat?"
Jonathan Allan
1
Saya memilih untuk menutup sebagai tidak jelas sampai poin di atas ditangani. Tapi jangan ragu untuk mem-ping saya setelah diperbaiki agar saya dapat menarik kembali suara saya atau memilih untuk membuka kembali.
Arnauld
1
@Tau aku bertanya karena ini . OP perlu menjawab.
mbomb007

Jawaban:

5

Japt , 29 24 byte

-5 byte terima kasih kepada @Shaggy

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

Mengambil input sebagai string

Cobalah online!

Herman L.
sumber
Selamat datang di Japt :) m@dapat diganti dengan £untuk menyimpan byte. Tapi ini bisa dilakukan dalam 24 byte menggunakan konversi basis.
Shaggy
Ups, sepertinya ini bukan solusi Japt pertama Anda! Anda masih memenuhi syarat untuk hadiah ini , jika Anda ingin mencobanya.
Shaggy
5

C (gcc) , 62 58 byte

-4 bytes berkat ceilingcat

f(n){n&&write(1,":)=((:)=:():=)(=:||:"+n%10*2,2,f(n/10));}

Cobalah online!

gastropner
sumber
5

05AB1E , 26 byte

"|:(=):)=:)"2ôºJ2ô`Šr)sSèJ

Cobalah online!

Emigna
sumber
Ini tidak berfungsi untuk angka dengan banyak digit.
izlin
1
@izlin: Memang. Saya tidak menyadari bahwa itu adalah bagian dari tantangan. Tetap sekarang. Terima kasih :)
Emigna
4

Python 2 , 65 62 byte

lambda n:''.join(':=():)=(:|)(:=(:)=|:'[int(c)::10]for c in n)

Cobalah online!

TFeld
sumber
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

Input adalah serangkaian digit Ans .
Output adalah nomor yang dikodekan Emoji Math.

Contoh:

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

Penjelasan:

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

Sebagai alternatif, berikut ini adalah solusi 94 byte yang menggunakan nomor sebagai input alih-alih sebuah string:

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

Contoh:

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

Penjelasan:

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

Catatan:

Tau
sumber
3

Perl 5 -p , 42 byte

s/./substr":)=((:)=:():=)(=:||:",$&*2,2/ge

Cobalah online!

Xcali
sumber
3

Java 8, 80 byte

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

Cobalah online.

Penjelasan:

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
Kevin Cruijssen
sumber
3

JS ES6, 77 66 byte

Turun ke 66 berkat saran dari @Charlie Harding dan @asgallant

Harus akhirnya membuat akun di codegolf karena ini adalah tantangan kecil yang menyenangkan!

Bentuk paling minim dari jawaban asli, saat mengharapkan input hanya string:

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

Kedua, jawaban asli saya yang menggunakan regex yang lebih panjang dan pertama memaksa input menjadi string, Ini bekerja dengan input tipe angka dan string input digit.

Saya pertama kali memaksa input menjadi string, yang kemudian dirusak menjadi array menggunakan penyebaran es6. Lalu saya memetakannya melalui pencocokan cb yang mengambil emoticon yang benar dari array yang dibuat dengan regex /.{1,2}/g. Akhirnya array emotikon yang dihasilkan digabungkan kembali ke string.

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

Hal-hal array JS menyenangkan. Saya yakin masih ada ruang untuk optimasi, ini mencocokkan kembali regex pada setiap loopmap .

Diuji dengan jelek sebagai berikut:

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

Roope
sumber
1
Mengapa ada spasi di sekitar =>panah di peta? Itu bisa menghemat dua byte, bukan?
Charlie Harding
1
Dan saya percaya regex /../gmelakukan pekerjaan yang sama juga, menghemat empat byte lagi
Charlie Harding
Akhirnya, jika input tersebut harus berupa string maka [...(""+n)]dapat disederhanakan [...n], menyimpan lima byte lebih lanjut
Charlie Harding
1
mapdan pencarian regex sebenarnya dikenakan biaya karakter Anda di sini; replacedan substrberfungsi dengan baik, dengan lebih sedikit karakter: 58 byte:, n=>n.replace(/./g,c=>':)=((:)=:():=)(=:||:'.substr(2*c,2))dengan asumsi input sebagai serangkaian digit.
asgallant
replace*** , itu cara yang rapi untuk menggunakan @gallant! Sepertinya saya harus mengenal fungsi string saya juga :)
Roope
3

Haskell, 64 56 Laikoni byte

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

Cobalah online

Tidak disatukan

Terapkan fungsi ini wordske string simbol yang dipisahkan oleh spasi ":) =( (: )= :( ): =) (= :| |: "untuk mendapatkan daftar, dan dapatkan elemen ke- n(!!) untuk setiap n di string input kami, menggabungkan hasilnya. nb (=<<) setara dengan concatMapdalam hal ini, memetakan string ke daftar string dan merangkai hasilnya. read . puremengkonversi karakter ke int, dengan mengangkat karakter ke string, lalu readke int.

f x = ((words ":) =( (: )= :( ): =) (= :| |: " !!) . read . pure) =<< x
Charlie Harding
sumber
2
56 byte: Cobalah secara online!
Laikoni
3

[R], 59 48 byte

pendekatan yang berbeda:

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

terima kasih kepada @aaron untuk mengarahkan saya lagi :)

asli:

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

ketukan

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

dengan 1 byte

Zahiro Mor
sumber
1
Pendekatan yang berbeda sedikit berbeda, Anda perlu menambahkan satu ke nomor yang dipindai dua kali lipat 2*scan()+1, dengan sedikit penataan ulang meskipun Anda masih dapat menyimpannya sebagai 48 byte. Cobalah online!
Aaron Hayman
2

PowerShell , 64 60 59 byte

-1 byte berkat mazzy

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

Cobalah online!

Mengambil string, membaginya dalam toCharArray, dan kemudian mengindeks ke tombol emoji dengan melemparkan karakter ke nilai numeriknya, menggandakannya karena setiap emoji dua lebar, dan kemudian mengambil substringdari tempat itu ditambah satu lebih tinggi. Akhirnya ia menggabungkan semuanya menjadi satu string dan mendorongnya ke output.

Veskah
sumber
1
59 byte
mazzy
@ Mazzy Ya, saya mengatur bagaimana cara melakukan cast ke int tanpa mendapatkan nilai ASCII, terima kasih.
Veskah
2

Ikon , 78 75 byte

procedure f(n);s:="";s||:=":)=((:)=:():=)(=:||:"[!n*2+1+:2]&/n;return s;end

Cobalah online!

Galen Ivanov
sumber
2

C # (Visual C # Interactive Compiler) , 87 , 86 , 82 , 67 byte

Props untuk @Artholl dan @someone untuk membantu mengoptimalkan

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

Cobalah online!

Innat3
sumber
1
Anda dapat menyimpan 2 byte . 1 byte jika Anda menggunakan Substringalih-alih Skip& Takedan 1 byte jika Anda hardcode nilai nol char.
Artholl
@Artholl terima kasih! Bisakah Anda menunjukkan kepada saya apa yang Anda maksud dengan hardcoding nilai nol char?
Innat3
Seperti yang Anda lihat pada contoh. Cukup tulis 48saja '0'.
Artholl
Beberapa optimasi sederhana; 67 byte Cobalah online!
kata ganti saya adalah monicareinstate
1
@ seseorang tidak tahu mengubah tipe output diizinkan di luar fungsi
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}
Naruyoko
sumber
Output ini ):bukan (:untuk3
Herman L
@Herman L Ya, terima kasih!
Naruyoko
1

Jelly , 24 byte

“LƇ§×Yþ’ḃ5$s2ị“:)=(|”ị@D

Cobalah online!

Nick Kennedy
sumber