Konwertuj liczby na matematykę z emotikonami [zamknięte]

13

W Emoji Math, utworzonym przez użytkownika module do gry wideo Keep Talking And Nobody Explosci, liczby zapisywane są jako ciąg znaków emotikonów, gdzie każda emotikon reprezentuje podstawową 10 cyfr. Poniżej znajduje się tabela konwersji cyfr i emotikonów.

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

Podaj liczbę, wyślij ją w kodowaniu Emoji Math. Możesz założyć brak znaków nienumerycznych.

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Kto
źródło
4
Czy wolno nam brać numer wejściowy jako ciąg znaków?
Tau
3
... Lub tablica cyfr.
Kudłaty
1
@Tau brzmi, jakby intencją było zaakceptowanie ciągu - „Możesz założyć brak znaków nienumerycznych.”; powinniśmy zapytać: „Czy możemy przyjąć dane jako liczbę całkowitą?”
Jonathan Allan
1
Głosowałem za zamknięciem jako niejasne, dopóki powyższe punkty nie zostaną rozwiązane. Ale nie wahaj się ze mną pingować, gdy zostanie to naprawione, abym mógł wycofać swój głos lub zagłosować, aby ponownie otworzyć.
Arnauld
1
@Tau prosiłem o ponieważ to . PO musi odpowiedzieć.
mbomb007

Odpowiedzi:

5

Japt , 29 24 bajtów

-5 bajtów dzięki @Shaggy

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

Pobiera dane wejściowe jako ciąg

Wypróbuj online!

Herman L.
źródło
Witamy w Japt :) m@można go zastąpić, £aby zapisać bajt. Ale można to zrobić w 24 bajtach przy użyciu konwersji podstawowej.
Kudłaty
Ups, wygląda na to, że to nie jest twoje pierwsze rozwiązanie Japt! Nadal jednak kwalifikujesz się do tej nagrody , jeśli chcesz spróbować.
Kudłaty
5

C (gcc) , 62 58 bajtów

-4 bajty dzięki ceilingcat

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

Wypróbuj online!

gastropner
źródło
5

05AB1E , 26 bajtów

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

Wypróbuj online!

Emigna
źródło
To nie działa dla liczb z wieloma cyframi.
izlin
1
@izlin: Rzeczywiście. Nie zdawałem sobie sprawy, że to część wyzwania. Naprawiono teraz. Dzięki :)
Emigna
4

Python 2 , 65 62 bajtów

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

Wypróbuj online!

TFeld
źródło
4

TI-BASIC, 79 bajtów

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

Dane wejściowe to ciąg cyfr w Ans.
Dane wyjściowe to liczba zakodowana w Emoji Math.

Przykłady:

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

Wyjaśnienie:

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

Alternatywnie, oto rozwiązanie 94-bajtowe , które przyjmuje liczbę jako dane wejściowe zamiast ciągu:

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

Przykłady:

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

Wyjaśnienie:

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

Uwagi:

Tau
źródło
3

Java 8, 80 bajtów

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

Wypróbuj online.

Wyjaśnienie:

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
źródło
3

JS ES6, 77 66 bajtów

Do 66 dzięki sugestiom @Charlie Harding i @asgallant

Musiałem w końcu założyć konto w codegolf, ponieważ było to takie zabawne małe wyzwanie!

Najbardziej minimalna forma oryginalnej odpowiedzi, gdy oczekuje się tylko danych wejściowych:

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

Po drugie, moja pierwotna odpowiedź, która używa dłuższego wyrażenia regularnego i najpierw wymusza wejście w ciąg znaków. Działa to zarówno z wprowadzaniem typu liczbowego, jak i z wprowadzaniem ciągu cyfr.

Najpierw przymuszam dane wejściowe do łańcucha, który jest następnie rozkładany na tablicę przy użyciu spreadu es6. Następnie odwzorowuję go za pomocą dopasowującego cb, który pobiera prawidłowy emotikon z tablicy wykonanej za pomocą wyrażenia regularnego /.{1,2}/g. Ostatecznie uzyskana tablica emotikonów jest ponownie łączona z łańcuchem.

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

Tablica JS jest fajna. Jestem pewien, że jest jeszcze miejsce na optymalizację, to ponownie dopasowuje wyrażenie regularne w każdej pętli map.

Crappily przetestowany z następującymi:

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
źródło
1
Dlaczego =>na mapie są spacje wokół strzałki? To mogłoby zaoszczędzić dwa bajty, prawda?
Charlie Harding
1
I wierzę, że regex /../gwykonuje tę samą pracę, oszczędzając kolejne cztery bajty
Charlie Harding
Wreszcie, jeśli dane wejściowe są koniecznie łańcuchem, [...(""+n)]można je uprościć [...n], oszczędzając kolejne pięć bajtów
Charlie Harding
1
mapa wyszukiwanie wyrażeń regularnych kosztuje tutaj postacie; replacei substrdziała równie dobrze, z mniejszą liczbą znaków: 58 bajtów:, n=>n.replace(/./g,c=>':)=((:)=:():=)(=:||:'.substr(2*c,2))przyjmując, że dane wejściowe są ciągiem cyfr.
asgallant
stary, to fajny sposób na użycie replace@asgallant! Wydaje mi się, że muszę także poznać moje funkcje strunowe :)
Roope
3

Haskell, 64 56 bajtów Laikoni

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

Wypróbuj online

Nie golfił

Zastosuj funkcję wordsdo naszego rozdzielonego spacjami łańcucha symboli, ":) =( (: )= :( ): =) (= :| |: "aby uzyskać listę i uzyskać n- ty element (!!)dla każdego nw naszym ciągu wejściowym, łącząc wyniki. nb (=<<) jest concatMapw tym przypadku równoznaczne z odwzorowaniem ciągu na listę ciągów i konkatenacją wyników. read . purekonwertuje znak na int, podnosząc znak na ciąg, a następnie reading na int.

f x = ((words ":) =( (: )= :( ): =) (= :| |: " !!) . read . pure) =<< x
Charlie Harding
źródło
2
56 bajtów: Wypróbuj online!
Laikoni
3

[R], 59 48 bajtów

odmienne podejście:

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

dzięki @aaron za ponowne skierowanie mnie :)

oryginalny:

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

uderzenia

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

o 1 bajt

Zahiro Mor
źródło
1
Inne podejście jest nieco odbiegające, musisz dodać jeden do podwojonej zeskanowanej liczby 2*scan()+1, z odrobiną rearanżacji, choć nadal możesz zachować ją jako 48 bajtów. Wypróbuj online!
Aaron Hayman
2

PowerShell , 64 60 59 bajtów

-1 bajt dzięki mazzy

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

Wypróbuj online!

Bierze ciąg, dzieli go toCharArray, a następnie indeksuje do klucza emoji, rzutując znak na jego wartość liczbową, podwaja go, ponieważ każde emoji ma dwa szerokości, a następnie bierze substringz tego miejsca plus jeden wyżej. Wreszcie łączy to wszystko w jeden ciąg i wypycha go na wyjście.

Veskah
źródło
1
59 bajtów
mazzy
@mazzy Tak, zastanawiałem się, jak rzutować na int bez uzyskiwania wartości ASCII, dzięki.
Veskah
2

C # (interaktywny kompilator Visual C #) , 87 , 86 , 82 , 67 bajtów

Wspiera @Artholl i @someone za pomoc w optymalizacji

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

Wypróbuj online!

Innat3
źródło
1
Możesz zapisać 2 bajty . 1 bajt, jeśli używasz Substringzamiast Skip& Takei 1 bajt, jeśli na stałe wpisałeś zerową wartość char.
Artholl,
@Artholl dziękuję! Czy możesz mi pokazać, co masz na myśli, wpisując na stałe wartość zero char?
Innat3
Jak widać na przykładzie. Po prostu napisz 48zamiast '0'.
Artholl,
Kilka prostych optymalizacji; 67 bajtów. Wypróbuj online!
mój zaimek to monicareinstate
1
@ ktoś nie wiedział, że zmiana typu wyjścia jest dozwolona poza funkcją
Innat3
1

JavaScript (ES6), 87 bajtów

n=>{for(s=":)=((:)=:():=)(=:||:",i=0;i<20;)n=n.split(i/2).join(s[i++]+s[i++]);return n}
Naruyoko
źródło
Ten wysyła ):zamiast (:do3
Herman L
@Herman L Tak, dziękuję!
Naruyoko,