Ответчик

12
  • Оригинал: https://james-iry.blogspot.co.at/2009/05/brief-incomplete-and-mostly-wrong.html

    Ален Кольмерауэр разработал язык логического программирования Prolog. Его целью было создать такой же интеллектуальный язык программирования, как у двухлетнего ребенка. Чтобы доказать, что он достиг своей цели, он представил программу Prolog, которая на все вопросы ответит «Нет».
    Спрашивай о чем угодно!
    ? -

  • (Конечно, он этого не сделал.) Ваша задача - создать программу, которая будет более умной, чем программа Алена Кольмерауэра. Это не должно быть в Прологе.

конкретика

  • Если ввод заканчивается ?и имеет хотя бы один ,, вернуть текст от последнего ,до последнего ?.

  • Иначе, если ввод заканчивается ?возвратом No.

  • Остальное, вернись Yes.

правила

  • Нет стандартных лазеек.
  • Ввод / вывод будет осуществляться через наши стандартные методы ввода / вывода.
  • Ваша программа должна принять как минимум 1 запрос.
  • Вы должны вывести обработанный запрос.
  • В Yesи No«ы чувствительны к регистру в примерах.
  • Вам гарантировано, что если вход включает в себя ?, вход будет иметь только один, ?и он всегда будет последним символом.
  • На входе всегда будет фраза / предложение. Эта фраза / предложение никогда не будет содержать только символы ,и ?, например ,, ?и ,?не являются допустимыми входами. (Хотя представления могут реализовать это в любом случае, поскольку фраза / предложение в этих случаях является пустой строкой.)
  • Кроме того, ввод никогда не закончится ,?.
  • Если есть пробелы сразу после последнего ,или непосредственно перед ?, они должны быть включены в вывод.

Примеры

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"

счет

Это , поэтому выигрывает самый короткий ответ в байтах.


источник
6
Гарантируем ли мы, что если вход включает в себя ?, будет только один, и он всегда будет последним символом?
Лохматый
3
Пожалуйста, добавьте тестовый набор, содержащий несколько запятых.
manatwork
8
Принятие ответа на ранней стадии может отговорить других пользователей публиковать новые ответы, поскольку похоже, что задача выполнена.
Арно
3
You are guaranteed that if the input includes a ?, the input will only have one ? and it will always be the last character.Поэтому эти контрольные примеры не являются обязательными.
8
Является ends with ,?действительным вход?
GammaFunction

Ответы:

6

05AB1E , 20 19 байтов

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

-1 байт благодаря @Grimy .

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

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

Посмотрите эту подсказку 05AB1E (раздел Как использовать словарь? ), Чтобы понять, почему ”€–”есть "Not"и ”…Üесть "Yes".

Кевин Круйссен
источник
1
20
Grimmy
@ Грими О, умное мышление. Благодаря! :)
Кевин Круйссен
8

Python 3 , 62 байта

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

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

Выражение ~(','in s)*('?'in s)вычисляется как 0(т.е. 'Yes'), если строка не содержит a '?', иначе -1(т.е. 'No'), если строка не содержит a ',', и иначе -2(т. Е. Последний разделенный запятыми раздел строки, исключая последний символ).

Jitse
источник
5

JavaScript (ES6),  53  52 байта

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

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

комментарии

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
источник
Уэлп, который искал решение JS, в итоге получил что-то в два раза больше этого размера.
Случайный парень
4

Древесный уголь , 23 22 байта

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

Попробуйте онлайн! Ссылка на подробную версию кода. Редактировать: 1 байт сохранен благодаря @KevinCruijssen. Объяснение:

¿№θ?

Строка содержит какие-либо ?s?

¿№θ,

Содержит ли он какие-либо ,s?

⊟⪪θ,

Разбейте строку на ,s и возьмите последнюю.

⁻...?

Удалите ?и выведите результат.

No

Если нет ,s, то выведите No.

Yes

Если нет ?s, то выведите Yes.

Нил
источник
-1 меняется Print(Join(Split(Pop(Split(q, ",")), "?"), w)наPrint(Minus(Pop(Split(q, ",")), "?");
Кевин Круйссен
@KevinCruijssen Спасибо, я забыл, что Minusсделал это. Кроме того, я был доволен собой за то, что сохранил два сепаратора.
Нейл
3

Pyth , 25 байт

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

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

?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
источник
3

Сетчатка , 32 28 байт

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

-4 байта с подсказками от @Neil .

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

Объяснение:

   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)
Кевин Круйссен
источник
Знаете ли вы, что Kсцена Retina 1 имеет встроенный условный? Я не Это может сэкономить вам несколько байтов.
Нил
@Neil Я не уверен, как связать Kи условно &быть полностью честным. Я знаю, как использовать Kс регулярным выражением для сопоставления, как это , но как мне объединить его с условным, чтобы имитировать троичный if-else для Yes/ No?
Кевин Круйссен
Вам не нужно &, что меня удивило, и вы можете просто сопоставить строку, или, что еще лучше, символ, поскольку вы знаете, что любой ?должен быть в конце.
Нил
@Neil Так, вот так? Что, по-видимому, тоже 32 байта.
Кевин Круйссен
1
Не совсем; вы по-прежнему соответствуете регулярному выражению, но вместо этого вы можете использовать строку или символ.
Нил
2

IBM / Lotus Notes Formula, 79 байтов

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

Нет TIO для Формулы, так что ...

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

ElPedro
источник
2

Python 3 , 98 87 байт

-9 байт благодаря ElPedro

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

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

Это было побито другими ответами, но я пробую играть в гольф на Python немного больше. Совет ценится!

connectyourcharger
источник
1
Вы можете использовать один шрифт , чтобы избежать назначения, а затем использовать лямбда , так что теперь только один оператор, а затем сократить инлайн ifзаявления в индексации списка вместо , а затем сократить условия для использования in, а затем выбросить все это , потому что это слишком близко к существующий ответ
Джо Кинг,
Пара гольфов без изменения вашего первоначального подхода, чтобы довести его до 87 Попробуйте онлайн!
ElPedro
Вы можете заменить if x.count(",")на if~x.find(","), сохранив один байт. str.findоценивает, -1если строка не найдена. Если вы дополните это унарным оператором, это приведет к тому, 0если и только если подстрока отсутствует. Кроме того, вы можете заменить его if","in x на 4 байта меньше.
Джитс
1

C # (интерактивный компилятор Visual C #) , 72 байта

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

Сохранено 2 байта благодаря @someone

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

Воплощение невежества
источник
SkipLast(1) -> Trim('?')за -??? насколько я вижу (все мои попытки вычислить разницу приводят к разным числам)
мое местоимение monicareinstate
1

Python 2 , 66 63 62 байта

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

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

-3 после обнаружения обновленного уточнения «у ввода будет только один? И он всегда будет последним символом».

-1 благодаря @ChasBrown

В основном порт моего ответа Lotus Notes . Любопытно, что указанное выше пояснение не помогает ответу Примечания, потому что @Endsэто на 4 байта дешевле, чем @Contains. Теперь, если бы только была @Inфункция ...

ElPedro
источник
2
Сохранить 1 байт с помощью rfind.
Час Браун
1

C ++ (gcc) , 120 118 байт

Функциональный макрос:

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

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

-2 байта благодаря @ceilingcat

Нисиока
источник