Convert Numbers To Emoji Math [fermé]


13

Dans Emoji Math, un module créé par l'utilisateur pour le jeu vidéo Keep Talking And Nobody Explodes, les nombres sont écrits sous forme de chaînes d'émoticônes, où chaque émoticône représente un chiffre de base 10. Voici le tableau de conversion entre les chiffres et les émoticônes.

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

Étant donné un nombre, affichez-le dans l'encodage Emoji Math. Vous pouvez supposer l'absence de caractères non numériques.

Il s'agit de , donc la réponse la plus courte en octets l'emporte.


4
Sommes-nous autorisés à prendre le numéro d'entrée sous forme de chaîne?
Tau

3
... Ou un tableau de chiffres.
Shaggy

1
@Tau semble que l'intention était d'accepter une chaîne - "Vous pouvez supposer l'absence de caractères non numériques."; nous devrions demander "Pouvons-nous prendre l'entrée comme un entier?"
Jonathan Allan

1
J'ai voté pour la fermeture comme peu claire jusqu'à ce que les points ci-dessus soient résolus. Mais n'hésitez pas à me cingler une fois qu'il est corrigé pour que je puisse retirer mon vote ou voter pour rouvrir.
Arnauld

1
@Tau, je demandais à cause de cela . Le PO doit répondre.
mbomb007

Réponses:


5

Japt , 29 24 octets

-5 octets grâce à @Shaggy

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

Prend l'entrée sous forme de chaîne

Essayez-le en ligne!


Bienvenue dans Japt :) m@peut être remplacé par £pour enregistrer un octet. Mais cela peut être fait en 24 octets en utilisant la conversion de base.
Shaggy

Oups, il semble que ce ne soit pas votre première solution Japt! Vous êtes quand même admissible à cette prime , si vous voulez l'essayer.
Shaggy


5

05AB1E , 26 octets

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

Essayez-le en ligne!


Cela ne fonctionne pas pour les numéros à plusieurs chiffres.
izlin

1
@izlin: En effet. Je n'avais pas réalisé que cela faisait partie du défi. Fixé maintenant cependant. Merci :)
Emigna


4

TI-BASIC, 79 octets

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

L'entrée est une chaîne de chiffres Ans.
La sortie est le nombre encodé en Emoji Math.

Exemples:

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

Explication:

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

Alternativement, voici une solution de 94 octets qui prend un nombre en entrée au lieu d'une chaîne:

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

Exemples:

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

Explication:

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

Remarques:



3

Java 8, 80 octets

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

Essayez-le en ligne.

Explication:

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 octets

Jusqu'à 66 grâce aux suggestions de @Charlie Harding et @asgallant

J'ai finalement dû créer un compte sur codegolf car c'était un petit défi si amusant!

La forme la plus minimale de la réponse d'origine, lors de l'attente d'une entrée de chaîne uniquement:

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

Deuxièmement, ma réponse d'origine qui utilise une expression régulière plus longue et contraint d'abord l'entrée en une chaîne, cela fonctionne à la fois avec une entrée de type numérique et une chaîne de chiffres.

Je contrains d'abord l'entrée dans une chaîne, qui est ensuite déstructurée dans un tableau à l'aide de la propagation es6. Ensuite, je le mappe à travers un matcher cb qui récupère l'émoticône correcte à partir d'un tableau créé avec l'expression régulière /.{1,2}/g. Enfin, le tableau d'émoticônes résultant est joint à une chaîne.

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

Les trucs du tableau JS sont amusants. Je suis sûr qu'il y a encore de la place pour l'optimisation, cela re-correspond à l'expression régulière sur chaque boucle de la map.

Crappily testé avec les éléments suivants:

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
Pourquoi y a-t-il des espaces autour de la =>flèche sur la carte? Cela pourrait économiser deux octets, n'est-ce pas?
Charlie Harding

1
Et je crois que l'expression régulière /../gfait le même travail aussi, économisant encore quatre octets
Charlie Harding

Enfin, si l'entrée est nécessairement une chaîne, elle [...(""+n)]peut être simplifiée en [...n]économisant cinq octets supplémentaires
Charlie Harding

1
mapet la recherche d'expression régulière vous coûte en fait des personnages ici; replaceet substrfonctionne aussi bien, avec moins de caractères: 58 octets:, en n=>n.replace(/./g,c=>':)=((:)=:():=)(=:||:'.substr(2*c,2))supposant que l'entrée est une chaîne de chiffres.
asgallant

l'homme, c'est une replacebonne façon d'utiliser @asgallant! Il semble que je dois aussi connaître mes fonctions de chaîne :)
Roope

3

Haskell, 64 56 octets Laikoni

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

Essayez-le en ligne

Non golfé

Appliquez la fonction wordsà notre chaîne de symboles séparés par des espaces ":) =( (: )= :( ): =) (= :| |: "pour obtenir une liste et obtenez le n ème élément (!!)pour chaque n de notre chaîne d'entrée, en combinant les résultats. nb (=<<) est équivalent à concatMapdans ce cas, mapper une chaîne à une liste de chaînes et concaténer les résultats. read . pureconvertit un caractère en int, en soulevant un caractère en chaîne, puis en reading en int.

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


3

[R], 59 48 octets

une approche différente:

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

merci à @aaron de m'avoir redirigé :)

original:

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

Beats

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

par 1 octet


1
L'approche différente est un peu décalée, vous devez en ajouter un au nombre scanné doublé 2*scan()+1, avec un peu de réarrangement, mais vous pouvez toujours le conserver sous 48 octets. Essayez-le en ligne!
Aaron Hayman


2

PowerShell , 64 60 59 octets

-1 octet grâce à mazzy

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

Essayez-le en ligne!

Prend une chaîne, la fractionne toCharArray, puis indexe la clé emoji en transtypant le caractère à sa valeur numérique, la double parce que chaque emoji est large de deux, puis prend lasubstring de cet endroit plus un plus haut. Enfin, il joint tout cela en une seule chaîne et le pousse à la sortie.



@mazzy Ouais, j'ai espacé comment convertir en int sans obtenir la valeur ASCII, merci.
Veskah


2

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

Accessoires à @Artholl et @someone pour aider à optimiser

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

Essayez-le en ligne!


1
Vous pouvez enregistrer 2 octets . 1 octet si vous utilisez Substringau lieu de Skip& Takeet 1 octet si vous codez en dur la valeur zéro.
Artholl

@Artholl merci! Pourriez-vous me montrer ce que vous voulez dire en codant en dur la valeur de zéro caractère?
Innat3

Comme vous pouvez le voir dans l'exemple. Écrivez simplement 48au lieu de '0'.
Artholl

Plusieurs optimisations simples; 67 octets. Essayez-le en ligne!
mon pronom est monicareinstate

1
@someone ne savait pas que le changement du type de sortie était autorisé en dehors de la fonction
Innat3

1

JavaScript (ES6), 87 octets

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

Ceci produit au ):lieu de (:pour3
Herman L

@Herman L Oui, merci!
Naruyoko


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.