Оператор, который объединяет сумму, произведение и разницу между двумя числами

28

Вызов:

В социальных сетях циркулирует глупая головоломка:

8 + 2 = 16106
5 + 4 = 2091
9 + 6 = ?

Реализуйте функцию или оператор, который, когда ему дано два положительных целых числа xи так y, что x > y > 0дает правильный ответ в виде целого числа , где цифры ответа - это цифры, за x * yкоторыми следуют цифры, за x + yкоторыми следуют цифры x - y. Очень просто.

Правила:

  • Стандартные лазейки запрещены.
  • Это поэтому выигрывает самый короткий код в байтах.
  • Проверка входных данных не требуется. Эта программа может аварийно завершить работу или вернуть мусор при неправильном вводе.
  • Вы можете использовать числовые функции и операторы (включая целочисленные и с плавающей точкой, функции математической библиотеки и другие функции, которые принимают и возвращают числа).
  • Вам разрешено использовать функцию, которая возвращает количество цифр числа, если это применимо.
  • Вы не можете использовать строки или любые виды конкатенации в любом месте вашего кода.
  • Результат может быть возвращен или помещен в стек, в зависимости от языка. Результатом должно быть целое число, а не строка.

Образец кода:

Dyalog APL :

Следующий код создает двоичный оператор с именем X.

Х ← {(⍺-⍵) + ((⍺ + ⍵) × 10 * 1 + ⌊10⍟⍺-⍵) + ⍺ × ⍵ × 10 * (2 + ⌊10⍟⍺ + ⍵) + ⌊10⍟⍺- ⍵}

Объяснение:

  • В APL вы оцениваете справа налево.

  • ⍺ and ⍵ левый и правый операнд соответственно

  • ⌊10⍟⍺-⍵гласит: floor of log10(⍺-⍵). Сначала выполняется вычитание, затем логарифм, затем пол. Справа налево log10 делается для того, чтобы посчитать цифры ⍺-⍵(потом вы должны сложить 1).

  • ⍺×⍵×10*(...) гласит: 10 to the (...)th power, multiplied by ⍵, multiplied by ⍺

  • Следовательно, ⍺×⍵×10*(2+⌊10⍟⍺+⍵)+⌊10⍟⍺-⍵это произведение, смещенное влево на сумму количества цифр суммы и разности. Умножение на степень 10 сместит целое число влево.

  • ((⍺+⍵)×10*1+⌊10⍟⍺-⍵) сумма, сдвинутая влево на количество цифр разницы.

  • (⍺-⍵)это разница. Сдвиг не требуется здесь.

  • X←{...} как вы определяете оператор в APL.

Примеры:

      8 X 2
16106
      5 X 4
2091
      9 X 6
54153

GNU dc:

Следующий код создает макрос с именем a:

[sysx10lxly-dseZdsclxly+dsd+Z1+^lxly**10lc^ld*+le+]sa

Объяснение:

  • sxи syвытолкнуть элемент из стека и сохранить его в регистрах xи y, соответственно.

  • lxи lyзагрузить элемент из регистров xи yсоответственно и поместить его в стек.

  • d дублирует последний элемент в стеке.

  • ^ вычисляет силу двух чисел.

  • Zвыскакивает число и возвращает его количество цифр. Это сделано потому, что dcне имеет функции логарифма.

  • [...]saхранит макрос в реестре a. laзагружает это. xвыполняет макрос в верхней части стека.

Примеры:

8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153
Locoluis
источник
Я предполагаю, что преобразование из целого числа в строку недопустимо?
Энтони Фам
2
Я думаю, что у нас был такой же вызов, но я не знаю, на каких условиях он найдет обман.
xnor
2
@AnthonyPham «Вы не можете использовать строки или любые виды конкатенации в любом месте вашего кода».
Только для ASCII
1
Можем ли мы взять пару целых чисел в качестве входных данных?
Конор О'Брайен,
1
Могу ли я сделать полную программу вместо функции?
Эрик Outgolfer

Ответы:

10

JavaScript (ES7), 63 61 59 байт

Сохранено 4 байта благодаря Нейлу .

(a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c)

<input id=a type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-~Math.log10(c)+c))(+a.value,+b.value)">
<input id=b type=number oninput="c.innerText=((a,b)=>[a*b,a+b,a-b].reduce((p,c)=>p*10**-!Math.log10(c)+c))(+a.value,+b.value)">
<p id=c>

ASCII-только
источник
Сохраните несколько байтов, используя 10**-~Math.log10(c). (Но +1 за использование reduce, конечно.)
Нил
"ES7" О, ради любви к кодированию ... Они делают еще один?
Feathercrown
@ Feeercrown Да, но разве это хуже, чем слушать "Java 9"? Плюс к этому есть полезные вещи, такие как async/ awaitи оператор возведения в степень**
только ASCII
@ ASCII-only **действительно полезно, я согласен. Это должно было быть в ES6.
Feathercrown
8

C, 79 75 байтов

Спасибо @GB за сохранение 4 байта!

#define X for(c=1;(c*=10)<=a
c,d;f(a,b){X+b;);d=c*a*b+a+b;X-b;);a=d*c+a-b;}

Попробуйте онлайн!

Steadybox
источник
1
Сохранить несколько байт с помощью определения вместо функции: tio.run/nexus/...
GB
6

Баш, 66

  • 2 байта сохранены благодаря @chepner.
f()(s=$[$1+$2]
d=$[$1-$2]
echo $[($1*$2*10**${#s}+s)*10**${#d}+d])

Попробуйте онлайн .

Цифровая травма
источник
Можно сделать это почти в два раза короче, если вы поместите свои переменные (s, d и другую для умножения, которые вы не определили) рядом друг с другом и оцените это как арифметическое выражение.
Максим Михайлов
3
@MaxLawnboy Да, хотя это звучит очень похоже на конкатенацию запрещенных строк для меня.
Цифровая травма
1
Имена идентификаторов внутри $[...]могут быть расширены без явного $(например, dвместо $d), за исключением двух символов
chepner
@chepner да - спасибо - я пропустил это.
Цифровая травма
Нашел еще два; использовать ((s=$1+$2,d=$1-$2))для инициализации двух переменных.
chepner
5

EXCEL, 61 байт

=A1-B1+(A1+B1)*10^LEN(A1-B1)+A1*B1*10^(LEN(A1-B1)+LEN(A1+B1))

Excel, 18 байт недействительно

=A1*B1&A1+B1&A1-B1
Йорг Хюльсерманн
источник
5

С накоплением , 36 байт

,@A$(*+-){!A...n!}"!{%y#'10\^x*y+}#\

Попробуйте онлайн!

Ранее: ,@A$(-+*){!A...n!}"!:inits$#'"!$summap:pop@.10\^1\,\*sum

Я собираюсь попытаться выжать один или два байта, прежде чем писать объяснение. ( #'= размер, и "это «делать на каждом», здесь нет никаких строк.)

Неконкурирующих по 26 байт: $(*+-)#!!:{%y#'10\^x*y+}#\.

Конор О'Брайен
источник
5

TI-Basic, 34 33 байта

Prompt A,B
A-B+(A+B)10^(1+int(log(A-B
Ans+AB10^(1+int(log(Ans
pizzapants184
источник
я думаю Prompt A,B также должно работать
Конор О'Брайен
@ ConorO'Brien Ты прав!
pizzapants184
4

GNU dc, 36

Определяет макрос, mкоторый принимает два верхних элемента стека, применяет макрос и оставляет результат в стеке (согласно примеру в вопросе):

[sadsbla-dZAr^lalb+*+dZAr^lalb**+]sm

Попробуйте онлайн .

Цифровая травма
источник
3

Perl 6 ,  81 61  58 байт

->\x,\y{($/=($/=x- y)+(x+y)*({10**$++}...*>$/).tail)+x*y*({10**$++}...*>$/).tail}

Попытайся

->\x,\y{(x*y,x+y,x- y).reduce:{$^a*10**Int(1+log10($^b))+$b}}

Попытайся

->\x,\y{[[&({$^a*10**Int(1+$^b.log10)+$b})]] x*y,x+y,x- y}

Попытайся

Брэд Гилберт b2gills
источник
Не зная Perl 6, я был немного удивлен, обнаружив, что x-yэто правильный идентификатор.
Нил
3

Желе , 27 байт

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵*
ạ,+,×Fæ.ç

Определяет двоичную ссылку / функцию, вызываемую с помощью ç. Принимает два целых числа в качестве входных данных и возвращает целое число. Он имеет дополнительный бонус в виде возможности взять х <у или х> y, используя абсолютную разницу.

Попробуйте онлайн!

Объяснение:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create link which computes what order of magnitude
                        to multiply the difference, sum, and product by
ạ,+,×Fæ.ç         -- Main link, applies this using dot product

Детали:

+,ạ,.1Fl⁵Ḟ‘€Ṛ+\⁵* -- Create dyadic like which does the following:
       l⁵Ḟ‘       -- Create operation which computes number of digits
                       (log base 10 (⁵ is the literal 10), floored, incremented)
           €      -- Apply this to each element in
+,ạ,.1F           -- ... the list [sum,difference,.1]
            R     -- Reverse the list
             +\   -- Add up first n elements to get list.
               ⁵* -- Raise 10 (⁵ is literal 10) to the power of each element

ạ,+,×Fæ.ç         -- Main link, applies above link
ạ,+,×F            -- The list [difference, sum, product]
      æ.          -- Dot product (multiply corresponding elements) with
        ç         -- The above link.
fireflame241
источник
2

PHP, 79 75 байт

две версии:

[,$a,$b]=$argv;echo(10**strlen($s=$a+$b)*$a*$b+$s)*10**strlen($d=$a-$b)+$d;
[,$a,$b]=$argv;echo(10**strlen($a+$b)*$a*$b+$a+$b)*10**strlen($a-$b)+$a-$b;

принимает входные данные из аргументов командной строки; беги с -r.

Я думаю, strlenквалифицируется как «функция, которая возвращает количество цифр»,
хотя она использует число в виде строки. Дайте мне знать, если нет.

Titus
источник
«Вы не можете использовать строки или любые виды конкатенации в любом месте вашего кода.», Поэтому я не думаю, что strlenэто правильно.
Numbermaniac
@numbermaniac Пусть ОП решит. По моему мнению, ограничение заключалось в том, чтобы заставить решения создавать один результат, а не просто печатать три результата друг за другом. Все, что за этим стоит, придирается.
Тит
2

C (gcc) , 70 байт

#define _ for(c=1;a+b>=(c*=10););d=c*d+a-(b=-b);
c,d;f(a,b){d=a*b;_ _}

Попробуйте онлайн!

основанный на ответе Steadybox , помещая все в макрос для игры в гольф немного больше.

(Примечание: назначение результата dвместо aработ неожиданно. Я посмотрел на сгенерированный ассемблерный код, и, похоже, все в порядке.)

гигабайт
источник
2

Haskell, 54 байта

a%0=a
a%b=10*a%div b 10+mod b 10
a#b=(a*b)%(a+b)%(a-b)

Головоломка реализована через инфиксную функцию #, например 8#2 = 16106. Другая функция %определяет конкатенацию base-10 (при условии, что RHS больше 0).

азотистый
источник
1

PHP, 87 байт

[,$a,$b]=$argv;echo($s=$a-$b)+($t=$a+$b)*10**($l=strlen($s))+$a*$b*10**($l+strlen($t));

и неверное решение для 37 байт

[,$a,$b]=$argv;echo$a*$b,$a+$b,$a-$b;
Йорг Хюльсерманн
источник
1

Рубин, 61 байт

->a,b{[a*b,a+b,a-b].reduce{|x,y|z=y;x*=10while(z>z/=10);x+y}}

Что подозрительно похоже на этот ответ Javascript, но без логарифма.

гигабайт
источник
1

Питон, 92 91 символ

def g(x,y):
    l=lambda x,i=0:l(x/10,i+1)if x else 10**i
    a=x-y
    a+=(x+y)*l(a)
    return x*y*l(a)+a

Благодаря предложению Wizards;)

Hermen
источник
Добро пожаловать на сайт! Вам не нужно пространство между )и if.
Wheat Wizard
1

R (3.3.1), 104 байта

function(x,y)Reduce(function(p,q)p*10^(floor(log10(q)+1))+q,lapply(c(`*`,`+`,`-`),function(z)z(x,y)),0)

возвращает анонимную функцию.

Это моя первая попытка игры в гольф, поэтому любые отзывы приветствуются.

Giuseppe
источник
1
Я бы сказал, чтобы попытаться избежать определения функций через зарезервированное слово «функция», если это вообще возможно, он использует много байтов. Просто сделайте расчет.
user11599
0

REXX, 70 байт

f:arg a b
c=a-b
c=(a+b)*10**length(c)+c
c=a*b*10**length(c)+c
return c

Конечно, родной путь был бы намного короче

f:arg a b
return a*b||a+b||a-b
idrougge
источник
0

PowerShell, 88 байт

param($x,$y)$l=2;if(($a=$x+$y)-gt9){$l++};($x*$y)*[math]::Pow(10,$l)+$a*10+$x-$y

PowerShell не имеет оператора питания, который не помогает. Также нельзя посчитать длину целого числа, если вы не посчитаете его как строку, что мы не можем сделать, поэтому я проверяю, является ли оно -gt9, чтобы узнать длину. Вероятно, может быть более кратким, но я должен вернуться к работе.

Matt
источник
0

Python 2.7, 109 96 байт

import math
a=lambda n:10**int(math.log10(10*n))
b,c=input()
d=b-c+(b+c)*a(b-c)
print d+b*c*a(d)

Исправлено после следующих правил конкурса. Кредиты mbomb007 для уменьшения кода со 109 до 96 байтов

Койшор Рой
источник
1
Из правил этого соревнования -•You're not allowed to use strings or any kind of concatenation anywhere in your code.
AdmBorkBork
Вы можете сохранить несколько байтов, сделав aлямбду. a=lambda n:10**int(..., Вы также можете сделать это b,c=input(), указав два ввода через запятую.
mbomb007
@ mbomb007 b, c = input () дает TypeError: объект 'int' не повторяется. Я попробовал это. И лямбда-функция не будет сохранять байты, потому что я вызываю функцию дважды в коде. попробовал это тоже. :(
Койшор Рой
@KoishoreRoy Я не думаю, что вы понимаете, о чем я. 96 байтов
mbomb007
0

J , 25 байт

X=.10#.[:;10#.inv&.>*;+;-
  1. *;+;- Вставьте результаты каждой операции.
  2. 10#.inv&.>Преобразуйте каждый результат в массив из 10 цифр. ( invесть ^:_1)
  3. [:; Распаковать и присоединиться к массивам.
  4. 10#. Преобразуйте массив из 10 цифр в целое число.
  5. X=.определите выше как оператор X.

Полученные результаты:

   8 X 2
16106
   5 X 4
2091
   9 X 6
54153
датчанин
источник
Вам не нужноX=.
Cyoce
@Cyoce - пример кода APL в вызове определяет оператор. Я почти уверен, что мы должны определить многоразовый оператор для этой задачи.
датчанин
"3. [:; Распаковать и присоединиться к массивам." - «Вы не можете использовать строки или любые виды конкатенации в любом месте вашего кода».
NGN
@ngn - Пожалуйста, разверните ваш комментарий. Ни в коем случае не используются строки.
датчанин
Я просто хотел указать, что «соединение» («ссылка»?) Может составлять «вид конкатенации», хотя я не очень знаком с J, и я не уверен, как интерпретировать формулировку проблемы в этом случае , Мое собственное решение поднимает подобные вопросы - я использую прядение (сопоставление существительных в APL образует вектор), которое может быть таким же, как «ссылка» J, но без глифа для его представления.
нгн
0

Mathematica, 67 байт

c=Ceiling;l=Log10;#-#2+(#+#2)10^(c@l[#-#2]/. 0->1)+10^c@l[2#]10#2#&

Принимает x-y, затем берет log10 x-y, округляет его, вычисляет 10 до степени, а затем умножает на x+y. Но мы также должны рассмотреть вопрос о log10(x-y)том, чтобы быть 0, поэтому мы заменяем 0 на 1. Затем мы берем log10 2x, округлил плюс 1 и находим 10 в степени этого. Умножьте это на xyи добавьте это.

numbermaniac
источник
0

05AB1E , 23 22 16 байтов

-Dg°¹²+*Dg°¹²**O

Попробуйте онлайн!

Мы могли бы сэкономить несколько байтов, если бы нам было разрешено использовать строки в программе (но не в вычислениях), зацикливаясь на строке, содержащей операции "-+*", поскольку код, выполняемый для каждой операции, одинаков.
Конечно, если бы нам было разрешено использовать конкатенацию, мы бы сэкономили гораздо больше.

Emigna
источник
0

R, 64 байта

x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)

Использование:

> x=scan();(b=(a=diff(-x))+10^nchar(a)*sum(x))+10^nchar(b)*prod(x)
1: 8 2
3: 
Read 2 items
[1] 16106
user11599
источник