Operator, który łączy sumę, iloczyn i różnicę między dwiema liczbami

28

Wyzwanie:

W sieciach społecznościowych krąży głupia łamigłówka, która brzmi:

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

Zaimplementuj funkcję lub operator, który, jeśli otrzyma dwie dodatnie liczby całkowite xi ytaki, który x > y > 0daje poprawną odpowiedź jako liczbę całkowitą , gdzie cyfry odpowiedzi to cyfry, x * ypo której następuje cyfra, x + ypo której następuje cyfra x - y. Bardzo prosty.

Zasady:

  • Standardowe luki są niedozwolone.
  • To jest więc wygrywa najkrótszy kod w bajtach.
  • Sprawdzanie poprawności danych wejściowych nie jest wymagane. Ten program może się zawiesić lub zwrócić śmieci, jeśli otrzyma nieprawidłowe dane wejściowe.
  • Możesz używać funkcji numerycznych i operatorów (w tym liczb całkowitych i zmiennoprzecinkowych, funkcji biblioteki matematycznej i innych funkcji, które akceptują i zwracają liczby).
  • Możesz użyć funkcji, która zwraca liczbę cyfr liczby, jeśli dotyczy.
  • Teraz nie wolno używać łańcuchów lub jakiejkolwiek konkatenacji gdziekolwiek w kodzie.
  • Wynik może zostać zwrócony lub przekazany na stos, w zależności od tego, który język ma zastosowanie. Wynik musi być liczbą całkowitą, a nie ciągiem.

Przykładowy kod:

Dyalog APL :

Poniższy kod tworzy dynamiczny operator o nazwie X.

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

Wyjaśnienie:

  • W APL oceniasz od prawej do lewej.

  • ⍺ and ⍵ są odpowiednio lewym i prawym operandem

  • ⌊10⍟⍺-⍵brzmi: floor of log10(⍺-⍵). Najpierw wykonuje odejmowanie, następnie logarytm, a następnie podłogę. Z prawej do lewej. log10 odbywa się w celu zliczenia cyfr ⍺-⍵(należy następnie zsumować 1).

  • ⍺×⍵×10*(...) czyta: 10 to the (...)th power, multiplied by ⍵, multiplied by ⍺

  • Stąd ⍺×⍵×10*(2+⌊10⍟⍺+⍵)+⌊10⍟⍺-⍵iloczyn produktu przesunięty w lewo o sumę liczby cyfr sumy i różnicy. Pomnożenie przez potęgę 10 spowoduje przesunięcie liczby całkowitej w lewo.

  • ((⍺+⍵)×10*1+⌊10⍟⍺-⍵) to suma przesunięta w lewo o liczbę cyfr różnicy.

  • (⍺-⍵)jest różnica. Nie jest wymagana żadna zmiana biegów.

  • X←{...} to sposób definiowania operatora w APL.

Przykłady:

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

GNU dc:

Poniższy kod tworzy makro o nazwie a:

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

Wyjaśnienie:

  • sxi sywyskakuje element ze stosu i zapisuje go odpowiednio w rejestrach xi y.

  • lxi lyzaładuj element z rejestrów xi yodpowiednio i wepchnij go na stos.

  • d duplikuje ostatni element na stosie.

  • ^ oblicza potęgę dwóch liczb.

  • Zwyskakuje liczba i zwraca liczbę cyfr. Odbywa się to, ponieważ dcnie ma funkcji logarytmu.

  • [...]saprzechowuje makro w rejestrze a. laładuje to. xwykonuje makro na górze stosu.

Przykłady:

8 2 laxn
16106
5 4 laxn
2091
9 6 laxn
54153
Locoluis
źródło
Zakładam, że konwersja z liczby całkowitej na ciąg jest nieprawidłowa?
Anthony Pham,
2
Myślę, że mieliśmy podobne wyzwanie, ale nie wiem, jakie warunki mogłyby znaleźć dupe.
xnor
2
@AnthonyPham „Nie wolno używać ciągów ani żadnych konkatenacji w dowolnym miejscu w kodzie”.
Tylko ASCII
1
Czy możemy wziąć parę liczb całkowitych jako dane wejściowe?
Conor O'Brien
1
Czy mogę zrobić pełny program zamiast funkcji?
Erik the Outgolfer

Odpowiedzi:

10

JavaScript (ES7), 63 61 59 bajtów

Zaoszczędzono 4 bajty dzięki Neilowi .

(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>

Tylko ASCII
źródło
Zaoszczędź kilka bajtów 10**-~Math.log10(c). (Ale reduceoczywiście +1 za użycie ).
Neil
„ES7” Och, z miłości do kodowania… Robią kolejną?
Feathercrown,
@ Feathercrown Tak, ale czy to naprawdę gorsze niż usłyszenie „Java 9”? Dodatkowo ma przydatne rzeczy, takie jak async/ awaiti operator potęgowania**
tylko ASCII
@ Tylko ASCII **jest naprawdę przydatne, zgadzam się. To powinno być w ES6.
Feathercrown,
8

C, 79 75 bajtów

Dzięki @GB za zapisanie 4 bajtów!

#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;}

Wypróbuj online!

Steadybox
źródło
1
Zaoszczędź niektóre bajty, używając funkcji definicyjnej
GB
6

Bash, 66

  • 2 bajty zapisane dzięki @chepner.
f()(s=$[$1+$2]
d=$[$1-$2]
echo $[($1*$2*10**${#s}+s)*10**${#d}+d])

Wypróbuj online .

Cyfrowa trauma
źródło
Można to zrobić prawie dwa razy krócej, jeśli umieścisz obok siebie zmienne (s, d i drugą dla mnożenia, których nie zdefiniowałeś) i ocenisz jako wyrażenie arytmetyczne.
Maxim Mikhaylov,
3
@MaxLawnboy Tak, choć dla mnie to brzmi jak zakazana konkatenacja łańcucha.
Cyfrowa trauma
1
Nazwy identyfikatorów wewnątrz $[...]podlegają rozszerzaniu parametrów bez wyraźnego $(np. dZamiast $d) zapisywania dwóch znaków.
chepner
@chepner tak - dzięki - tęskniłem za nimi.
Cyfrowa trauma
Znaleziono kolejne dwa; Użyj, ((s=$1+$2,d=$1-$2))aby zainicjalizować dwie zmienne.
chepner
5

EXCEL, 61 bajtów

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

Excel, 18 bajtów niepoprawny

=A1*B1&A1+B1&A1-B1
Jörg Hülsermann
źródło
5

Skumulowane , 36 bajtów

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

Wypróbuj online!

Poprzednio: ,@A$(-+*){!A...n!}"!:inits$#'"!$summap:[email protected]\^1\,\*sum

Spróbuję wycisnąć bajt lub dwa przed napisaniem wyjaśnienia. ( #'= rozmiar i "jest „zrób na każdym”, nie dołączono tutaj żadnych ciągów.)

Noncompeting na 26 bajtów: $(*+-)#!!:{%y#'10\^x*y+}#\.

Conor O'Brien
źródło
5

TI-Basic, 34 33 bajty

Prompt A,B
A-B+(A+B)10^(1+int(log(A-B
Ans+AB10^(1+int(log(Ans
pizzapanty184
źródło
Myślę, że Prompt A,Bpowinien również działać
Conor O'Brien
@ ConorO'Brien Masz rację!
pizzapants184
4

GNU dc, 36

Definiuje makro, mktóre bierze dwa górne elementy stosu, stosuje makro i pozostawia wynik na stosie (jak w przykładzie w pytaniu):

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

Wypróbuj online .

Cyfrowa trauma
źródło
3

Perl 6 ,  81 61  58 bajtów

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

Spróbuj

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

Spróbuj

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

Spróbuj

Brad Gilbert b2gills
źródło
Nie znając Perla 6, byłem lekko zaskoczony odkryciem, że x-yjest to prawidłowy identyfikator.
Neil,
3

Galaretka , 27 bajtów

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

Definiuje diademiczne łącze / funkcję, które można wywołać za pomocą ç. Pobiera na wejściu dwie liczby całkowite i zwraca liczbę całkowitą. Ma dodatkową zaletę, że jest w stanie wziąć x <y lub x >y przy użyciu absolutnej różnicy.

Wypróbuj online!

Wyjaśnienie:

+,ạ,.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

Detale:

+,ạ,.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
źródło
2

PHP, 79 75 bajtów

dwie wersje:

[,$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;

pobiera dane wejściowe z argumentów wiersza poleceń; biegać z -r.

Wydaje mi się, że strlenkwalifikuje się jako „funkcja zwracająca liczbę cyfr”,
chociaż używa liczby jako łańcucha. Daj mi znać, jeśli nie.

Tytus
źródło
„Nie wolno używać ciągów ani żadnego rodzaju konkatenacji w dowolnym miejscu w kodzie.”, Więc nie sądzę, aby strlenbyła poprawna.
numbermaniac
@numbermaniac Niech OP zdecyduje. Imo ograniczenie polegało na zmuszeniu rozwiązań do stworzenia jednego wyniku zamiast drukowania tylko trzech wyników po sobie. Wszystko poza tym jest podstępne.
Tytus
2

C (gcc) , 70 bajtów

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

Wypróbuj online!

na podstawie odpowiedzi Steadyboksa , umieszczając wszystko w makrze, aby trochę więcej w golfa.

(Uwaga: nieoczekiwanie przypisanie wyniku dzamiast apracy. Spojrzałem na wygenerowany kod asemblera i wydaje się być w porządku.)

GB
źródło
2

Haskell, 54 bajty

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

Układanka jest realizowana za pomocą funkcji infix #, np 8#2 = 16106. Druga funkcja %definiuje konkatenację base-10 (przy założeniu, że RHS jest większy niż 0).

azotawy
źródło
1

PHP, 87 bajtów

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

i nieprawidłowe rozwiązanie dla 37 bajtów

[,$a,$b]=$argv;echo$a*$b,$a+$b,$a-$b;
Jörg Hülsermann
źródło
1

Ruby, 61 bajtów

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

Które podejrzanie wygląda bardzo podobnie do tej odpowiedzi Javascript, ale bez logarytmu.

GB
źródło
1

Python, 92 91 znaków

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

Dzięki sugestii Czarodziejów;)

Hermen
źródło
Witamy na stronie! Nie potrzebujesz odstępu między )i if.
Kreator pszenicy
1

R (3.3.1), 104 bajty

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

zwraca anonimową funkcję.

To moja pierwsza gra w golfa, więc wszelkie uwagi są mile widziane.

Giuseppe
źródło
1
Powiedziałbym, że staram się unikać definiowania funkcji za pomocą słowa zastrzeżonego „funkcja”, jeśli w ogóle możliwe, zużywa dużo bajtów. Po prostu wykonaj obliczenia.
user11599 21.04.17
0

REXX, 70 bajtów

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

Oczywiście rodzimy sposób byłby znacznie krótszy:

f:arg a b
return a*b||a+b||a-b
idrougge
źródło
0

PowerShell, 88 bajtów

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

PowerShell nie ma operatora mocy, który nie pomaga. Nie można również policzyć długości liczby całkowitej, chyba że policzymy ją jako ciąg, czego nie możemy zrobić, więc sprawdzam, czy jest to -gt9, aby poznać długość. Prawdopodobnie może być bardziej zwięzły, ale muszę wrócić do pracy.

Matt
źródło
0

Python 2.7, 109 96 bajtów

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)

Poprawione po przestrzeganiu zasad konkursu. Kredyty dla mbomb007 za obniżenie kodu z 109 bajtów do 96 bajtów

Koishore Roy
źródło
1
Z zasad tego wyzwania -•You're not allowed to use strings or any kind of concatenation anywhere in your code.
AdmBorkBork
Możesz zaoszczędzić kilka bajtów, tworząc alambda. a=lambda n:10**int(.... Możesz także zrobić b,c=input(), podając dwa wejścia oddzielone przecinkiem.
mbomb007
@ mbomb007 b, c = input () daje TypeError: obiektu „int” nie można iterować. Próbowałem A funkcja lambda nie zapisuje bajtów, ponieważ wywołuję tę funkcję dwukrotnie w kodzie. też tego próbowałem. :(
Koishore Roy
@ KoishoreRoy Nie sądzę, że rozumiesz. 96 bajtów
mbomb007
0

J , 25 bajtów

X=.10#.[:;10#.inv&.>*;+;-
  1. *;+;- Umieść wyniki każdej operacji.
  2. 10#.inv&.>Konwertuj każdy wynik na tablicę 10 cyfr podstawowych. ( invjest ^:_1)
  3. [:; Rozpakuj i dołącz do tablic.
  4. 10#. Konwertuj tablicę 10 cyfr podstawowych na liczbę całkowitą.
  5. X=.zdefiniuj powyższe jako operator X.

Wyniki:

   8 X 2
16106
   5 X 4
2091
   9 X 6
54153
Duńczyk
źródło
Nie potrzebujeszX=.
Cyoce,
@Cyoce - przykładowy kod APL w wyzwaniu określa operatora. Jestem pewien, że mamy zdefiniować operatora wielokrotnego użytku dla tego wyzwania.
Dane
„3. [:; Rozpakuj i dołącz do tablic.” - „Nie wolno używać ciągów ani żadnych konkatenacji w dowolnym miejscu w kodzie.”
ngn
@ngn - rozwinąć swój komentarz. W żadnym momencie nie są używane łańcuchy.
Dane
Chciałem tylko zaznaczyć, że „dołącz” („link”?) Może stanowić „rodzaj konkatenacji”, chociaż J nie znam się dobrze i nie jestem pewien, jak interpretować opis problemu w tym przypadku . Moje własne rozwiązanie rodzi podobne pytania - używam splatania (zestawienie rzeczowników w APL tworzy wektor), który może być taki sam jak „link” J, ale bez glifu do jego przedstawienia.
ngn
0

Mathematica, 67 bajtów

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

Bierze x-y, a następnie bierze log10 x-y, zaokrągla w górę, oblicza 10 do potęgi tego, a następnie mnoży przez x+y. Ale musimy również rozważyć log10(x-y)bycie 0, więc zamieniamy 0 na 1. Następnie bierzemy log10 2x, zaokrąglone w górę, plus 1 i znajdujemy 10 na potęgę tego. Pomnóż to przez xyi dodaj to.

NumberManiac
źródło
0

05AB1E , 23 22 16 bajtów

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

Wypróbuj online!

Moglibyśmy zaoszczędzić kilka bajtów, gdybyśmy mogli używać ciągów w programie (ale nie w obliczeniach), zapętlając ciąg zawierający operacje "-+*", ponieważ kod wykonywany dla każdej operacji jest taki sam.
Oczywiście, gdyby pozwolono nam korzystać z konkatenacji, zaoszczędzilibyśmy znacznie więcej.

Emigna
źródło
0

R, 64 bajty

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

Stosowanie:

> 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
użytkownik11599
źródło