Nhận dạng biểu cảm khuôn mặt


25

Viết chương trình chấp nhận làm đầu vào biểu tượng cảm xúc và thông báo nếu biểu tượng cảm xúc vui hay buồn.

Chương trình chấp nhận một chuỗi làm đầu vào hoặc tham số và sẽ hiển thị chuỗi "hạnh phúc" nếu đầu vào nằm trong danh sách biểu tượng cảm xúc hạnh phúc hoặc "buồn" nếu đầu vào nằm trong danh sách biểu tượng cảm xúc buồn.

Bạn có thể giả sử đầu vào luôn là một biểu tượng cảm xúc (vui hay buồn) hợp lệ, không có khoảng trống hoặc các tab xung quanh.

Dưới đây là danh sách các biểu tượng cảm xúc hạnh phúc được phân tách bằng không gian:

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

Dưới đây là danh sách các biểu tượng cảm xúc buồn:

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

Đây là môn đánh gôn, vì vậy chương trình ngắn nhất sẽ thắng.


1
Bạn đã quên mất :'D, :')(hạnh phúc) và :@(tức giận)
Ismael Miguel

Câu trả lời:


19

Python, 86 byte

Tôi nên bị tống vào tù.

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

Câu hỏi ngắn nhất tôi có thể đưa ra tương đương với câu trả lời của CJam của Martin, vì vậy tôi quyết định tôi sẽ giấu tất cả các biểu tượng cảm xúc buồn (trừ ký tự giữa nếu có) trong mã ngược lại và sử dụng __file__cheat quine của Python .

Muahahaha.


Suy

Trên thực tế, bây giờ tôi nhìn vào mã của bạn, sẽ loại bỏ khoảng trắng sau khi dấu hai chấm giúp bất cứ điều gì, hoặc nó sẽ chỉ phá vỡ chương trình?
Beta Decay

6
Tôi thích chương trình này chứa biểu tượng cảm xúc của riêng nó:c:
Alex A.

@BetaDecay nó sẽ phá vỡ nó heheh
cjfaure

1
@AlexA. nó cũng có những thứ này, nếu bạn xem xét kỹ:8) (8 :] [:
cjfaure

16

CJam, 33 32 byte

Cảm ơn Dennis vì đã tiết kiệm 1 byte.

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

Có vẻ như nó ngắn hơn để làm điều tương tự mà không cần regex ...

Kiểm tra nó ở đây.

Giải trình

Điều này dựa trên quan sát tương tự như câu trả lời của Retina, nhưng lần này phù hợp với khuôn mặt hạnh phúc không có lợi ích gì, vì vậy chúng tôi sẽ đối mặt với khuôn mặt buồn thay thế (vì có một cái miệng ít hơn để tính đến). Giải pháp hoàn toàn giống nhau, ngoại trừ việc nó không được thực hiện thông qua thay thế 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
Ái chà, cho chúng tôi một cơ hội còn lại Martin: D
Beta Decay

10

Võng mạc , 38 36 byte

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

Chúng ta có thể nhận ra tất cả các biểu tượng cảm xúc bằng miệng của chúng, bởi vì không có miệng nào được sử dụng làm mũ hoặc mắt trong bộ khác (chỉ trong cùng một bộ). Những người hạnh phúc có thêm một miệng để tính đến, nhưng họ có lợi ích là miệng không xuất hiện ở bộ kia, thậm chí không phải là mũi (ngược lại là không đúng: cvừa là miệng vừa buồn. mũi). Điều này có nghĩa là chúng ta có thể tránh sử dụng neo nhưng thay vào đó chỉ cần đảm bảo rằng có nhiều ký tự ở phía bên kia của miệng.

Vì vậy, miệng hợp lệ cho khuôn mặt hạnh phúc là ] ) D 3 > }ở bên phải hoặc < [ ( {bên trái. Chúng tôi phù hợp với những người .+[])D3>}]|[<[({].+và thay thế chúng với happy. Nếu chúng tôi không khớp, sẽ có hai hoặc ba ký tự trong chuỗi (biểu tượng cảm xúc), nhưng nếu chúng tôi làm thì sẽ có năm ( happy). Vì vậy, trong bước thứ hai, chúng tôi thay thế hai hoặc ba ký tự sad.


We can recognise all emoticons by their mouths, because none of the mouths is used as a hat.Vâng, ]:<biểu tượng cảm xúc sử dụng một cái miệng như một chiếc mũ, chỉ cần nói.
Loovjo

@Loovjo ngoại trừ không có ."mũ" trong câu trả lời của tôi. ;) "... như một chiếc mũ hoặc đôi mắt trong bộ khác (chỉ trong cùng một bộ)."
Martin Ender

8

JavaScript (ES6), 46

Sử dụng biểu thức chính để tìm biểu tượng cảm xúc buồn, đó là những biểu tượng bắt đầu bằng >)]}hoặc kết thúc bằng <([{c. Lưu ý bên lề: các biểu thức chính khác ở đây có thể ngắn hơn nhưng tôi không chắc chắn hiểu chúng.

Lưu ý thông thường: kiểm tra chạy đoạn mã trên bất kỳ trình duyệt tuân thủ EcmaScript 6 nào (đáng chú ý không phải là Chrome mới nhất nhưng không phải MSIE. Tôi đã thử nghiệm trên Firefox, Safari 9 có thể đi)

Tin lớn Có vẻ như các chức năng mũi tên cuối cùng đã đến vùng đất Chrome! Rel 45, tháng 8 năm 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>


hoạt động tuyệt vời trên chrome
Glycerine

3
@Glycerine để bây giờ Chrome nhận ra =>? Tôi đã bỏ lỡ tin tức đó
edc65

4

Julia, 87 69 byte - đã lưu 18 byte nhờ Alex A.

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

2
Bạn có thể lưu một bó bằng cách sử dụng một ternary thay vì if/ elsevà đặt ternary bên trong printđể tránh phải gán 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'])>}']

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

Nếu một chuỗi khuôn mặt bắt đầu bằng ])>}hoặc kết thúc bằng [(c<{, nó buồn, nếu không thì nó hạnh phúc. Lập chỉ mục tuple được sử dụng như if.


1
Chào mừng bạn đến với Câu đố lập trình & Code Golf!
Dennis

Sử dụng một chức năng là hoàn toàn tốt. Ngược lại, giả sử đầu vào đã được lưu trữ trong xkhông được phép.
Dennis

3

Brachylog , 50 byte

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

Giải trình

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

Phải có một cách để giảm kích thước ở đây.

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

Đầu vào là một chuỗi mặt cười. Các ký tự đầu tiên và cuối cùng sẽ được so sánh để xác định xem nó có buồn không. Nếu không, nó hạnh phúc.

Tôi đã có thể lưu 2 byte bằng cách không hiển thị, nhưng chỉ định chúng cho biến mặc định (ans) của MATLAB và sau đó hiển thị ans sau câu lệnh if. Nhưng tôi tin rằng nó có thể được cải thiện bằng cách nào đó.

Cải thiện 2 byte bằng cách thay đổi hàm s (e), thành e = input (''); .


1

PowerShell, 92 byte

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

Một chút dài dòng, nhưng như một phần thưởng, nó không sử dụng regex!

Điều này lợi dụng <string>.IndexOf()chức năng .NET trả về -1nếu ký tự không được tìm thấy trong chuỗi. Vì vậy, nếu ký tự đầu tiên không phải là ký tự "hạnh phúc", ký tự đầu tiên IndexOf()sẽ là -1 - tương tự cho ký tự cuối cùng. Vì vậy, nếu đó là một khuôn mặt buồn, IndexOf()s sẽ luôn có tổng bằng -2, nghĩa -eq-2$TRUE, và do đó sadđược in.


Biến thể tiền thưởng: PowerShell với 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

Dùng thử trực tuyến

Việc nhập regex làm cho nó hơi dài, cũng như không thể sử dụng Nonenhư một chỉ mục mảng. Nhưng tôi thích regex :)


1

Java 8, 52 byte

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

Hãy thử trực tuyến.

Giải trình:

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#matcheshoàn toàn bổ sung ^...$để khớp với toàn bộ Chuỗi, đó là lý do tại sao nó ngắn hơn để kiểm tra các khuôn mặt buồn thay vì kiểm tra các khuôn mặt vui vẻ như hầu hết các câu trả lời khác làm .+[\\])D3>}]|[<\\[({].+(vì ví dụ như regex của tôi sẽ thất bại trong câu trả lời Retina của @MartinEnder trường hợp thử nghiệm hạnh phúc :c)).

Regex giải thích:

^.+[\\[(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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.