数字を絵文字数学に変換[終了]


13

ユーザーが作成したビデオゲーム「Keep Talking And Nobody Explodes」のモジュールを作成したEmoji Mathでは、数字は絵文字の文字列として記述されます。各絵文字は10桁の基本を表します。以下は、数字と絵文字間の変換表です。

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

番号を指定して、Emoji Mathエンコーディングで出力します。数字以外の文字が存在しないと仮定することもできます。

これはであるため、バイト単位の最短回答が優先されます。


4
入力番号を文字列として使用できますか?
タウ

3
...または数字の配列。
シャギー

1
@Tauは、文字列を受け入れることを意図していたように聞こえます-「数字以外の文字が存在しないと仮定することもできます。」; 「入力を整数として取ることができますか?」
ジョナサンアラン

1
上記の点が扱われるまで、私は不明確として終了することに投票しました。ただし、修正した後、私にpingを送信することをためらわないでください。
アーナルド

1
@Tau私はこのために尋ねていました。OPが答える必要があります。
mbomb007

回答:


5

Japt29 24バイト

@Shaggyのおかげで-5バイト

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

入力を文字列として受け取ります

オンラインでお試しください!


Japtへようこそ:) m@£、バイトを保存するために置き換えることができます。ただし、これはベース変換を使用して24バイトで実行できます。
シャギー

おっと、これは実際には最初のJaptソリューションではないようです!あなたはまだのための資格です。この恵みあなたはそれを試してみたい場合は、しかし、。
シャギー




4

TI-BASIC、79バイト

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

入力はの数字列ですAns
出力は、Emoji Mathでエンコードされた数値です。

例:

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

説明:

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

あるいは、ここに94バイトがあります文字列の代わりに数値を入力として使用ソリューションを次に示します。

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

例:

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

説明:

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

ノート:



3

Java 8、80バイト

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

オンラインでお試しください。

説明:

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バイト

@Charlie Hardingと@asgallantからの提案による66までの感謝

これはとても楽しい小さな挑戦だったので、最終的にcodegolfでアカウントを作成する必要がありました!

文字列のみの入力を想定している場合、元の回答の最も最小限の形式:

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

第二に、長い正規表現を使用し、最初に入力を文字列に強制する元の答えは、数値型入力と数字列の入力の両方で機能します。

まず入力を文字列に強制し、次にes6 spreadを使用して配列に非構造化します。次に、正規表現で作成された配列から正しい絵文字を取得するマッチャーcbを介してマッピングし/.{1,2}/gます。最後に、結果の絵文字の配列が文字列に結合されます。

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

JS配列のものは楽しいです。最適化の余地はまだあると確信しています。これにより、すべてのループで正規表現が再照合されます。map。これ。

以下を使用して正常にテストされました。

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
=>マップの矢印の周りにスペースがあるのはなぜですか?それで2バイト節約できますよね?
チャーリーハーディング

1
そして、正規表現/../gも同じ仕事をして、さらに4バイトを節約すると信じています
チャーリーハーディング

最後に、入力が必然的に文字列である場合、さらに5バイトを節約する[...(""+n)]ため[...n]に簡略化できます
チャーリーハーディング

1
mapまた、正規表現検索では、実際にここでキャラクターのコストがかかります。replaceそして、substr少ない文字で全く同じように仕事、:58バイト:n=>n.replace(/./g,c=>':)=((:)=:():=)(=:||:'.substr(2*c,2))、数字の文字列として入力を想定しました。
22分にアスガルント

男、それはreplace@asgallant を使うきちんとした方法です!私も私の文字列関数を知るようになったようです:)
ロープ

3

Haskell、64 56 Laikoniバイト

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

オンラインで試す

非ゴルフ

関数を適用wordsシンボルの私達のスペースで区切られた文字列に":) =( (: )= :( ): =) (= :| |: "リストを取得し、取得のn番目の要素(!!)のすべてのためのn個の結果を組み合わせた当社の入力文字列、インチ この場合、nb (=<<)concatMap文字列を文字列のリストにマッピングし、結果を連結するのと同じです。 read . pure文字を文字列に変換してからintに変換することにより、文字をintに変換しreadます。

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


3

[R]、59 48バイト

別のアプローチ:

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

再度指示してくれた@aaronに感謝します:)

元の:

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

ビート

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

1バイトずつ


1
別のアプローチは少しオフです。2倍のスキャン数に1を追加する必要が2*scan()+1ありますが、48バイトのままにすることもできますが、少し並べ替えます。オンラインでお試しください!
アーロンヘイマン


2

PowerShell64 60 59バイト

-1バイト、mazzyのおかげ

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

オンラインでお試しください!

文字列をtoCharArray取得し、文字列を分割し、文字を数値にキャストすることで絵文字キーにインデックスを付け、各絵文字が2つの幅があるのでそれを2倍にしsubstring、その場所から1つ上にプラスします。最後に、これをすべて1つの文字列に結合し、出力にプッシュします。



@mazzyええ、ASCII値を取得せずにintにキャストする方法に間隔を空けました、ありがとう。
ヴェスカー


2

C#の(ビジュアルC#コンパイラインタラクティブ)878682、67バイト

最適化を支援するための@Arthollと@someoneの小道具

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

オンラインでお試しください!


1
2バイト節約できます。&のSubstring代わりに使用する場合は1バイト、ゼロ文字値をハードコードする場合は1バイト。SkipTake
アーソル

@Arthollありがとうございます!ゼロ文字値をハードコーディングすることの意味を教えていただけますか?
Innat3

例でわかるように。の48代わりに書くだけです'0'
アーホル

いくつかの簡単な最適化。67バイト。オンラインでお試しください!
私の代名詞は

1
@someoneは、関数の外部で出力のタイプの変更が許可されていることを知りませんでした
Innat3

1

JavaScript(ES6)、87バイト

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

これ):(:、次の代わりに出力されます3
Herman L

@ハーマンLはい、ありがとう!
鳴代子


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.