Sayıları Emoji Math'a Dönüştür [kapalı]


13

Video Tutmaya Devam Et ve Kimse Patlamıyor video oyunu için kullanıcı tarafından oluşturulan bir modül olan Emoji Math'da, sayılar ifadelerin dizeleri olarak yazılır, burada her ifade bir 10 basamağı temsil eder. Aşağıda rakamlar ve ifadeler arasındaki dönüşüm tablosu bulunmaktadır.

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

Bir sayı verildiğinde Emoji Math kodlamasında çıktı alın. Sayısal olmayan karakterlerin olmadığını varsayabilirsiniz.

Bu , bu yüzden bayttaki en kısa cevap kazanır.


4
Giriş numarasını dize olarak almamıza izin var mı?
Tau

3
... ya da bir dizi rakam.
Shaggy

1
@Tau kulağa bir dize kabul etmek gibi geliyor - "Sayısal olmayan karakterlerin olmadığını varsayabilirsiniz."; "Girdiyi tamsayı olarak alabilir miyiz?" sorusunu sormalıyız.
Jonathan Allan

1
Yukarıdaki hususlar ele alıncaya kadar belirsiz olarak kapanmaya oy verdim. Ancak, düzeltildikten sonra bana ping atmaktan çekinmeyin, böylece oyumu geri çekebilir veya yeniden açmak için oy verebilirim.
Arnauld

1
@Tau Özrüme soruyordum bu . OP'nin cevaplaması gerekiyor.
mbomb007

Yanıtlar:


5

Japt , 29 24 bayt

@Shaggy sayesinde -5 bayt

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

Girişi dize olarak alır

Çevrimiçi deneyin!


Japt'e hoş geldiniz :) bir bayt kaydetmek için m@ile değiştirilebilir £. Ancak bu, temel dönüştürme kullanılarak 24 bayt olarak yapılabilir .
Shaggy

Hata! Görünüşe göre bu aslında ilk Japt çözümünüz değil! Yine de, eğer denemek istiyorsanız, bu ödül için hak kazanıyorsunuz .
Shaggy


5

05AB1E , 26 bayt

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

Çevrimiçi deneyin!


Bu, birden fazla basamaklı sayılar için çalışmaz.
izlin

1
@izlin: Gerçekten. Bunun zorluğun bir parçası olduğunu fark etmemiştim. Şimdi düzeltildi. Teşekkürler :)
Emigna


4

TI-BASIC, 79 bayt

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

Girdi, içindeki bir basamak dizesidir Ans.
Çıktı, Emoji Math kodlu sayıdır.

Örnekler:

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

Açıklama:

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

Alternatif olarak, sayı yerine dize yerine 94 baytlık bir çözüm var:

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

Örnekler:

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

Açıklama:

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

Notlar:



3

Java 8, 80 bayt

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

Çevrimiçi deneyin.

Açıklama:

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

JS ES6, 77 66 bayt

@Charlie Harding ve @asgallant'ın önerileri sayesinde 66'ya kadar

Bu eğlenceli küçük bir meydan okuma olduğu için nihayet codegolf bir hesap yapmak zorunda kaldım!

Yalnızca dize girdisi beklenirken orijinal yanıtın en minimal biçimi:

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

İkincisi, daha uzun bir regex kullanan ve ilk girdi bir dizeye zorlar benim orijinal cevap, Bu hem sayı türü girişi hem de basamak dizisi girişi ile çalışır.

İlk önce girdiyi bir dizeye zorlar, bu da es6 yayılımını kullanarak bir diziye zarar verir. Sonra regex ile yapılan bir diziden doğru ifade kapmak bir eşleştirici cb ile eşleyin /.{1,2}/g. Son olarak, ortaya çıkan ifadeler dizisi bir dizeye geri eklenir.

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

JS dizi şeyler eğlenceli. Eminim hala optimizasyon için yer var, bu, her döngüdeki normal ifadeyle eşleşiyormap .

Crappily aşağıdakilerle test edilmiştir:

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
=>Haritada neden okun etrafında boşluklar var ? Bu iki bayt kurtarabilirdi, değil mi?
Charlie Harding

1
Regex'in /../gde aynı işi yaptığını ve dört bayt
Charlie Harding

Son olarak, giriş mutlaka bir dize [...(""+n)]ise [...n], basitleştirilebilir , beş bayt daha tasarruf edilebilir
Charlie Harding

1
mapve normal ifade araması aslında burada karakterlere mal oluyor; replaceve substrdaha az karakterle çalışın: 58 bayt:, n=>n.replace(/./g,c=>':)=((:)=:():=)(=:||:'.substr(2*c,2))girdi bir basamak dizisi olarak varsayılarak.
asgallant

dostum, bu replace@asgallant kullanmanın düzgün bir yolu ! Ben de benim dize fonksiyonları bilmek gerekir :)
Roope

3

Haskell, 64 56 Laikoni bayt

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

Çevrimiçi deneyin

Ungolfed

İşlevini uygulayın wordssembollerin bizim boşlukla ayrılmış dizeye ":) =( (: )= :( ): =) (= :| |: "bir listesini almak ve almak için v- inci elemanı (!!)her için n sonuçlarını birleştirerek, bizim giriş dizesi. nb (=<<) , concatMapbu durumda bir dizeyi bir dize listesiyle eşleştirir ve sonuçları birleştirir. read . purebir karakteri bir dizeye kaldırarak ve sonra readbir int'e çevirerek bir karakteri int'e dönüştürür.

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


3

[R], 59 48 bayt

farklı yaklaşım:

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

beni tekrar yönlendirdiği için @aaron'a teşekkürler :)

orijinal:

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

atım

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

1 bayt tarafından


1
Farklı yaklaşım biraz kapalı, 2*scan()+1yine de 48 bayt olarak tutabilseniz de, taranan numaraya bir tane eklemeniz gerekiyor , yine de biraz yeniden düzenleme ile. Çevrimiçi deneyin!
Aaron Hayman


2

PowerShell , 64 60 59 bayt

Mazzy sayesinde -1 bayt

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

Çevrimiçi deneyin!

Bir dize alır, onu böler toCharArrayve sonra karakteri sayısal değerine çevirerek emoji anahtarını dizine ekler, her iki emoji iki geniş olduğu için iki katına çıkarır ve sonra substringo noktadan bir tane daha yükselir. Sonunda tüm bunları tek bir dizeye ekler ve çıktıya iter.



@mazzy Evet, ASCII değerini almadan int'e nasıl yayınlanacağımı araladım, teşekkürler.
Veskah


2

C # (Görsel C # Etkileşimli Derleyici) , 87 , 86 , 82 , 67 bayt

Optimize etmeye yardımcı oldukları için @Artholl ve @someone'den aksesuarlar

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

Çevrimiçi deneyin!


1
2 bayt kaydedebilirsiniz . Eğer kullanırsanız 1 bayt Substringyerine Skip& Takeve 1 bayt sıfır karakter değerini hardcode eğer.
Artholl

@ Artholl teşekkür ederim! Sıfır karakter değerini kodlayarak bana ne demek istediğini gösterebilir misin?
Innat3

Örnekte gördüğünüz gibi. Bunun 48yerine yazın '0'.
Artholl

Birkaç basit optimizasyon; 67 bayt. Çevrimiçi deneyin!
zamirim

1
@someone çıktı türünü değiştirme işlevi dışında izin vermedi bilmiyordu
Innat3

1

JavaScript (ES6), 87 bayt

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

Bu çıktılar ):yerine (:için3
Herman L

@Herman L Evet, teşekkürler!
Naruyoko


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.