Arytmetyka lokalizacji (arytmetyka łacińska localis) to addytywne (nie-pozycyjne) układy liczb binarnych, które John Napier badał jako technikę obliczeniową w swoim traktacie Rabdology (1617), zarówno symbolicznie, jak i na szachownicy.
Co?
Cyfry lokalizacji to sposób wpisywania liczb za pomocą liter alfabetu.
Notacja binarna nie została jeszcze ustandaryzowana, więc Napier użył czegoś, co nazwał liczbami lokalizacji, do przedstawienia liczb binarnych. System Napiera używa notacji znak-wartość do reprezentowania liczb; używa kolejnych liter alfabetu angielskiego do reprezentowania kolejnych potęg dwóch: a = 2 ^ 0 = 1, b = 2 ^ 1 = 2, c = 2 ^ 2 = 4, d = 2 ^ 3 = 8, e = 2 ^ 4 = 16 i tak dalej.
Przykład
ab = 1 + 2 = 3 w podstawie 10
aabb = 1 + 1 + 2 + 2 = 6 w podstawie 10
Zauważ, że aabbmożna to skrócić bc, zastępując dowolne 2 wystąpienia litery wyższym.
Dodanie
Po prostu połącz dwie liczby i uprość.
acd+ bde= acdbde= abcdde= acebe= abcf= 39w podstawie 10
Odejmowanie
Wystarczy usunąć wszystkie cyfry pojawiające się jednakowo w obu częściach odejmowania. Konieczne może być rozszerzenie (konwersja bna aa)
abde- ad= be= 18 w podstawie 10
Mnożenie
To jest trochę trudniejsze.
Powiedzmy, że chcemy pomnożyć acd(13) przez def(56). Najpierw ustaw acdpionowo:
a
c
d
Następnie dodajesz defpo pierwszym a:
a def
c
d
Teraz c ma 2 pozycje później w alfabecie niż a, więc dodajemy 2 pozycje w alfabecie, defaby zrobić fgh. To jest dodawane do drugiego rzędu.
a def
c fgh
d
Wreszcie d jest o 1 pozycję później w alfabecie niż c, więc dodajemy 1 pozycję w alfabecie, fghaby zrobić ghi. To jest dodawane do trzeciego rzędu.
a def
c fgh
d ghi
Następnie bierzesz sumę prawa: def+ fgh+ ghi= deffgghhi= deggghhi= deghhhi= deghii= deghj(728)
Kolejny przykład mnożenia
Wkład:
bc * de
Pierwszy:
b
c
Następnie
b ef
c
Następnie
b ef
c fg
Zauważ, że zapisaliśmy efw pierwszym wierszu. To dlatego, że bczaczyna się od b, i bjest drugą literą w alfabecie, więc musimy przesunąć deo 1 literę, aby stała się ef.
Następnie
ef+fg
Wydajność:
eh
Podział
To nie jest część tego wyzwania, ponieważ może stać się bardzo złożone.
Twoje rzeczywiste wyzwanie
Twój program lub funkcja musi przyjmować dane wejściowe jako ciąg znaków, który wygląda następująco:
a + b
I musisz wydać:
ab
Oczywiście, program lub funkcja musi obsługiwać numery dowolnej długości (do łańcucha lub wejściowego granicy języka) z żadnym z operatorów +, -lub *. Kilka innych przykładów:
Wkład:
ab + bd
Wydajność:
acd
Wkład:
d - ab
Wydajność:
ac
Wkład:
ab * cd
Wydajność:
cf
Uwagi:
- Kolejność liter w danych wyjściowych nie ma znaczenia, ale zawsze można założyć, że kolejność liter w liczbach na wejściu będzie rosła (a przed z).
- Możesz pobierać dane wejściowe z końcowym znakiem nowej linii i dane wyjściowe z końcowym znakiem nowej linii.
- Być może nie wziąć wkład w postaci listy
ab,*abdzaab * bd. - Używany jest alfabet angielski (
abcdefghijklmnopqrstuvwxyz) - Twój wynik musi być uproszczony (
aanie jest dozwolony,bjest wymagany) - Wprowadzanie danych zostanie uproszczone (
b+c, nieaa+bblubaa+aaaa) - Może wymagać przestrzeń przed i operatora (
+,-lub*), lub może wymagać, aby istniała żadna. - Będzie tylko jeden operator na dane wejściowe.
- Możesz założyć, że dane wyjściowe i wejściowe nigdy nie przekroczą 2 ^ 27-1 (
abcdefghijklmnopqrstuvwxyz) - To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach!
bc*de==efghale nie efghjest240144
bc*depowinno byćeh
d is 2 positions later in the alphabet than cczy to jest wright? nie powinno być1?That is added to the second row.w tym samym zdaniu, prawdathird?