表情表情识别


25

编写一个程序,接受表情符号并输入表情符号是表情符号是开心还是悲伤。

程序接受字符串作为输入或参数,如果输入在快乐表情列表中,则应显示字符串“ happy”,如果输入在悲伤表情列表中,则应显示“ sad”。

您可以假定输入始终是有效的(开心或悲伤)表情符号,周围没有空格或制表符。

这是用空格分隔的开心表情列表:

:-) :) :D :o) :] :3 :c) :> =] 8) =) :} :^) :-D 8-D 8D x-D xD X-D XD =-D =D =-3 =3 B^D (-: (: (o: [: <: [= (8 (= {: (^:

这是用空格分隔的悲伤表情符号列表:

>:[ :-( :( :-c :c :-< :< :-[ :[ :{ 8( 8-( ]:< )-: ): >-: >: ]-: ]: }: )8 )-8

这是代码高尔夫球,因此最短的程序为准。


1
您忘了:'D:')(快乐)和:@(生气)
Ismael Miguel

Answers:


19

Python,86个字节

我应该被送进监狱。

x=lambda c: ["happy","sad"][c[0]+c[-1:]in open(__file__).read(88)[::-1]]#<][><:>{:}(:)

我能想出的最短的时间等同于Martin的CJam答案,因此我决定我将所有可悲的表情符号(如果有的话减去中间字符)都隐藏在代码的反面,并使用Python的__file__quine作弊技巧。

啊哈哈哈哈


很好的想法
edc65

实际上,现在我看了一下您的代码,在冒号之后删除空格会有所帮助,还是会破坏程序?
Beta Decay

6
我喜欢该程序包含自己的图释:c:
Alex A.

@BetaDecay它将打破它

1
@AlexA。如果您仔细看的话,它也包含这些内容:8) (8 :] [:
cjfaure 2015年

16

CJam,33 32字节

感谢Dennis节省了1个字节。

q)"[(c<{"&\"])>}"&|"sad""happy"?

看起来不使用正则表达式就可以做同样的事情...

在这里测试。

说明

这是基于与Retina答案相同的观察结果,但是这次匹配幸福的面孔没有任何好处,因此我们将匹配悲伤的面孔(因为要少张嘴)。除了不通过正则表达式替换实现之外,解决方案完全相同:

q)             e# Read input and split off last character.
"[(c<{"&       e# Set intersection with the sad right-hand mouths.
\              e# Pull up remaining emoticon.
"])>}"&        e# Set intersection with the sad left-hand mouths.
|              e# Set union, which amounts to a logical OR in this case.
"sad""happy"?  e# Pick the correct string.

7
哇,给我们其他人一个机会马丁:D
Beta Decay

10

视网膜38 36字节

.+[])D3>}]|[<[({].+
happy
^...?$
sad

我们可以通过它们的嘴识别所有表情符号,因为在另一组(仅在同一组中),没有一个嘴用作帽子或眼睛。快乐的人还需要考虑另一只嘴,但是它们的好处是,它们的嘴根本不会出现在另一只嘴中,甚至不会像鼻子一样出现(相反的情况并非如此:c既是悲伤的嘴又是快乐的嘴)鼻子)。这意味着我们可以避免使用锚,而只需确保在嘴的另一侧有更多字符。

因此,笑脸的有效嘴] ) D 3 > }在右边或< [ ( {左边。我们.+[])D3>}]|[<[({].+将其与匹配,并用替换它们happy。如果我们不匹配,则字符串(图释)中将有两个或三个字符,但如果匹配,则将有五个(happy)。因此,在第二步中,我们用替换两个或三个字符sad


We can recognise all emoticons by their mouths, because none of the mouths is used as a hat.好吧,图]:<释只是用嘴盖帽子。
Loovjo

@Loovjo除了.我的答案中没有“帽子”之后。;)“ ...作为帽子或眼睛在另一组(仅在同一组中)。”
Martin Ender 2015年

8

JavaScript(ES6),46

使用正则表达式查找可悲的表情,即以开头>)]}或结尾的表情<([{c。旁注:此处的其他正则表达式可能更短,但我不确定是否了解它们。

通常说明:在任何符合EcmaScript 6的浏览器上运行该代码段(尤其是不是最新的Chrome浏览器,但不是MSIE。我在Firefox上进行了测试,Safari 9可以运行)

大新闻似乎箭头功能终于到达了Chrome领域!Rel 45,2015年8月

F=s=>/^[\])}>]|[[({<c]$/.test(s)?'sad':'happy'

//Same length
X=s=>/[\])}>].|.[[({<c]/.test(s)?'sad':'happy'

Y=s=>s.match`].|[)}>].|.[[({<c]`?'sad':'happy'
                 
//TEST
out=x=>O.innerHTML+=x+'\n';

sad='>:[ :-( :( :-c :c :-< :< :-[ :[ :{ 8( 8-( ]:< )-: ): >-: >: ]-: ]: }: )8 )-8'.split` `
happy=':-) :) :D :o) :] :3 :c) :> =] 8) =) :} :^) :-D 8-D 8D x-D xD X-D XD =-D =D =-3 =3 B^D (-: (: (o: [: <: [= (8 (= {: (^:'.split` ` 

out('The sad faces')                   
sad.forEach(x=>out(x + ' is ' + F(x)))
out('\nThe happy faces')
happy.forEach(x=>out(x + ' is ' + F(x)))
<pre id=O></pre>


在铬上效果很好
甘油

3
@甘油所以Chrome现在可以识别了=>吗?我错过了这个消息
edc65

4

朱莉娅,87 69字节-感谢Alex A,节省了18字节。

s=readline();print(s[end-1] in")D]3>}"||s[1] in"([<{"?"happy":"sad")

2
您可以通过使用三元数而不是if/ else并将三元数放在里面print来避免分配,从而节省了一大堆t
Alex A.

4

Python 3中77个 75 74 72 61 55字节

lambda e:('happy','sad')[e[-1]in'[(c<{'or e[0]in'])>}']

在线尝试!

它是如何工作的

如果脸部字符串以开头])>}或结尾[(c<{,则很可悲,否则很高兴。元组索引用作if


1
欢迎来到编程难题和代码高尔夫球!
丹尼斯2015年

使用一个函数是完全可以的。相反,x不允许输入已经存储在其中。
丹尼斯

3

Brachylog,50个字节

(rh{,"[(c<{":Im?};?h{,"])>}":Im?}),"sad".;"happy".

说明

(                              ),"sad".;"happy".  § If what's in the parentheses is true,
                                                  § output "sad", else output "happy".

 rhA                                              § Unify A with the last char of the input
    ,"[(c<{":ImA                                  § True if A is a char of "[(c<{"
                ;                                 § OR
                 ?hA                              § Unify A with the first char of the input
                    ,"])>}":ImA                   § True if A is a char of "])>}"

2

Python,159个字节。

i,e=raw_input(),0
for c in i:e=(e,i.index(c))[c in":=8xXB"]
f,s,h=i[:e],i[e+1:],0
for c in f:h+=c in"[(c<{"
for c in s:h+=c in")]}>D"
print["Sad","Happy"][h>0]

2

MATLAB, 85 83个字节

这里一定有减小尺寸的方法。

e=input('');if any([e(end)=='[(c<{',e(1)=='])>}']),'sad';else 'happy';end,disp(ans)

输入的是一个笑脸字符串。将比较第一个和最后一个字符以确定是否难过。如果没有,那就很高兴。

通过不显示任何一个,我可以节省2个字节,而是将它们分配给MATLAB的默认变量(ans),然后在if语句后显示ans。但是我坚信可以通过某种方式进行改进。

通过将函数s(e)更改为e = input('')可提高2个字节;


1

PowerShell,92字节

param([char[]]$a)if("<[({".IndexOf($a[0])+"})D3]>".IndexOf($a[-1])-eq-2){"sad"}else{"happy"}

有点罗word,但作为奖励,它不使用正则表达式!

这利用了.NET <string>.IndexOf()函数的优势,-1如果在字符串中未找到该字符,该函数将返回。因此,如果第一个字符不是“快乐”字符,则第一个字符IndexOf()将为-1-对于最后一个字符也是如此。因此,如果它是一张悲伤的脸,则IndexOf()s总是总和为-2,表示-eq-2is $TRUE,因此sad被打印。


奖励变体:带有Regex的PowerShell,95字节

param([char[]]$a)if(($a[0]-match"[<\[\(\{]")-or($a[-1]-match"[\}\)D3\]>]")){"happy"}else{"sad"}

1

Python 3,75个字节

lambda y:"sad"if re.match("(.*[[(c<{]$)|(^[\])>}])",y)else"happy"
import re

在线尝试

regex导入使其有点太长,并且无法None用作数组索引。但是我喜欢正则表达式:)


1

Java 8,52字节

e->e.matches(".+[\\[(c<{]|[)>\\]}].+")?"sad":"happy"

在线尝试。

说明:

e->          // Method with String as both parameter return-type
  e.matches( ".+[\\[(c<{]|[)>\\]}].+")                   
             //  Checks if the input matches the regex
   ?"sad"    //  If it does: output "sad"
   :"happy"  //  Else: output "happy"

Java会String#matches隐式添加^...$以匹配整个String,这就是为什么它更难检查而不是像大多数其他答案一样检查高兴的面孔.+[\\])D3>}]|[<\\[({].+(例如,由于我的regex在@MartinEnder的Retina答案中失败,快乐的测试用例:c))。

正则表达式说明:

^.+[\\[(c<{]|[)>\\]}].+$
^                           Start of the string
 .+                          One or more characters,
   [\\[(c<{]                 followed by one of "[(c<{"
            |               Or
             [)>\\]}]        One of ")>]}",
                     .+      followed by one or more characters
                       $    End of the string
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.