Из статьи Википедии :
Локальная арифметика (Latin arithmeticæ localis) - это аддитивные (непозиционные) двоичные системы счисления, которые Джон Нейпир исследовал как метод вычисления в своем трактате «Рабдология» (1617), как символически, так и на шахматной решетке.
Какая?
Расположение цифр - это способ написания чисел с использованием букв алфавита.
Двоичная запись еще не была стандартизирована, поэтому Нейпир использовал то, что он называл цифрами местоположения, для представления двоичных чисел. Система Нейпира использует нотацию знак-значение для представления чисел; он использует последовательные буквы английского алфавита для представления последовательных степеней двух: a = 2 ^ 0 = 1, b = 2 ^ 1 = 2, c = 2 ^ 2 = 4, d = 2 ^ 3 = 8, e = 2 ^ 4 = 16 и так далее.
Пример
ab
= 1 + 2 = 3 в базе 10
aabb
= 1 + 1 + 2 + 2 = 6 в базе 10
Обратите внимание, что aabb
это можно сократить bc
, заменив любые 2 экземпляра буквы на более высокий.
прибавление
Вы просто соединяете два числа и упрощаете.
acd
+ bde
= acdbde
= abcdde
= acebe
= abcf
= 39
в базе 10
Вычитание
Просто удалите все цифры, появляющиеся одинаково в обеих частях вычитания. Расширение (преобразование b
в aa
) может быть необходимым
abde
- ad
= be
= 18 в базе 10
умножение
Это немного сложнее.
Допустим, мы хотим умножить acd
(13) на def
(56). Сначала вы расположите acd
вертикально:
a
c
d
Затем вы добавляете def
после первого a
:
a def
c
d
Теперь c на 2 позиции в алфавите позже, чем a, поэтому мы добавляем 2 позиции в алфавите def
для создания fgh
. Это добавляется во второй ряд.
a def
c fgh
d
Наконец, d на 1 позицию в алфавите позже, чем c, поэтому мы добавляем 1 позицию в алфавите fgh
для создания ghi
. Это добавлено в третий ряд.
a def
c fgh
d ghi
Тогда вы берете сумму справа: def
+ fgh
+ ghi
= deffgghhi
= deggghhi
= deghhhi
= deghii
= deghj
(728)
Еще один пример умножения
Входные данные:
bc * de
Первый:
b
c
затем
b ef
c
затем
b ef
c fg
Обратите внимание, что мы записали ef
в первой строке. Это потому, что bc
начинается с b
, и b
является второй буквой в алфавите, поэтому нам нужно сместиться de
на 1 букву, чтобы она стала ef
.
затем
ef+fg
Выход:
eh
разделение
Это не является частью этой проблемы, потому что это может быть очень сложным.
Ваш актуальный вызов
Ваша программа или функция должна принимать входные данные в виде строки, которая выглядит следующим образом:
a + b
И вы должны вывести:
ab
Конечно, ваша программа или функция должна поддерживать число произвольной длины (до строки или входного предела вашего языка) с любым из операторов +
, -
или *
. Еще несколько примеров:
Входные данные:
ab + bd
Выход:
acd
Входные данные:
d - ab
Выход:
ac
Входные данные:
ab * cd
Выход:
cf
Заметки:
- Порядок букв в выходных данных не имеет значения, но вы всегда можете предположить, что порядок букв в цифрах на входе будет возрастать (от a до z).
- Вы можете получить ввод с завершающей новой строкой и вывод с завершающей новой строкой.
- Вы не можете принимать входные данные в виде списка
ab
,*
иbd
дляab * bd
. - Используется английский алфавит (
abcdefghijklmnopqrstuvwxyz
) - Ваш вывод должен быть упрощен (
aa
не разрешен,b
требуется) - Ввод будет упрощен (
b
+c
, а неaa
+bb
илиaa
+aaaa
) - Вам может потребоваться пробел до и оператор (
+
,-
или*
), или вы можете потребовать, чтобы их не было. - Для каждого входа будет только один оператор.
- Вы можете предположить, что вывод и ввод никогда не пройдут 2 ^ 27-1 (
abcdefghijklmnopqrstuvwxyz
) - Это код-гольф , поэтому выигрывает самый короткий ответ в байтах!
источник
d is 2 positions later in the alphabet than c
это Райт? не должно ли это быть1
?That is added to the second row.
в том же предложении, не так лиthird
?bc*de==efgh
ноefgh
это240
не144
bc*de
должно бытьeh
Ответы:
Желе ,
2625 байтИспользует операторы Jelly (
×
а не*
и_
вместо-
) во входной строке, как это разрешено OP .(Требуются места вокруг операторов)
Попробуйте онлайн! или посмотрите набор тестов
Как?
источник
Mathematica, 168 байт
Мое первоначальное решение (до того, как пост был отредактирован, чтобы уточнить, что вывод должен быть упрощен) было на
64
байты короче:Это просто изменило это решение для работы. Вероятно, на самом деле короче использовать методы, описанные в задании, но я все равно хотел это поднять.
Объяснение:
Заменяет каждую последовательность букв на соответствующее целое число с помощью арифметики кода символа, затем преобразует результирующую строку в выражение (которое автоматически упростится до целого числа), затем создает строку
a
символов длиной, равной этому целому числу, и, наконец, заменяет смежные идентичные символы с кодом следующего символа, пока не будет достигнута фиксированная точка.источник
JavaScript (ES6),
136134133 байтаСохранено 1 байт благодаря Люку
Контрольные примеры
Показать фрагмент кода
источник
Perl 5 , 95 байт
94 байта кода +
-p
флаг.Попробуйте онлайн!
Три шага здесь:
-
s/\w/a x 2**(-97+ord$&)/ge;
преобразует ввод в строкуa
только.-
s/(.*)-\1|+//;/*/&&($_=$`x length$')
выполнит оператор (который очень прост для строкa
):+
это конкатенация,-
означает удаление из первой части столько,a
сколько имеется во второй части, и*
означает дублирование первой части столько раз, сколькоa
во второй часть.-
1while s/(.)\1/chr 1+ord$1/e
складывает последовательные одинаковые буквы в следующую букву в алфавите.источник
05AB1E , 29 байт
Попробуйте онлайн! или как тестовый набор
объяснение
источник
C & x86 asm, 340 байт
Компилировать с -O0
объяснение
Поскольку C не имеет
eval()
, я использовал вместо него таблицу инструкций x86. Я должен был выбрать инструкции, которые были бы одинаковой длины (или дополнены nops), и которые ожидали src и назначение тех же типов. Особую досаду вызвало то, что MUL может писать только в регистры, а однобайтовые коды операций MUL могут писать только в EAX. Кроме того, казалось, что не было инструкции SUB для записи в регистр, которая вычитала бы из памяти, а не наоборот, отсюда и XCHG.редактировать
Поскольку это было задано в комментариях, более традиционная оценка будет выглядеть так:
Это на самом деле немного короче, в 301 символах, по нескольким причинам: 1. Поскольку должно быть много функций, накладные расходы каждой из них можно сократить с помощью некоторых правил препроцессора. 2. Современный linux защищает от выполнения в стеке, поэтому вызов mprotect () отключает эти пожертвованные 34 байта. 3. Вызов XCHG очень неоптимален и стоит еще 30 байтов. Если бы не эти вещи, комбинация x86 выиграла бы примерно на 10-20 байтов.
Также отрезал 2 байта от обоих, улучшив вызов islower () в g.
источник
GNU sed + coreutils, 329 байт
Да, я понятия не имею, что на меня нашло, но, по крайней мере, теперь я знаю, что писать сценарии sed немного лучше. Обратите внимание, что для этого решения требуется
e
расширение GNU sed , которое запускает команду оболочки.Я предполагаю, что вокруг операторов не будет пробелов. Из моего терминала:
И для тех, кто более здравый, чем я: закомментированная версия!
источник
sed: file golf.sed line 24: ":" lacks a label
PHP, 168
Выход по возрастанию с использованием eval
PHP, 185 байт
Выход по возрастанию
Онлайн версия
расширенный
PHP, 201 байт
Выход по убыванию
Онлайн версия
расширенный
источник
Python 3 ,
176167 байтПопробуйте онлайн!
источник
m>=2**(t+1)
наm>=2**t*2
, и пять байтов, заменивa=a.split();m=eval(i(a[0])+a[1]+i(a[2]))
что-то вродеb,c,d=a.split();m=eval(i(b)+c+i(d))
.2**(ord(i)-97)
на1<<ord(i)-97
.PHP, 130
расширенная версия:
беги с
php -R <code>
.источник
AWK, 201 байт
"(awk '$0="a s"'<<<1)"|getline v
это лучший способ, который я мог придумать, чтобы сделатьevaluate
вAWK
. Возможно, я немного «обманываю», чтобы назвать это простоAWK
, так как я выполняю команду, но, по крайней мере, команда тожеAWK
:)Я уверен, что упускаю какой-то способ уменьшить количество байтов, но я точно не вижу этого.
Использование довольно стандартно, например, введите код
FILE
и сделайте:Обратите внимание, что пробелы не требуются, и любой неоперационный / не [аз] символ будет игнорироваться. Может быть расширен для работы с числами больше, чем "abcdefghijklmnopqrstuvwxyz", изменив цикл. Для деления просто добавьте
/
символ в строку операции :). Кроме того, будет печатать пустую строку, еслиresult <= 0
.источник