var QUESTION_ID=106182,OVERRIDE_USER=8478;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Odpowiedzi:
Brachylog V1, 05AB1E, J, K, Underload, MATL, Forth, PigeonScript, Stacked, Implicit, Jolf, Clojure, Braingolf, 8th, Common Lisp, Julia, Pyt, Appleseed, Stax, Reality, dc 1 bajt
Możesz edytować tę odpowiedź, aby dodać inne języki, dla których
*
jest poprawna odpowiedź.źródło
*(5,16)
C (GCC), 13 bajtów
Nie działa na wszystkich implementacjach, ale jest OK.
Wypróbuj na TIO!
źródło
a
? Nie rozumiem ...a
jest zmienną stosu lokalnego dof()
- dlaczego zwracana jest jej wartość?). +1, btw - bardzo sprytne nadużycie ABI.return
kluczowe po prostu umieszcza redult swojego argumentu w rejestrze EAX. W tym przypadku wygenerowany plik wykonywalny dokonuje obliczeńa*b
w tym rejestrze, więcreturn
nic nie robi.f(a,b){a*=b;}
część na,1##&
a następnie zmieniając język na Mathematica.Beatnik , 888 bajtów
Wypróbuj online!
Używam interpretera C, ponieważ interpreter Pythona na TIO irytująco wykonuje adres, jeśli warunek skoku do tyłu nie jest spełniony. Prostym obejściem dla interpretera Pythona jest wypełnienie niektórych pól zerowych, aby adres stał się pusty. Uważam, że żadne z nich nie jest poprawne:
Dane wejściowe powinny składać się z dwóch liczb całkowitych oddzielonych spacją, bez końcowych znaków nowej linii.
Ta odpowiedź działa teoretycznie dla wszystkich liczb całkowitych, jeśli każda komórka może przechowywać dowolnie dużą wartość, nieograniczoną do 0 - 255. Ale przepełnia się, jeśli | A | + | B | > 22. I działa bardzo wolno, jeśli | A | + | B | > 6. Tak więc nie ma wielu przypadków, które można przetestować, a rozwiązanie if-else dla tych przypadków może być jeszcze krótsze.
Chodzi o obliczenie liczb trójkątnych T (N) = N (N + 1) / 2 poprzez zmniejszenie wartości do 0 i zsumowanie wszystkich wartości pośrednich. Wtedy możemy uzyskać odpowiedź A * B = T (A + B) - T (A) - T (B).
Jednak obliczenie wszystkich 3 wartości jest trudne. Robi to najpierw obliczając T (A + B) - A, pozostawiając kopię A na stosie, aby dodać później, i wykorzystując dane wejściowe B. Następnie rekurencyjnie znajdź największą trójkątną liczbę mniejszą niż ta, którą jest T ( A + B-1) z wyjątkiem zerowych przypadków specjalnych. Możemy odzyskać B = T (A + B) - A - T (A + B-1) i obliczyć T (B) stamtąd.
Liczba N jest liczbą trójkątną, jeżeli jest równa największej liczbie trójkątnej mniejszej niż N, plus liczba nieujemnych liczb trójkątnych mniejsza niż N. Działa to w O (2 ^ (T (A + B) -A)) i jest najwolniejszą częścią programu.
źródło
Mathematica, 4 bajty
Przykładowe użycie:
1##&[7,9]
zwraca63
. Rzeczywiście, ta sama funkcja zwielokrotnia dowolną liczbę argumentów dowolnego typu razem.Jak wiedzą kodegolfiści Mathematica, działa to, ponieważ
##
odnosi się do całej sekwencji argumentów funkcji, a konkatenacja w Mathematica (często) reprezentuje mnożenie;1##
odnosi się zatem do (1 razy) iloczynu wszystkich argumentów funkcji.&
Jest tylko krótki dlaFunction
komendy, która definiuje czystego funkcji (bez nazwy).Wewnątrz innego kodu wspólny symbol
*
działa jak mnożenie. Podobnie spacja, więc7 9
jest to interpretowane jako7*9
(w rzeczywistości, obecna wersja REPL Mathematica faktycznie wyświetla takie spacje, jak znaki mnożenia!). Co więcej, jeśli Mathematica może stwierdzić, gdzie zaczyna się jeden token, a drugi kończy, wówczas operator mnożenia wcale nie potrzebuje bajtów:5y
jest automatycznie interpretowany jako5*y
i3.14Log[9]
jako3.14*Log[9]
.źródło
##&
nieważnym?##&
zwraca listę argumentów jako obiekt „Sekwencja” - odpowiedni do podłączenia do innych funkcji, które pobierają wiele argumentów. W tym kontekście##&
nic nie robi z listą argumentów; chcemy, aby ta lista została pomnożona razem.Retina ,
383731 bajtówCałkowicie nowe podejście, stare jest poniżej.
Wypróbuj online!
Wyjaśnienie
Najpierw zajmujemy się znakiem:
dopasowuje wszystkie
-
w ciągu i zwraca je rozdzielone znakami nowej linii(z następną pustą linią)
*\)
oznacza, że wynik tego i poprzednich etapów powinien zostać wydrukowany bez nowej linii, a następnie ciąg znaków powrócił do poprzedniego stanu (ciąg wejściowy). Pozostała część usuwa dwa-
oddzielone znakiem nowej linii.Następnie przekształcamy pierwszą liczbę na unarną:
(na końcu pierwszego wiersza jest spacja).
_
W tym przypadku używamy jako naszej jednoznacznej cyfry, ponieważ standardowa cyfra1
może występować w drugim numerze, a to spowodowałoby konflikt później.Teraz dochodzimy do faktycznego pomnożenia:
Każdy z nich
_
jest zastępowany przez jednoargumentową reprezentację wszystkiego, co następuje po nim (nadal_
jako cyfra jedności). Ponieważ konwersja na jednoargumentowe ignoruje znaki niecyfrowe, powtórzy to jednoargumentową reprezentację drugiej liczby po raz pierwszy. Druga liczba pozostanie w postaci dziesiętnej na końcu łańcucha.Na koniec za pomocą jednego
_
zwracamy liczbę_
w ciągu, która będzie wynikiem pomnożenia.Poprzednia odpowiedź: (ostrzeżenie: wyświetla pusty ciąg znaków, gdy powinien wypisać
0
)Siatkówka ,
454241 bajtówZagrajmy w grę! Pomnóż liczby względne przez język, w którym nie ma operatorów arytmetycznych i ograniczone wsparcie tylko dla liczb naturalnych ... Brzmi zabawnie :)
Wyjaśnienie
Pierwsze trzy linie dotyczą znaku:
Sortuje,
O
a następnie odwraca^
wszystkie ciągi pasujące do wyrażenia regularnego^|-
. W praktyce powoduje to dopasowanie pustego łańcucha na początku i ewentualnego znaku minus przed drugą liczbą, a także porządkuje je, umieszczając pusty ciąg w miejscu znaku minus. Następnie wszystkie-
znajdują się na początku łańcucha, a parę z nich można łatwo usunąć za pomocą dwóch następnych linii.Następnie używamy wbudowanego narzędzia do konwertowania liczb na jednoargumentową reprezentację, a następnie następuje faktyczne pomnożenie:
Dopasowujemy dowolne
1
i zastępujemy każdą z nich1
następującą spacją. Każda cyfra pierwszego numeru zostanie zastąpiona pełnym drugim numerem, a każda cyfra drugiego numeru zostanie zastąpiona pustym ciągiem.Ostatnia część jest ponownie wbudowanym narzędziem do konwersji z jedności na dziesiętne.
Wypróbuj online!
źródło
$*
powinna być_
.).+,(.+)
do$.($1**
), ale tutaj jest więcej bajtów.Scratch , 1 bajt
Sposób użycia: umieść cyfry po obu stronach
*
znakuUwaga: Ponieważ Scratch jest językiem wizualnym, nie mogłem ustalić, ile bajtów zużywa, dopóki @ mbomb007 nie zauważył mnie o metodzie liczenia bajtów scratch
źródło
Brain-Flak , 56 bajtów
To musi być uruchomione jako pełny program, ponieważ nie jest on czysty w stosach, a dane wejściowe muszą być jedynymi elementami w każdym stosie.
Wypróbuj online!
Objaśnienie: (wywołaj dane wejściowe x i y)
Część 1:
W tym momencie mamy [x, y] na jednym stosie i [-x, -y] na drugim.
Część 2:
źródło
JavaScript (ES6), 9 bajtów
ES6 ma dedykowaną funkcję dla 32-bitowych liczb całkowitych, szybciej niż bardziej ogólny
*
operator.Nawiasem mówiąc, jest to tak długo, jak:
źródło
Brain-Flak ,
565452 bajtów2 bajty zapisane dzięki błędowi wyłapanemu przez Nitrodon
Wypróbuj online!
Wersja czystego stosu,
6260 bajtówWypróbuj online!
Wyjaśnienie
To wyjaśnienie jest raczej wyjaśnieniem stosowanego algorytmu i pomija rzeczywisty kod. Zakłada się, że umiesz biegle czytać Brain-Flak. Jeśli potrzebujesz pomocy w zrozumieniu kodu lub algorytmu, chętnie edytuję lub odpowiadam, jeśli zostawisz komentarz.
Jest to trochę dziwne i wykorzystuje dziwną matematykę, która ledwo się sprawdza. Pierwszą rzeczą, którą zrobiłem, było utworzenie pętli, która zawsze kończyłaby się w krokach O (n) . Normalnym sposobem na to jest umieszczenie n i -n na przeciwnych stosach i dodawanie po jednym do każdego, aż osiągnie zero, jednak zrobiłem to w nieco dziwniejszy sposób. W mojej metodzie umieszczam licznik pod wejściem i na każdym kroku zwiększam licznik, dodając go do n i odwracając znak n .
Przejdźmy przez przykład. Powiedz n = 7
Nie udowodnię tego tutaj, ale to zawsze kończy się dla dowolnego wejścia i zrobi to w około 2n krokach. W rzeczywistości zakończy się w krokach 2n, jeśli n jest dodatnie, i kroków 2n-1, jeśli n jest ujemne. Możesz to przetestować tutaj .
Teraz mamy około 2n kroków w naszej pętli, w jaki sposób pomnożymy przez n ? Cóż, oto magia matematyki. Oto, co robimy: tworzymy akumulator, na każdym etapie procesu dodajemy drugie wejście ( m ) do akumulatora i odwracamy znak obu z nich, a następnie przesuwamy sumę nad wszystkimi występującymi pętlami, jest to produkt.
Dlaczego, u licha, tak jest?
Cóż, przejdźmy przez przykład i mam nadzieję, że stanie się jasny. W tym przykładzie mnożymy 5 przez 3 , pokażę tylko ważne wartości
Mam nadzieję, że mechanizm jest tutaj widoczny. Przechodzimy przez wszystkie wielokrotności m w kolejności ich wartości bezwzględnych. Będziesz wówczas zawiadomienie, że 2n th termin jest zawsze m * n a termin przed zawsze -m * n . To sprawia, że nasza pętla idealnie pokrywa się z oczekiwanymi wynikami. Trochę szczęśliwego zbiegu okoliczności;)
źródło
Dyalog APL , 1 bajt
×
bierze jedną cyfrę po lewej i jedną po prawej×
... lub nawet wiele cyfr po lewej lub po prawej stronie lub po obu stronach×/
mnoży wszystkie liczby z listy×/¨
mnoży pary z danej listy×/∊
mulitplies wszystkie liczby w tablicyDotyczy to wszystkich funkcji arytmetycznych, tablic wszystkich rozmiarów i rang oraz liczb wszystkich typów danych.
źródło
R, 3 bajty
Jest to funkcja, która przyjmuje dokładnie dwa argumenty. Uruchom jako
'*'(a,b)
.Zobacz także,
prod
który robi to samo, ale może przyjąć dowolną liczbę argumentów.źródło
'*'
.ArnoldC , 152 bajty
Wypróbuj online!
źródło
Sześciokąt , 9 bajtów
Wypróbuj online!
Jest to w rzeczywistości dość proste. Oto rozwinięta wersja:
/
Tylko przekierować przepływ sterowania do drugiej linii, aby zapisać bajty na trzecią. To redukuje kod do tego programu liniowego:Sam ten liniowy kod byłby faktycznie poprawnym rozwiązaniem, gdyby dane wejściowe były ograniczone do liczb ściśle dodatnich, ale ze względu na możliwość uzyskania dodatnich wyników nie gwarantuje się zakończenia.
Program wykorzystuje trzy krawędzie pamięci w kształcie litery Y:
Wskaźnik pamięci zaczyna się od krawędzi
A
wskazującej w kierunku środka.Przeprowadziłem wyszukiwanie brutalnej siły dla rozwiązań 7-bajtowych (tj. Pasujących do długości 2), a jeśli nie popełniłem błędu (lub istnieje rozwiązanie typu zajęty bóbr, które zajmuje dużo czasu, co wątpię) to rozwiązanie 7-bajtowe nie istnieje. Może istnieć rozwiązanie 8-bajtowe (np. Przez ponowne użycie
?
lub użycie tylko jednego polecenia przekierowania zamiast dwóch/
), ale to jest więcej niż to, co może zrobić moje wyszukiwanie z użyciem siły i nie znalazłem jeszcze ręcznie.źródło
Piet , 16 bajtów
Tłumacz online dostępny tutaj.
Wyjaśnienie
Aby uruchomić, wklej powyższy kod w polu tekstowym po prawej stronie połączonej strony. Poniżej znajduje się graficzna reprezentacja tego kodu z rozmiarem kodu 31. Siatka ma na celu czytelność i może zakłócać tradycyjne interpretery Piet.
Kod działa liniowo od lewej do prawej, idąc wzdłuż górnej krawędzi obrazu, aż do pierwszego zielonego bloku, w którym przepływ programu przechodzi do środkowego rzędu kodeli. Biały samotny biały kod jest niezbędny do przebiegu programu. Można go zastąpić kodem dowolnego koloru innego niż zielony lub ciemnoniebieski, ale dla czytelności wybrałem biel.
Jeśli uważasz, że tekst nie jest najlepszym sposobem reprezentacji programu Piet lub masz problem z rozmiarem bajtów programów Piet w ogólności, daj znać swoją opinię w dyskusji na temat meta .
źródło
BitCycle
-U
, 68 bajtówWypróbuj online!
Pomnożenie dwóch liczb nie jest trywialnym problemem w BitCycle, szczególnie gdy znaki muszą być obsługiwane! To moja druga próba; pierwszy (zasadniczo ten sam algorytm, inny układ) miał 81 bajtów, więc całkiem możliwe, że ten też można skrócić.
Program przyjmuje dwie liczby jako argumenty wiersza poleceń i dane wyjściowe na standardowe wyjście.
-U
Flaga jest do konwersji liczb dziesiętnych do podpisał jednoskładnikowa , ponieważ BitCycle wie tylko 0 i 1 roku.Wyjaśnienie
To wyjaśnienie zakłada, że rozumiesz podstawy BitCycle (zobacz Esolangs lub readme GitHub). Będę opierać moje wyjaśnienie tego ungolfed wersji widziane tutaj obliczeniowej
-2
razy3
:Przegląd
Podpisane liczby jednoargumentowe składają się ze znaku (
0
przypadku liczby niepozytywnej, pustej w przypadku wartości dodatniej), po której następuje wielkość (liczba1
s równa wartości bezwzględnej liczby). Aby pomnożyć dwa z nich, musimy XOR znaki (wypisać a,0
jeśli dokładnie jeden z nich jest0
lub nic, jeśli oba lub oba nie są), a następnie pomnożyć wielkości (i wypisać tyle1
s). Pomnożymy przez wielokrotne dodawanie.Podpisuj bity
Zaczynając od dwóch źródeł
?
, oddzielamy znaki od wielkości za pomocą+
.0
s (bity znakowe) skręcają w lewo i są skierowane wzdłuż górnego rzędu, podczas gdy1
s (wielkości) skręcają w prawo i kończą się na dwóchB
kolektorach.Sekcja, która obsługuje znaki, wygląda następująco:
Jeśli obie liczby nie są dodatnie, dwa
0
bity pochodzą od góryv
. Pierwszy odbija się od szczytu\
, jest wysyłany na południe i odbija się od/
. Tymczasem drugi bit przechodzi przez zdezaktywowaną górę\
i odbija się od dołu\
. Dwa bity mijają się, idą prosto przez dezaktywowane teraz rozdzielacze w dolnym rzędzie i schodzą z pola gry.Jeśli tylko jedna z liczb nie jest dodatnia, jedna
0
pochodzi z góry. Odbija się od wszystkich trzech splitterów i kończy ponownie na północ, dopóki nie trafiv
i znów zostaje wysłany na południe. Tym razem przechodzi przez dezaktywowane rozgałęźniki i dociera do<
, który wysyła go do zlewu!
.Pętle do przechowywania wielkości
Wielkość pierwszej liczby trafia do
B
kolektora w tej sekcji:Zanim
B
kolektor się otworzy,A
kolektor zwalnia singiel,0
który został w nim umieszczony, a następnie trafia na koniec kolejkiB
. Użyjemy go jako wartości flagi do zakończenia pętli, gdy znikną wszystkie1
bityB
.Za każdym razem, gdy
B
otwierają się kolektory,\
rozdzielacz odrywa pierwszy bit z kolejki i wysyła go do logiki przetwarzania w środku. Reszta bitów wchodziC
, a kiedyC
kolektory się otwierają, zostają odesłane z powrotemB
.Wielkość drugiej liczby trafia do
B
kolektora w tej sekcji:Po
B
otwarciu kolektorów bity trafiają do dolnego dupneg~
. Oryginalne1
bity skręcają w prawo i są wysyłane na zachód do logiki przetwarzania na środku. Negowane kopie0
skręcają w lewo i natychmiast uderzają w kolejny dupneg. Tutaj0
s skręca w prawo i schodzi z pola gry, a (teraz podwójnie) negowane1
s skręca w lewo i zostaje wysłanyC
. PoC
otwarciu wracają doB
.Powtarzane dodawanie
Centralną logiką przetwarzania jest ta część:
Bity z obu pętli (jedna od strony zachodniej i wszystko od strony wschodniej) są wysyłane na południe do przełącznika
=
. Czas należy ustawić tak, aby bit z zachodniej pętli dotarł tam pierwszy. Jeśli jest to1
, przełącznik zmienia się na}
, wysyłając następujące bity na wschód do zlewu w!
celu wysłania . Gdy wszystkie1
s znikną, otrzymamy0
, co zmienia przełącznik na{
. To wysyła następujące bity do@
, który kończy program. Krótko mówiąc, wypisujemy (jednoargumentową) wielkość drugiej liczby tyle razy, ile jest1
wartości (jednej) wielkości pierwszej liczby.źródło
Python 3 , 11 bajtów
Wypróbuj online!
Działa również dla liczb całkowitych
2**32
w Pythonie 2.źródło
Java 8,
109 bajtówWypróbuj tutaj.
Java 7, 31 bajtów
Wypróbuj tutaj.
Jako pełny program (
9990 bajtów) :Wypróbuj tutaj.
źródło
*
literówka+
.a,b
w wyrażeniu lambda.Pyth, 2 bajty
Wypróbuj tutaj!
Tutaj pojawia się automatyczna ocena Pytha. Aby obejść ten problem, używam jednoznacznej oceny jednego z argumentów
źródło
TI-Basic, 2 bajty
Bardzo proste.
źródło
Ans
nie jest dozwoloną metodą we / wy .PHP, 21 bajtów
pobiera dane wejściowe z argumentów wiersza poleceń. Działa również z pływakami.
źródło
Siatkówka oka ,
3935 bajtówDzięki Leo za umożliwienie mi wykorzystania jego pomysłu, który ostatecznie pozwolił mi zaoszczędzić 4 bajty.
Wejście jest oddzielone od linii.
Wypróbuj online!(Dla wygody zestaw testów oddzielony spacjami).
Wyjaśnienie
Pierwsze dwa etapy wypisują znak minus, jeśli dokładnie jedno z dwóch sygnałów wejściowych jest ujemne. Robią to bez faktycznej zmiany danych wejściowych. Odbywa się to poprzez grupowanie ich w drugim etapie
)
i przekształcanie ich w suchą próbę z*
.\
Opcję na drugiej zapobiega etap drukowania spływu wysuwu.Najpierw usuwamy wszystko oprócz znaków minus.
Następnie anulujemy znaki minus, jeśli pozostały dwa z nich.
Teraz przekształcamy każdą linię w jednoargumentową reprezentację jej wartości bezwzględnej. Pozbędzie się znaku minus, ponieważ
$*
szuka tylko pierwszej nieujemnej liczby w dopasowaniu (tzn. Nie wie o znakach minus i ignoruje je).Pierwsza linia jest konwertowana na
_
, dopasowując poszczególne1
s tak długo, jak sąsiadują z poprzednim dopasowaniem (stąd nie możemy dopasować1
s na drugim wierszu, ponieważ wysuw linii przerywa ten łańcuch).Wykonuje to rzeczywiste mnożenie. Zastępujemy każdą
_
(w pierwszej linii), a także całą drugą linię wszystko po tym meczu. Te_
mecze będą zatem obejmować całą drugą linię (pomnożenie jej przez liczbę0
sekund w pierwszej linii), a druga linia zostanie usunięty, ponieważ nie ma nic po tym meczu. Oczywiście wynik będzie również zawierał śmieci w postaci_
s i linii, ale to nie będzie miało znaczenia.Kończymy, po prostu licząc liczbę
1
s w wyniku.źródło
MATLAB,
54 bajtówdot
przyjmuje iloczyn kropkowy dwóch wektorów o równej długości. Jeśli karmimy go dwoma skalarami, po prostu pomnoży te dwie liczby.prod
przyjmuje iloczyn wartości we wszystkich wierszach każdej kolumny macierzy. Jeśli macierz jest jednowymiarowa (tj. Wektor), wówczas działa wzdłuż wymiaru nie singletonu, przyjmując iloczyn wszystkich elementów w wektorze.dot
jest o jeden bajt krótszy niż oprod
jeden bajt krótszy niż nawet bardziej oczywiste wbudowanetimes
.Nazwij to tak:
źródło
PigeonScript , 1 bajt
Objaśnienie:
*
patrzy na stos, aby sprawdzić, czy coś tam jest. Jeśli nie, monituje o dane wejściowe i mnoży dane wejściowe razemźródło
Perl 6 , 4 bajty
Jest to zwykły operator mnożenia infix
*
, wyrażony jako zwykła funkcja. Jako bonus, jeśli podana zostanie jedna liczba, zwróci tę liczbę, a jeśli nie otrzyma żadnej liczby, zwróci1
tożsamość multiplikatywną.źródło
*×*
> <>, 5 bajtów
Pobiera dane wejściowe jako znak ascii, wypisuje liczbę.
Wyjaśnienie:
Ty też możesz to zrobić
Ale czuję, że moje rozwiązanie jest znacznie fajniejsze.
Inną możliwością jest upuszczenie średnika, co spowodowałoby odbicie wskaźnika od lustra, naciśnięcie polecenia drukowania i wygenerowanie błędu, ponieważ stos jest pusty.
źródło
Kod maszynowy Intel 8080 , MITS Altair 8800 , 28 bajtów
To implementuje binarne mnożenie w procesorze Intel 8080 (ok. 1974), który nie miał instrukcji mnożenia ani dzielenia. Wejściami są wartości 8-bitowe, a iloczyn 16-bitowy jest zwracany w
BC
parze rejestrów.Oto kod maszynowy wraz z instrukcjami krok po kroku, jak załadować program do Altair 8800 za pomocą przełączników na panelu przednim.
Wypróbuj online!
Jeśli wprowadziłeś to wszystko poprawnie, w szufladzie stanu maszyny w symulatorze zawartość pamięci RAM będzie wyglądać następująco:
Wkład
Mnożnik w
C
rejestrze i multiplikacja naD
. Standardowy Altair nie ma,STDIN
więc dane wejściowe są dokonywane tylko za pomocą przełączników na panelu przednim.Wydajność
Wynik jest wyświetlany na lampkach
D7
-D0
(prawy górny rząd) w formacie binarnym.5 x 16 = 80 (0101 0000)
4 x 5 = 20 (0001 0100)
7 x 9 = 63 (0011 1111)
8 x -9 = -72 (1011 1000)
Uwaga dotycząca zgodności: ta funkcja powinna również działać na IMSAI 8080 , choć obecnie nie była testowana.
źródło
C #, 10 bajtów
To tylko pomnożenie.
źródło
Galaretka , 1 bajt
Wypróbuj online!
Obowiązkowe zgłoszenie galaretki.
źródło
Clojure, 1 bajt
: P Jako bonus działa na dowolnej liczbie argumentów:
Co ciekawe, możesz łatwo uzyskać jego kod źródłowy:
źródło
Owk , 11 bajtów
Można to przypisać do funkcji takiej jak ta:
i nazwał tak:
źródło