Проблема:
Ваша цель состоит в том, чтобы добавить два входных чисел без использования какой - либо из следующих операторов математики: +,-,*,/
.
Кроме того, вы не можете использовать какие-либо встроенные функции, которые предназначены для замены этих математических операторов.
Подсчет очков:
Наименьший код (в количестве байтов) выигрывает.
Обновить
Большинство программ, которые я видел, объединяют два массива, содержащие их номера, или делают
first number
из символов, добавляютsecond number
символы, а затем подсчитывают их все.Самый короткий счетчик массива: APL с 8 символами, Tobia
Объединение кратчайшего массива: Golfscript с 4 символами, от Doorknob
Кратчайшее логарифмическое решение: TI-89 Basic с 19-ю символами, по Quincunx
Интеграционное решение: Mathematica с 45 символами, автор Michael Stern
Круто, на мой взгляд: побитовые операторы в JavaScript, Дэйв
источник
Ответы:
Smalltalk,
2113Все перечисленные ниже работают только с натуральными числами. Смотрите другой ответ Smalltalk для серьезного.
version1
переходя к большому целому числу и запрашивая у него высокий битовый индекс (плохо, индексирование ST основано на 1, поэтому мне нужно дополнительное смещение вправо):
version2
аналогично и даже немного короче (из-за правил старшинства Smalltalk и не требуется смещение вправо):
Version3
другой вариант темы «размер коллекции-конкатенации»,
заданный двумя числами a и b,
используя Intervals в качестве коллекции, мы получаем более дружественную к памяти версию ;-) за 21 символ:
хотя не рекомендуется для тяжелого хруста числа.
Version4
Для вашего удовольствия, если вы хотите обменять время на память, попробуйте:
что обычно достаточно точно (но не гарантирует ;-)))
version5
записать в файл и спросить его размер
источник
Javascript (25)
Это добавляет две переменные x и y, используя только побитовые операции, и сохраняет результат в x.
Это работает и с отрицательными числами.
источник
while(y)x^=y,y=(y&x^y)<<1
!for(;y;y=(y&x^y)<<1)x^=y
на 1 байт короче :)C - 38 байт
Я тут немного обманываю, ОП сказал, что не использует никаких математических операторов.
Формат
*
inprintf()
означает, что ширина поля, используемого для печати символа, берется из аргументаprintf()
, в данном случае 3 и 4. Возвращаемым значениемprintf()
является количество напечатанных символов. Таким образом, он печатает один' '
с шириной поля 3, а другой с шириной поля 4, всего 3 + 4 символа.Возвращаемое значение - добавленные номера в
printf()
вызове.источник
main
. Кроме того, если вам все равно, что вы печатаете, вы можете заменить один' '
на0
и пропустить второй.Python - 49 байт
Предполагая ввод путем размещения в переменных
x
иy
.Это 61-байтовое решение является полной программой:
Учитывая, что вы не запретили возведение в степень, мне пришлось опубликовать это. Когда вы упрощаете выражение, используя свойства логарифмов, вы просто получаете
print input() + input()
.Это поддерживает как отрицательные числа, так и числа с плавающей запятой.
Примечание: я последовал совету Гнибблера и разделил этот ответ на три части. Это решение Mathematica , и это решение TI-89 Basic .
источник
E^y
. Использование,Log[Log[(E^E^x)^E^y]]
кажется, работает нормально.JavaScript [25 байт]
источник
Mathematica, 21 байт
Есть несколько способов сделать это в Mathematica. Во-первых, используйте функцию Accumulate и бросьте все, кроме последнего числа в выводе. Как и в моем другом решении ниже, я предполагаю, что входные числа находятся в переменных
a
иb
. 21 байт.Веселее, хотя это 45 символов, используйте цифры, чтобы определить линию и интегрировать под ней.
В качестве бонуса оба решения работают для всех комплексных чисел, а не только для положительных целых чисел, как, кажется, имеет место для некоторых других решений здесь.
источник
function _(){return array_sum(func_get_args());}
. Я должен был снять это, потому что я не мог найти короткий способ "исправить" это.array_sum()
в php, что делает то же самое.GolfScript,
64 символа / байтВвод в виде
10, 5
(=>15
).+
Является массив конкатенация, а не дополнение.Как это работает, это то, что
,
используется для создания массива длины, которой является число (0,1,...,n-2,n-1
). Это делается для обоих чисел, затем массивы объединяются.,
снова используется для другой цели, чтобы найти длину результирующего массива.Теперь вот трюк . Мне действительно нравится этот, потому что он злоупотребляет форматом ввода. Это выглядит , как это просто ввод массива, но на самом деле, так как вход выполняется в GolfScript коде, первый
,
уже сделал для меня! (Старая 6-символьная версия была~,\,+,
с форматом ввода10 5
, который я сбрил на 2 символа, исключив\,
(массив подкачки)).Старая версия (12) :
Создает функцию
f
.Символы
*
и+
являются повторением и объединением строк, а не арифметическими функциями.Объяснение:
n
создает односимвольную строку (новую строку). Затем это повторяетсяa
раз, затем делается то же самоеb
. Строки объединяются, а затем,
используются для длины строки.источник
C
2927 байтИспользование арифметики указателей:
x
определяется как указатель, но вызывающая сторона должна передать целое число.Анонимный пользователь предложил следующее - также 27 байтов, но параметры являются целыми числами:
источник
int
s в распространенных в настоящее время системах, гдеint
32-битные, а указатели имеют 64-битные. Второй избегает этой проблемы.Brainf * ck,
936Это работает без использования простого сложения; он проходит и кладет след 1, а затем считает их
Примечание:
+
и-
являются просто единичными приращениями, и без них ничего нельзя сделать в brainf * ck. Они на самом деле не сложение / вычитание, поэтому я считаю, что это все еще имеет значение.источник
J (6)
Вы не сказали, что мы не можем использовать функцию succ:
Использование:
Он просто делает 9 повторений
>:
по 8.Список конкатенации подход работает, тоже:
#@,&(#&0)
. И - я знаю, что это противоречит правилам - я не могу позволить этому ответу остаться без самого решения J-ish:*&.^
(умножение при возведении в степень).источник
Постскриптум, 41
Мы определяем функцию с выражением длиной 41 байт:
Тогда мы называем это, например, как:
Который дает
Он легко обрабатывает негативы и плавающие, в отличие от большинства конкурентов :-)
источник
Баш, 20 символов
источник
Smalltalk (сейчас серьезно),
123 118105 (*)Извините за ответ дважды, но считаю это серьезным ответом, тогда как другой был больше похож на юмор. Следующее фактически выполняется прямо в этот самый момент на всех наших машинах (хотя на аппаратном уровне). Странно, что это никому не пришло в голову ...
Комбинируя два полумесяца и выполняя все биты слов параллельно, мы получаем (входные данные a, b; выходные данные в s) читаемую версию:
Цикл предназначен для распространения переноса. Маски гарантируют обработку целых чисел со знаком (без них возможны только числа без знака). Они также определяют длину слова, указанное выше для 32-битной операции. Если вы предпочитаете 68-битное дополнение, измените на 16rFFFFFFFFFFFFFFFFF.
версия для гольфа (123 символа) (избегая длинной маски, повторно используя в м):
(*) Используя -1 вместо 16rFFFFFFFF, мы можем лучше играть в гольф, но код больше не работает для чисел с произвольной точностью, только для smallIntegers размером с машинное слово (представление для largeIntegers не определено в стандарте Ansi):
это уменьшает размер кода до 105 символов.
источник
APL, 8 и 12
Ничего нового здесь, версия для подсчета массивов:
и журнал ○ версия журнала:
Я просто думал, что они выглядят круто в APL!
источник
≢∘∊⍳¨
sed, 359 байт (без необычного форматирования)
Извините за поздний ответ, и, вероятно, самый длинный ответ здесь. Но я хотел посмотреть, возможно ли это с помощью sed:
Это похоже на https://codegolf.stackexchange.com/a/38087/11259 , который просто увеличивает числа в строке. Но вместо этого он выполняет операции приращения в цикле.
Ввод берется из STDIN в форме "x y". Это сначала преобразуется в "x: 0 :: y:". Затем мы увеличиваем все числа после символов «:», пока не получим «x: x: :( x + y):». Тогда мы наконец вернемся (x + y).
Выход
Обратите внимание, что это работает только для натуральных чисел. Однако (по крайней мере, в теории) это работает для сколь угодно больших целых чисел. Поскольку мы выполняем x операций инкремента для y, порядок может иметь большое значение для скорости: x <y будет быстрее, чем x> y.
источник
Тире , 18 байт
Требуется время GNU 1,7 или выше. Выход в STDERR.
Попробуйте онлайн!
Обратите внимание, что это не будет работать в B ash, поскольку его встроенная команда time отличается от времени GNU.
За счет одного дополнительного байта
\time
можно использовать вместо того,time
чтобы заставить Bash использовать внешнюю команду.источник
sleep -3
я смогу ускорить свои программы. Какое разочарование.\time
должен работать в Bash.Javascript (67)
Там наверное намного лучше
источник
joins
излишне.Array
Конструктор делает массивundefineds
, который можно пересчитать:a=Array;p=parseInt;r=prompt;alert(a(p(r())).concat(a(p(r()))).length)
Number
конструктор спасает 2 персонажаparseInt
alert
, вывод будет по-прежнему идти на консоль, но это делает ответ немного менее забавным. Вы также можете повторно использоватьprompt
переменную вместо alert (конструктор предупреждает аргумент подсказкой). В любом случае, хороший ответ!Рубин, 18 символов
И еще два подробных варианта, 29 символов
Другая версия, 32 символа
источник
C # - генерация кода на лету
Да, там на самом деле есть добавление, но не оператор + и даже не каркасная функция, которая выполняет добавление, вместо этого мы генерируем метод на лету, который выполняет добавление.
источник
Рубин 39
источник
R 36
где
rep
строит вектор изx
тех, за которыми следуютy
двойки.источник
length(rep(1:2,scan()))
TI Basic 89 - 19 байт
Запустите это в своем TI-89 (домашний экран или приложение для программирования):
Это использует правила журнала для вычисления
x+y
, как в этом решении . В качестве бонуса он работает для десятичных и целых чисел. Это работает для всех действительных чисел. Если правила логарифма все еще действительны для комплексных показателей, то это работает и для комплексных чисел. Тем не менее, мой калькулятор выплевывает мусор, когда я пытаюсь вставить сложные показатели.источник
ln
1 байт в TI Basic? Кроме того, вы можете удалить закрывающие скобки, уменьшив их до 15 байт.Спасибо Майклу Стерну за то, что он научил меня нотации Mathematica .
Mathematica -
2120 байтПри этом используется тот же подход, что и в этом решении , но в Mathematica его сделать короче. Это работает для отрицательных чисел и чисел с плавающей точкой, а также целых чисел в
x
иy
.Упрощение выражения с использованием правил журнала дает результат
x+y
, но это действительно, поскольку оно использует возведение в степень, а не один из 4 основных операторов.источник
C # - строковая арифметика
Мы конвертируем оба числа в строки, добавляем их с обрезкой строки (с помощью переноса и всего, что вы знаете), а затем анализируете до целого числа. Протестировано с i1, i2 в 0..200, работает как шарм. Найти дополнение в этом!
источник
С (79)
источник
Python - 22 символа
источник
APL: 2
Это преобразует числа из базы 1, поэтому (n * 1 ^ 1) + (m * 1 ^ 2), что в точности равно n + m.
Можно попробовать на TryApl.org
источник
TI-BASIC, 10
Добавляет
X
иY
источник
К, 2 байта
Пример использования:
Примените оператор «где» (монадический
&
) к числам в списке ввода (возможно, воспользовавшись форматом ввода). Это создаст список, содержащий первое число нулей, за которым следует второе число единиц:Обычно этот оператор используется как «сборка» для создания списка индексов ненулевых элементов логического списка, но обобщенная форма иногда оказывается полезной.
Затем просто возьмите счет этого списка (монадический
#
).Если моя интерпретация входных требований неприемлема, то следующее немного более длинное решение делает то же самое:
источник
Pyth , 29 байт
Попробуйте онлайн!
Моя первая подача здесь!
Это компилируется в:
источник