Emoticon reconocimiento de expresiones faciales

25

Escriba un programa que acepte como entrada un emoticón y salga si el emoticón es feliz o triste.

El programa acepta una cadena como entrada o parámetro, y debe mostrar la cadena "feliz" si la entrada está en la lista de emoticones felices, o "triste" si la entrada está en la lista de emoticones triste.

Puede suponer que la entrada siempre es un emoticón válido (feliz o triste), sin espacios ni pestañas.

Aquí hay una lista de emoticones felices separados por espacios:

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

Aquí hay una lista de emoticones tristes separados por espacios:

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

Este es el código de golf, por lo que gana el programa más corto.

Arnaud
fuente
1
Te olvidaste :'D, :')(feliz) y :@(enojado)
Ismael Miguel

Respuestas:

19

Python, 86 bytes

Debería ser enviado a prisión.

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

Lo más corto que pude encontrar fue equivalente a la respuesta CJam de Martin, así que decidí esconder todos los emojis tristes (menos el carácter del medio, si los hubiera) en el reverso de mi código y usar el __file__truco de Python .

Muahahaha

cjfaure
fuente
Muy bien pensado
edc65
En realidad, ahora que miro su código, ¿eliminará algo el espacio después de los dos puntos o simplemente interrumpirá el programa?
Beta Decay
66
Me encanta que el programa contenga su propio emoticón:c:
Alex A.
@BetaDecay lo romperá jejeje
cjfaure
1
@AlexA. también tiene estos, si nos fijamos bien:8) (8 :] [:
cjfaure
16

CJam, 33 32 bytes

Gracias a Dennis por guardar 1 byte.

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

Parece que es más corto hacer lo mismo sin una expresión regular ...

Pruébalo aquí.

Explicación

Esto se basa en la misma observación que la respuesta de Retina, pero esta vez emparejar caras felices no tiene ningún beneficio, por lo que combinaremos caras tristes (porque hay una boca menos para tener en cuenta). La solución es exactamente la misma, excepto que no se implementa a través de la sustitución de expresiones regulares:

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
fuente
77
Woah, danos una oportunidad al resto Martin: D
Beta Decay
10

Retina , 38 36 bytes

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

Podemos reconocer todos los emoticones por sus bocas, porque ninguna de las bocas se usa como sombrero u ojos en el otro conjunto (solo en el mismo conjunto). Los felices tienen una boca más para tener en cuenta, pero tienen el beneficio de que las bocas no aparecen en el otro conjunto, ni siquiera como narices (lo contrario no es cierto: ces tanto una boca triste como una feliz nariz). Esto significa que podemos evitar el uso de anclas, sino asegurarnos de que haya más caracteres al otro lado de la boca.

Entonces las bocas válidas para caras felices están ] ) D 3 > }a la derecha o < [ ( {a la izquierda. Emparejamos aquellos con .+[])D3>}]|[<[({].+y los reemplazamos con happy. Si no coincidimos, habrá dos o tres caracteres en la cadena (el emoticón), pero si lo hiciéramos, habrá cinco ( happy). Entonces, en un segundo paso, reemplazamos dos o tres caracteres con sad.

Martin Ender
fuente
We can recognise all emoticons by their mouths, because none of the mouths is used as a hat.Bueno, el ]:<emoticón usa una boca como sombrero, solo diciendo.
Loovjo
@Loovjo, excepto que no hay .después de "sombrero" en mi respuesta. ;) "... como un sombrero u ojos en el otro conjunto (solo en el mismo conjunto)".
Martin Ender
8

JavaScript (ES6), 46

Usar una expresión regular para encontrar emoticones tristes, que son los que comienzan >)]}o terminan con <([{c. Nota al margen: otras expresiones regulares aquí pueden ser más cortas, pero no estoy seguro de entenderlas.

Nota habitual: prueba ejecutando el fragmento en cualquier navegador compatible con EcmaScript 6 (notablemente no es el Chrome más nuevo pero no MSIE. Probé en Firefox, Safari 9 podría funcionar)

Grandes noticias Parece que las funciones de flecha finalmente llegaron a Chrome. Rel 45, agosto de 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
fuente
funciona muy bien en cromo
Glicerina
3
@Glicerina, ¿ahora Chrome reconoce =>? Me perdí esa noticia
edc65 el
4

Julia, 87 69 bytes - ahorró 18 bytes gracias a Alex A.

s=readline();print(s[end-1] in")D]3>}"||s[1] in"([<{"?"happy":"sad")
pawel.boczarski
fuente
2
Puede guardar un montón utilizando un ternario en lugar de if/ elsey colocando el ternario dentro printpara evitar tener que asignar t.
Alex A.
4

Python 3 , 77 75 74 72 61 55 bytes

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

Pruébalo en línea!

Como funciona

Si una cadena de la cara comienza ])>}o termina con [(c<{, es triste, de lo contrario es feliz. La indexación de tuplas se usa como if.

xbarbie
fuente
1
¡Bienvenido a Programming Puzzles & Code Golf!
Dennis
Usar una función está perfectamente bien. Por el contrario, asumir que la entrada ya está almacenada xno está permitido.
Dennis
3

Brachylog , 50 bytes

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

Explicación

(                              ),"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 "])>}"
Fatalizar
fuente
2

Python, 159 bytes.

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
fuente
2

MATLAB 85 83 bytes

Debe haber una manera de reducir el tamaño aquí.

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

La entrada es una cadena sonriente. El primer y el último personaje se compararán para determinar si es triste. Si no, es feliz.

Pude guardar 2 bytes al no mostrarlos, sino asignarlos a la variable predeterminada (ans) de MATLAB y luego mostrar ans después de la instrucción if. Pero estoy convencido de que se puede mejorar de alguna manera.

Mejora de 2 bytes cambiando la función s (e), a e = input (''); .

slvrbld
fuente
1

PowerShell, 92 bytes

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

Un poco prolijo, pero como beneficio adicional, ¡no usa expresiones regulares!

Esto aprovecha la <string>.IndexOf()función .NET que regresa -1si el carácter no se encuentra en la cadena. Entonces, si el primer personaje no es un personaje "feliz", el primero IndexOf()será -1, del mismo modo para el último personaje. Entonces, si es una cara triste, la IndexOf()s siempre sumará a -2, lo que significa que -eq-2es $TRUE, y así sadse imprime.


Variante de bonificación: PowerShell con Regex, 95 bytes

param([char[]]$a)if(($a[0]-match"[<\[\(\{]")-or($a[-1]-match"[\}\)D3\]>]")){"happy"}else{"sad"}
AdmBorkBork
fuente
1

Python 3 , 75 bytes

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

Pruébalo en línea

La importación de expresiones regulares hace que sea demasiado larga, así como la imposibilidad de usarla Nonecomo índice de matriz. Pero me gusta la expresión regular :)

etene
fuente
1

Java 8, 52 bytes

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

Pruébalo en línea.

Explicación:

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 se String#matchesagrega implícitamente ^...$para que coincida con la cadena completa, por lo que es más corto buscar caras tristes en lugar de buscar caras felices como lo hacen la mayoría de las otras respuestas .+[\\])D3>}]|[<\\[({].+(porque mi expresión regular fallaría en la respuesta Retina de @MartinEnder , por ejemplo, debido a El caso de prueba feliz :c)).

Explicación de expresiones regulares:

^.+[\\[(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
fuente