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


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

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


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.


Очень хорошо продумано
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>


отлично работает на хроме
глицерин

3
@ Глицерин, так что теперь Chrome распознает =>? Я пропустил эту новость
edc65

4

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

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

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.


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

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]

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


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

1

Python 3 , 75 байт

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

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

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.