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


28

Виклик:

У соціальних мережах циркулює нерозумна головоломка, на якій написано:

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

Реалізуйте функцію чи оператора, який, якщо дано два додатних цілих числа xта yтакий, що x > y > 0дає правильну відповідь як ціле число , де цифрами відповіді є цифри, за якими x * yйдуть цифри, x + yа за ними - цифри x - y. Дуже просто.

Правила:

  • Стандартні лазівки заборонені.
  • Це тому найкоротший код в байтах виграє.
  • Перевірка вхідних даних не потрібна. Ця програма може вийти з ладу або повернути сміття, якщо йому дано недійсне введення.
  • Вам дозволяється використовувати числові функції та оператори (включаючи цілі чи плаваючі точки, функції математичної бібліотеки та інші функції, які приймають і повертають числа).
  • Ви можете використовувати функцію, яка повертає кількість цифр числа, якщо це можливо.
  • Ви НЕ дозволяється використовувати такі рядки або будь-якого виду конкатенації в будь-якому місці вашого коду.
  • Результат може бути повернутий або висунутий у стек, що залежно від мови. Результатом має бути ціле число, а не рядок.

Приклад коду:

Діалог APL :

Наступний код створює діадичний оператор з ім'ям X.

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

Я припускаю, що перетворення з цілого на рядок недійсне?
Ентоні Фам

2
Я думаю, у нас був такий виклик, як це, але не знаю, які умови знайдуть дупа.
xnor

2
@AnthonyPham "Вам заборонено використовувати рядки або будь-який тип конкатенації в будь-якому місці вашого коду."
Лише ASCII

1
Чи можемо ми взяти пару цілих чисел як вхідні дані?
Conor O'Brien

1
Чи можу я зробити повну програму замість функції?
Ерік Аутгольфер

Відповіді:


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>


Збережіть кілька байтів за допомогою 10**-~Math.log10(c). (Але +1 за використання reduce, звичайно.)
Ніл

"ES7" О, за любов до кодування ... Вони роблять ще один?
Feathercrown

@Feathercrown Так, але чи справді це гірше, ніж слухати "Java 9"? Плюс у ньому є корисні речі, такі як async/ awaitта оператор експоненції**
лише ASCII

@ ASCII-тільки **дуже корисний, я згоден. Це мало бути в ES6.
Feathercrown


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 так - дякую - я їх пропустив.
Цифрова травма

Знайшли ще двох; використовувати ((s=$1+$2,d=$1-$2))для ініціалізації двох змінних.
чепнер


5

Зіставлено , 36 байт

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

Спробуйте в Інтернеті!

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

Я спробую вичавити байт-два, перш ніж написати пояснення. ( #'= розмір і "є "робити на кожному", тут не додаються рядки.)

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





3

Желе , 27 байт

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

Визначає діадичну зв'язок / функцію, яку можна дзвонити за допомогою ç. Бере два цілі числа як вхідні дані і повертає ціле число. Він має додатковий бонус за можливість приймати x <y або x >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.

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кваліфікується як "функція, яка повертає кількість цифр",
хоча вона використовує число як рядок. Дайте мені знати, якщо ні.


«Ви не допускається до рядків використання або будь-якого виду конкатенації в будь-якому місці вашого коду.», Так що я не думаю , що 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. Інша функція, %визначає конкатенацію базової 10 (припускаючи, що РЧС перевищує 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

Завдяки пропозиції Майстрів;)


Ласкаво просимо на сайт! Вам не потрібно пробіл між )і if.
Пшеничний майстер

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)

повертає анонімну функцію.

Це моя перша спроба гольфу, тому будь-який відгук цінується.


1
Я б сказав, щоб спробувати уникнути визначення функцій зарезервованим словом 'function', якщо це взагалі можливо, воно використовує багато байтів. Просто зробіть обчислення.
користувач11599

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

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, щоб дізнатися довжину. Ймовірно, це може бути більш стислим, але я мушу повернутися до роботи.


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' не можна передати. Я спробував це. І лямбда-функція не буде економити байти, тому що я двічі викликаю функцію в коді. спробував це теж. :(
Koishore Roy

@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, але без гліфа для його представлення.
ngn

0

Математика, 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і додайте це.


0

05AB1E , 23 22 16 байт

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

Спробуйте в Інтернеті!

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


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.