将数字转换为表情符号数学[关闭]


13

在用户创建的视频游戏“保持说话且没人爆炸”模块Emoji Math中,数字被写成表情符号字符串,其中每个表情符号代表以10为基数的数字。以下是数字和表情符号之间的转换表。

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

给定一个数字,将其输出为Emoji Math编码。您可以假定没有非数字字符。

这是,因此最短的答案以字节为单位。


4
我们可以将输入数字作为字符串吗?
Tau

3
...或数字数组。
毛茸茸的

1
@Tau听起来像是要接受一个字符串-“您可以假设没有非数字字符。” 我们应该问:“我们可以将输入作为整数吗?”
乔纳森·艾伦,

1
在以上各点未得到解决之前,我已投票决定关闭(不清楚)。但是,请在确定问题后立即对我执行ping操作,以便我可以收回投票或重新投票。
阿诺尔德

1
因为这个我问@ @ Tau 。OP需要回答。
mbomb007,19年

Answers:






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个字节

降至66,这要归功于@Charlie Harding和@asgallant的建议

最终必须在codegolf上注册一个帐户,因为这是一个有趣的小挑战!

当期望仅字符串输入时,原始答案的最小形式:

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

其次,我原来的答案是使用更长的正则表达式,然后首先将输入强制为字符串,这适用于数字类型输入和数字字符串输入。

我首先将输入强制为字符串,然后使用es6 spread将其解构为数组。然后,我通过匹配器cb映射它,该匹配器从用regex制成的数组中获取正确的图释/.{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
为什么=>地图中箭头周围有空格?这样可以节省两个字节,不是吗?
查理·哈丁

1
而且我相信正则表达式/../g也可以完成相同的工作,又节省了四个字节
Charlie Harding

最后,如果输入必须是字符串,则[...(""+n)]可以简化为[...n],从而节省了另外五个字节
Charlie Harding,

1
map正则表达式搜索实际上使您在这里花费了字符;replacesubstr以较少的字符数工作:58个字节:n=>n.replace(/./g,c=>':)=((:)=:():=)(=:||:'.substr(2*c,2)),假设输入为数字字符串。
asgallant

伙计,这是使用replace@asgallant 的一种整洁方式!似乎我也要了解我的字符串函数:)
Roope

3

Haskell,64个 56 Laikoni字节

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

在线尝试

不打高尔夫球

将函数words应用于以空格分隔的符号字符串":) =( (: )= :( ): =) (= :| |: "以获取列表,并结合输入结果对输入字符串中的每个n获取第n个元素。在这种情况下,nb等效于将字符串映射到字符串列表并连接结果。 通过将字符提升为字符串,然后将其转换为整数,将字符转换为整数。(!!) (=<<)concatMapread . pureread

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

2
56个字节:在线尝试!
莱科尼

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*scan()+1重新排列,尽管您仍然可以将其保持为48字节。在线尝试!
亚伦·海曼


2

PowerShell64 60 59字节

-1字节感谢mazzy

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

在线尝试!

取一个字符串,将其分割为toCharArray,然后通过将字符转换为数值将其索引到emoji关键字中,将其加倍,因为每个emoji字母都是两个宽的,然后substring从该位置取高一个。最后,它将所有这些连接成一个字符串并将其推入输出。



@mazzy是的,我对如何在不获取ASCII值的情况下强制转换为int表示感谢,谢谢。
维斯卡


2

C#(Visual C#中交互式编译器)878682,67个字节

@Artholl和@someone的道具以帮助优化

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

在线尝试!


1
您可以节省2个字节。如果使用Substring而不是SkipTake则为1字节,如果将零字符值硬编码为1字节。
Artholl

@Artholl谢谢!您能告诉我硬编码零字符值的意思吗?
Innat3

如您在示例中看到的。只是写48而不是'0'
Artholl

几个简单的优化;67个字节 在线尝试!
我的代名词是monicareinstate,

1
@someone不知道可以在函数之外更改输出的类型
Innat3,19年

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是的,谢谢!
鸣子


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.