Contestador de consultas

12
  • Original: https://james-iry.blogspot.co.at/2009/05/brief-incomplete-and-mostly-wrong.html

    Alain Colmerauer diseñó el lenguaje de programación lógica Prolog. Su objetivo era crear un lenguaje de programación que fuera tan inteligente como un niño de dos años. Con el fin de demostrar que había logrado su objetivo, presentó un programa Prolog que responde "No" con recursos para todas las consultas.
    ¡Pregúntame lo que sea!
    ? -

  • (Por supuesto que no lo hizo). Su tarea es crear un programa que sea más inteligente que el programa de Alain Colmerauer. Esto no tiene que estar en Prolog.

Detalles específicos

  • Si la entrada termina con ?y tiene al menos uno ,, devuelva el texto desde el último ,hasta antes del último ?.

  • De lo contrario, si la entrada termina con ?return No.

  • De lo contrario, vuelve Yes.

Reglas

  • No hay lagunas estándar.
  • La entrada / salida se tomará a través de nuestros métodos de entrada / salida estándar.
  • Su programa tiene que tomar al menos 1 consulta.
  • Debe generar la consulta procesada.
  • Los Yesy Noson sensibles a mayúsculas y minúsculas en los ejemplos.
  • Se le garantiza que si la entrada incluye a ?, la entrada solo tendrá uno ?y siempre será el último carácter.
  • La entrada siempre será una frase / oración. Esta frase / frase no sólo contendrá los caracteres ,y ?, por ejemplo ,, ?y,? no son entradas válidas. (Aunque las presentaciones podrían implementarlo de todos modos, ya que la frase / oración es una cadena vacía en estos casos).
  • Además, la entrada nunca terminará con ,?.
  • Si hay espacios en blanco inmediatamente después del último ,o inmediatamente antes del ?, deben incluirse en la salida.

Ejemplos

Hmm. -> Yes
Alright, -> Yes
Ask me anything! -> Yes
Ask me a question, please! -> Yes
Are you okay? -> No
No? -> No
Hey,does this program work? -> does this program work

Quotes in the following test cases should not be outputted.
They are used as a delimiter here.

Okay, so this does work ? -> " so this does work "
Please, add, a, test, case, containing, multiple, commas? -> " commas"

Puntuación

Este es el , por lo que la respuesta más corta en bytes gana.


fuente
66
¿Estamos garantizados que si la entrada incluye a ?, solo habrá uno y siempre será el último carácter?
Shaggy
3
Agregue un caso de prueba que contenga varias comas.
manatwork
8
Aceptar una respuesta temprano puede desanimar a otros usuarios a publicar nuevas respuestas, porque parece que el desafío está hecho.
Arnauld
3
You are guaranteed that if the input includes a ?, the input will only have one ? and it will always be the last character.Por lo tanto, estos casos de prueba son innecesarios.
8
¿Es ends with ,?una entrada válida?
GammaFunction

Respuestas:

6

05AB1E , 20 19 bytes

'?åi',¡”€–”0ǝθ¨ë”…Ü

-1 byte gracias a @Grimy .

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

'?åi          '# If the (implicit) input contains a "?":
    ',¡       '#  Split the (implicit) input on ","
       ”€–”    #  Push dictionary string "Not"
           0ǝ  #  Insert it at the first position (index 0) in the list
       θ       #  Then get the last item of the list
        ¨      #  And remove the last character
               #  (either the "?" of the original input; or the "t" in "Not")
      ë        # Else:
       ”…Ü     #  Push dictionary string "Yes"
               # (after which the top of the stack is output implicitly as result)

Vea esta sugerencia mía 05AB1E (sección ¿Cómo usar el diccionario? ) Para comprender por qué ”€–”es "Not"y ”…Ües "Yes".

Kevin Cruijssen
fuente
1
20
Grimmy
@ Grimy Oh, pensamiento inteligente. ¡Gracias! :)
Kevin Cruijssen
8

Python 3 , 62 bytes

lambda s:['Yes',*s[:-1].split(','),'No'][~(','in s)*('?'in s)]

Pruébalo en línea!

La expresión se ~(','in s)*('?'in s)evalúa como 0(es decir 'Yes') si la cadena no contiene a '?', de lo contrario -1(es decir 'No') si la cadena no contiene a ',', y de lo contrario -2(es decir, la última sección de la cadena separada por comas excluyendo el último carácter).

Jitse
fuente
5

JavaScript (ES6),  53  52 bytes

s=>(m=s.match(/(,?)([^,]*)\?/))?m[1]?m[2]:'No':'Yes'

Pruébalo en línea!

Comentado

s =>                  // s = input string
  ( m = s.match(      // m is the result of matching in s:
  //     +------------>    an optional comma
  //     |     +------>    followed by a string containing no comma
  //     |     |   +-->    followed by a question mark
  //   <--><-----><>     
      /(,?)([^,]*)\?/
  )) ?                // if m is not null:
    m[1] ?            //   if the comma exists:
      m[2]            //     output the string following it
    :                 //   else:
      'No'            //     output 'No'
  :                   // else:
    'Yes'             //   output 'Yes'
Arnauld
fuente
Welp, estaba buscando una solución JS, terminó con algo doble de este tamaño.
El tipo al azar
4

Carbón , 23 22 bytes

¿№θ?¿№θ,⁻⊟⪪θ,¦?¦No¦Yes

Pruébalo en línea! El enlace es a la versión detallada del código. Editar: Guardado 1 byte gracias a @KevinCruijssen. Explicación:

¿№θ?

¿La cadena contiene algún ?s?

¿№θ,

¿Contiene alguna ,s?

⊟⪪θ,

Divide la cadena en ,sy toma la última.

⁻...?

Eliminar el ?y generar el resultado.

No

Si no hay ,s entonces salida No.

Yes

Si no hay ?s entonces salida Yes.

Neil
fuente
-1 cambiando Print(Join(Split(Pop(Split(q, ",")), "?"), w)aPrint(Minus(Pop(Split(q, ",")), "?");
Kevin Cruijssen
@KevinCruijssen Gracias, se me había olvidado que eso Minushizo eso. Además, me sentía complacido conmigo mismo por salvar dos separadores.
Neil
3

Pyth , 25 bytes

?qeQ\??}\,QPecQ\,"No""Yes

Pruébalo en línea!

?q                          # if       ==
  eQ\?                      #    Q[-1]    "?":
      ?}                    #   if     in   
        \,Q                 #      ","    Q:
             cQ\,           #     return split(Q, ",")
            e               #                         [-1] (last element)
           P                #                             [:-1] (remove the trailing ?)
                 "No"       #   else: return "No"
                     "Yes"  # else: return "Yes" (last " implicit)
ar4093
fuente
3

Zsh , 51 bytes

<<<${${${1#*\?}:+Yes}:-${${${${1##*,}%$1}:-No}%\?}}

Pruébalo en línea!

Se puede guardar un byte si ends with,?y similares no son válidos

Función Gamma
fuente
3

Retina , 32 28 bytes

^'?K`Yes
.+,(.*)\?
$1
'?K`No

-4 bytes con consejos de @Neil .

Pruébalo en línea.

Explicación:

   K`       # Replace any (implicit) input, which does
^           # NOT
 '?        '# contain a "?"
     Yes    # with "Yes"

.+          # Match 1 or more characters
  ,         # followed by a comma
    .*      # followed by zero or more characters,
   (  )     # (captured in capture group 1)
       \?   # followed by a (trailing) "?"
$1          # And replace it with just the match of capture group 1,
            # (so everything between the last comma and trailing question mark)

  K`        # Replace any remaining string, which does
'?         '# contain a "?"
    No      # with "No"

            # (after which the result is output implicitly)
Kevin Cruijssen
fuente
¿Sabías que el Kescenario de Retina 1 tiene un condicional incorporado? No lo hice Probablemente podría ahorrarle unos pocos bytes.
Neil
@Neil No estoy seguro de cómo encadenar Ky condicional &para ser completamente honesto. Sé cómo usar Kuna expresión regular para que coincida así , pero ¿cómo lo combino con el condicional para imitar un if-else ternario para el Yes/ No?
Kevin Cruijssen
No es necesario &, que es lo que me sorprendió, y puedes combinar una cadena, o mejor aún, un personaje, ya que sabes que cualquiera ?debe estar al final.
Neil
@Neil Entonces, ¿ así? Que también es de 32 bytes aparentemente.
Kevin Cruijssen
1
No exactamente; todavía estás haciendo coincidir una expresión regular, pero en su lugar se te permite una cadena o carácter.
Neil
2

Fórmula IBM / Lotus Notes, 79 bytes

@If(@Ends(i;"?");@If(@Contains(i;",");@Left(@RightBack(i;",");"?");"No");"Yes")

No hay TIO para la fórmula, así que ...

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ElPedro
fuente
2

Python 3 , 98 87 bytes

-9 bytes gracias a ElPedro

x=input();o="Yes"
if"?"==x[-1]:o=x[(x.rfind(",")+1):-1]if x.count(",")else"No"
print(o)

Pruébalo en línea!

Esto ha sido superado por otras respuestas, pero estoy probando un poco más el golf en Python. ¡Se agradece el consejo!

conecta tu cargador
fuente
1
Puede usar una impresión para evitar la asignación, luego usar una lambda ya que ahora es solo una declaración, luego acortar las ifdeclaraciones en línea a una indexación de lista y luego acortar las condiciones para usar in, luego desechar todo porque está demasiado cerca de un respuesta existente
Jo King
Un par de campos de golf sin cambiar su enfoque original para bajarlo a 87 ¡ Pruébelo en línea!
ElPedro
Puede reemplazar if x.count(",")con if~x.find(","), guardando un byte. str.findevalúa -1si no se encuentra la cadena. Si complementa esto con el operador unario, da como resultado 0si y solo si la subcadena no está presente. Alternativamente, puede reemplazarlo if","in x por 4 bytes menos.
Jitse
1

C # (compilador interactivo de Visual C #) , 72 bytes

x=>x.Last()!=63?"Yes":x.Contains(',')?x.Split(',').Last().Trim('?'):"No"

Guardado 2 bytes gracias a @someone

Pruébalo en línea!

Encarnación de la ignorancia
fuente
SkipLast(1) -> Trim('?')para -??? bytes por lo que veo (todos mis intentos de calcular la diferencia dan como resultado números diferentes)
mi pronombre es monicareinstalar el
1

Python 2 , 66 63 62 bytes

lambda i:("Yes",("No",i[i.rfind(",")+1:-1])[","in i])["?"in i]

Pruébalo en línea!

-3 después de detectar la aclaración actualizada "la entrada solo tendrá una? Y siempre será el último carácter".

-1 con agradecimiento a @ChasBrown

Básicamente un puerto de mi respuesta de Lotus Notes . Curiosamente, la aclaración mencionada anteriormente no ayuda a la respuesta de Notes porque @Endses 4 bytes más barata que @Contains. Ahora si solo hubiera una @Infunción ...

ElPedro
fuente
2
Ahorre 1 byte usando rfind.
Chas Brown
1

C ++ (gcc) , 120 118 bytes

Macro tipo función:

#include<string>
#define f(s)({int i{},j{};for(;s[i];)j=s[++i]-44?j:i;s[--i]-63?"Yes":j?std::string(s-~j,i+~j):"No";})

Pruébalo en línea!

-2 bytes gracias a @ceilingcat

Nishioka
fuente