Каковы некоторые умные (краткие и идиоматические) подходы к получению списка строк и возвращению единственной правильно пунктуированной строки, построенной из списка, с каждым элементом в кавычках.
Это пришло мне в голову при экспериментировании с Groovy , для которого мое слишком буквальное, но иллюстративное решение
def temp = things.collect({"\'${it}\'"})
switch (things.size()) {
case 1:
result = temp[0]
break
case 2:
result = temp.join(" and ")
break
default:
result = temp.take(temp.size()-1).join(", ") + ", and " + temp[-1]
break
}
То есть, ['1']
должен уступить '1'
, ['1','2']
должен уступить '1 and 2'
, [посмотрите, что я там сделал?] И ['1','2','3']
должен уступить '1, 2, and 3'
.
У меня есть несколько хороших ответов на Groovy, но я бы хотел посмотреть, что могут делать другие языки.
Каковы некоторые компактные умные подходы на разных языках, которые используют преимущества и особенности этих языков?
['we invited the stripper','JFK','Stalin']
Ответы:
CSS,
132116115 байтПоказать фрагмент кода
CSS не часто встречается в гольф-коде, потому что он может только форматировать текст, но на самом деле он работает для этой задачи, и я подумал, что это будет интересно. Посмотрите его в действии, используя приведенный выше фрагмент (нажмите «Показать фрагмент кода»).
Список должен быть в связанном HTML-файле, где каждый элемент окружен
<a>
тегами и разделен переносами строк. Элементы списка должны быть единственными элементами в их родительском элементе, напримеробъяснение
Давайте рассмотрим вышедшую из строя версию выше. Если вы не знакомы с тем, как работает CSS, все, что находится вне фигурных скобок, является селектором, который определяет набор элементов HTML, к которым применяются объявления внутри фигурных скобок. Каждая пара объявление-селектор называется правилом . (Это более сложно, но этого будет достаточно для этого объяснения.) Перед применением какого-либо стиля, список кажется разделенным только пробелами.
Мы хотим добавлять запятые после каждого слова, кроме последнего, за исключением списков из двух слов, которые не имеют запятых. Первый селектор,
a:not(:last-child):nth-child(n+2):after
выбирает все элементы, кроме первого и последнего.:nth-child(n+2)
это более короткий способ сказать:not(:first-child)
, и он в основном работает, выбирая элементы, индекс которых (начиная с 1) больше или равен 2. (Да, это все еще немного смущает меня. Документы MDN могут помочь.)Теперь нам просто нужно выбрать первый элемент, чтобы получить запятую, если всего три или более элементов.
a:nth-last-child(n+3):after
работает как:nth-child
, но с обратной стороны, поэтому он выбирает все элементы, кроме двух последних. Запятая принимает объединение двух наборов, и мы используем:after
псевдоэлемент для добавленияcontent
сразу после каждого выбранного элемента.Второе правило проще. Нам нужно добавить «и» перед последним элементом в списке, если это не единственный элемент. Другими словами, нам нужно выбрать последний элемент, которому предшествует другой элемент.
+
это соседний селектор в CSS.источник
<li>
.<li>
было бы идеально, но это добавило бы два дополнительных символа к селекторам. Я выбрал,<a>
потому что это одна буква и не применяет свое собственное форматирование.Haskell:
81, 7774 символаОсобенности Haskell: сопоставление с образцом
источник
f[x,y,z]
f["a","b","c"]
должно быть,"a, b, and c"
но это так"a,b and c"
y++", and "++z
наf[y++",",z]
:)Рубин, 47 байтов
объяснение
$*
).$*
есть третий элемент ($*[2]
не возвращает ноль), возьмите все элементы минус последний и превратите их в разделенную запятыми строку, используяArray#*
. Наконец добавьте дополнительную запятую, строку" and "
и последний аргумент командной строки.$*
нет третьего элемента, были заданы два, один или нулевой аргумент. Аргументы могут безопасно соединяться со строкой" and "
и давать правильный результат.источник
Python 2 (61)
Основной трюк состоит в том, чтобы отрезать часть окончательного столяра
", and "
для одного и двух элементов. Для одного все это вырезано, а для двух запятая удалена. Это делается путем нарезки[8-7*len(s):]
(отмечая, чтоs
это на один короче послеpop
).К сожалению,
d
нельзя просто заменить его выражением, иначеpop
это произойдет слишком поздно.источник
s
сs=input()
и удалить первую строку, если я не ошибаюсь. Сохраняет 2 символа.s
несколько раз.CSS,
62 символа112 символовВдохновлен другими записями, даже короче. Обратите внимание, что требуется, чтобы элементы A не были разделены пробелами:
http://jsfiddle.net/olvlvl/1Ls79ocb/
Исправьте для «один и два», как указано Деннисом:
http://jsfiddle.net/olvlvl/1Ls79ocb/3/
источник
Perl (v 5.10+) -
37353428чтобы работать с
perl -ape
, с список прилагается пространство , отделенное отSTDIN
.Выход для различных входов:
источник
s/(\S+)$/and $1/
$
anchor in your edit, so an input offoo bar baz
becomesfoo, and bar, baz
. Also, you can remove one of the spaces by doings/( \S+)$/ and$1/
$#F>1
as@F>2
to shave off one more. Sorry for all the suggestions for micro improvements, I just really like this answer :)echo -n ... | wc -c)
. If you miss the space before(\S+)
you'd get to 33 characters, but if you put intest this
you will gettest and this
(two spaces aftertest
), so without more I think that's wrong.Javascript (63)
l=a.length;l>2&&(a[l-1]='and '+a[l-1]);a.join(l>2?', ':' and ')
случаи:
a = [1]
=>1
a = [1, 2]
=>1 and 2
a = [1, 2, 3]
=>1, 2, and 3
Предостережение: это изменит последний элемент в массиве с длиной> 2.
источник
&&
GNU sed - 69 chars including 1 for
-r
flagTakes a space-separated list (fairly idiomatic for shell scripts).
Example
источник
1 and 2
instead of1, 2
Python 2 -
71, 7068Character count including both,
input
andprint
.источник
Ruby, 57 bytes
I'm joining the string with
,
and then I'm replacing the last comma in the string with anand
(and optional comma depending on list length).источник
Cobra - 60
Cobra's
List<of T>.join
function lets you specify a different separator for the final two elements of the list, which is what makes this so short.источник
Perl - 59
Joins the list with commas, then if the list has more than one element, either adds
' and'
after the last comma (if length >= 3), or replaces the last comma with it (if length == 2).источник
PHP,
192167146136 characters:Based on a function I wrote years ago at http://www.christopherbloom.com/2011/05/21/join-implode-an-array-of-string-values-with-formatting/
источник
Batch - 151 Bytes
Note; you have to call the script from
cmd
with the/v
switch set ason
, this is so I don't have to include the lengthysetLocal enableDelayedExpansion
in the script. Otherwise add 30 to the byte count, and call the script normally.источник
Groovy,
47 4357 characters , JavaScript ES6 56 charactersGroovy:
Since the array is filled with characters, we can replace
a.size>1
bya[1]
JavaScript, ES6:
Both cases assume that variable a has the array in question.
источник
PHP,
8684 charsПосле инициализации массива мы начинаем считать:
Prettified:
Последний элемент в списке изменен. Это должно быть хорошо, потому что в PHP, присваивание массивов и вызовы функций выполняют копии.
источник
CJam,
35302827 байтЭто программа, которая читает из STDIN и печатает в STDOUT. Попробуйте онлайн.
Как это работает
Пример запуска
источник
Google Sheets,
67686792 байтаВвод начинается с ячейки
A1
и продолжается до тех пор, пока существует много записей.JOIN
объединяет их все в строку с запятой между ними.FILTER
удаляет все пустые поля, чтобы в конце не было бесконечных запятых.SUBSTITUTE
заменяет последнюю запятую (найденаCOUNTA
подсчета непустых вводов).Это не очень интересно, но выполнимо в одной клетке.
источник
)
этой формулы на -1 байт;A:A>""
должны быть преобразованы в,A:A<>""
и это не реализует опущение оксфордской запятой в случаях только 2 объектов>""
. Поправка, сделанная мной ранее, явно не проверялась. Мне не нравится направление, которое пошло ...JavaScript (ES6) 60
Предполагая, что во входном массиве нет пустых строк
Тест In FireFox / Консоль Firebug
Выход
источник
node --harmony
с массивом строкvar a = 'abcdefgh'.split('');
, но он просто сидит там с...
и, кажется, ничего не делает. Также +1 за использование уникальной функции ES6()=>
.f=(a,b=a.pop())=>a[0]?a.join(', ')+', and '+b:b
это также правильно и на 13 байт короче.JavaScript -
6056716763Не совсем идиоматический подход, но мне было весело писать его, и я люблю регулярные выражения.
Предполагая, что массив хранится в
var a
:Сокращается простой проверкой индекса
[2]
: (yay логическое приведение)Видимо, я отстой на тестировании и пропустил однократный тест. Вот исправленная версия:
Скинул 2 символа, перевернув мои логические значения, и еще 3, переместив пространство из конкатенации в тогда / еще первую тройную:
Спасибо @tomsmeding за напоминание о том, что мне не нужно приводить мои логические значения, потому что JS делает это для меня. Я также понял, что забыл удалить скобки, отделяющие первую троичную от конкатенации внутри
join()
:Я правильно сделал? Обязательные новые извинения гольфиста.
источник
!!
вообще;a[2]?A:B
работает уже. Возможно , придется перевернуть ваши булевы снова .a[i]
равно true . Ну, почти. Я предполагаю, что если вы получите 2 входа, ваш массив имеет длину два. Тогдаa[2]===undefined
иundefined
оцениваюfalse
. РЕДАКТИРОВАТЬ: ваше редактирование - то, что я имел в виду :)Golfscript -
31393430Привет, мир! Я долгое время скрывался, впервые пишу. Вот мое 30-байтовое решение в Golfscript (учитывая, что массив, такой как [1 2 3], уже находится в стеке).
Результаты подходят для всех тестовых случаев.
РЕДАКТИРОВАТЬ: Возьми это, CJam!
источник
Xojo,
527183 символовОбратите внимание, что UBound на единицу меньше длины массива.
источник
Excel VBA, 108 байт
Функция анонимного непосредственного окна VBE, которая принимает входные данные в виде массива с разделителями-пробелами из диапазона
A1
и выводит их в непосредственное окно VBE.источник
Ракетка 87
источник
Python 62 символа
Предполагая, что я список строк:
источник
C # 102 Чарс
источник
Юлия (53)
Принимает аргументы из STDIN и выводит в STDOUT
Решение с использованием Base.join (items, delim [, last])
Редактировать:
Контрольные примеры
1
1 и 2
1, 2 и 3
источник
1, 2, and 3
, нет1, 2 and 3
.Рэнт (108)
Ungolfed:
Использование:
Попробуйте онлайн
источник
Пиф, 28
Примеры:
источник
TypeError: can only concatenate list (not "str") to list
). Работает нормально с последней версией.PHP - 72
Настройте вход:
И тогда процесс:
источник