Répondeur à la demande

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

    Alain Colmerauer a conçu le langage de programmation logique Prolog. Son objectif était de créer un langage de programmation aussi intelligent qu'un enfant de deux ans. Afin de prouver qu'il avait atteint son objectif, il a présenté un programme Prolog qui répond «Non» avec ingéniosité pour toutes les demandes.
    Demande-moi n'importe quoi!
    ? -

  • (Bien sûr qu'il ne l'a pas fait.) Votre tâche est de créer un programme plus intelligent que le programme d'Alain Colmerauer. Cela ne doit pas nécessairement être dans Prolog.

Détails

  • Si l'entrée se termine par ?et en contient au moins un ,, renvoyez le texte du dernier ,jusqu'à l'avant-dernier ?.

  • Sinon, si l'entrée se termine par un ?retour No.

  • Sinon, revenez Yes.

Règles

  • Pas de failles standard.
  • L'entrée / sortie sera prise via nos méthodes d'entrée / sortie standard.
  • Votre programme doit prendre au moins 1 demande.
  • Vous devez sortir la requête traitée.
  • Les Yeset Nosont sensibles à la casse dans les exemples.
  • Vous êtes assuré que si l'entrée comprend un ?, l'entrée n'en aura qu'un ?et ce sera toujours le dernier caractère.
  • L'entrée sera toujours une phrase / phrase. Cette phrase / phrase ne contient jamais que les caractères ,et ?, par exemple ,, ?et ,?ne sont pas entrées valides. (Bien que les soumissions puissent l'implémenter de toute façon, puisque la phrase / phrase est une chaîne vide dans ces cas.)
  • De plus, l'entrée ne se terminera jamais avec ,?.
  • S'il y a des espaces immédiatement après le dernier ,ou juste avant le ?, ils doivent être inclus dans la sortie.

Exemples

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"

Notation

C'est le , donc la réponse la plus courte en octets l'emporte.


la source
6
Sommes-nous garantis que si l'entrée comprend un ?, il n'y en aura qu'un et ce sera toujours le dernier caractère?
Shaggy
3
Veuillez ajouter un scénario de test contenant plusieurs virgules.
manatwork
8
Accepter une réponse au début peut décourager les autres utilisateurs de publier de nouvelles réponses, car il semble que le défi soit terminé.
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.Par conséquent, ces cas de test sont inutiles.
8
Est-ce ends with ,?une entrée valide?
GammaFunction

Réponses:

6

05AB1E , 20 19 octets

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

-1 octet grâce à @Grimy .

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

'?å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)

Voir cette astuce 05AB1E (section Comment utiliser le dictionnaire? ) Pour comprendre pourquoi ”€–”est "Not"et ”…Üest "Yes".

Kevin Cruijssen
la source
1
20
Grimmy
@Grimy Oh, une pensée intelligente. Merci! :)
Kevin Cruijssen
8

Python 3 , 62 octets

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

Essayez-le en ligne!

L'expression est ~(','in s)*('?'in s)évaluée 0(ie 'Yes') si la chaîne ne contient pas a '?', else -1(ie 'No') si la chaîne ne contient pas a ',', et autrement -2(ie la dernière section séparée par des virgules de la chaîne excluant le dernier caractère).

Jitse
la source
5

JavaScript (ES6),  53  52 octets

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

Essayez-le en ligne!

Commenté

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
la source
Welp, à la recherche d'une solution JS, s'est retrouvé avec quelque chose du double de cette taille.
Le gars aléatoire
4

Fusain , 23 22 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Edit: 1 octet enregistré grâce à @KevinCruijssen. Explication:

¿№θ?

La chaîne contient-elle des ?s?

¿№θ,

Contient-il des ,s?

⊟⪪θ,

Séparez la chaîne sur ,s et prenez la dernière.

⁻...?

Supprimez le ?et affichez le résultat.

No

S'il n'y a pas de ,s, sortez No.

Yes

S'il n'y a pas de ?s, sortez Yes.

Neil
la source
-1 passage Print(Join(Split(Pop(Split(q, ",")), "?"), w)àPrint(Minus(Pop(Split(q, ",")), "?");
Kevin Cruijssen
@KevinCruijssen Merci, j'avais oublié Minuscela. D'ailleurs, je me sentais content d'avoir sauvé deux séparateurs.
Neil
3

Pyth , 25 octets

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

Essayez-le en ligne!

?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
la source
3

Zsh , 51 octets

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

Essayez-le en ligne!

Un octet peut être enregistré si ends with,?et similaires ne sont pas valides.

GammaFunction
la source
3

Rétine , 32 28 octets

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

-4 octets avec des conseils de @Neil .

Essayez-le en ligne.

Explication:

   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
la source
Saviez-vous que la Kscène de Retina 1 a un conditionnel intégré? Non. Cela pourrait probablement vous faire économiser quelques octets.
Neil
@Neil Je ne sais pas comment enchaîner le Kconditionnel &pour être complètement honnête. Je sais comment utiliser Kavec une expression régulière pour faire correspondre cela , mais comment le combiner avec le conditionnel pour imiter un if ternaire pour le Yes/ No?
Kevin Cruijssen
Vous n'avez pas besoin &, ce qui m'a surpris, et vous pouvez simplement faire correspondre une chaîne, ou mieux encore, un caractère, car vous savez que tout ?doit être à la fin.
Neil
@Neil Alors, comme ça? Ce qui fait aussi apparemment 32 octets.
Kevin Cruijssen
1
Pas assez; vous correspondez toujours sur une expression régulière, mais vous êtes autorisé à la place une chaîne ou un caractère.
Neil
2

Formule IBM / Lotus Notes, 79 octets

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

Pas de TIO pour Formula alors ...

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

ElPedro
la source
2

Python 3 , 98 87 octets

-9 octets grâce à ElPedro

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

Essayez-le en ligne!

Cela a été solidement battu par d'autres réponses, mais j'essaie un peu plus de jouer au golf en Python. Les conseils sont appréciés!

Branchez votre chargeur
la source
1
Vous pouvez utiliser une impression pour éviter l'affectation, puis utiliser un lambda car il ne s'agit plus que d'une seule instruction, puis raccourcir les ifinstructions en ligne à une liste d'indexation à la place, puis raccourcir les conditions à utiliser in, puis tout jeter car il est trop proche d' un réponse existante
Jo King
Quelques golfs sans changer votre approche originale pour descendre à 87 Essayez-le en ligne!
ElPedro
Vous pouvez remplacer if x.count(",")par if~x.find(","), en économisant un octet. str.findévalue -1si la chaîne n'est pas trouvée. Si vous complétez cela avec l'opérateur unaire, cela entraîne 0si et seulement si la sous-chaîne n'est pas présente. Alternativement, vous pouvez le remplacer if","in x par 4 octets de moins.
Jitse
1

PHP , 58 octets

<?=$argn[-1]=='?'?substr(strrchr($argn,','),1,-1)?:No:Yes;

Essayez-le en ligne!

Nuit2
la source
1

C # (Visual C # Interactive Compiler) , 72 octets

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

Sauvegardé 2 octets grâce à @someone

Essayez-le en ligne!

Incarnation de l'ignorance
la source
SkipLast(1) -> Trim('?')pour -??? octets pour autant que je vois (toutes mes tentatives pour calculer la différence résultent en différents nombres)
mon pronom est monicareinstate
1

Python 2 , 66 63 62 octets

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

Essayez-le en ligne!

-3 après avoir repéré la clarification mise à jour "l'entrée n'aura qu'un seul? Et ce sera toujours le dernier caractère."

-1 avec merci à @ChasBrown

Fondamentalement, un port de ma réponse Lotus Notes . Curieusement, la clarification notée ci-dessus n'aide pas la réponse de Notes car elle @Endsest 4 octets moins chère que @Contains. Maintenant, si seulement il y avait une @Infonction ...

ElPedro
la source
2
Économisez 1 octet en utilisant rfind.
Chas Brown
1

C ++ (gcc) , 120 118 bytes

Macro de type fonction:

#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";})

Essayez-le en ligne!

-2 octets grâce à @ceilingcat

Nishioka
la source