Мы все сделали это, ну, может быть, и нет, но создание собственного языка инопланетян и системы нумерации является одним из основных элементов фэнтезийного письма, но в основном это просто забавное занятие.
Задача проста, взять два входа:
Упорядоченный список вводит 10 [десять] уникальных «цифр» (любой печатный символ ASCII) и интерпретирует их по порядку как значения 0, 1, 2, 3, ..., 9
+ Есть исключения из того, что здесь может быть цифрой. Арифметические операторы (+, -, *, /), круглые скобки и пробелы не могут использоваться в качестве одной из цифр.
Арифметическая задача, использующая только эти «цифры»
И вывести эквивалентный целочисленный результат в заданной форме.
Вот пример:
INPUT
abcdefghij
bcd + efg + hij
OUTPUT
bdgi
В этом примере, входной список (вы можете выбрать, в какую форму входит список) для 'abcdefghij' соответствует '0123456789', так же как 'hjkloiwdfp' также будет соответствовать 1 к 1 с '0123456789', где вместо 'a' ассоциируется с ноль, «ч» делает. Следующее арифметическое «переводит» в 123 + 456 + 789, что равно 1368. Затем оно должно быть выведено в той форме, которую мы ему дали, поэтому b (который представляет 1) d (для 2) g (для 6) и i (для 8.).
ТЕСТОВЫЕ СЛУЧАИ
abcdefghij
abc + def - ghij
-gedc
qwertyuiop
qwerty / uiop
e
%y83l;[=9|
(83l * 9) + 8%
y9|8
БОЛЬШЕ ПРАВИЛ
- Стандартные лазейки запрещены!
- Это код гольфа, поэтому выигрывают кратчайшие ответы в байтах.
- Это должна быть полная программа или функция, принимающая входы и выходы в любом формате, который лучше всего подходит для вас. (Просто нельзя добавить дополнительную информацию во входные данные, только «цифры» и выражение.
- Используйте любой язык, который вам нравится (если он соответствует другим правилам)
источник
q.ioiopewioyetqorw...
. Если да, то какое округление следует применять?1
для5/3
, а не2
из-за целочисленного деления (не округления). Это не делает задачу недействительной, но вам, возможно, придется разрешить разные приемлемые ответы для одного и того же теста (см. Мой ответ по T-SQL ниже).Ответы:
05AB1E ,
109 байтов(Сейчас) выводит в виде списка символов.
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Новая версия 05AB1E - это сборка в Elixir .
.E
Функция будет вызыватьcall_unary(fn x -> {result, _} = Code.eval_string(to_string(x)); result end, a)
, еслиCode.eval_string
это встроенный Elixir .Обратите внимание, что унаследованная версия 05AB1E не подойдет для этого, потому что она построена на Python. Числа с начальными 0 не будут оцениваться:
см. Все тестовые примеры в устаревшей версии (которая использует 10-байтовую версию, потому что
Åв
встроенная версия является новой).источник
R , 58 байт
Попробуйте онлайн!
Использует перевод символов,
chartr
чтобы поменять цифры,parse
s иeval
s выражение, а затемchartr
вернуться к исходным цифрам.Если требуется округление до ближайшего целого числа, это
R 65 байт
Попробуйте онлайн!
источник
[
более короткого имени для функции с 3 параметрами очень разумно. Отлично сработано.T-SQL, 117 байт
Разрывы строки предназначены только для удобства чтения.
Ввод осуществляется через уже существующую таблицу t с текстовыми столбцами c (символы) и e (уравнение) в соответствии с нашими правилами ввода-вывода .
Использует функцию SQL 2017
TRANSLATE
для переключения между символами и создания строки, которая содержит не только уравнение, но и код для перевода обратно в исходные символы:Эта строка затем оценивается с помощью
EXEC()
.Там могут быть некоторые символы (например, одинарные кавычки
'
), которые нарушают этот код; Я не проверял все возможные символы ASCII.В соответствии с задачей я оцениваю выражение как данное, в зависимости от того, как мой язык интерпретирует эти операторы. Таким образом, второй контрольный пример возвращает 1 (
w
), а не 2 (e
) из-за целочисленного деления.источник
Perl 6 , 38 байт
Попробуйте онлайн!
Я не уверен, как округление должно работать. Если она округляет в конце , то я могу добавить
.round
к +6 байт . Если поведение/
должно быть другим, то это может быть дольше. Принимает ввод карри какf(arithmetic)(numerals)(arithmetic)
.Объяснение:
источник
Stax ,
746665 байтЗапустите и отладьте его
Stax не очень хорошо здесь, без истинного "eval" инструкции. В документах он называется «eval», но он работает только с буквальными значениями, а не с полными выражениями.
источник
Баш, 97 байт
Могло бы быть меньше, если бы мы могли обрезать, а не округлять. Также сложно обрабатывать начальные нули (как в тестовом примере № 2), поскольку Bash интерпретирует числа, начинающиеся с 0, как восьмеричные.
источник
tr
является частью coreutils, аbc
не является. Тем не менее,bc
это очень распространенный инструмент. Каждая другая команда в этом ответе - bash.$T
он всего на один байт короче0-9
, вы используете его только дважды, и вы тратите 8 байтов на его определение.Бин ,
9490 байтHexDump
JavaScript
объяснение
Эта программа неявно назначает первую и вторую строки ввода как строки для переменных
a
иb
соответственно.Каждый символ
c
в строкеb
заменяется соответствующим индексомi
символа, найденного в строкеa
, или самого себя, если он не найден.Затем он удаляет каждую последовательность из одного или нескольких
0
s, которым предшествует граница, из результирующей строки. Это сделано для того, чтобы неeval()
оценивать любую последовательность цифр, начиная с0
восьмеричного литерала.После
eval()
иMath.round()
результат приводится обратно в строку, и каждый символ цифрыi
заменяется соответствующим символом из строкиa
в индексеi
.Тестовые случаи
демонстрация
демонстрация
демонстрация
демонстрация
источник
Perl 5
-p
, 63 байтаПопробуйте онлайн!
Принимает выражение в первой строке ввода и список перевода во второй.
источник
Perl 5 , 130 байт
Попробуйте онлайн!
Может быть, этот двойной eval как-то можно превратить в
s/.../.../geer
.источник
Древесный уголь , 14 байтов
Попробуйте онлайн! Ссылка на подробную версию кода. Примечание. Выражение оценивается в соответствии с семантикой Python 3, поэтому, например, начальные нули на ненулевых числах недопустимы. Объяснение:
источник
0
s не работают в Python, который присутствует в тестовых примерах.Python 3 , 137 байт
Подход без регулярных выражений, использующий
str.translate
иstr.maketrans
заменяющий символы. Я потерял много персонажей при обрезке ведущих нулей ...Попробуйте онлайн!
источник
Python 3 , 167 байт
Попробуйте онлайн!
Есть куда расти...
источник
Wolfram Language (Mathematica) , 121 байт
Я определяю чистую функцию с двумя аргументами. Поскольку некоторые функции повторяются, я сохраняю их в переменной, чтобы сохранить несколько символов. Этот код просто выполняет некоторые строковые замены, а затем использует его
ToExpression
для оценки выражения с ядром Wolfram.Попробуйте онлайн!
источник
Lua ,
162151150 байтload
вместоfunction(...) end
Попробуйте онлайн!
Не самая короткая вещь в мире (Lua заставляет вас сильно увлекаться, особенно огромными ключевыми словами), но создавать было довольно весело. Полная программа, принимающая входные данные в качестве аргументов и результат печати.
объяснение
Вступление
Присвойте значения из аргументов переменным. Наш словарь есть
l
и выражение естьp
.Следующее выражение довольно сложно понять, потому что оно имеет странный порядок выполнения, поэтому я объясню это шаг за шагом:
Преобразование в нормальные числа
Выполните замену в строке выражения: возьмите каждый символ и передайте его функции (
load
доказано, что она закорочена, чем обычное объявление).Функция находит позицию вхождения в строке dict для использования переданного символа
find
....
это первый (и единственный) аргумент здесь, поскольку мы находимся в функции vaarg (любойload
ed), который является нашим текущим символом. Следующие аргументы необходимы, чтобы сделатьfind
игнорирования специальных символов (1
это просто короткое значение, которое оценивается какtrue
при преобразовании в логическое значение): начальная позиция (здесь по умолчанию один) иplain
, которая фактически отключает обработку паттернов. Без этих программ происходит сбой в третьем тестовом случае из-за того,%
что он особенный.Если совпадение найдено, вычтите единицу, поскольку строки Lua (и, кстати, массивы) основаны на 1. Если совпадение не найдено, оно ничего не вернет, в результате чего замена не будет сделана.
решение
Prepend
return
к нашему выражению, чтобы позволить ему вернуть результат, вычислите его, скомпилировав как функцию Lua и вызвав его, выполните округление ( это перевернулось наоборот, чтобы сделать его короче).В конце мы получаем численное решение нашей проблемы, остается только преобразовать ее обратно.
Снова схожу с ума
Первая строка - это короткий способ преобразования числа в строку, поэтому теперь мы можем вызывать строковые методы коротким способом. Давай сделаем так!
Теперь
gsub
снова вызывается, чтобы заменить все обратно в безумие. Это время%d
используется вместо.
шаблона замены, поскольку наша функция может и должна обрабатывать только числа (.
это приведет к ошибке на отрицательных числах). Эта функция времени (load
снова для сохранения байтов) сначала добавляет1
редактируемая к своему первому (и единственному) аргументу, преобразовывая его в позицию в строке dict, а затем возвращает символ из этой позиции.Ура, почти нет!
Драматический финал, или Почему брекеты имеют значение
Ну ... зачем две пары скобок? Пришло время поговорить о паралле ... эх, многократном возвращении в Луа. Дело в том, что одна функция может возвращать несколько значений из одного вызова (посмотрите на этот мета-вопрос для большего количества примеров).
Здесь last
gsub
вернул два значения: нужную нам строку ответа и количество выполненных замен (на самом деле количество цифр, но кого это волнует). Если бы не внутренняя пара, то были бы напечатаны и строка, и число, что напортачило. Таким образом, здесь мы жертвуем двумя байтами, чтобы опустить второй результат и, наконец, напечатать продукт этой безумной фабрики.Ну, я с удовольствием объяснял почти столько же, сколько игра в гольф, надеюсь, вы поняли, что здесь происходит.
источник