Wprowadzenie
Zdefiniujmy nową operację arytmetyczną, którą nazywam mnożeniem suwaka . Aby zignorować pomnożenie dwóch nieujemnych liczb całkowitych, dodajesz zera wiodące, aby dopasować długości, mnożymy odpowiadające im 10-cyfrowe cyfry liczb, dodajesz zera wiodące do wyników, aby uzyskać 2-cyfrowe liczby, konkatenować je, a na końcu upuszczać zera wiodące.
Oto przykład z A = 1276 i B = 933024 :
1. Add leading zeros
A = 001276
B = 933024
2. Multiply digit-wise
A = 0 0 1 2 7 6
B = 9 9 3 0 2 4
-> 0 0 3 0 14 24
3. Pad to 2 digits
-> 00 00 03 00 14 24
4. Concatenate
-> 000003001424
5. Drop leading zeros
-> 3001424
Operacja jest rozszerzona na wszystkie liczby całkowite ze zwykłymi regułami znakowania: czasy dodatnie ujemne są ujemne, czasy ujemne ujemne są dodatnie i tak dalej.
Zadanie
Twoje dane wejściowe to dwie liczby całkowite, a wynikiem jest ich pomnożenie przez suwak. Powinieneś być w stanie obsłużyć dowolnie duże dane wejściowe. Dane wejściowe i / lub wyjściowe mogą mieć format łańcuchowy (i rzeczywiście muszą być, jeśli twój język nie obsługuje dowolnie dużych liczb całkowitych). Pamiętaj, że -0
nie jest to prawidłowe wejście lub wyjście.
Zasady i punktacja
Możesz napisać pełny program lub funkcję, a wygrywa najniższa liczba bajtów.
Przypadki testowe
0 0 -> 0
302 40 -> 0
302 -40 -> 0
-4352 448 -> -122016
0 6623 -> 0
0 -6623 -> 0
20643 -56721 -> -1000420803
63196 21220 -> 1203021800
1276 933024 -> 3001424
-1276 933024 -> -3001424
-1276 -933024 -> 3001424
5007204555 350073039 -> 12001545
-612137119 -8088606033 -> 816060042000327
3389903661 -6619166963 -> -18180881090018543603
-23082746128560880381 1116941217 -> -8050600723200060807
-668336881543038127783364011867 896431401738330915057436190556 -> -485448120906320001351224000900090235004021121824000900403042
402878826066336701417493206805490000415 312487283677673237790517973105761463808 -> 120004325656161618004242182118140007280900200921180018080025285400000000320040
źródło
b⁵
zD
aby uzyskać 10 bajtów. : PPython 2, 99 bajtów
Wiele bajtów ma na celu uwzględnienie znaku w przypadku negatywnych danych wejściowych. W Pythonie
n%d
jest zawsze nieujemny, jeślid
jest dodatni 1 . Moim zdaniem jest to na ogół pożądane, ale tutaj wydaje się niewygodne: usunięcie wywołańabs
spowoduje uszkodzenie powyższego kodu. Tymczasemp
śledzi „wartość miejsca” (jedynki, setki itp.), A także zapamiętuje pożądany znak wyniku.Kod jest zasadniczo symetryczny
a
ib
pozawhile
warunkiem: kontynuujemy doa
zera i w tym czasie. Oczywiście, jeślib
najpierw jest zero, to przez pewien czas dodamy zera, aż doa
zera.1 Na przykład
(-33)%10
zwraca7
, a iloraz liczby całkowitej(-33)/10
wynosi-4
. Jest to poprawne, ponieważ(-4)*10 + 7 = -33
. Jednak produkt z zamkiem błyskawicznym(-33)
z33
musi kończyć się3*3 = 09
raczej niż7*3 = 21
.źródło
JavaScript (ES6), 44 bajty
Dogodnie działa to automatycznie dla liczb ujemnych.
źródło
f=
liczbę bajtów. Również|0
dlatego, że muszę podział liczby całkowitej, nie wiem, jak myślisz, że jesteś coraz właściwą odpowiedź bez niego.|0
. Być może ponowne przypisanie nowej funkcji do f nie zadziałało i nadal testowałem starą wersję|0
.C, 77 bajtów
-2 bajty do usuwania zbędnych nawiasów klamrowych (
*
jest skojarzone).t
= 1 100,10000, ... służy do wypełnienia. Dopókia
lubb
nie jest zero keep multiplicating ostatnią cyfrę%10
zt
i akumuluj. Następnie usuń ostatnią cyfręa
ib
(/=10
) i przesuńt
o 2 cyfry (*=100
).Niegolfowane i użytkowanie:
źródło
for(r=0;a|b;t*=100)r+=a%10*t*(b%10),a/=10,b/=10
zamiastr=0;while(a|b)r+=t*(a%10)*(b%10),a/=10,b/=10,t*=100
Faktycznie ,
2319 bajtówDane wejściowe są traktowane jako dwa ciągi. Ponadto, najwyraźniej próba konwersji z bazy 100, jak robi ais523 w ich odpowiedzi na żelki, nie działa tak dobrze w rzeczywistości. Zaoszczędziłbym również 9 bajtów, gdyby zadziałało: / Sugestie dotyczące gry w golfa mile widziane! Wypróbuj online!
Edycja: -4 bajty od zmiany sposobu budowania wyniku na nową liczbę.
Ungolfing
źródło
Mathematica 66 bajtów
Nie golfowany:
gdzie% oznacza poprzednią wydajność
źródło
R,
18211010786 bajtówNie jest to już najdłuższa odpowiedź (dzięki, Rakieta), a w rzeczywistości krótsza niż rozwiązanie Python (rzadka uczta)! Anonimowa funkcja, która przyjmuje dwie liczby całkowite jako dane wejściowe.
Oto jak to działa.
Mnożenie zamka błyskawicznego polega na dzieleniu liczb wejściowych na ich cyfry składowe. Bierzemy wartość bezwzględną liczby i wykonujemy modulo dla malejących mocy 10:
Więc bierzemy jedną liczbę
x
i stosujemy modulo z 99 innymi liczbami (10^99
przez10^1
). R domyślnie powtarza sięx
99 razy, zwracając wektor (listę) z 99 elementami. (x %% 10^99
,x %% 10^98
,x %% 10^97
Etc.)Używamy
10^99
przez10^1
. Bardziej wydajna implementacja wykorzystałaby wartość liczby cyfr w najdłuższej liczbie (sprawdź historię edycji tego postu; poprzednie wersje to zrobiły), ale po prostu biorąc99..1
mniej bajtów.Za
x = 1276
to daje namNastępnie używamy dzielenia liczb całkowitych, zmniejszając moc 10, aby zaokrąglić liczby:
To daje
która jest dokładnie taką reprezentacją, jakiej chcemy. W kodzie chcemy
10^(98:0)
później użyć ponownie, więc przypisujemy go do zmiennej:(Zawijanie wyrażenia w nawiasach w R zazwyczaj ocenia to wyrażenie (w tym przypadku przypisując wartość
10^(98:0)
doe
), a następnie zwraca wynik wyrażenia, co pozwala nam osadzać przypisania zmiennych w innych obliczeniach.)Następnie wykonujemy mnożenie par cyfr na wejściu. Dane wyjściowe są następnie dopełniane do dwóch cyfr i łączone. Dopełnianie do dwóch cyfr i łączenie jest równoznaczne z pomnożeniem każdej liczby przez
10^n
, gdzien
jest odległość od prawej krawędzi, a następnie zsumowaniem wszystkich liczb.Warto zauważyć, że ponieważ mnożenie jest przemienne, możemy wykonać mnożenie przez
10^n
przed mnożymy A przez B . Tak więc bierzemy nasze wcześniejsze obliczenia i mnożymy przez10^(98:0)
:co jest równoważne z
Po zastosowaniu tego do A , to my wtedy chcą powtórzyć całą operację na B . Ale to zajmuje cenne bajty, więc definiujemy funkcję, więc musimy ją zapisać tylko raz:
Robimy naszą sztuczkę osadzania w nawiasach, aby umożliwić nam zdefiniowanie i zastosowanie funkcji w tym samym czasie, wywołanie tej funkcji na A i B i pomnożenie ich razem. (Moglibyśmy zdefiniować to w osobnej linii, ale ponieważ ostatecznie zamierzamy umieścić to wszystko w anonimowej funkcji, jeśli mamy więcej niż jedną linię kodu, wszystko musi być owinięte w nawiasy klamrowe, co kosztuje cenne bajtów).
I bierzemy sumę tego wszystkiego i jesteśmy prawie skończeni:
Jedyne, co należy teraz rozważyć, to znak danych wejściowych. Chcemy przestrzegać regularnych zasad mnożenia, więc jeśli jeden i tylko jeden z A i B jest ujemny, wynik jest ujemny. Używamy funkcji,
sign
która zwraca,1
gdy otrzyma liczbę dodatnią i-1
gdy otrzyma liczbę ujemną, w celu uzyskania współczynnika, który mnożymy przez całe nasze obliczenia przez:Wreszcie, całość jest zapakowana w anonimową funkcję, która przyjmuje
a
ib
jako dane wejściowe:Usuń biały znak i jego 86 bajtów.
źródło
Python 3 ,
92 bajty, 119 bajtówWypróbuj online!
Poprawka do obsługi liczb ujemnych kosztuje 29 bajtów: /
źródło
lstrip
część, pakując wszystko do środkaint()
i zwracając liczbę.Pyke, 16 bajtów
Wypróbuj tutaj!
Gdzie jest bajtem
0x84
lub132
źródło
PHP, 84 bajty
nieco dłużej z konkatenacją łańcuchów (86 bajtów):
źródło
Rakieta 325 bajtów
Nie golfowany:
Testowanie:
Wynik:
źródło
PowerShell ,
153151 bajtówWypróbuj online!
Mniej golfa:
źródło
Perl 5
-MList::Util=min
, 140 bajtówWypróbuj online!
źródło