Расшифровать невротических лягушек
Теперь, когда Puzzling.SE наконец-то взломал мой одержимый амфибиями шифр , давайте напишем программу или функцию для его расшифровки!
(Если вы хотите посмотреть на головоломку, прежде чем ее испортить, нажмите на ссылку выше).
Как работает шифр
В Neurotic Лягушках О ught К Rel х В М уд ванны ( «Невротические Лягушки» для краткости), каждая буква шифруется в виде одного или двух слов:
- Длина не выделенного курсивом слова представляет букву.
neurotic
=> 8 букв =>H
frogs
=> 5 букв =>E
perpendicular
=> 13 букв =M
- Слово, содержащее курсив, изменяет следующее слово, добавляя 10, если выделенное курсивом слово было нечетным по длине, или 20, если выделенное курсивом слово было четным по длине. Любое или все слово может быть выделено курсивом. Слово, выделенное курсивом, всегда сопровождается словом, не выделенным курсивом.
*o*ught to
=> нечетно, 2 => 12 =>L
lo*u*nging calms
=> четный, 5 => 25 =>Y
Каждое слово открытого текста соответствует предложению зашифрованного текста, а каждое предложение открытого текста соответствует абзацу зашифрованного текста.
Формат ввода
Ваша программа или функция должна ввести сообщение в Neurotic Frogs, отформатированное в Markdown. Ввод будет состоять только из печатных ASCII и новых строк.
- Слова - это наборы символов, которые соответствуют регулярному выражению
[A-Za-z0-9']
.- Числа и буквы оба учитывают длину слова.
QB64
представляетD
. - ПРИМЕЧАНИЕ. Апострофы не учитываются при расчете длины слова.
Isn't
представляетD
, а неE
.
- Числа и буквы оба учитывают длину слова.
- Выделенные курсивом буквы заключены в пару звездочек (
*letters*
).- Одна или несколько последовательных букв могут быть выделены курсивом, вплоть до целого слова (
masseus*es*
,*all*
); несколько непоследовательных букв в слове также могут быть выделены курсивом (g*e*n*e*rates
). - Курсив никогда не охватывает несколько слов, никогда не включает пунктуацию и никогда не включает апострофы.
- Непарные звездочки и несколько соседних звездочек никогда не появятся.
- Одна или несколько последовательных букв могут быть выделены курсивом, вплоть до целого слова (
- Пунктуация является любой из следующих символов:
.,?!:;-()"
.- Слова в предложении разделены одним или несколькими знаками препинания и / или одним пробелом. Примеры:
*all* welcomed
,toad*s*, newts
,Ever*y*one--frogs
,cap... bliss
,they're (I
- Предложения заканчиваются одним или несколькими знаками препинания и разделяются двойным пробелом:
Th*e* Montgomery A*m*phibian Salon! Come luxuriate today!
- Абзацы разделены одной новой строкой. (Последнее предложение абзаца по-прежнему имеет один или несколько знаков препинания в конце.)
- Слова в предложении разделены одним или несколькими знаками препинания и / или одним пробелом. Примеры:
Другие символы не будут отображаться при вводе и не должны обрабатываться.
Ваш код может, по вашему усмотрению, ожидать, что ввод будет иметь один завершающий перевод строки.
Выходной формат
Результатом расшифровки ввода будет одно или несколько предложений. Буквы открытого текста могут быть любой комбинацией прописных и строчных букв. Слова в предложении должны быть разделены пробелами. Предложения должны заканчиваться точкой ( .
) и разделяться одним пробелом. Вы можете вывести завершающий пробел после последнего предложения. Все ваши выходные данные будут в одной строке, но вы можете вывести завершающий символ новой строки.
Разные детали
Ваш код может использовать любой из стандартных методов ввода и вывода. Он должен получать входные данные в виде многострочной строки, а не списка или другой структуры данных, и он должен выводить строку.
Самый короткий код в байтах побеждает!
Контрольные примеры
-->
Neurotic Frogs *O*ught To Rel*a*x In *M*ud Baths!
<--
HELLO.
-->
Business standards all*o*w only *adult* amphibians.
<--
HINT.
-->
Rejoice, *a*ll frogs an*d* toads also! Montgomery Sal*o*n opens up! Ha*pp*y throng fill*s* street ecstatically!
<--
GOOD JOB PPL.
-->
I like 3.1415926535897.
IM*O*, it's a *b*la*st*, yeah!
<--
ADAM. MAN.
-->
*I*, happily, *th*anks 2 u *e*ditin*g* specific wor*ding*--clarifying a *bit*--betterment :D!
<--
QUARTATA.
-->
Perpendicular l*ou*nging calms. *A* frog, a m*u*d cap... bliss! Wallowing g*e*n*e*rates happiness. Amphibian sp*a* isn't expensive--seventy d*o*llars--cheap! That'*s* not *a* large e*x*pens*e* from an*y* discerning fr*o*g's money, unlik*e* Super 8.
Ever*y*one--frogs, toad*s*, newts, *a*nd salamanders! G*e*t a wonderful shiat*s*u, or recei*v*e an other kind. Masseus*es* are her*e* today! Invite a fianc*e*e, supervisor, roommate, niece: *all* welcomed!
Y*o*u simply ne*v*er believed these p*o*ssibilitie*s*; they're (I *swear*) absolute truth! Th*e* Montgomery A*m*phibian Salon! Come luxuriate today!
<--
MY NAME IS INIGO MONTOYA. YOU KILLED MY FATHER. PREPARE TO DIE.
источник
Ответы:
Perl, 72 байта
Считая Шебанг как единое, ввод берется из стандартного ввода.
Образец использования
источник
JavaScript (ES6),
172169157150 байтСохранено 10 байтов благодаря @Neil
Возможно, может быть улучшено. Выходы все строчные.
источник
i=0
вtoString
.x=>x.replace(/([\w*']+)[^\w\n*' ]* ?( ?)/g,(_,y,z)=>/\*/.test(y,l=y.replace(/'/g ,"").length)?(i=l%2||2,""):l+i*10+9).toString(36,i=0)+z,i=0).replace(/\n|$/g,". ")
.replace
и просто.match
сохранив еще 12 байтов.Python 2,
238221218214207205 байтИспользует много регулярных выражений для обработки. Мы трансформируем двойное пространство
~
и используем его для его обработки.~
и\n
обрабатываются специально.Наибольший выигрыш символа происходит от предварительной обработки ввода в
for
строке; это определенно может быть дальше в гольфе.Идео это! (все тестовые случаи)
Сохранено 7 байтов благодаря DLosc!
источник
Пип ,
6564 байтаОценка составляет 62 байта кода + 2 для
-rs
флагов.Попробуйте онлайн!
объяснение
-r
Флаг читает все строки стандартного ввода и сохраняет их список вg
.-s
Флаг устанавливает формат вывода списков в пространстве-отделенной.Самый простой способ прочитать этот код извне:
источник
Python 2,7,
390342341339335 байт:Принимает ввод в формате:
F('''Multi or Single-lined String''')
Можно играть в гольф намного больше, что я буду делать всякий раз, когда у меня будет такая возможность.
Repl.it со всеми тестовыми примерами!
Объяснение:
Использует огромные возможности встроенных регулярных выражений Python для расшифровки ввода. Это фундаментальный процесс, через который проходит функция для каждого входа:
Во-первых, все
--
заменяются одним пробелом, и каждый апостроф удаляется. Затем все слова, содержащие выделенные курсивом компоненты и идущее за ним слово, сопоставляются в одной строке и заменяются10 + len(second word)
числом последовательныхa
s, если длина первого слова равнаodd
, и20 + len(second word)
последовательнымиa
s в противном случае. Это использует следующее регулярное выражение:[^\w\s*]*\w*\*\w+\*.*?(?=\s) \w+
Например, если у нас есть предложение
Perpendicular l*ou*nging calms.
,l*ou*nging calms
будет заменено наaaaaaaaaaaaaaaaaaaaaaaaaa
, или 25a
с, так какl*ou*nging
имеет четное количество символов иcalms
имеет 520+5=25
..Теперь вновь модифицированный ввод разделяется на каждый знак пунктуации, за которым следует newline (
\n
), чтобы получить абзацы, затем каждый абзац разделяется на каждую пунктуацию, за которой следуют 2 пробела, чтобы получить предложения, и, наконец, каждое предложение разделяется на слова любая пунктуация, включая пробел. Затем для каждого слова (включая серии последовательныхa
символов s) мы добавляем в строкуW
букву, соответствующую кодовой точке64
Unicode (кодовой точке Unicode символа перед символомA
, который является@
), плюсlen(word)
. Затем мы добавляем один пробелW
после того, как все слова предложения были исчерпаны, а когда все предложения в абзаце исчерпаны, мы добавляем.
после него один пробел.Наконец, после прохождения всего ввода
W
выводитсяstdout
как расшифрованное сообщение.источник
re
, используйтеsub
вместоstr.replace
. Более общее предложение игры в гольф: вероятно, более эффективно рассматривать все, что не является словом или*
пунктуацией. Экономит на больших классах персонажей.PHP, 196 байт
Если бы я мог предположить, что есть только один апостроф в середине слова 194 байта
источник
%0A
как функцияrawurlencode("\n")
. В этом случае я предпочитаю форму с текстовой областью для ввода, и мой html-сайт позволяет автоматически кодировать строку<?
. Одна ошибка принадлежит$_GET[s]
ему, но работает правильно,$_GET["s"]
и лучше объявить и инициализировать переменную$p=0;
перед циклом. Теперь мой вопрос к вам: могу ли я предположить, что в одном Слове только один Апостроф в середине Слова?<?php
сработало.<?
в реальности. Я использую короткий тег только в своем посте здесь. Теперь я знаю, что это может привести к пустой странице.PHP,
231226228 байтдля начала
Сохранить в файл, rund
php <scriptpath> <text>
. Избегайте перевода строки в тексте, чтобы он работал в оболочке.источник
$argv[1]
, но я не знаю, как этот подход будет работать, когда ввод содержит новые строки. Я попытался"Neurotic Frogs *O*ught To Re*a*x In *M*ud Baths!"
в качестве аргумента командной строки и получилIFHCHCFF.
для вывода (а такжеUndefined variable: d
предупреждение).<?
это предварительно добавить , сохранить его в файл и вызвать его с помощьюphp <filename> <string>
. Возможно, мне придется добавить 2 к числу байтов.<?
, вы также можете закончить?>.
, для чистого усиления для 1. FWIW, я получаюIFHCMFF.
для первого теста (с использованием PHP 5.5.21 64-bit, VC14). Использование$argn
с-F
может также быть опцией.php <filename> <string>
это возможно, когда<string>
могут содержать переводы строк.