Розпізнавання виразів обличчя смайликом


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, :')(щасливий) і :@(сердитий)
Ісмаель Мігель

Відповіді:


19

Пітон, 86 байт

Мене слід відправити до в'язниці.

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

Найкоротший, який я міг придумати, був еквівалентним відповіді Мартина на CJam, тому я вирішив приховати всі сумні емоджи (за винятком середнього символу, якщо такі є) у звороті мого коду та використати __file__чіт-чіт Python .

Муахахаха.


Дуже добре продуманий
edc65

Насправді, тепер, коли я дивлюся на ваш код, чи допоможе видалення місця після двокрапки, чи це просто порушить програму?
Бета-розпад

6
Мені подобається, що програма містить власний смайлик:c:
Алекс А.

@BetaDecay це зламає його heheh
cjfaure

1
@AlexA. У неї також є такі, якщо уважно подивитися:8) (8 :] [:
cjfaure

16

CJam, 33 32 байти

Завдяки Деннісу за збереження 1 байта.

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

Схоже, коротше робити те ж саме без регулярного вираження ...

Перевірте це тут.

Пояснення

Це ґрунтується на тому самому спостереженні, що й відповідь Сітківки, але цього разу відповідність щасливим обличчям не має ніякої користі, тому ми замість цього познайомимось із сумними обличчями (тому що потрібно брати до уваги ще один рот). Інакше рішення точно таке ж, за винятком того, що він не реалізований за допомогою заміни регулярними виразами:

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

Сітківка , 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! 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
@Glycerine, тепер 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

Пітон, 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()s завжди буде дорівнювати -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"

Ява 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.