Цель этой задачи - получить входные и выходные данные, но с обратным порядком предложений. Пример ввода:
Hello friend. What are you doing? I bet it is something I want to do too!
Пример вывода:
I bet it is something I want to do too! What are you doing? Hello friend.
Как видно из примеров, ваша программа имеет дело с вопросительными знаками, восклицательными знаками и точками. Можно предположить, что каждое предложение имеет пунктуацию и пробел перед следующим предложением. Завершающие пробелы / переводы строки в порядке, если они читабельны. Самый короткий код выигрывает.
Удачи!
РЕДАКТИРОВАТЬ: Вы можете предположить, что предложения не имеют кавычек или скобок, но если вы сделаете свой код способным справиться с обоими из них, то вы получите -5 байт Пример вывода для паренов / кавычек:
"Hello, " she said. (I didn't know what she was talking about.) --> (I didn't know what she was talking about.) "Hello, " she said.
"Hello!" she said. (I hesitated. How should I respond? This is too much!) I responded, "Hi there. How are you? What is your cat's name?" without thinking any more about it.
Ответы:
Юлия,
4542 байта - 5 бонусов = 37Это создает анонимную функцию, которая принимает строку в качестве входных данных и возвращает строку с обращенными предложениями. Это обрабатывает любой специальный символ надлежащим образом, хотя двойные кавычки и знаки доллара должны быть экранированы, иначе они не являются допустимыми строками в Julia.
Ungolfed + объяснение:
Примеры:
И если вам не нравится смотреть на экранированные кавычки в выводе:
Сэкономили 3 байта на регулярном выражении благодаря Мартину Бюттнеру! Ранее это использовали назад ' :
(?<=[.?!])
.источник
CJam,
2322 байтаЯ не уверен, имеет ли это право на бонус или нет, но здесь идет решение:
Расширение кода (немного устаревшее) :
Попробуйте онлайн здесь
источник
J,
3532Он почти обрабатывает ввод бонусов, за исключением того, что я должен избегать одиночных апострофов, так что, думаю, это не считается. (Также мое первое представление здесь)
Использование:
источник
Perl, 27/25
Или из командной строки:
источник
perl -nE 'say reverse/ |[^.?!]*.\)?/g'
, доведя общее количество до 23.PHP, 60
источник
[?!.]\K
вместо этого регулярное выражение ?Bash + coreutils, 40 байт
Это читает из STDIN, поэтому ввод может быть перенаправлен из файла или просто передан, например:
источник
(foo bar.)
меняются как единое целое?зернышко , 25 байт
После добавления пробела во входную строку мы находим все индексы
.
,?
и!
добавьте 2, и использовать^@
сплит-на операторе , чтобы разорвать строку в предложения (каждый с завершающими пробелами). Обратный список, и он автоматически печатается в конце программы. Вуаля!Пример, показывающий этапы основного вычисления с вводом
A! B? C. D!
:источник
Retina ,
61343330 байтКредиты Nutki для сокращения этого на 24 байта.
Где
<empty>
обозначает пустую строку. Предполагается, что#
это не является частью ввода, но если это не законно, я мог бы заменить его на любой другой символ, включая"
(который мне нужно было бы обработать только для бонуса) или что-то непечатное. Вы можете запустить такой код в одном файле, если вы используете-s
флаг, или вы можете поместить каждую строку в отдельный файл и передать их все в Retina.Поменять это с помощью одной замены регулярных выражений возможно, но действительно громоздко. Даже с балансировочными группами .NET мне нужно что-то около 90 байт, поэтому я попытался сделать это в несколько этапов.
В Retina каждая пара линий представляет собой одну стадию замены, где первая строка - это шаблон, а вторая - это замена.
Этот этап просто подготавливает строку для дальнейшей обработки. Это выглядит
#
как маркер. Этот маркер указывает на то, что все, что находится перед ним, уже размещено в нужном месте, и все, что после него, все еще необходимо обработать.Этот этап меняет предложения, многократно перемещая последнее предложение перед
#
(которое перемещается вперед по строке в процессе).+`
Инструктирует Retina повторить этот этап , пока выход не перестанет изменяться. В качестве примера, вот какfoo. bar! blah?
будет обрабатываться ввод :И, наконец, мы просто удаляем маркер:
источник
.+
=>$0 #
и повторить(.*?[.!?] )(.*#)
=>$2$1
?Ява, 113
источник
JavaScript (ES6) 47
45Как уже говорилось, это простое упражнение с регулярными выражениями. В JavaScript:
источник
Python 2, 62
Не собираюсь улучшать бонус, так как он, вероятно, не стоит байтовой стоимости.
источник
Matlab (93 байта)
источник
Рубин 41
В других ответах по Ruby не хватает WTF.
По крайней мере , работает в Рубине 2. Если
a
иF
переключатель работает в 1.8.7, я думаю , вы могли бы упасть$_=
, чтобы сохранить три символа.Обращает каждую строку в stdin и печатает в stdout:
источник
Рубин, 48 (42 без пут) байтов
reverse_sentence.rb
Использование:
Выход:
Критика более чем приветствуется.
источник
.join(" ")
=>*" "
к, 31
,
источник
C # - LINQPAD - 93 - 5 = 88 байт
Консольное приложение C # 189 - 5 = 184 байта
регулярное выражение беззастенчиво порется от Алекса А. :)
источник
namespace System
этомusing Linq;usingText.RegularExpressions
сохранении 2xsystem
.Clojure - 44
71символУлучшено и упрощено RE, устранены лишние пробелы.
Выходные данные представляют собой последовательность предложений в исходной строке с обратным порядком предложений:
Входные данные: «Привет, друг. Что ты делаешь? Могу поспорить, это то, что я тоже хочу сделать!» Вывод: («Могу поспорить, это то, что я тоже хочу сделать!» «Что ты делаешь?» «Привет, друг».)
источник
Руби, 47
Авторы благодарны Мартину Бюттнеру за спасение некоторых персонажей.
источник
gets
чтобы сохранить байт, распечатать его,$><<
чтобы сохранить байт (без пробела), и соединить строку с,*''
чтобы сохранить два байта.CJam, 21 байт
Это работает, превращая пробелы после
!
s,.
s и?
s в число 1 (не символ 1 и не символ с кодовой точкой 1, поэтому входные данные все еще могут содержать их), разделяя их на 1, изменяя порядок получающихся кусков и объединяя по пробелам.Попробуйте онлайн в интерпретаторе CJam .
Как это устроено
источник