Zahlen in Emoji-Mathematik umrechnen [closed]

13

In Emoji Math, einem benutzerdefinierten Modul für das Videospiel Keep Talking And Nobody Explodes, werden Zahlen als Zeichenfolgen von Emoticons geschrieben, wobei jedes Emoticon eine 10-stellige Basis darstellt. Unten sehen Sie die Umrechnungstabelle zwischen Ziffern und Emoticons.

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

Geben Sie eine Zahl in der Emoji Math-Codierung aus. Sie können davon ausgehen, dass keine numerischen Zeichen vorhanden sind.

Das ist , also gewinnt die kürzeste Antwort in Bytes.

Wer
quelle
4
Dürfen wir die eingegebene Nummer als Zeichenfolge verwenden?
Tau
3
... oder eine Reihe von Ziffern.
Shaggy
1
@Tau klingt so, als ob die Absicht darin bestand, eine Zeichenfolge zu akzeptieren - "Sie können davon ausgehen, dass keine numerischen Zeichen vorhanden sind."; wir sollten fragen "Dürfen wir die Eingabe als Ganzzahl nehmen?"
Jonathan Allan
1
Ich habe dafür gestimmt, als unklar zu schließen, bis die obigen Punkte angesprochen sind. Aber zögern Sie nicht, mich anzupingen, sobald dies behoben ist, damit ich meine Stimme widerrufen oder für die Wiedereröffnung stimmen kann.
Arnauld
1
@Tau Ich war wegen fragen diese . Das OP muss antworten.
mbomb007

Antworten:

5

Japt , 29 24 Bytes

-5 Bytes dank @Shaggy

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

Nimmt die Eingabe als String

Probieren Sie es online!

Herman L
quelle
Willkommen bei Japt :) m@kann durch ersetzt werden £, um ein Byte zu speichern. Dies kann jedoch mit der Basisumwandlung in 24 Bytes erfolgen .
Shaggy
Hoppla, das ist anscheinend nicht deine erste Japt-Lösung! Sie können sich dennoch für diese Prämie qualifizieren , wenn Sie es versuchen möchten.
Shaggy
5

C (gcc) , 62-58 Bytes

-4 Bytes dank Ceilingcat

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

Probieren Sie es online!

Gastropner
quelle
5

05AB1E , 26 Bytes

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

Probieren Sie es online!

Emigna
quelle
Dies funktioniert nicht bei mehrstelligen Zahlen.
Izlin
1
@izlin: In der Tat. Ich hatte nicht bemerkt, dass das Teil der Herausforderung war. Jetzt behoben. Danke :)
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

Die Eingabe ist eine Ziffernfolge in Ans.
Die Ausgabe ist die mit Emoji Math codierte Zahl.

Beispiele:

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

Erläuterung:

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

Alternativ ist hier eine 94-Byte- Lösung, die eine Zahl anstelle einer Zeichenfolge als Eingabe verwendet:

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

Beispiele:

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

Erläuterung:

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

Anmerkungen:

  • TI-BASIC ist eine Token-Sprache . Die Anzahl der Zeichen entspricht nicht der Anzahl der Bytes.

  • |ist das Zwei-Byte-Token 0xBBD8 , auf das nur mit diesem Assembly-Programm zugegriffen werden kann .

Tau
quelle
3

Java 8, 80 Bytes

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

Probieren Sie es online aus.

Erläuterung:

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

JS ES6, 77 66 Bytes

Bis auf 66 dank Vorschlägen von @Charlie Harding und @asgallant

Musste endlich einen Account bei Codegolf erstellen, da dies eine so lustige kleine Herausforderung war!

Die minimalste Form der ursprünglichen Antwort, wenn nur Zeichenfolgeneingaben erwartet werden:

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

Zweitens, meine ursprüngliche Antwort, die einen längeren regulären Ausdruck verwendet und zuerst die Eingabe in eine Zeichenfolge erzwingt. Dies funktioniert sowohl bei der Eingabe von Zahlentypen als auch bei der Eingabe von Ziffernfolgen.

Ich erzwinge zuerst die Eingabe in einen String, der dann mit es6 spread in ein Array zerlegt wird. Dann ordne ich es durch einen Matcher cb zu, der das richtige Emoticon aus einem mit dem regulären Ausdruck erstellten Array aufnimmt /.{1,2}/g. Schließlich wird die resultierende Anordnung von Emoticons wieder zu einer Zeichenfolge verbunden.

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

JS Array Zeug macht Spaß. Ich bin mir sicher, dass noch Optimierungsbedarf besteht. Dies entspricht der Regex in jeder Schleife der map.

Crappily mit den folgenden getestet:

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
quelle
1
Warum gibt es =>in der Karte Leerzeichen um den Pfeil? Das könnte zwei Bytes sparen, oder?
Charlie Harding
1
Und ich glaube, der Regex /../gmacht den gleichen Job auch und spart weitere vier Bytes
Charlie Harding
Wenn die Eingabe notwendigerweise eine Zeichenfolge ist, [...(""+n)]kann sie vereinfacht werden [...n], um weitere fünf Bytes zu speichern
Charlie Harding,
1
mapund die Suche nach regulären Ausdrücken kostet Sie hier tatsächlich Zeichen. replaceund substrfunktionieren genauso gut mit weniger Zeichen: 58 Bytes: n=>n.replace(/./g,c=>':)=((:)=:():=)(=:||:'.substr(2*c,2))unter der Annahme, dass die Eingabe als Ziffernfolge erfolgt.
Asgallant
Mann, das ist eine nette Art, replace@asgallant zu benutzen ! Scheint, ich muss auch meine String-Funktionen kennenlernen :)
Roope
3

Haskell, 64 56 Laikoni Bytes

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

Probieren Sie es online aus

Ungolfed

Wenden Sie die Funktion wordsauf unsere durch Leerzeichen getrennte Zeichenfolge an ":) =( (: )= :( ): =) (= :| |: ", um eine Liste zu erhalten, und ermitteln Sie das n- te Element (!!)für jedes n in unserer Eingabezeichenfolge, indem Sie die Ergebnisse kombinieren. nb (=<<) entspricht concatMapin diesem Fall der Zuordnung einer Zeichenfolge zu einer Liste von Zeichenfolgen und der Verkettung der Ergebnisse. read . pureWandelt ein Zeichen in ein int um, indem ein Zeichen in einen String und dann readin ein int umgewandelt wird.

f x = ((words ":) =( (: )= :( ): =) (= :| |: " !!) . read . pure) =<< x
Charlie Harding
quelle
2
56 bytes: Probieren Sie es online!
Laikoni
3

[R] 59 48 Bytes

anderer Ansatz:

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

danke an @aaron für die erneute anregung :)

Original:

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

schlägt

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

um 1 Byte

Zahiro Mor
quelle
1
Der andere Ansatz ist ein bisschen abwegig. Sie müssen der doppelt gescannten Zahl 2*scan()+1eine hinzufügen , mit ein wenig Neuordnung, obwohl Sie sie immer noch bei 48 Bytes belassen können. Probieren Sie es online!
Aaron Hayman
2

PowerShell , 64 60 59 Bytes

-1 Byte dank mazzy

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

Probieren Sie es online!

Nimmt eine Zeichenfolge, teilt sie auf toCharArrayund indiziert sie dann in den Emoji-Schlüssel, indem das Zeichen auf seinen numerischen Wert umgewandelt wird. Verdoppelt es, da jedes Emoji zwei breit ist, und nimmt dann das substringvon dieser Stelle plus eins höher. Schließlich fügt es dies alles zu einer Zeichenkette zusammen und schiebt es zur Ausgabe.

Veskah
quelle
1
59 Bytes
mazzy
@mazzy Ja, ich habe mir überlegt, wie man nach int wandelt, ohne den ASCII-Wert zu erhalten, danke.
Veskah
2

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

Wenden Sie sich an @Artholl und @someone, um zur Optimierung beizutragen

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

Probieren Sie es online!

Innat3
quelle
1
Sie können 2 Bytes speichern . 1 Byte, wenn Sie Substringanstelle von Skip& verwenden, Takeund 1 Byte, wenn Sie den Nullzeichenwert fest codieren.
Artholl
@Artholl danke! Können Sie mir zeigen, was Sie meinen, indem Sie den Null-Zeichen-Wert fest codieren?
Innat3
Wie Sie im Beispiel sehen können. Schreiben Sie einfach 48statt '0'.
Artholl
Mehrere einfache Optimierungen; 67 Bytes. Probieren Sie es online!
Mein Pronomen ist monicareinstate
1
@ jemand wusste nicht, dass das Ändern der Art der Ausgabe außerhalb der Funktion
zulässig war
1

JavaScript (ES6), 87 Byte

n=>{for(s=":)=((:)=:():=)(=:||:",i=0;i<20;)n=n.split(i/2).join(s[i++]+s[i++]);return n}
Naruyoko
quelle
Diese Ausgabe ):statt (:für3
Herman L
@Herman L Ja, danke!
Naruyoko