絵文字の表情認識


25

絵文字を入力として受け入れ、絵文字が幸せか悲しいかを出力するプログラムを作成します。

プログラムは文字列を入力またはパラメータとして受け入れ、入力が幸せな絵文字リストにある場合は文字列「happy」を表示し、入力が悲しい顔文字リストにある場合は「悲しい」を表示する必要があります。

入力は常に有効な(幸せまたは悲しい)絵文字であり、スペースやタブはありません。

以下は、スペースで区切られた幸せな顔文字のリストです。

:-) :) :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:')(幸せ)と:@(怒り)を忘れていた
イスマエルミゲル

回答:


19

Python、86バイト

私は刑務所に送られるべきです。

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

私が思いつく最短はマーティンのCJamの答えと同等だったので、コードの逆にすべての悲しい絵文字(もしあれば中央の文字を除く)を隠し、Pythonの__file__カンニングチートを使用することにしました。

ムアハハハ。


非常によく考えられた
-edc65

実際、私はあなたのコードを見て、コロンの後にスペースを削除すると何か助けになるでしょうか、それともプログラムを壊すだけでしょうか?
ベータ崩壊

6
私は、プログラムが独自の絵文字が含まれていることを愛して:c:
アレックスA.

@BetaDecayそれはそれを破るでしょうheheh
cjfaure

1
@AlexA。注意深く見ると、次のようなものもあります8) (8 :] [:
。– cjfaure

16

CJam、33 32バイト

1バイトを節約してくれたDennisに感謝します。

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

正規表現なしで同じことをする方が短いように見えます...

ここでテストしてください。

説明

これはRetinaの回答と同じ観察に基づいていますが、今回は幸せそうな顔を一致させることには何のメリットもないので、代わりに悲しい顔を一致させます(考慮する口が1つ少ないため)。それ以外の場合のソリューションは、正規表現の置換によって実装されていないことを除いて、まったく同じです。

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:すごい迫力は、私たちの残りの部分にチャンスマーティン与える
ベータ崩壊

10

網膜38 36バイト

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

他のセット(同じセットのみ)で口は帽子や目として使用されないため、すべての顔文字を口で認識することができます。幸せな人にはもう1つの口がありますが、鼻ではなく口が他のセットにまったく表示されないという利点があります(逆は真実ではありません:c悲しい口と幸せの両方です鼻)。これは、アンカーの使用を避けることができますが、代わりに口の反対側により多くのキャラクターがあることを確認することを意味します。

したがって、幸せそうな顔の有効な口] ) D 3 > }は右または< [ ( {左にあります。これらを一致させ.+[])D3>}]|[<[({].+、で置き換えますhappy。一致しなかった場合、文字列には2文字または3文字(絵文字)がありますが、一致した場合は5文字(happy)になります。したがって、2番目のステップでは、2つまたは3つの文字をに置き換えsadます。


We can recognise all emoticons by their mouths, because none of the mouths is used as a hat.ええと、]:<絵文字は口を帽子として使っています。
Loovjo

@Loovjoは.、私の答えに「帽子」の後にないことを除いて。;) "...他のセットの帽子または目として(同じセットのみ)。"
マーティンエンダー

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/の代わりに3進数を使用し、3 else進数を内部に配置printすることで、割り当てを回避して、束を保存できますt
アレックスA.

4

Pythonの377の 75 74 72 61 55バイト

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

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

仕組み

顔文字列がで始まる])>}かで終わる場合[(c<{、それは悲しいです。タプルインデックスはとして使用されifます。


1
プログラミングパズルとコードゴルフへようこそ!
デニス

関数を使用してもまったく問題ありません。対照的に、入力が既に保存されている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)

入力はスマイリー文字列です。最初と最後のキャラクターを比較して、悲しいかどうかを判断します。そうでない場合、それは幸せです。

どちらも表示せず、代わりにそれらをMATLABのデフォルト変数(ans)に割り当て、ifステートメントの後にansを表示することで、2バイトを節約できました。しかし、どうにか改善できると確信しています。

関数s(e)e = input( '')に変更することによる2バイトの改善


1

PowerShell、92バイト

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

少し冗長ですが、ボーナスとして正規表現を使用しません!

これは、文字文字列に見つからない場合に<string>.IndexOf()返さ-1れる.NET 関数を利用します。したがって、最初の文字が「ハッピー」文字でない場合、最初の文字は-1になります(最後の文字も同様)。したがって、悲しい顔の場合、sは常に合計-2になり、is 、つまり印刷されます。IndexOf()IndexOf()-eq-2$TRUEsad


ボーナスバリアント:正規表現を使用した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

オンラインで試す

正規表現のインポートにより、長さが少し長くなりすぎ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暗黙的に追加されます^...$、他のほとんどの答えがでませんように幸せそうな顔をチェックするのではなく、悲しい顔を確認するために短い理由である、文字列全体を一致させるために.+[\\])D3>}]|[<\\[({].+、私の正規表現はで失敗するので(@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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.