Converter números para Emoji Math [fechado]

13

No Emoji Math, um módulo criado pelo usuário para o videogame Keep Talking And Nobody Explodes, os números são escritos como cadeias de emoticons, em que cada emoticon representa 10 dígitos básicos. Abaixo está a tabela de conversão entre dígitos e emoticons.

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

Dado um número, produza-o na codificação Emoji Math. Você pode assumir a ausência de caracteres não numéricos.

Isso é , então a resposta mais curta em bytes vence.

Quem
fonte
4
Podemos pegar o número de entrada como uma string?
Tau
3
... Ou uma matriz de dígitos.
Shaggy
1
@Tau parece que a intenção era aceitar uma string - "Você pode assumir a ausência de caracteres não numéricos."; deveríamos perguntar "Podemos aceitar a entrada como um número inteiro?"
Jonathan Allan
1
Votei em fechar como obscuro até que os pontos acima sejam abordados. Mas não hesite em me enviar um ping depois que estiver definido, para que eu possa retirar meu voto ou votar para reabrir.
Arnauld
1
@Tau eu estava perguntando por causa disso . O OP precisa responder.
Mbomb007

Respostas:

5

Japonês , 29 24 bytes

-5 bytes graças a @Shaggy

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

Recebe entrada como uma string

Experimente online!

Herman L
fonte
Bem-vindo ao Japt :) m@pode ser substituído por £para salvar um byte. Mas isso pode ser feito em 24 bytes usando a conversão base.
Shaggy
Opa, parece que essa não é realmente a sua primeira solução em Japt! Você ainda se qualifica para essa recompensa , se quiser tentar.
Shaggy
5

C (gcc) , 62 58 bytes

-4 bytes graças ao ceilingcat

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

Experimente online!

gastropner
fonte
5

05AB1E , 26 bytes

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

Experimente online!

Emigna
fonte
Isso não está funcionando para números com vários dígitos.
izlin
1
@linlin: De fato. Eu não tinha percebido que isso fazia parte do desafio. Corrigido agora. Obrigado :)
Emigna
4

Python 2 , 65 62 bytes

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

Experimente online!

TFeld
fonte
4

TI-BASIC, 79 bytes

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

Entrada é uma sequência de dígitos em Ans.
Saída é o número codificado por Emoji Math.

Exemplos:

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

Explicação:

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

Como alternativa, aqui está uma solução de 94 bytes que recebe um número como entrada em vez de uma 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

Exemplos:

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

Explicação:

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

Notas:

Tau
fonte
3

Perl 5 -p , 42 bytes

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

Experimente online!

Xcali
fonte
3

Java 8, 80 bytes

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

Experimente online.

Explicação:

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
fonte
3

JS ES6, 77 66 bytes

Até 66, graças às sugestões de @Charlie Harding e @asgallant

Finalmente tive que fazer uma conta no codegolf, já que esse era um pequeno desafio tão divertido!

A forma mais mínima da resposta original, ao esperar a entrada apenas de sequência:

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

Em segundo lugar, minha resposta original, que usa um regex mais longo e primeiro coage a entrada em uma string, funciona tanto com a entrada do tipo de número quanto com a entrada de uma sequência de dígitos.

Primeiro eu coagro a entrada em uma string, que é então destruída em uma matriz usando a propagação es6. Depois mapeio-o através de um matchb cb que pega o emoticon correto de uma matriz feita com o regex /.{1,2}/g. Finalmente, a matriz resultante de emoticons é unida novamente a uma string.

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

O material da matriz JS é divertido. Tenho certeza de que ainda há espaço para otimização, isso corresponde novamente ao regex em cada loop do map.

Testado porcaria com o seguinte:

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
fonte
1
Por que existem espaços ao redor da =>seta no mapa? Isso poderia economizar dois bytes, não poderia?
Charlie Harding
1
E eu acredito que a regex /../gfaz o mesmo trabalho também, poupando mais quatro bytes
Charlie Harding
Finalmente, se a entrada é necessariamente uma string, então [...(""+n)]pode ser simplificada para [...n], economizando mais cinco bytes
Charlie Harding
1
mape a pesquisa de expressões regulares está realmente custando caracteres para você aqui; replacee substrfunciona da mesma maneira, com menos caracteres: 58 bytes:, n=>n.replace(/./g,c=>':)=((:)=:():=)(=:||:'.substr(2*c,2))assumindo a entrada como uma sequência de dígitos.
asgallant
cara, essa é uma maneira legal de usar replace@asgallant! Parece que eu tenho que conhecer meus funções de cadeia, bem :)
Roope
3

Haskell, 64 56 bytes de Laikoni

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

Experimente online

Ungolfed

Aplique a função wordsà nossa sequência de símbolos separados por espaço ":) =( (: )= :( ): =) (= :| |: "para obter uma lista e obtenha o n- ésimo elemento (!!)para cada n na nossa sequência de entrada, combinando os resultados. nb (=<<) é equivalente a concatMap, neste caso, mapear uma string para uma lista de strings e concatenar os resultados. read . pureconverte um caractere em um int, levantando um caractere em uma string e depois readem um int.

f x = ((words ":) =( (: )= :( ): =) (= :| |: " !!) . read . pure) =<< x
Charlie Harding
fonte
2
56 bytes: Experimente online!
Laikoni
3

[R], 59 48 bytes

abordagem diferente:

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

obrigado aaaron por me direcionar novamente :)

original:

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

batidas

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

por 1 byte

Zahiro Mor
fonte
1
A abordagem diferente é um pouco complicada; você precisa adicionar um ao número digitalizado dobrado 2*scan()+1, com um pouco de reorganização, embora ainda possa mantê-lo como 48 bytes. Experimente online!
Aaron Hayman
2

PowerShell , 64 60 59 bytes

-1 byte graças a mazzy

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

Experimente online!

Pega uma string, divide-a toCharArraye indexa-a na chave emoji, convertendo o caractere em seu valor numérico, dobra-a porque cada emoji tem dois de largura e, em seguida, pega o substringdesse ponto mais um. Finalmente, junta tudo isso em uma única string e empurra para a saída.

Veskah
fonte
1
59 bytes
mazzy
@mazzy Sim, eu falei sobre como converter para int sem obter o valor ASCII, obrigado.
Veskah 6/05/19
2

C # (Compilador interativo do Visual C #) , 87 , 86 , 82 , 67 bytes

Adereços para @Artholl e @someone por ajudar a otimizar

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

Experimente online!

Innat3
fonte
1
Você pode salvar 2 bytes . 1 byte se você usar em Substringvez de Skip& Takee 1 byte se você codificar o valor de zero caractere.
Artholl
@Artholl obrigado! Você poderia me mostrar o que você quer dizer com codificar o valor de zero caractere?
Innat3
Como você pode ver no exemplo. Basta escrever em 48vez de '0'.
Artholl
Várias otimizações simples; 67 bytes. Experimente online!
meu pronome é monicareinstate
1
@someone não sabia mudando o tipo de saída foi permitido fora da função
Innat3
1

JavaScript (ES6), 87 bytes

n=>{for(s=":)=((:)=:():=)(=:||:",i=0;i<20;)n=n.split(i/2).join(s[i++]+s[i++]);return n}
Naruyoko
fonte
Isso gera em ):vez de (:para3
Herman L
@ Herman L Sim, obrigado!
Naruyoko 5/05/19