Введение
Оказывается, инопланетяне любят мемов так же, как и мы. Каждая инопланетная раса, с которой мы столкнулись до сих пор, имеет свою собственную версию 2spooky4me
(см. Следующий вопрос ) и эквивалентную, но с некоторыми вариациями. Жители планеты CUTE1f не могут справиться с большим количеством призрака, поэтому их предпочитают 1spooky2me
, в то время как skeletor7 любят их, поэтому они склонны использовать 9spooky11me
.
Вызов
Переводить мемы - тяжелая работа, поэтому вам поручено написать универсальный переводчик мемов, чтобы помочь этим парням получить доступ к меменету. Ваша программа примет мем и преобразование, которое будет применено к последовательности цифр в этом меме, чтобы сделать его подходящим для жителей другой планеты.
вход
Ваша программа получит два строковых ввода:
- Входной мем (например
2spooky4me
). Матчи [a-zA-Z0-9]+
.
- Преобразование, чтобы применить к нему (например
+1
, перейти от 2spooky4me
к 3spooky5me
). Матчи [+\-*/^]\d+
(вы должны принять +
, -
, *
, /
, и в ^
качестве операторов, независимо от родного представления на вашем языке).
Выход
Ваша программа должна вернуть строковый вывод (напечатанный на стандартный вывод или эквивалентный) с заданным преобразованием, примененным к последовательностям цифр во входном меме. При странном повороте событий также выясняется, что все встречающиеся расы предпочитают интегральные мемы, а не дробные, поэтому эти преобразования должны выполнять целочисленную арифметику (например, 1spooky1me /2
приводить к 0spooky0me
).
Примеры
Стандартные арифметические операции применяются:
Input: 2spooky4me +1
Output: 3spooky5me
Input: 2spooky4me -1
Output: 1spooky3me
Input: 2spooky4me *15
Output: 30spooky60me
Input: 10spooky900me /5
Output: 2spooky180me
Цифровые последовательности являются целыми; целочисленное усечение должно происходить в таких случаях:
Input: idontunderstandmemes3 /2
Output: idontunderstandmemes1
Ваш ввод может не содержать последовательности цифр:
Input: notreallyafunnymeme *100
Output: notreallyafunnymeme
Вы должны поддерживать возведение в степень, даже если это не нативная операция на выбранном вами языке:
Input: 2spooky4me ^3
Output: 8spooky64me
Нет ограничений на длину строки количества последовательностей цифр в строке:
Input: some1meme2sequences3can4be5really6long7 /2
Output: some0meme1sequences1can2be2really3long3
добавление
Если ваш язык поддерживает целые числа произвольной точности в качестве языковой функции, вы должны использовать их. Если это не так, вам не нужно поддерживать целые числа произвольной точности. Например, вы должны использовать Integer
в Haskell вместо того, Int
потому что он доступен как часть языка; в Java
, вы не обязаны использовать, BigInteger
потому что это функция библиотеки, а не функция языка.
Input: 2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000spooky4me /2
Output: 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000spooky2me
Это код-гольф , поэтому стандартные лазейки запрещены, и выигрывает самый короткий ответ в байтах!
Leaderboard
Фрагмент стека в нижней части этого поста создает таблицу лидеров из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
## Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать имя языка ссылкой, которая будет отображаться во фрагменте кода:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 79809; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 45941; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
BigInteger
для своих вычислений?Ответы:
Джольф,
1514 байтовПопробуй это здесь!
объяснение
Интересно отметить, что после этого испытания я обновил Jolf, добавив несколько встроенных функций RegExp. Это может быть
1211 байт:источник
Рубин,
504443 байтаFGITW ответ. Должен идти быстро!
Спасибо @Neil за сохранение 6 байтов.
Ах да, зачеркнуто 44 все еще 44
источник
a=gets;$><<gets.gsub(/\d+/){eval$&+a}
. Моя пропустила вещь ^! = **, и, вероятно, немного дольше.^
. : DPerl,
3634 байтаИсходный код имеет длину 30 байт и требует переключателей
-pi
( +4 байта ). Он принимает первый вход из STDIN, второй вход в качестве аргумента-i
.Спасибо @DenisIbaev за 2 байта в гольфе!
Проверьте это на Ideone .
источник
-pi
такое 4 байта?-pi
от остальной части команды."0|$&"
короче чем"0|".$&
."0|$&$^I"
тоже работает. Благодарность!PowerShell v2 +,
139137 байтOoof ... 47 байт просто для учета,
^
поскольку это не собственный оператор в PowerShell. Сохранено 2 байта благодаря @TessellatingHeckler.Принимает входной сигнал , как
$a=<word>
,$b=<operation>
, как.\universal-spooky-meme.ps1 2spooky4me ^3
. Мы-split
$a
на цифрах, заключая это в паренсы, чтобы мы держали разделители, и передать результирующий массив через цикл|%{...}
. Если текущий кусок является числом, мы в первомif
. Нам нужно проверить , является ли первый символ$b
IS^
. Если это не так, мы просто объединяем наш текущий фрагмент и$b
отправляем егоiex
(аналогичноeval
), а затем оставляем это в конвейере. В противном случае нам нужно создать строку возведения в степень с помощью"$_*"*$b.Trim('^')+1
и передать ее в каналiex
и оставить ее в конвейере. Для приведенного2spooky4me ^3
примера это будет2*2*2*1
и4*4*4*1
, соответственно.В противном случае мы просто оставляем строку как есть на конвейере.
Все эти результаты собираются из конвейера с инкапсулирующими паренами, а затем
-join
объединяются в одну строку. Это повторный запуск в конвейере, и вывод неявно при завершении программы.Примеры
источник
Floor(("$_$b"|iex))
с ,Floor((iex $_$b))
чтобы сэкономить пару, или , может бытьiex $_+$b
.JavaScript (ES7),
5857 байтРедактировать: Сохранено 1 байт, когда я вспомнил, что
replace
также работает с литеральными строками.источник
Пиф, 29
Это работает путем извлечения каждого числа из мема, а затем чередования (
.i
), за которым следует пробел и завернутый в список с другим аргументом. Так что, если наш номер7
и мы имели^20
мы получим список:["^", "7 ", "20"]
. Сглаживание и использование Pyth'seval
(.v
) всегда дает нужную нам операцию. Наконец, эти значения чередуются с исходной строкой, разбитой на вхождения чисел.Это может быть на байт короче, если оба входа были заключены в кавычки, или на два байта короче, если только один из них может быть заключен в кавычки.
Попробуйте здесь или запустите Test Suite
источник
Python 2,
156898887 байтВдохновлен другими ответами, которые используют функцию подстановки своих языков с помощью обработчика функций для обработки числовых частей длинной
i
строкиo
nput с помощью ператора. К несчастью для Python, его^
необходимо заменить**
, что стоит колоссальные 18 байт..group(0)
Вызова только для доступа к объекту матча «s строковое представление не делает вещи лучше ...Спасибо QPaysTaxes за обнаружение ложного пространства и RootTwo за ненужный аргумент
.group
!источник
i,o:
p.group()
. (по умолчанию 0); и (2) вставитьr=re.sub;
заменить первыйre.sub
вызовr
и затем использоватьr('^','**',o)
вместоo.replace(...)
r('^','**',o)
тогда требуется избежать ,^
чтобы\^
для того , чтобы соответствовать символу, а не началоo
, чистый не экономя ни одного байта :-( - но спасибо за указывая ненужных0
!Javascript (ES6) 99 байт
Другой пример, почему мы ненавидим ждать, пока ES7 получит совместимость
Runnable пример:
источник
\d+|\D+
, что эквивалентно.+
.[a-zA-Z0-9]+
Вы хотите регулярное выражение, нет? Или,[a-zA-Z]+|[0-9]+
если разделение имеет значение?Math.pow
напрямую, так как в любом случае вам придется использовать его в особом случае. Кроме того, вы используете целочисленное деление?\d+|\D+
Не совсем так же, как.+
. Они не одинаковы, потому что расширение клини происходит доor
. Было бы то же самое, если бы это выглядело(\d|\D)+
, но как бы, это не соответствовало бы всем, скажем,2a
в одной группе, это были бы две отдельные группы.Юлия,
715954 байтаТребование использовать,
big
если доступно, делает это намного дольше, чем могло бы быть ...Попробуйте онлайн!
источник
Котлин,
416413 байтОтсутствие
eval()
в Kotlin действительно увеличило количество байтов ...Попробуйте онлайн!
Ungolfed
источник
PowerShell (v4),
124120 байт(новые строки предназначены только для того, чтобы избежать горизонтальной прокрутки, они работают при сохранении одной строки).
Были запрошены комментарии и разглаженная версия:
iex
как иeval()
в других языках. Это просто делает"2spooky" "+3"
->eval("2+3")
^
оператор или любое другое удобное возведение в степень, например**
, он может использовать только[math]::Pow()
библиотечный вызов, поэтому есть большой блок для обработки этой ветви."2*" * n
которое становится,"2*2*2*2*"
а затем добавляет+1
в конце умножение на единицу, вместо того, чтобы жаловаться на трейлинг*
.[math]::Truncate()
. Вместо этого я сохраняю символы, используя-replace
обрезку десятичной точки и что-нибудь после нее.Тестовые случаи:
NB. В последнем тесте числа
[BigInteger]
автоматически переходят в тип , но отображаются в научной записи. К счастью, каждая известная раса, способная общаться между звездами, имеет достаточно научных разработок, чтобы без проблем обрабатывать научные обозначения.источник
Bash + GNU coreutils, 144 байта
Здесь рассматривается изменение между цифрами и не цифрами, поэтому к входной строке добавляется случайный недопустимый символ ввода (запятая). Эта запятая затем игнорируется в выводе. Соглашение OP точно соответствует синтаксису,
bc
который используется здесь для выполнения математических операций.источник
Луа,
14593 байтаисточник
R 163 байта
Для тех, кто изучает регулярные выражения и подстановку строк в R, это оказалось довольно сложной задачей. Тем более, что сопоставить числа легко, но я не смог найти способ использовать множественные замены с
gsub
. Кроме того, я не знаю,eval(parse(paste0(...
является ли самый эффективный способ переключения между операциями. Может быть,switch
-функция лучше подходит здесь.объяснение
источник
Javascript (ES6), 85 байт
Ungolfed:
источник
()
разбирать лямбда-аргумент, вам не нужноvar
, и вы должны использовать вместо фигурных скобокreturn
^
это особый случай для JavaScript, это побитовый XOR вместоMath.pow
Groovy,
6460 байтЗаменяет все вхождения цифр на замыкание, которое оценивает операцию над цифрами частей переданного слова. Если передана функция экспоненты, она заменяет ее соответствующими обозначениями. Groovy неявно обрабатывает преобразование BigInteger / BigDecimal при использовании,
Eval.me()
потому что проанализированные строки могут быть вне2^32-1
диапазона.Разъяснения
{a,b->...}
- Закрытие с двумя аргументами.a.replaceAll(/\d+/,{...})
- Поиск всех последовательностей цифр в строке и заменить на закрытие.{Eval.me(it+b.replace("^","**"))}
- В частности, замыкание с каждым сопоставлением, к которому добавлена операция, а затем оценивается как отличный код..replace("^","**")
- Замените первый экземпляр^
на оператор Groovy экспоненты**
в предоставленной операции. Если вы хотите, чтобы это работало с полными строками уравнений, в которых используются показатели степени, используйтеreplaceAll()
вместо этого штраф в +3 байта.Забавно, что это правильный тестовый сценарий:
(22348952345238905290858906209862398036spooky409552me, /200*4943^8-23939+((100/203)+600)
источник
RProgN , 39 байт
Разъяснения
Технически неверный ответ, потому что этот язык для него не существовал. Тем не менее, он не был специально разработан для этого, ни каких-либо конкретных дополнений. Так что я бегу это. Подать в суд на меня.
Попробуйте онлайн!
источник
Perl 6, 111 байт
К сожалению,
EVAL
по умолчанию отключено. Кроме того, вы должны использоватьdiv
для целочисленного деления.источник