Problem:
Twoim celem jest dodanie dwóch liczb wejściowych bez korzystania z któregokolwiek z następujących operatorów matematycznych: +,-,*,/
.
Ponadto nie można używać żadnych wbudowanych funkcji, które zostały zaprojektowane w celu zastąpienia tych operatorów matematycznych.
Punktacja:
Najmniejszy kod (w liczbie bajtów) wygrywa.
Aktualizacja
Większość programów, które widziałem, albo łączy dwie tablice zawierające ich liczby, albo markę
first number
postaci, dodajesecond number
znaki, a następnie zlicza je wszystkie.Najkrótszy licznik tablic: APL z 8 znakami, autor: Tobia
Najkrótsza konkatenacja macierzy: Golfscript z 4 znakami, autor: Doorknob
Najkrótsze rozwiązanie logarytmiczne: TI-89 Basic z 19 znakami, Quincunx
Rozwiązanie integracyjne: Mathematica z 45 znakami, autor: Michael Stern
Najfajniejsze, moim zdaniem: bitowe operatory w javascript, autor: dave
źródło
Odpowiedzi:
Smalltalk,
2113Wszystkie poniższe działania działają tylko na dodatnie liczby całkowite. Zobacz inną odpowiedź Smalltalk na poważną.
wersja 1
przejście do dużej liczby całkowitej i pytanie o jej wysoki indeks bitowy (źle, indeksowanie ST jest oparte na 1, więc potrzebuję dodatkowego przesunięcia w prawo):
wersja 2
podobne, a nawet nieco krótsze (ze względu na reguły pierwszeństwa Smalltalk i niepotrzebne przesunięcie w prawo):
wersja 3
kolejna odmiana motywu „rozmiar zestawiania-łączenia-pytania”, z
podaniem dwóch liczb a i b,
wykorzystując Interwały jako kolekcję, otrzymujemy wersję bardziej przyjazną dla pamięci ;-) w 21 znakach:
nie jest to jednak zalecane w przypadku dużej liczby awarii.
wersja 4
Dla rozrywki, jeśli chcesz wymienić czas na pamięć, spróbuj:
co zwykle jest wystarczająco dokładne (ale nie ma gwarancji ;-)))
wersja 5
napisz do pliku i zapytaj o jego rozmiar
źródło
JavaScript (25)
Dodaje to dwie zmienne x i y, używając tylko operacji bitowych, i zapisuje wynik w x.
Działa to również z liczbami ujemnymi.
źródło
while(y)x^=y,y=(y&x^y)<<1
!for(;y;y=(y&x^y)<<1)x^=y
jest o 1 bajt krótszy :)C - 38 bajtów
Trochę tu oszukuję, OP powiedział, żeby nie używać żadnych operatorów matematycznych .
*
Wprintf()
użyciu wielkoformatowych że pole szerokość używane do drukowania znaku jest przenoszony z argumentemprintf()
, w tym przypadku, 3 i 4. Wartość zwracanaprintf()
jest liczba znaków drukowanych. Więc drukuje jeden' '
z polem o szerokości 3, a drugi z polem o szerokości 4, daje w sumie 3 + 4 znaki.Wartość zwracana to dodane liczby w
printf()
połączeniu.źródło
main
. Ponadto, jeśli nie obchodzi, co drukujesz, można wymienić jeden' '
z0
i pominąć drugi.Python - 49 bajtów
Zakładając wkład przez umieszczenie w zmiennych
x
iy
.To 61 bajtowe rozwiązanie jest pełnym programem:
Biorąc pod uwagę, że nie zakazałeś potęgowania, musiałem to opublikować. Kiedy upraszczasz wyrażenie za pomocą właściwości logarytmów, po prostu dostajesz
print input() + input()
.Obsługuje zarówno liczby ujemne, jak i zmiennoprzecinkowe.
Uwaga: postępowałem zgodnie z radą gnibblera i podzieliłem tę odpowiedź na trzy. To jest rozwiązanie Mathematica , a to jest podstawowe rozwiązanie TI-89 .
źródło
E^y
. KorzystanieLog[Log[(E^E^x)^E^y]]
wydaje się działać dobrze.JavaScript [25 bajtów]
źródło
Mathematica, 21 bajtów
Jest wiele sposobów na zrobienie tego w Mathematica. Po pierwsze, użyj funkcji Akumuluj i podrzuć wszystko oprócz ostatniej liczby na wyjściu. Podobnie jak w przypadku mojego innego rozwiązania poniżej, zakładam, że liczby wejściowe są w zmiennych
a
ib
. 21 bajtów.Więcej zabawy, chociaż ma 45 znaków, użyj liczb, aby zdefiniować linię i zintegrować pod nią.
Jako bonus, oba rozwiązania działają dla wszystkich liczb zespolonych, a nie tylko dodatnich liczb całkowitych, jak się wydaje w przypadku niektórych innych rozwiązań tutaj.
źródło
function _(){return array_sum(func_get_args());}
. Musiałem to zdjąć, bo nie mogłem znaleźć krótkiego sposobu, aby to „naprawić”.array_sum()
w php, co robi dokładnie to samo.GolfScript,
64 znaki / bajtyDane wejściowe w postaci
10, 5
(=>15
).Jest
+
to konkatenacja macierzy, a nie dodawanie.Działa to tak,
,
aby utworzyć tablicę o długości, która jest liczbą (0,1,...,n-2,n-1
). Odbywa się to dla obu liczb, a następnie tablice są łączone.,
jest używany ponownie w innym celu, aby znaleźć długość wynikowej tablicy.Teraz tutaj jest podstęp . Naprawdę podoba mi się ten, ponieważ nadużywa formatu wejściowego. To wygląda jak to tylko wprowadzanie tablicę, ale tak naprawdę, ponieważ wejście jest wykonany jako kod GolfScript, pierwszy
,
jest już dla mnie zrobił! (Stara 6-znakowa wersja miała~,\,+,
format wejściowy10 5
, który ogoliłem 2 znaki, eliminując\,
(swap-array)).Stara wersja (12) :
Tworzy funkcję
f
.*
I+
są powtórzeniem ciąg konkatenacji i odpowiednio, nie funkcje arytmetyczne.Objaśnienie:
n
tworzy ciąg jednoznakowy (nowy wiersz). Jest to następnie powtarzanea
razy, a następnie robi się to samob
. Ciągi są łączone, a następnie,
są używane do długości ciągu.źródło
C,
2927 bajtówUżywanie arytmetyki wskaźnika:
x
jest zdefiniowany jako wskaźnik, ale osoba dzwoniąca powinna przekazać liczbę całkowitą.Anonimowy użytkownik zasugerował następujące - również 27 bajtów, ale parametry są liczbami całkowitymi:
źródło
int
s na obecnie popularnych systemach, w którychint
ma 32 bity, a wskaźniki mają 64 bity. Drugi pozwala uniknąć tego problemu.Brainf * ck,
936Działa to bez użycia prostego dodatku; przechodzi i kładzie ślad 1, a następnie je zlicza
Uwaga:
+
i-
są tylko pojedynczymi przyrostami i bez nich nic nie można zrobić w mózgu *. Nie są to tak naprawdę dodawanie / odejmowanie, więc uważam, że to się nadal liczy.źródło
J (6)
Nie powiedziałeś, że nie możemy użyć funkcji succ:
Stosowanie:
Wykonuje tylko 9 powtórzeń z
>:
8.Podejście lista konkatenacji działa zbyt:
#@,&(#&0)
. I - Wiem, że jest to niezgodne z regułami - nie mogę pozwolić, by ta odpowiedź przebiegła bez najbardziej J-tego rozwiązania:*&.^
(mnożenie pod potęgowaniem).źródło
Postscriptum, 41
Definiujemy funkcję wyrażeniem o długości 41 bajtów, ponieważ:
Następnie nazywamy to np .:
Co daje
Z łatwością radzi sobie z negatywami i zmiennymi, w przeciwieństwie do większości konkurentów :-)
źródło
bash, 20 znaków
źródło
Smalltalk (teraz poważnie),
123 118105 (*)Przepraszam, że odpowiedziałem dwa razy, ale uważaj to za poważną odpowiedź, podczas gdy druga była bardziej jak humor. W tym momencie na wszystkich naszych komputerach (choć sprzętowo) wykonywane jest poniższe polecenie. Dziwne, że nikomu to nie przyszło do głowy ...
Łącząc dwa pół-sumatory i wykonując wszystkie bity słów równolegle, otrzymujemy (dane wejściowe a, b; dane wyjściowe ws) wersji do odczytu:
Pętla służy do propagacji przenoszenia. Maski zapewniają obsługę podpisanych liczb całkowitych (bez nich możliwe są tylko niepodpisane liczby). Określają również długość słowa, powyższe dotyczy operacji 32-bitowej. Jeśli wolisz dodawanie 68-bitowe, zmień na 16rFFFFFFFFFFFFFFFFF.
wersja golfowa (123 znaki) (unikanie długiej maski poprzez ponowne użycie wm):
(*) Używając -1 zamiast 16rFFFFFFFF, możemy lepiej grać w golfa, ale kod nie działa już dla liczb o dowolnej dokładności, tylko dla małych liczb całkowitych wielkości maszyny (reprezentacja dużych liczb całkowitych nie jest zdefiniowana w standardzie Ansi):
zmniejsza to rozmiar kodu do 105 znaków.
źródło
APL, 8 i 12
Nic nowego tutaj, wersja z liczeniem tablic:
oraz log version wersja dziennika:
Pomyślałem, że wyglądają świetnie w APL!
źródło
≢∘∊⍳¨
sed, 359 bajtów (bez fantazyjnego formatowania)
Przepraszamy za późną odpowiedź i prawdopodobnie najdłuższą odpowiedź tutaj. Chciałem jednak sprawdzić, czy jest to możliwe dzięki sed:
Jest to podobne do https://codegolf.stackexchange.com/a/38087/11259 , który po prostu zwiększa liczby w ciągu. Zamiast tego wykonuje operacje przyrostowe w pętli.
Dane wejściowe są pobierane ze STDIN w postaci „x y”. To jest najpierw przekształcane na „x: 0 :: y:”. Następnie zwiększamy wszystkie liczby występujące po znakach „:”, aż otrzymamy „x: x: :( x + y):”. Potem w końcu wracamy (x + y).
Wydajność
Zauważ, że działa to tylko dla liczb naturalnych. Jednak (przynajmniej teoretycznie) działa dla dowolnie dużych liczb całkowitych. Ponieważ wykonujemy operacje przyrostowe x na y, kolejność może mieć duży wpływ na szybkość: x <y będzie szybsze niż x> y.
źródło
Dash , 18 bajtów
Wymaga czasu GNU 1.7 lub nowszego. Dane wyjściowe są do STDERR.
Wypróbuj online!
Zauważ, że to nie zadziała w B ash, ponieważ jego wbudowane polecenie czasu różni się od czasu GNU.
Kosztem jednego dodatkowego bajtu
\time
można użyć zamiasttime
zmusić Bash do użycia polecenia zewnętrznego.źródło
sleep -3
mogę przyspieszyć swoje programy. Co za zawód.\time
powinien również działać w Bash.JavaScript (67)
Prawdopodobnie jest znacznie lepiej
źródło
joins
są niepotrzebne.Array
Konstruktor sprawia tablicęundefineds
, którą można zaliczyć:a=Array;p=parseInt;r=prompt;alert(a(p(r())).concat(a(p(r()))).length)
Number
konstruktor zapisuje 2 postacieparseInt
alert
, wyjście nadal trafi do konsoli, ale to sprawia, że odpowiedź jest nieco mniej zabawna. Możesz także ponownie użyćprompt
zmiennej zamiast alert (konstruktor ostrzega argument za pomocą monitu). W każdym razie ładna odpowiedź!Ruby, 18 znaków
I jeszcze dwa pełne warianty, 29 znaków
Kolejna wersja, 32 znaki
źródło
C # - przy generowaniu kodu w locie
Tak, w rzeczywistości jest tam dodatek, ale nie ma operatora +, a nawet funkcji ramowej, która dodaje, zamiast tego generujemy w locie metodę, która dodaje.
źródło
Rubin 39
źródło
R 36
gdzie
rep
buduje wektorx
jedności, po których następująy
dwójki.źródło
length(rep(1:2,scan()))
TI Basic 89 - 19 bajtów
Uruchom to w TI-89 (ekranie głównym lub aplikacji do programowania):
Używa do tego reguł dziennika
x+y
, tak jak w tym rozwiązaniu . Jako bonus działa dla liczb dziesiętnych i liczb całkowitych. Działa dla wszystkich liczb rzeczywistych. Jeśli reguły logarytmu są nadal poprawne dla złożonych wykładników, to działa to również dla liczb zespolonych. Jednak mój kalkulator wyrzuca śmieci, gdy próbuję wstawić złożone wykładniki.źródło
ln
w TI Basic nie ma 1 bajtu? Możesz także upuścić nawiasy zamykające, zmniejszając to do 15 bajtów.Podziękowania dla Michaela Sterna za nauczenie mnie notacji matematycznej .
Mathematica -
2120 bajtówKorzysta z tego samego podejścia co to rozwiązanie , ale w Mathematica jest krótsze. Działa to dla liczb ujemnych i zmiennoprzecinkowych, a także liczb całkowitych w
x
iy
.Uproszczenie wyrażenia przy użyciu reguł logów daje
x+y
, ale jest to poprawne, ponieważ używa potęgowania, a nie jednego z 4 podstawowych operatorów.źródło
C # - arytmetyka ciągów
Konwertujemy obie liczby na ciągi znaków, robimy dodawanie odcinając ciągi znaków (z przeniesieniem i wszystkim, wiesz), a następnie analizujemy z powrotem na liczbę całkowitą. Testowane z i1, i2 w 0..200, działa jak urok. Znajdź dodatek w tym!
źródło
C (79)
źródło
Python - 22 znaki
źródło
APL: 2
Konwertuje to liczby z podstawy 1, więc (n * 1 ^ 1) + (m * 1 ^ 2), czyli dokładnie n + m.
Można wypróbować na TryApl.org
źródło
TI-BASIC, 10
Dodaje
X
iY
źródło
K, 2 bajty
Przykład użycia:
Zastosuj operator „where” (monadyczny
&
) do liczb na liście danych wejściowych (prawdopodobnie wykorzystując format wejściowy). Spowoduje to utworzenie listy zawierającej pierwszą liczbę zer, a następnie drugą liczbę zer:Zwykle ten operator jest używany jako „gromadzenie” w celu wygenerowania listy wskaźników niezerowych elementów listy boolowskiej, ale uogólniona forma okazuje się przydatna.
Następnie po prostu policz tę listę (monadycznie
#
).Jeśli moja interpretacja wymagań wejściowych jest nie do przyjęcia, poniższe nieco dłuższe rozwiązanie działa tak samo:
źródło
Pyth , 29 bajtów
Wypróbuj online!
Moje pierwsze zgłoszenie tutaj!
To kompiluje się do:
źródło