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

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>


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,


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 .


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

5

Skumulowane , 36 bajtów

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

Wypróbuj online!

Poprzednio: ,@A$(-+*){!A...n!}"!:inits$#'"!$summap:pop@.10\^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+}#\.



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 .


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


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.

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.


„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.)


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).



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;

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.


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;)


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.


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

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.


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


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

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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.