Когда я писал свое эссе для Шекспира, я понял, что мне нужно сократить ссылки на цитаты до более приемлемой длины. Я ранее писал это:
(Act 1, Scene 2, Lines 345-346)
Но теперь мне сказали написать их так:
(I.ii.345-6)
Ясно, что мне нужно немного кода для игры в гольф, чтобы немного смягчить ссылки на мои цитаты Шекспира.
Задание
Напишите программу или функцию, которая при заданном вводе строки после шаблона 1 или 2 печатает или возвращает строку после шаблона 3 или 4 соответственно. Вам нужно только поддерживать Деяния 1–5 и Сцены 1–9.
Шаблоны
Шаблон 1
(Act x, Scene y, Lines a-b)
Вы можете предположить, что x
никогда не превышает 5, y
никогда не превышает 9 a
и b
всегда являются положительными целыми числами, не превышающими максимальное положительное стандартное целочисленное значение вашего языка, и a
всегда исключительно меньше b
.
Шаблон 2
(Act x, Scene y, Line a)
Те же условия, что и в Шаблоне 1, исключая информацию о b
.
Шаблон 3
(x.y.a-b)
Где x
- это заглавная римская цифра, y
это римская цифра в нижнем регистре, a
и b
это цифры, которые b
сокращаются до цифр, меньших, чем у первой отличающейся цифры равного значения a
.
Шаблон 4
(x.y.a)
Те же условия, что и в Шаблоне 3, за исключением информации о b
.
Тестовые случаи
Позвольте f(s)
быть функцией, определенной в Задаче. ""
обозначает строковое значение.
>>> f("(Act 1, Scene 2, Lines 345-346)")
"(I.ii.345-6)"
>>> f("(Act 3, Scene 4, Lines 34-349)")
"(III.iv.34-349)"
>>> f("(Act 5, Scene 9, Lines 123-234)")
"(V.ix.123-234)"
>>> f("(Act 3, Scene 4, Line 72)")
"(III.iv.72)"
>>> f("(Act 2, Scene 3, Lines 123-133)")
"(II.iii.123-33)"
>>> f("(Act 4, Scene 8, Lines 124-133)")
"(IV.viii.124-33)"
Для целей этой задачи должны поддерживаться следующие переводы с арабского на римский язык:
1 i I
2 ii II
3 iii III
4 iv IV
5 v V
6 vi (you do not have to support past 5)
7 vii
8 viii
9 ix
(Act 1, Scene 2, Lines 345-3499)
Ответы:
Язык программирования Шекспира (не конкурирующий)
Мне очень понравился этот вопрос, и поскольку был некоторый интерес к ответу на языке Шекспира, вот один.
(Его длина превышает 6000 байт.) Есть некоторые хитрости, но я не очень старался играть в гольф, потому что: (1) я уже внес свою долю в гольф в другом ответе, и (2) изменив все символы на «Page «и« шайба », или все фразы« большой большой большой большой большой кот », кажется, портят удовольствие. Вместо этого для части, которая имеет дело с римскими цифрами, я использовал символы, которые являются римлянами, и т. Д. Я использовал символы и инструкции повторно, чтобы сохранить некоторую печать. :-)
Программа должна быть в основном простой, но стоит упомянуть одну сложность: когда я писал это, я предполагал, что чтение целого числа будет работать так
scanf
: (1) потреблять только столько символов из ввода, сколько соответствует целому числу, и (2) в случае, если ошибки, оставьте переменную без изменений. (Я использовал это второе свойство, чтобы различать Шаблон 1 и 2 в Акте II, читая «Строка» и пытаясь прочитать целое число.) К сожалению, оказывается, что есть (что я считаю) ошибка в оригинальной реализации язык , где чтение целочисленных потребляет весь до конца строки и выдает ошибку , если это не удается, поэтому она нуждается в патче,libspl.c
чтобыint_input
вести себя больше какscanf
.И с этим, это работает:
Немного более высокого уровня псевдокод, из которого я работал, чтобы помочь любому, пытающемуся понять:
Отношение вышеупомянутого к окончательному коду оставлено в качестве упражнения. :-) Обратите внимание, что у ShakespearePL есть арифметика и стеки и переходы, но нет указателей (только метки), поэтому реализация «подпрограмм», таких как преобразование в роман, немного… интересна.
источник
LaTeX,
513364259226215178159 байтХорошие эссе всегда должны быть написаны на LaTeX.
При этом используется пакет xstring, поскольку встроенной обработки строк не очень много. С положительной стороны, верхний предел для встроенного
\Roman
форматирования больше, чем нам когда-либо понадобится (даже для сонетов)2^31-1
. Я включил\documentclass{ecv}
в подсчет, но ни один из тестового кода:(Если бы вы были достаточно сумасшедшими, чтобы действительно использовать это, вам, по крайней мере, пришлось бы разглаживать имена макросов. Перезапись односимвольных макросов - плохая практика)
Развернулся и прокомментировал:
Обратите внимание, что в этой версии комментарии требуются, в противном случае символ новой строки интерпретируется как пробел и расширяется до пробела.
источник
~
вместо имени макроса\s
. Но на самом деле вам вообще не нужна\s
(\stripcomma
в версии без гольфа): вы можете просто,\def\t#1 #2, #3 #4, #5 #6
и TeX позаботится об удалении запятых. (Таким образом, вы можете использовать~
трюк\t
вместо этого, сохраняя 1 байт.)~
немного неприятен, но мне здесь нравится. Это означало, что мне нужно было изменить.cls
\@roman
и\@Roman
не нужно скобок вокруг аргумента.xstring
идеи были вашими :-) Было весело играть в гольф вместе!JavaScript (ES6),
210183178177171 байтСохранение 27 байтов путем развертывания остальных параметров (благодаря ETHproductions )
Сохранено 5 байтов, если они не совпадают с открывающим пареном и не настроены для генерации римских чисел
Сохранено 1 байт путем корректировки конечного троичного выражения
Сохранено 6 байтов путем объединения двух соответствующих групп
Тестовые случаи:
источник
Act
и каждый\D*
с.*
?Желе ,
87 8685 байтПопробуйте онлайн! или посмотрите набор тестов
Как?
источник
œr
,Ṗ,Ç
,Ṗ€V
,ṪÇ$
,W
как последнее звено на хелпер ссылку, возможно , другие тоже, хорошие усилия! Это не обычное 80-летнее представление Jelly, это заслуживает особого признания среди людей Jelly.R ,
94126112166 байтИ теперь это более многословно, чем раньше :(, вернемся к дальнейшим попыткам игры в гольф. Regex для сокращения ссылки на страницу, бессовестно
украденной,позаимствованной у @FryAmTheEggman.Теперь мне действительно нужно проделать некоторую работу, чтобы вернуть байты, но теперь это работает для второго случая.
Попробуйте онлайн! - Обратите внимание, что
el
не работает на TIO и был заменен наunlist
источник
Сетчатка ,
8988 байтПопробуйте онлайн!
Сохранено 3 байта благодаря Нейлу.
Удаляет ненужные символы перед заменой первых двух чисел на блоки
i
символов. Затем он соответствует кускам этихi
s, чтобы сформировать соответствующие римские цифры. Затем мы используем заглавную первую римскую цифру. Наконец, мы сопоставляем столько цифр, сколько сможем до дефиса и после дефиса, чтобы количество цифр в числе было одинаковым. Затем мы удаляем этот префикс из второго числа.источник
iiiii
сv
,iiii
сiv
иviv
с,ix
кажется, экономит пару байтов.345-356
- я ожидал345-56
.\b
в конце последней замены, чтобы избежать необходимости повторять)
замену?\d
но, похоже, это работает, так как нет другого слова. Спасибо!PHP> = 7.1, 195 байт
Testcases
расширенный
источник
preg_match_all("#\d+#",$argn,$m);[$a,$s,$b,$e]=$m[0];
сохраняет два байта.if($e){for(;$b[$i]==$e[$i];$i++);echo"-",substr($e,$i);}echo")";
следует сохранить 46.(you do not have to support past 5)
экономит 15 байт.".$r[$s].$b"
сохраняет еще 5 байтов; и[[$a,$s,$b,$e]]=$m;
еще один. К сожалению, массивы не работают по ссылке (пока).if($e&&$e-$b){for($x=str_pad($b,strlen($e),0,0);$x[$i]==$e[$i];$i++);echo"-",substr($e,$i);}
сохраняет 10 байтов и может работать.&&$e-$b
не требуется для тестовых случаев; Таким образом, это экономит 17 байтов, а не 10. Кстати. вам все еще не нужен роман с 6 по 9.;)for(;str_pad($b,strlen($e),0,0)[$i]==$e[$i];)$i++;
наfor(;$e&&~$c=$e[-++$k];)$c>$b[-$k]&&$i=-$k;
.Perl 5, 185 + 1 = 186 байт
1 байтный штраф за требуемый
-n
флаг.Может провалиться для некоторых тестовых случаев, где сцена имеет более 10 ^ 11 строк, но AFAIK без сцен Шекспира довольно длинные;)
В читаемом виде:
источник
Рубин , 204 + 1 = 205 байт
Использует
-p
флаг.Попробуйте онлайн!
источник
Python 2,7 298 байт
источник
Perl, 99 байт
Беги с
perl -pe
. 98 байт (источник) + 1 байт (p
флаг) = 99.источник
Python 2 ,
301259252221 байтКолоссальные -31 байт благодаря Часу Брауну.
Так что, это ... очень долго ... Я думаю, что могу играть в гольф, но я какое-то время ломал голову.
Попробуйте онлайн!
Сломать
источник
b,c,d,e,f=s.groups()
вместоa,b,c,d,e,f=[s.group(n) for n in range(6)]
[0]+'i,ii,iii,iv,v,vi,vii,viii,ix'.split(',')
вместо[s,'i','ii','iii','iv','v','vi','vii','viii','ix']
.[0]+'i ii iii iv v vi vii viii ix'.split()
вместо[s,'i','ii','iii','iv','v','vi','vii','viii','ix']
.0
внутри цитаты. Один последний несовершеннолетний твик я вижу: вы используете:s,r=XXX,YYY;b,c,d,e,f=s.groups();
вы можете сохранить еще 4 байта на вместо того, чтобы то же самое , говоря:b,c,d,e,f=XXX.groups();r=YYY;
. Таким образом, вы в конечном итоге на 81 байт меньше моего представления! :)q / kdb +,
200187 байтРешение:
Примеры:
Пояснение: (немного не в гольфе)
Примечания:
Технически это может быть на 2 байта короче (без необходимости
f:
), но облегчает показ примеров таким образом.Редактирование:
string
на$:
,count
с#:
,til
с(!)
иfirst
с(*:)
, привести индексы R к строкам, поэтому нам не нужно приводить акт / сцену в целыеисточник