Смайлик распознавания выражений лица

25

Напишите программу, которая принимает в качестве входных данных смайлик и выводит их, если смайлик счастлив или печален.

Программа принимает строку в качестве ввода или параметра и должна отображать строку «счастливый», если вход находится в списке счастливых смайликов, или «грустный», если вход находится в списке печальных смайликов.

Вы можете предположить, что ввод всегда является действительным (счастливым или печальным) смайликом, без пробелов и табуляции.

Вот список разделенных пробелами счастливых смайликов:

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

Это код-гольф, поэтому выигрывает самая короткая программа.

Arnaud
источник
1
Вы забыли о :'D, :')(счастливый) и :@(сердито)
Исмаэль Miguel

Ответы:

19

Python, 86 байт

Я должен быть отправлен в тюрьму.

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

Самое короткое, что я мог придумать, было эквивалентно ответу Мартина CJam, поэтому я решил спрятать все грустные смайлики (за исключением среднего символа, если таковые имеются) в обратной части моего кода и использовать __file__чит- код Python .

Muahahaha.

cjfaure
источник
Очень хорошо продумано
edc65
На самом деле, теперь, когда я смотрю на ваш код, удаление пробела после двоеточия поможет чему-нибудь или это просто сломает программу?
бета-распад
6
Мне нравится, что в программе есть собственный смайлик:c:
Алекс А.
@BetaDecay это сломает это хехех
cjfaure
1
@AlexA. у этого также есть эти, если Вы внимательно посмотрите:8) (8 :] [:
cjfaure
16

CJam, 33 32 байта

Спасибо Деннису за сохранение 1 байта.

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

Похоже, короче сделать то же самое без регулярных выражений ...

Проверьте это здесь.

объяснение

Это основано на том же наблюдении, что и ответ Retina, но на этот раз сопоставление счастливых лиц не приносит никакой пользы, поэтому вместо этого мы сопоставим грустные лица (потому что нужно учесть на один рот меньше). В остальном решение точно такое же, за исключением того, что оно не реализовано с помощью подстановки регулярных выражений:

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

Retina , 38 36 байт

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

Мы можем распознать все смайлики по рту, потому что ни один из ртов не используется в качестве шляпы или глаз в другом наборе (только в одном наборе). У счастливых есть еще один рот, который нужно принять во внимание, но у них есть то преимущество, что они вообще не появляются в другом наборе, даже в виде носов (обратное неверно: cэто и грустный рот, и счастливый нос). Это означает, что мы можем избегать использования якорей, а просто гарантировать, что на другой стороне рта будет больше символов.

Таким образом, правильные рты для счастливых лиц находятся ] ) D 3 > }справа или < [ ( {слева. Мы сопоставляем их с .+[])D3>}]|[<[({].+и заменяем их happy. Если мы не соответствуем, в строке будет два или три символа (смайлик), но если мы это сделаем, будет пять ( happy). Таким образом, на втором шаге мы заменяем два или три символа на 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 Land! Rel 45, август 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
источник
отлично работает на хроме
глицерин
3
@ Глицерин, так что теперь Chrome распознает =>? Я пропустил эту новость
edc65
4

Юлия, 87 69 байтов - спасла 18 байтов благодаря Алексу А.

s=readline();print(s[end-1] in")D]3>}"||s[1] in"([<{"?"happy":"sad")
pawel.boczarski
источник
2
Вы можете сохранить группу, используя троичный вместо if/ elseи поместив троичный внутри, printчтобы избежать необходимости назначать t.
Алекс А.
4

Python 3 , 77 75 74 72 61 55 байт

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

Попробуйте онлайн!

Как это работает

Если лицевая нить начинается с ])>}или заканчивается [(c<{, это грустно, в противном случае она счастлива. Индексирование кортежей используется как if.

xbarbie
источник
1
Добро пожаловать в Программирование Пазлов и Код Гольф!
Деннис
Использование функции прекрасно. Напротив, допущение, что вход уже сохранен, xне допускается.
Денис
3

Брахилог , 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 "])>}"
Fatalize
источник
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]
Loovjo
источник
2

MATLAB, 85 83 байта

Здесь должен быть способ уменьшить размер.

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

Ввод - смайлик. Первый и последний символы будут сравниваться, чтобы определить, грустно ли это. Если нет, то счастлив.

Я смог сохранить 2 байта, не отображая ни того, ни другого, а назначив их переменной по умолчанию (ans) MATLAB, а затем отобразив ans после оператора if. Но я убежден, что это можно как-то улучшить.

Улучшение на 2 байта путем изменения функции s (e) на e = input (''); ,

slvrbld
источник
1

PowerShell, 92 байта

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

Немного многословно, но в качестве бонуса оно не использует регулярные выражения!

Это использует <string>.IndexOf()функцию .NET, которая возвращает, -1если символ не найден в строке. Таким образом, если первый символ не является «счастливым», первый IndexOf()будет -1 - аналогично последнему символу. Так что , если это печальное лицо, то IndexOf()ей будет всегда подводить -2, то есть -eq-2это $TRUE, и , таким образом , должна быть sadраспечатана.


Бонусный вариант: PowerShell с Regex, 95 байт

param([char[]]$a)if(($a[0]-match"[<\[\(\{]")-or($a[-1]-match"[\}\)D3\]>]")){"happy"}else{"sad"}
AdmBorkBork
источник
1

Python 3 , 75 байт

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

Попробуйте онлайн

Импорт регулярных выражений делает его слишком длинным, а также невозможностью использования Noneв качестве индекса массива. Но я люблю регулярные выражения :)

etene
источник
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>}]|[<\\[({].+(потому что мое регулярное выражение не сработало в ответе Retina @MartinEnder, например, из-за счастливый тестовый кейс :c)).

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
Кевин Круйссен
источник