Задача состоит в том, чтобы проанализировать строку, как это делает Python, и распечатать ее содержимое.
- Входные данные (аргумент командной строки или стандартный ввод) : строковый литерал (например,
"hello"
) (или несколько литералов, см. Конкатенацию строкового литерала ниже) - Выход (stdout) : содержимое строки (например
hello
)
Правила разбора строки:
- Строковый литерал заключен в соответствующие пары одинарных кавычек (
'a'
), двойных кавычек ("a"
), тройных одинарных кавычек ('''a'''
) или тройных двойных кавычек ("""a"""
). Первое повторение типа кавычек, открывших строку, завершает строку. - Обратная косая черта уходит:
\'
внутри строки становится'
,\"
становится"
и\\
становится\
. Вам не нужно реализовывать любые другие обратные слэши. Обратная косая черта, которая не является частью escape-последовательности, остается обратной косой чертой. - Конкатенация строковых литералов: Содержимое смежных строковых литералов объединяется. Например,
"hello" 'world'
становитсяhelloworld
. - Входные данные могут содержать пробелы, которые не являются частью какого-либо литерала.
- Вам не нужно поддерживать какие-либо другие виды пробелов, ни внутри, ни за пределами литералов.
Дополнительные правила:
eval
,exec
И подобные вещи не допускаются для разбора буквальных или его части.- Вы можете предположить, что ввод действителен.
- Вы можете принять максимальную длину ввода 1023 символа.
Примеры:
"hello" ' world'
->hello world
"""\"""'\\\A"""
->"""'\\A
( '''"""'''"""'''""" )
(без скобок, но с пробелами) ->"""'''
Самый короткий код выигрывает.
Ответы:
Perl, 54 символа
Так же, как я публиковал это, я заметил, что это почти идентично решению Ruby от Jan Dvorak. Я немного расстроен тем, насколько это похоже на самом деле, но я собираюсь сказать: «Великие умы думают одинаково», и на этом все и закончится.
Эта программа подчеркивает странный случай в углу при подсчете символов в сценариях Perl. Насколько я понимаю, наличие одинарных кавычек в сценарии означает, что мне нужно посчитать
-p
опцию как два символа по отношению к общему количеству. Как правило, при вычислении размеров сценариев Perl начальный символ тире в опциях считается свободным, при условии, что он может быть связан с знаком,-e
который вводит саму программу ... но тогда вам также придется учитывать любые дополнительные побеги вам нужно ввести скрипт в командной строке. Одинарные кавычки требуют большого количества экранирования, поэтому, чтобы избежать этого штрафа, я должен считать его скриптом, запускаемым из файла, и поэтому получаю#!/usr/bin/perl
бесплатно, но не любые дополнительные символы. Это немного сбивает с толку.источник
(('|")\2{2}?)
такой же длины как("""|'''|"|')
C, 178 символов
Это одно из тех решений C, где все делается внутри цепочки троичных операторов.
Программа работает, копируя символы обратно в тот же буфер, перезаписывая метасимволы.
d
содержит разделитель внутри строки иt
имеет значение true, если разделитель представляет собой тройную кавычку.источник
'foo\\'
ссылается на строку foo \, за которой следует символ, который не является ни пробелом, ни разделителем строк.Рубин,
7473 персонажаЯдром здесь являются два регулярных выражения: первое определяет границы строк и выбирает только содержимое. Изменения есть, чтобы удалить все, что не внутри строк, и это также сбрасывает открытые строки.
Обратные слеши считаются необязательными, за которыми следует что угодно. Таким образом,Так как механизм регулярных выражений не будет возвращаться(\\?.)
для правильных входных данных (спасибо @breadbox), единственная обратная косая черта не может соответствовать там. Кавычки обрабатываются через ленивое повторение. Затем второе регулярное выражение удаляет обратную косую черту перед каждым доступным символом. Регулярное выражение зависит от двигателя, который всегда выбирает самую левую альтернативу первой.Я также рассмотрел подход конечного автомата, но он оказался довольно большим (19 состояний x 4 класса символов) по сравнению с решением регулярных выражений. Я все еще могу опубликовать состояние машины, если кто-то заинтересован.
источник
'foo\\'
является первой строкой иbar'
находится вне контекста строки, когда ввод'foo\\'bar'