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.


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.



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.

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.


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>


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")

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.


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 "])>}"

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]

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 (''); .


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"}

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 :)


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.