Pengenalan ekspresi wajah Emoticon

25

Tulis program yang menerima sebagai input emoticon dan ouput jika emoticon senang atau sedih.

Program menerima string sebagai input atau parameter, dan harus menampilkan string "bahagia" jika inputnya ada dalam daftar emoticon bahagia, atau "sedih" jika inputnya ada dalam daftar emoticon sedih.

Anda dapat menganggap input tersebut selalu merupakan emoticon yang valid (bahagia atau sedih), tanpa spasi atau tab di sekitar.

Berikut ini adalah daftar emotikon bahagia yang dipisahkan oleh ruang:

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

Berikut ini adalah daftar emoticon sedih yang dipisahkan oleh ruang:

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

Ini adalah kode-golf, jadi program terpendek menang.

Arnaud
sumber
1
Anda lupa :'D, :')(bahagia) dan :@(marah)
Ismael Miguel

Jawaban:

19

Python, 86 byte

Saya harus dikirim ke penjara.

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

Yang terpendek yang bisa saya buat adalah setara dengan jawaban CJam Martin, jadi saya memutuskan untuk menyembunyikan semua emoji sedih (minus karakter tengah jika ada) di balik kode saya dan menggunakan Python. __file__ cheat quine .

Muahahaha.

cjfaure
sumber
Dipikirkan
Sebenarnya, sekarang saya melihat kode Anda, akan menghapus ruang setelah titik dua membantu apa pun, atau hanya akan merusak program?
Beta Decay
6
Saya suka bahwa program ini mengandung emotikonnya sendiri:c:
Alex A.
@BetaDecay itu akan merusaknya heheh
cjfaure
1
@AlexA. ini juga memiliki ini, jika Anda perhatikan dengan teliti:8) (8 :] [:
cjfaure
16

CJam, 33 32 byte

Terima kasih kepada Dennis untuk menghemat 1 byte.

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

Sepertinya lebih pendek untuk melakukan hal yang sama tanpa regex ...

Uji di sini.

Penjelasan

Ini berdasarkan pengamatan yang sama dengan jawaban Retina, tapi kali ini mencocokkan wajah-wajah bahagia tidak ada manfaatnya, jadi kami akan mencocokkan wajah-wajah sedih (karena ada satu mulut yang kurang untuk diperhitungkan). Solusinya adalah persis sama, kecuali itu tidak diimplementasikan melalui substitusi regex:

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.
Martin Ender
sumber
7
Woah, beri kami kesempatan lain Martin: D
Beta Decay
10

Retina , 38 36 byte

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

Kita dapat mengenali semua emotikon melalui mulutnya, karena tidak ada mulut yang digunakan sebagai topi atau mata pada perangkat lain (hanya pada perangkat yang sama). Yang bahagia memiliki satu mulut lagi untuk diperhitungkan, tetapi mereka memiliki manfaat bahwa mulut tidak muncul sama sekali, bahkan tidak seperti hidung (sebaliknya tidak benar:c keduanya mulut yang sedih dan bahagia hidung). Ini berarti kita dapat menghindari menggunakan jangkar tetapi hanya memastikan bahwa ada lebih banyak karakter di sisi lain mulut.

Jadi mulut yang valid untuk wajah bahagia ada ] ) D 3 > }di kanan atau < [ ( {di kiri. Kami mencocokkan mereka dengan .+[])D3>}]|[<[({].+dan menggantinya dengan happy. Jika kami tidak cocok akan ada dua atau tiga karakter di string (emotikon), tetapi jika kami melakukannya akan ada lima ( happy). Jadi pada langkah kedua kita mengganti dua atau tiga karakter dengan sad.

Martin Ender
sumber
We can recognise all emoticons by their mouths, because none of the mouths is used as a hat.Nah, ]:<emotikon menggunakan mulut sebagai topi, hanya mengatakan.
Loovjo
@ Loovjo kecuali tidak ada ."topi" setelah jawaban saya. ;) "... seperti topi atau mata di set lain (hanya di set yang sama)."
Martin Ender
8

JavaScript (ES6), 46

Menggunakan regexp untuk menemukan emotikon sedih, yang dimulai dengan >)]}atau berakhir dengan <([{c. Catatan: regexps lain di sini mungkin lebih pendek tapi saya tidak yakin untuk memahaminya.

Catatan biasa: tes menjalankan cuplikan pada browser apa pun yang sesuai dengan EcmaScript 6 (terutama bukan Chrome yang terbaru tetapi bukan MSIE. Saya mengujinya di Firefox, Safari 9 dapat digunakan)

Berita besar Sepertinya fungsi panah akhirnya tiba di Chrome land! Rel 45, Agustus 2015

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>

edc65
sumber
bekerja sangat baik pada chrome
Glycerine
3
@ Gliserin jadi sekarang, Chrome mengenali =>? Saya ketinggalan berita itu
edc65
4

Julia, 87 69 bytes - disimpan 18 bytes berkat Alex A.

s=readline();print(s[end-1] in")D]3>}"||s[1] in"([<{"?"happy":"sad")
pawel.boczarski
sumber
2
Anda dapat menyimpan banyak dengan menggunakan terner sebagai ganti if/ elsedan menempatkan ternary di dalamnya printuntuk menghindari penetapan t.
Alex A.
4

Python 3 , 77 75 74 72 61 55 byte

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

Cobalah online!

bagaimana cara kerjanya

Jika string wajah dimulai dengan ])>}atau diakhiri dengan [(c<{, itu sedih, kalau tidak senang. Pengindeksan Tuple digunakan sebagai if.

xbarbie
sumber
1
Selamat Datang di Programming Puzzles & Code Golf!
Dennis
Menggunakan fungsi tidak masalah. Sebaliknya, dengan asumsi input sudah tersimpan xtidak diperbolehkan.
Dennis
3

Brachylog , 50 byte

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

Penjelasan

(                              ),"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 "])>}"
Fatalisasi
sumber
2

Python, 159 byte.

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]
Loovjo
sumber
2

MATLAB, 85 83 byte

Pasti ada cara untuk mengurangi ukuran di sini.

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

Input adalah string smiley. Karakter pertama dan terakhir akan dibandingkan untuk menentukan apakah itu sedih. Jika tidak, itu bahagia.

Saya dapat menyimpan 2 byte dengan tidak menampilkan salah satu, tetapi menempatkan mereka ke variabel default MATLAB (ans) dan kemudian menampilkan ans setelah pernyataan if. Tapi saya yakin itu bisa diperbaiki.

Peningkatan 2 byte dengan mengubah fungsi s (e), menjadi e = input (''); .

slvrbld
sumber
1

PowerShell, 92 Bytes

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

Sedikit bertele-tele, tetapi sebagai bonus, itu tidak menggunakan regex!

Ini mengambil keuntungan dari <string>.IndexOf()fungsi .NET yang mengembalikan -1jika karakter tidak ditemukan dalam string. Jadi, jika karakter pertama bukan karakter "bahagia", yang pertama IndexOf()adalah -1 - juga untuk karakter terakhir. Jadi, jika itu adalah wajah sedih, angka IndexOf()s akan selalu berjumlah -2, artinya -eq-2adalah $TRUE, dan dengan demikian sadakan dicetak.


Varian bonus: PowerShell dengan Regex, 95 byte

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

Python 3 , 75 byte

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

Cobalah online

Impor regex membuatnya agak terlalu lama, serta ketidakmampuan untuk digunakan Nonesebagai indeks array. Tapi saya suka regex :)

etene
sumber
1

Java 8, 52 byte

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

Cobalah online.

Penjelasan:

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#matchessecara implisit menambahkan ^...$untuk mencocokkan seluruh String, itulah sebabnya mengapa lebih pendek untuk memeriksa wajah sedih daripada memeriksa wajah bahagia seperti kebanyakan jawaban lainnya lakukan dengan .+[\\])D3>}]|[<\\[({].+(karena regex saya akan gagal dalam jawaban Retina @MartinEnder misalnya, karena kasus uji senang :c)).

Penjelasan regex:

^.+[\\[(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
Kevin Cruijssen
sumber