Converti i numeri in Emoji Math [chiuso]


13

In Emoji Math, un modulo creato dall'utente per il videogioco Keep Talking And Nobody Explodes, i numeri sono scritti come stringhe di emoticon, dove ogni emoticon rappresenta una cifra di base 10. Di seguito è riportata la tabella di conversione tra cifre ed emoticon.

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

Dato un numero, emettilo nella codifica Emoji Math. È possibile supporre l'assenza di caratteri non numerici.

Questo è , quindi vince la risposta più breve in byte.


4
È consentito prendere il numero di input come stringa?
Tau,

3
... O una serie di cifre.
Shaggy

1
@Tau suona come se l'intenzione fosse quella di accettare una stringa - "Puoi presumere l'assenza di caratteri non numerici."; dovremmo chiedere "Possiamo prendere l'input come numero intero?"
Jonathan Allan,

1
Ho votato per chiudere come poco chiaro fino a quando non saranno affrontati i punti sopra. Ma non esitate a chiamarmi dopo che è stato risolto in modo da poter ritirare il mio voto o votare per riaprire.
Arnauld

1
@Tau stavo chiedendo per questo . L'OP deve rispondere.
mbomb007,

Risposte:


5

Japt , 29 24 byte

-5 byte grazie a @Shaggy

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

Accetta l'input come stringa

Provalo online!


Benvenuto in Japt :) m@può essere sostituito con £per salvare un byte. Ma questo può essere fatto in 24 byte usando la conversione di base.
Shaggy,

Oops, sembra che questa non sia in realtà la tua prima soluzione Japt! Ti qualifichi comunque per questa taglia , se vuoi provarci.
Shaggy


5

05AB1E , 26 byte

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

Provalo online!


Questo non funziona per numeri con più cifre.
izlin,

1
@izlin: davvero. Non mi ero reso conto che faceva parte della sfida. Risolto ora però. Grazie :)
Emigna,


4

TI-BASIC, 79 byte

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

L'input è una stringa di cifre in Ans.
L'output è il numero con codifica Emoji Math.

Esempi:

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

Spiegazione:

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

In alternativa, ecco una soluzione a 94 byte che accetta un numero come input anziché una stringa:

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

Esempi:

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

Spiegazione:

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

Appunti:



3

Java 8, 80 byte

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

Provalo online.

Spiegazione:

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 byte

Fino a 66 grazie ai suggerimenti di @Charlie Harding e @asgallant

Ho dovuto finalmente fare un account su codegolf poiché questa era una piccola sfida così divertente!

La forma più minima della risposta originale, quando ci si aspetta un input solo stringa:

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

In secondo luogo, la mia risposta originale che utilizza una regex più lunga e costringe innanzitutto l'input in una stringa, funziona sia con input di tipo numerico sia con input di una stringa di cifre.

Innanzitutto costringo l'input in una stringa, che viene poi destrutturata in un array usando l'es6 spread. Quindi lo mappa attraverso un cb di corrispondenza che prende l'emoticon corretta da un array creato con regex /.{1,2}/g. Infine, la matrice di emoticon risultante viene unita a una stringa.

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

Le cose dell'array JS sono divertenti. Sono sicuro che c'è ancora spazio per l'ottimizzazione, questo ri-abbina la regex su ogni ciclo di map.

Testato male con quanto segue:

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
Perché ci sono spazi attorno alla =>freccia nella mappa? Ciò potrebbe salvare due byte, no?
Charlie Harding,

1
E credo che anche il regex /../gfaccia lo stesso lavoro, salvando altri quattro byte
Charlie Harding,

Infine, se l'input è necessariamente una stringa, allora [...(""+n)]può essere semplificato [...n], salvando altri cinque byte
Charlie Harding,

1
mape la ricerca regex ti sta effettivamente costando dei personaggi qui; replacee substrfunziona altrettanto bene, con meno caratteri: 58 byte:, n=>n.replace(/./g,c=>':)=((:)=:():=)(=:||:'.substr(2*c,2))assumendo input come una stringa di cifre.
stupefacente

amico, è un modo semplice di usare replace@asgallant! Sembra che devo conoscere anche le mie funzioni di stringa :)
Roope

3

Haskell, 64 56 byte Laikoni

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

Provalo online

Ungolfed

Applicare la funzione wordsdi nostra stringa separato da spazi di simboli ":) =( (: )= :( ): =) (= :| |: "per ottenere una lista, e ottenere l' n -esimo elemento (!!)per ogni n nella stringa di input, combinando i risultati. nb (=<<) equivale concatMapin questo caso, mappare una stringa a un elenco di stringhe e concatenare i risultati. read . pureconverte un carattere in un int, sollevando un carattere in una stringa, quindi reading in un int.

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


3

[R], 59 48 byte

approccio diverso:

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

grazie a @aaron per avermi diretto di nuovo :)

originale:

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

battiti

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

di 1 byte


1
Il diverso approccio è un po 'fuori, è necessario aggiungerne uno al numero scansionato raddoppiato 2*scan()+1, con un po' di riarrangiamento anche se è ancora possibile mantenerlo come 48 byte. Provalo online!
Aaron Hayman,


2

PowerShell , 64 60 59 byte

-1 byte grazie a mazzy

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

Provalo online!

Prende una stringa, la divide toCharArraye quindi si indicizza nella chiave emoji lanciando il personaggio al suo valore numerico, lo raddoppia perché ogni emoji è larga due, quindi prende il substringda quel punto più uno più alto. Alla fine unisce tutto in una stringa e lo spinge verso l'output.



@mazzy Sì, ho spaziato su come trasmettere a int senza ottenere il valore ASCII, grazie.
Veskah,


2

C # (compilatore interattivo Visual C #) , 87 , 86 , 82 , 67 byte

Propone a @Artholl e @someone per aiutare a ottimizzare

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

Provalo online!


1
È possibile salvare 2 byte . 1 byte se si utilizza Substringinvece di Skip& Takee 1 byte se si codifica il valore zero char.
Artholl,

@Artholl grazie! Potresti mostrarmi cosa intendi codificando il valore zero char?
Innat3

Come puoi vedere nell'esempio. Basta scrivere 48invece di '0'.
Artholl,

Diverse semplici ottimizzazioni; 67 byte. Provalo online!
mio pronome è monicareinstate

1
@someone non sapeva che cambiare il tipo di output era consentito al di fuori della funzione
Innat3

1

JavaScript (ES6), 87 byte

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

Questo ):invece di (:per3
Herman L

@Herman L Sì, grazie!
Naruyoko,


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.