Rozpoznawanie mimiki twarzy

25

Napisz program, który przyjmuje jako dane wejściowe emotikon i wypisuje, jeśli emotikon jest szczęśliwy lub smutny.

Program akceptuje ciąg jako parametr wejściowy lub parametr i powinien wyświetlać ciąg „szczęśliwy”, jeśli dane wejściowe znajdują się na liście szczęśliwych emotikonów, lub „smutny”, jeśli dane wejściowe znajdują się na liście smutnych emotikonów.

Możesz założyć, że dane wejściowe są zawsze prawidłowymi (szczęśliwymi lub smutnymi) emotikonami, bez spacji i znaków tabulacji.

Oto rozdzielona spacjami lista szczęśliwych emotikonów:

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

Oto rozdzielona spacjami lista smutnych emotikonów:

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

To jest golf golfowy, więc wygrywa najkrótszy program.

Arnaud
źródło
1
Zapomniałeś o :'D, :')(szczęśliwy) i :@(zły)
Ismael Miguel

Odpowiedzi:

19

Python, 86 bajtów

Powinienem zostać wysłany do więzienia.

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

Najkrótszy, jaki mogłem wymyślić, był równoważny z odpowiedzią Martina na CJam, więc zdecydowałem, że ukryję wszystkie smutne emoji (bez środkowego znaku, jeśli w ogóle) na odwrocie mojego kodu i __file__użyję oszukiwanego kodu Pythona .

Muahahaha.

cjfaure
źródło
Bardzo dobrze przemyślane
edc65
Właściwie, teraz, kiedy spojrzę na twój kod, czy usunięcie spacji po dwukropku coś pomoże, czy po prostu zepsuje program?
Beta Decay
6
Uwielbiam to, że program zawiera własny emotikon:c:
Alex A.
@BetaDecay it will break it heheh
cjfaure
1
@AlexA. ma również te, jeśli przyjrzysz się uważnie:8) (8 :] [:
cjfaure
16

CJam, 33 32 bajty

Dzięki Dennisowi za zaoszczędzenie 1 bajtu.

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

Wygląda na to, że krócej jest zrobić to samo bez wyrażenia regularnego ...

Sprawdź to tutaj.

Wyjaśnienie

Opiera się to na tej samej obserwacji, co odpowiedź Retiny, ale tym razem dopasowanie szczęśliwych twarzy nie przynosi żadnych korzyści, więc zamiast tego dopasujemy smutne twarze (ponieważ jest o jedno usta mniej do wzięcia pod uwagę). W przeciwnym razie rozwiązanie jest dokładnie takie samo, z tym wyjątkiem, że nie jest zaimplementowane przez podstawienie wyrażenia regularnego:

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
źródło
7
Woah, daj reszcie szansę Martin: D
Beta Decay
10

Siatkówka , 38 36 bajtów

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

Możemy rozpoznać wszystkie emotikony po ich ustach, ponieważ żadne usta nie są używane jako kapelusz lub oczy w drugim zestawie (tylko w tym samym zestawie). Szczęśliwi mają jeszcze jedno usta do wzięcia pod uwagę, ale mają tę zaletę, że usta wcale nie pojawiają się w drugim zestawie, nawet jako nosy (odwrotność nie jest prawdą: cjest to zarówno usta smutne, jak i szczęśliwe nos). Oznacza to, że możemy uniknąć używania kotwic, ale po prostu upewnij się, że po drugiej stronie ust jest więcej znaków.

Tak więc ważne usta dla szczęśliwych twarzy znajdują ] ) D 3 > }się po prawej lub < [ ( {po lewej stronie. Dopasowujemy je .+[])D3>}]|[<[({].+i zastępujemy nimi happy. Jeśli nie pasujemy, w łańcuchu będą dwa lub trzy znaki (emotikon), ale jeśli tak się stanie, będzie ich pięć ( happy). Tak więc w drugim kroku zamieniamy dwa lub trzy znaki na sad.

Martin Ender
źródło
We can recognise all emoticons by their mouths, because none of the mouths is used as a hat.Cóż, ]:<emotikon używa ust jak kapelusza, mówiąc tylko.
Loovjo,
@Loovjo, z wyjątkiem tego, że .w mojej odpowiedzi nie ma słowa „hat”. ;) „... jak kapelusz lub oczy w innym zestawie (tylko w tym samym zestawie).”
Martin Ender
8

JavaScript (ES6), 46

Używanie wyrażenia regularnego do znajdowania smutnych emotikonów, które zaczynają się na >)]}lub kończą na <([{c. Uwaga dodatkowa: inne wyrażenia regularne mogą być krótsze, ale nie jestem pewien, czy je rozumiem.

Zwykła uwaga: przetestuj fragment kodu w dowolnej przeglądarce zgodnej z EcmaScript 6 (zwłaszcza nie w najnowszym Chrome, ale nie MSIE. Testowałem na Firefox, Safari 9 mogłaby przejść)

Wielka wiadomość Wygląda na to, że funkcje strzałek w końcu dotarły do ​​krainy Chrome! Rel 45, sierpień 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
źródło
działa świetnie na chromie
Gliceryna
3
@ Gliceryna, więc teraz Chrome rozpoznaje =>? Brakowało mi tej wiadomości
edc65
4

Julia, 87 69 bajtów - dzięki Alexowi A. zaoszczędzono 18 bajtów

s=readline();print(s[end-1] in")D]3>}"||s[1] in"([<{"?"happy":"sad")
pawel.boczarski
źródło
2
Możesz zapisać wiązkę, używając trójki zamiast if/ elsei umieszczając trójkę wewnątrz, printaby uniknąć konieczności przypisywania t.
Alex A.
4

Python 3 , 77 75 74 72 61 55 bajtów

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

Wypróbuj online!

Jak to działa

Jeśli sznurek twarzy zaczyna się ])>}lub kończy [(c<{, jest smutny, w przeciwnym razie jest szczęśliwy. Indeksowanie krotkowe jest używane jako if.

xbarbie
źródło
1
Witamy w Programowaniu Puzzle i Code Golf!
Dennis,
Korzystanie z funkcji jest w porządku. Natomiast zakładanie, że dane wejściowe są już zapisane, xjest niedozwolone.
Dennis
3

Brachylog , 50 bajtów

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

Wyjaśnienie

(                              ),"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 "])>}"
Fatalizować
źródło
2

Python, 159 bajtów.

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
źródło
2

MATLAB, 85 83 bajty

Tutaj musi być sposób na zmniejszenie rozmiaru.

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

Dane wejściowe to buźka. Pierwsza i ostatnia postać zostaną porównane, aby ustalić, czy to smutne. Jeśli nie, to jest szczęśliwy.

Udało mi się zapisać 2 bajty, nie wyświetlając żadnego z nich, ale przypisując je do domyślnej zmiennej MATLAB (ans), a następnie wyświetlając ans po instrukcji if. Jestem jednak przekonany, że można to jakoś ulepszyć.

2 bajty poprawy przez zmianę funkcji s (e) na e = input (''); .

slvrbld
źródło
1

PowerShell, 92 bajty

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

Trochę nieprzyjemny, ale jako bonus nie używa wyrażenia regularnego!

Wykorzystuje to <string>.IndexOf()funkcję .NET, która zwraca, -1jeśli znak nie zostanie znaleziony w ciągu. Tak więc, jeśli pierwsza postać nie jest postacią „szczęśliwą”, pierwsza IndexOf()będzie równa -1 - podobnie dla ostatniej postaci. Tak więc, jeśli jest to smutna twarz, IndexOf()s zawsze będzie sumować -2, co oznacza, że -eq-2jest $TRUE, i w ten sposób sadzostanie wydrukowane.


Wariant bonusowy: PowerShell z Regex, 95 bajtów

param([char[]]$a)if(($a[0]-match"[<\[\(\{]")-or($a[-1]-match"[\}\)D3\]>]")){"happy"}else{"sad"}
AdmBorkBork
źródło
1

Python 3 , 75 bajtów

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

Wypróbuj online

Import wyrażeń regularnych powoduje, że jest on zbyt długi, a także niemożność użycia go Nonejako indeksu tablicy. Ale lubię wyrażenia regularne :)

eten
źródło
1

Java 8, 52 bajty

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

Wypróbuj online.

Wyjaśnienie:

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"

Jawa String#matchesdomyślnie dodaje, ^...$aby dopasować cały ciąg, dlatego krótsze jest sprawdzanie smutnych twarzy zamiast sprawdzania szczęśliwych twarzy, jak większość innych odpowiedzi .+[\\])D3>}]|[<\\[({].+(ponieważ mój regex zawiódłby na przykład w odpowiedzi Retina @MartinEnder z powodu szczęśliwy przypadek testowy :c)).

Wyjaśnienie 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
źródło