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 aabb
moż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
= 39
w podstawie 10
Odejmowanie
Wystarczy usunąć wszystkie cyfry pojawiające się jednakowo w obu częściach odejmowania. Konieczne może być rozszerzenie (konwersja b
na 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 acd
pionowo:
a
c
d
Następnie dodajesz def
po pierwszym a
:
a def
c
d
Teraz c ma 2 pozycje później w alfabecie niż a, więc dodajemy 2 pozycje w alfabecie, def
aby 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, fgh
aby 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 ef
w pierwszym wierszu. To dlatego, że bc
zaczyna się od b
, i b
jest drugą literą w alfabecie, więc musimy przesunąć de
o 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
,*
abd
zaab * bd
. - Używany jest alfabet angielski (
abcdefghijklmnopqrstuvwxyz
) - Twój wynik musi być uproszczony (
aa
nie jest dozwolony,b
jest wymagany) - Wprowadzanie danych zostanie uproszczone (
b
+c
, nieaa
+bb
lubaa
+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!
źródło
d is 2 positions later in the alphabet than c
czy to jest wright? nie powinno być1
?That is added to the second row.
w tym samym zdaniu, prawdathird
?bc*de==efgh
ale nieefgh
jest240
144
bc*de
powinno byćeh
Odpowiedzi:
Galaretka ,
2625 bajtówUżywa operatorów Jelly (
×
zamiast*
i_
raczej niż-
) w ciągu wejściowym, na co pozwala OP .(Wymaga odstępów wokół operatorów)
Wypróbuj online! lub zobacz pakiet testowy
W jaki sposób?
źródło
Mathematica, 168 bajtów
Moje początkowe rozwiązanie (przed edycją postu w celu wyjaśnienia, że dane wyjściowe muszą zostać uproszczone) było
64
krótsze bajtów:To właśnie zmodyfikowało to rozwiązanie do pracy. Prawdopodobnie krócej jest użyć metod opisanych w wyzwaniu, ale i tak chciałem to podnieść.
Wyjaśnienie:
Zastępuje każdą sekwencję liter odpowiadającą liczbą całkowitą arytmetyką kodu znakowego, a następnie konwertuje wynikowy ciąg znaków na wyrażenie (które automatycznie upraszcza się na liczbę całkowitą), a następnie tworzy ciąg
a
znaków o długości równej tej liczbie całkowitej, a na koniec zastępuje sąsiednie identyczne znaki z kodem następnego znaku aż do osiągnięcia stałego punktu.źródło
JavaScript (ES6),
136134133 bajtówZaoszczędził 1 bajt dzięki Luke'owi
Przypadki testowe
Pokaż fragment kodu
źródło
Perl 5 , 95 bajtów
94 bajty kodu +
-p
flaga.Wypróbuj online!
Tutaj trzy kroki:
-
s/\w/a x 2**(-97+ord$&)/ge;
przekształca dane wejściowe w ciąga
tylko.-
s/(.*)-\1|+//;/*/&&($_=$`x length$')
wykona operator (który jest bardzo prosty na ciągach znakówa
):+
jest konkatenacją,-
oznacza usunięcie z pierwszej części tyle,a
ile jest w drugiej części, i*
oznacza duplikowanie pierwszej części tyle razy, ile jesta
w drugiej część.-
1while s/(.)\1/chr 1+ord$1/e
składa kolejne te same litery do następnej litery w alfabecie.źródło
05AB1E , 29 bajtów
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
C i x86 asm, 340 bajtów
Skompiluj z -O0
Wyjaśnienie
Ponieważ C nie ma
eval()
, zamiast tego użyłem tabeli instrukcji x86. Musiałem wybrać instrukcje, które były tej samej długości (lub były wypełnione nops) i które oczekiwały src i miejsca docelowego tego samego typu. Szczególnie denerwujące było to, że MUL może zapisywać tylko do rejestrów, a 1-bajtowe kody MUL mogą zapisywać tylko do EAX. Dodatkowo wydawało się, że nie ma instrukcji SUB zapisującej rejestry, która odejmowałaby się z pamięci zamiast na odwrót, stąd XCHG.edytować
Ponieważ zostało to zadane w komentarzach, bardziej tradycyjna ocena wyglądałaby następująco:
Jest tak naprawdę nieco krótszy, przy 301 znakach, z kilku powodów: 1. Ponieważ potrzebnych jest wiele funkcji, narzut na każdą z nich można pokroić za pomocą pewnych reguł preprocesora. 2. Nowoczesny system Linux chroni przed wykonaniem na stosie, dlatego wywołanie mprotect () wyłącza poświęcone 34 bajty. 3. Wywołanie XCHG jest bardzo nieoptymalne i kosztuje kolejne 30 bajtów. Gdyby nie te rzeczy, kombinacja x86 wygrałaby o około 10-20 bajtów.
Również pocięliśmy 2 bajty z obu poprzez ulepszenie wywołania islower () wg.
źródło
GNU sed + coreutils, 329 bajtów
Tak, nie mam pojęcia, co we mnie weszło, ale przynajmniej wiem, że teraz skrypt jest trochę lepszy. Zauważ, że to rozwiązanie wymaga
e
rozszerzenia GNU sed , które uruchamia polecenie powłoki.Zakładam, że wokół operatorów nie będzie przestrzeni. Z mojego terminala:
A dla tych rozsądniejszych ode mnie: skomentowana wersja!
źródło
sed: file golf.sed line 24: ":" lacks a label
PHP, 168
Wyjście Rosnąco za pomocą eval
PHP, 185 bajtów
Wyjście Rosnąco
Wersja online
Rozszerzony
PHP, 201 bajtów
Wyjście Decending
Wersja online
Rozszerzony
źródło
Python 3 ,
176167 bajtówWypróbuj online!
źródło
m>=2**(t+1)
jem>=2**t*2
, i pięć bajtów, zastępująca=a.split();m=eval(i(a[0])+a[1]+i(a[2]))
coś podobnegob,c,d=a.split();m=eval(i(b)+c+i(d))
.2**(ord(i)-97)
z1<<ord(i)-97
.PHP, 130
wersja rozszerzona:
biegać z
php -R <code>
.źródło
AWK, 201 bajtów
"(awk '$0="a s"'<<<1)"|getline v
Jest to najlepszy sposób mogłem wymyślić, aby zrobićevaluate
inAWK
. Być może trochę oszukuję, żeby to nazwaćAWK
, ponieważ wykonuję polecenie, ale przynajmniej polecenie jest równieżAWK
:)Jestem pewien, że brakuje mi jakiegoś sposobu na zmniejszenie liczby bajtów, ale na pewno tego nie widzę.
Użycie jest dość standardowe, np. Wstaw kod
FILE
i wykonaj:Zauważ, że spacje nie są wymagane, a wszelkie znaki spoza / non [az] zostaną po cichu zignorowane. Można go rozszerzyć do pracy z liczbami większymi niż „abcdefghijklmnopqrstuvwxyz” poprzez zmianę pętli. Aby wykonać podział, wystarczy dodać
/
znak do ciągu operacji :). Również wydrukuje pustą linię, jeśliresult <= 0
.źródło