Задача
Из Википедии :
Рекурсивная аббревиатура - это аббревиатура, которая относится к самому себе в выражении, за которым оно стоит.
Ваша цель - проверить, является ли строка рекурсивной аббревиатурой.
- Акроним это первое слово
- Слова не чувствительны к регистру, разделены одним пробелом.
- Данная строка не содержит знаков препинания и апострофа.
- Только первая буква каждого слова может быть частью аббревиатуры.
Вы также должны дать функциональные слова . Для простоты каждое слово можно рассматривать как функциональное слово.
пример
f("RPM Package Manager") => { true, [] }
f("Wine is not an emulator") => { true, ["an"] }
f("GNU is not Unix") => { true, ["is"] }
f("Golf is not an acronym") => { false }
f("X is a valid acronym") => { true, ["is","a","valid","acronym"] }
Вы можете дать полную программу или функцию.
Входная строка может быть взята из STDIN или в качестве аргумента функции.
Выходной результат может быть true / false, 0/1, yes / no ...
Список функциональных слов (любой формат списка допустим) должен быть задан тогда и только тогда, когда это рекурсивная аббревиатура (даже если список пуст) , Вам не нужно сохранять заглавные буквы функциональных слов.
Критерии победы
Это код-гольф , самый короткий код выигрывает.
Ответы:
GolfScript,
5150 символовЭто, вероятно, можно играть в гольф дальше. Принимает участие в STDIN. Логическое значение равно 0/1.
Тест онлайн
Объяснение:
источник
Regex, .NET аромат, 62 байта
Вы можете проверить это здесь . Если ввод является рекурсивной аббревиатурой, это приведет к совпадению, и группа захвата
w
будет содержать все функциональные слова. Если это не так, то совпадения не будет.это делает сохранить капитализацию функции слов (но соответствует регистронезависимо).
К сожалению, тестер не отображает весь стек именованной группы захвата, но если вы использовали его где-нибудь в .NET,
w
группа будет содержать все функциональные слова по порядку.Вот фрагмент кода C #, чтобы доказать это:
Вот краткое объяснение. Я использую балансирующие группы .NET для построения стека букв аббревиатуры в именованной группе
c
с этим фрагментомХитрость в том, что мне нужна вторая буква вверху стека и последняя внизу. Таким образом, я помещаю все это в вид сзади, который соответствует позиции после аббревиатуры. Это помогает, потому что .NET совпадает со взглядами справа налево, поэтому сначала встречается последняя буква.
Получив этот стек, я сопоставляю остальную часть строки слово в слово. Либо слово начинается с буквы в верхней части стека акронимов. В этом случае я выталкиваю это письмо из стека:
В противном случае, я все равно сопоставляю слово и помещаю его в
w
стек, который будет содержать все служебные слова:В конце я
$
проверяю, достиг ли я конца строки, а также проверяю, что я использовал все буквы от аббревиатуры, проверяя, что стек пуст:Проверьте это на ideone.
источник
Python (158, без регулярных выражений)
Дело не в том, что я не люблю регулярные выражения. Это то, что я их не знаю.
О, у меня также была версия без гольфа:
источник
Python 2.7 -
131126 байтСоставляет список букв в первом слове аббревиатуры. Затем для каждого слова в полной строке избавьтесь от первого элемента этого списка, который мы создали, если он совпадает с первой буквой этого слова. В противном случае добавьте это слово в список служебных слов. Для вывода верните
not a
(в python любой список, кроме пустого списка, равенTrue
-y, а список пуст, если это рекурсивная аббревиатура) и список ifnot a
.Спасибо @ace за помощь в исправлении ошибки / сохранении некоторых байтов.
источник
SyntaxError: invalid syntax
в концеreturn
строки.for w in s:f+=0*a.pop(0)if a and w[0]==a[0]else[w]
который короче и не зависит от вкладок. Что касаетсяreturn
заявления, я нашел,0if a else(1,f)
который короче, чем ваш оригинал.Python - 154 символа
Первая в истории попытка игры в гольф. Я думаю, что Python не лучший язык для него, учитывая все длинные ключевые слова. Кроме того, я не думаю, что эта функция надежна. Это работает для ввода ОП, но я уверен, что могу придумать исключения.
источник
ECMAScript 6 (105 байт):
Введите функцию в консоль браузера Firefox, а затем просто вызовите функцию, например так:
источник
The function words list ... must be given if and only if this is a recursive acronym
. Это предупредит их независимо.Haskell - 287 байт
Не самая короткая запись (эй, это Haskell, что ты ожидал?), Но все же очень интересно писать.
Протестировано с
Ожидаемый результат
Ungolfed
источник
JavaScript (ECMAScript 6) - 97 символов
тесты:
источник
Реболь - 133
Ungolfed:
Протестировано с:
Выход:
источник
Юлия - 116 байт
Меньше гольфа
Значение
0
on в конце выводит 0. В противном случае выводится массив, содержащий1
слова функций. Например:источник
Брахилог , 29 байт
Попробуйте онлайн!
Выводит функциональные слова через выходную переменную, если вход является рекурсивной аббревиатурой, и завершается ошибкой, если это не так.
Без необходимости выводить слова функций (рассматривая это как чисто решающую проблему ), получается всего 12 байтов, потому что
∧Zt
может быть отброшено для -3,Y
может быть заменено.
на -1 и, что наиболее важно,;0zpᵐz{ċ₂ˢ}ᵐZh
может быть заменено⊇
на колоссальныеḷṇ₁Xh.∧X⊇hᵐc
источник
Кобра - 187
источник
Рубин - 173
Могло быть лучше...
Вызов функции:
Выход :
источник
Ява - 195
К сожалению, Java не имеет встроенной поддержки кортежей.
Итак, это класс, который хранит логическое значение в «b» и список функциональных слов в «x».
Здесь функция является конструктором класса.
Тест
источник
string[]
:null
просто означает false, пустой означает true, аn
elements означает true сn
функциональными словами.Awk - 145
Тест:
источник
Coffeescript - 144
Назовите это, например:
z "GNU is not Unix"
Скомпилированный JS:
Он разбивает строку на слова, а затем перебирает каждое слово. Если первый символ слова не соответствует следующему в аббревиатуре, слово сохраняется. Счетчик (
g
) используется для отслеживания количества пропущенных слов. Если количество пропущенных слов плюс длина аббревиатуры совпадает с длиной фразы, она совпадает, поэтому верните 1 и пропущенные слова. Если нет, то это было недействительно, поэтому верните 0.источник
C # - 234
источник
Python (108)
источник