Convertir números a Emoji Math [cerrado]

13

En Emoji Math, un módulo creado por el usuario para el videojuego Keep Talking And Nobody Explodes, los números se escriben como cadenas de emoticones, donde cada emoticón representa una base de 10 dígitos. A continuación se muestra la tabla de conversión entre dígitos y emoticones.

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

Dado un número, imprímalo en la codificación Emoji Math. Puede suponer la ausencia de caracteres no numéricos.

Esto es , por lo que gana la respuesta más corta en bytes.

Quien
fuente
44
¿Se nos permite tomar el número de entrada como una cadena?
Tau
3
... O una serie de dígitos.
Shaggy
1
@Tau parece que la intención era aceptar una cadena: "Puede suponer la ausencia de caracteres no numéricos"; deberíamos preguntarnos "¿Podemos tomar la entrada como un entero?"
Jonathan Allan
1
He votado para cerrar como poco claro hasta que se aborden los puntos anteriores. Pero no dude en enviarme un ping una vez que esté solucionado para que pueda retractar mi voto o votar para volver a abrir.
Arnauld,
1
@Tau preguntaba por esto . El OP necesita responder.
mbomb007

Respuestas:

5

Japt , 29 24 bytes

-5 bytes gracias a @Shaggy

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

Toma la entrada como una cadena

Pruébalo en línea!

Herman L
fuente
Bienvenido a Japt :) m@se puede reemplazar con £para guardar un byte. Pero esto se puede hacer en 24 bytes usando la conversión base.
Shaggy
¡Vaya, parece que esta no es tu primera solución Japt! Sin embargo, todavía calificas para esta recompensa si quieres probarla.
Shaggy
5

05AB1E , 26 bytes

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

Pruébalo en línea!

Emigna
fuente
Esto no funciona para números con varios dígitos.
izlin
1
@izlin: De hecho. No me había dado cuenta de que era parte del desafío. Arreglado ahora sin embargo. Gracias :)
Emigna
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

La entrada es una cadena de dígitos en Ans.
La salida es el número codificado en Emoji Math.

Ejemplos:

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

Explicación:

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

Alternativamente, aquí hay una solución de 94 bytes que toma un número como entrada en lugar de una cadena:

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

Ejemplos:

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

Explicación:

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

Java 8, 80 bytes

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

Pruébalo en línea.

Explicación:

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

JS ES6, 77 66 bytes

Hasta 66 gracias a las sugerencias de @Charlie Harding y @asgallant

¡Finalmente tuve que hacer una cuenta en codegolf ya que este fue un pequeño desafío tan divertido!

La forma más mínima de la respuesta original, cuando se espera una entrada de solo cadena:

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

En segundo lugar, mi respuesta original, que usa una expresión regular más larga y primero coacciona la entrada en una cadena, funciona tanto con la entrada de tipo de número como con una entrada de cadena de dígitos.

Primero coacciono la entrada en una cadena, que luego se desestructura en una matriz usando es6 spread. Luego lo mapeo a través de un matcher cb que toma el emoticón correcto de una matriz hecha con la expresión regular /.{1,2}/g. Finalmente, la matriz resultante de emoticones se une de nuevo a una cadena.

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

Las cosas de la matriz JS son divertidas. Estoy seguro de que todavía hay espacio para la optimización, esto vuelve a coincidir con la expresión regular en cada bucle del map.

Crappily probado con lo siguiente:

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

Cuerda
fuente
1
¿Por qué hay espacios alrededor de la =>flecha en el mapa? Eso podría ahorrar dos bytes, ¿no?
Charlie Harding
1
Y creo que la expresión regular también /../ghace el mismo trabajo, ahorrando otros cuatro bytes
Charlie Harding
Finalmente, si la entrada es necesariamente una cadena, entonces [...(""+n)]se puede simplificar [...n], ahorrando otros cinco bytes
Charlie Harding
1
mapy la búsqueda de expresiones regulares en realidad te está costando personajes aquí; replacey substrfunciona igual de bien, con menos caracteres: 58 bytes:, n=>n.replace(/./g,c=>':)=((:)=:():=)(=:||:'.substr(2*c,2))suponiendo que la entrada es una cadena de dígitos.
Asgallant
hombre, esa es una buena manera de usar replace@asgallant! Parece que tengo que conocer mis funciones de cadena también :)
Roope
3

Haskell, 64 56 bytes Laikoni

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

Pruébalo en línea

Sin golf

Aplique la función wordsa nuestra cadena de símbolos separados por espacios ":) =( (: )= :( ): =) (= :| |: "para obtener una lista y obtenga el n -ésimo elemento (!!)por cada n en nuestra cadena de entrada, la combinación de los resultados. nb (=<<) es equivalente a, concatMapen este caso, asignar una cadena a una lista de cadenas y concatenar los resultados. read . pureconvierte un carácter en un int, levantando un carácter a una cadena, luego reading a un int.

f x = ((words ":) =( (: )= :( ): =) (= :| |: " !!) . read . pure) =<< x
Charlie Harding
fuente
2
56 bytes: ¡ Pruébelo en línea!
Laikoni
3

[R], 59 48 bytes

enfoque diferente:

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

gracias a @aaron por dirigirme de nuevo :)

original:

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

latidos

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

por 1 byte

Zahiro Mor
fuente
1
El enfoque diferente está un poco apagado, debe agregar uno al número escaneado duplicado 2*scan()+1, con un poco de reorganización, aunque aún puede mantenerlo como 48 bytes. Pruébalo en línea!
Aaron Hayman
2

PowerShell , 64 60 59 bytes

-1 byte gracias a mazzy

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

Pruébalo en línea!

Toma una cadena, la divide toCharArrayy luego la indexa en la tecla emoji al convertir el carácter en su valor numérico, lo dobla porque cada emoji tiene dos anchos y luego toma el substringde ese lugar más uno más alto. Finalmente, une todo esto en una sola cadena y lo empuja a la salida.

Veskah
fuente
1
59 bytes
mazzy
@mazzy Sí, espacié sobre cómo enviar a int sin obtener el valor ASCII, gracias.
Veskah,
2

C # (compilador interactivo de Visual C #) , 87 , 86 , 82 , 67 bytes

Apoyos a @Artholl y @someone por ayudar a optimizar

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

Pruébalo en línea!

Innat3
fuente
1
Puedes guardar 2 bytes . 1 byte si usa en Substringlugar de Skip& Takey 1 byte si codifica el valor de carácter cero.
Artholl
@Artholl gracias! ¿Podría mostrarme a qué se refiere al codificar el valor de cero caracteres?
Innat3
Como puedes ver en el ejemplo. Solo escribe en 48lugar de '0'.
Artholl
Varias optimizaciones simples; 67 bytes. Pruébalo en línea!
mi pronombre es monicareinstate
1
@someone no sabía que se permitía cambiar el tipo de salida fuera de la función
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
fuente
Esto sale en ):lugar de (:para3
Herman L
@Herman L ¡Sí, gracias!
Naruyoko