Zrównoważona logika trójskładnikowa
Trójargumentowy jest zwykle inna nazwa podstawy 3, to znaczy, każda cyfra jest 0
, 1
lub 2
, a każde miejsce jest warte 3 razy tyle, ile następnej kolejności.
Zrównoważone trójskładnikowe jest modyfikacją trójskładnikowego wykorzystującą cyfry -1
, 0
i 1
. Ma to tę zaletę, że nie wymaga znaku. Każde miejsce jest nadal warte 3 razy więcej niż następne. Pierwszych kilka całkowite dodatnie są zatem [1]
, [1, -1]
, [1, 0]
, [1, 1]
, [1, -1, -1]
podczas gdy pierwsze kilka negatywnych całkowitymi są [-1]
, [-1, 1]
, [-1, 0]
, [-1, -1]
, [-1, 1, 1]
.
Masz trzy wejścia x, y, z
. z
jest albo -1
, 0
albo 1
, podczas gdy x
i y
może być od -3812798742493
do 3812798742493
włącznie.
Pierwszym krokiem jest przekształcenie x
i y
od dziesiętnej na system trójkowy zrównoważony. To powinno dać ci 27 tritów (TeRnary digITS). Następnie trzeba połączyć z trits x
i y
parami przy użyciu potrójny operację, a następnie przekonwertować wynik do tyłu po przecinku.
Możesz wybrać, które wartości z
mapy dla jednej z tych trzech operacji trójskładnikowych każda:
A
: Biorąc pod uwagę dwie tryty, jeśli jeden z nich jest równy zero, to wynik wynosi zero, w przeciwnym razie wynik wynosi -1, jeśli są różne lub 1, jeśli są takie same.B
: Biorąc pod uwagę dwie trity, jeśli jedna z nich jest równa zero, to wynikiem jest druga trit, w przeciwnym razie wynik wynosi zero, jeśli są różne, lub negacja, jeśli są takie same.C
: Biorąc pod uwagę dwie tryty, wynik wynosi zero, jeśli są różne, lub ich wartość, jeśli są takie same.
Przykład. Załóżmy, że x
jest 29
i y
jest 15
. W zrównoważonej trójce stają się [1, 0, 1, -1]
i [1, -1, -1, 0]
. (Pozostałe 23 tryty zerowe zostały pominięte ze względu na zwięzłość.) Po każdej z odpowiednich operacji stają się one A
: [1, 0, -1, 0]
, B
: [-1, -1, 0, -1]
, C
: [1, 0, 0, 0]
. Przekształcany z powrotem na dziesiętne wyniki są 24
, -37
i 27
odpowiednio. Wypróbuj następującą implementację referencyjną, aby uzyskać więcej przykładów:
Implementacja referencyjna postępuje zgodnie z krokami podanymi powyżej, ale oczywiście możesz swobodnie korzystać z dowolnego algorytmu, który daje takie same wyniki.
To jest golf golfowy , więc wygrywa najkrótszy program lub funkcja, która nie narusza żadnych standardowych luk!
z
musi to być jedna z nich,-1,0,1
czy możemy wybrać dowolne trzy spójne i odrębne wartości? Wybrałem1,2,3
w swojej odpowiedzi i jest w tym trochę zamieszania.Odpowiedzi:
Czysty ,
231... 162 bajtówDefiniuje funkcję
@
, biorąc trzyInt
si dając anInt
.Mapa operatorów jako
1 -> A, 0 -> B, -1 -> C
.Wypróbuj online!
Funkcja
$
składa lambda nad miejscami cyfr[0..26]
, na listę cyfr trójskładnikowych. Wykorzystuje nagłówek listy, którą daje, aby zachować bieżącą całkowitą różnicę w stosunku do wymaganej liczby (dlatego jest ona dostosowywana przed zwróceniem) isign(2*t/3^p)
aby określić bieżącą cyfrę do uzyskania. Trik znakowy jest równoważnyif(abs(2*t)<3^p)0(sign t)
.źródło
$n
(tak myślę). Czy możesz dodać wyjaśnienie?Galaretka , 39 bajtów
Pełny program pobierający dwa argumenty
[x,y]
iz
... gdzie
z
znajduje{A:-1, B:0, C:1}
się wynik
Wypróbuj online! Uwaga: metoda gry w golfa spowalnia - ta zmieniona wersja jest szybsza (loguje się o 3, pułapy i przyrosty przed każdym produktem kartezjańskim)
W jaki sposób?
źródło
R ,
190172151 bajtówWypróbuj online!
Oblicza wszystkie kombinacje tritów i wybiera właściwą. W rzeczywistości spowoduje to błąd pamięci
27
, ponieważ3^27
jest to nieco duża liczba, ale teoretycznie działałoby. Łącze TIO ma tylko11
obsługę liczb całkowitych trit; Nie jestem pewien, w którym momencie upłynie limit czasu lub błędy pamięci i nie chcę, żeby Dennis się na mnie wściekł za nadużywanie TIO!stara odpowiedź, 170 bajtów
Ten powinien działać na wszystkich wejściach, choć przy 32-bitowych liczbach całkowitych istnieje możliwość niedokładności, ponieważ R automatycznie je przekonwertuje
double
.Wypróbuj online!
Trwa
-1
zaA
,0
zaB
i1
zaC
.Podaje podejście zawarte w tej odpowiedzi do przejścia na zbalansowane trójskładnikowe, chociaż ponieważ gwarantujemy, że nie będziemy mieć więcej niż 27 zrównoważonych tritów, jest to zoptymalizowane do tego.
R , 160 bajtów
Wypróbuj online!
Ta wersja kończy się bardzo powoli. Bogosort konwersji bazy, ta funkcja losowo wybiera trits, aż w jakiś sposób magicznie (
3^-54
szansa na wystąpienie) znajdzie odpowiednie trits dlaa
ib
, a następnie wykona wymaganą operację. To w zasadzie nigdy się nie skończy.źródło
z
jest ograniczony do{-1, 0, 1}
.z
mapy do jednej z tych trzech operacji trójskładnikowych każda: [...]z
jest albo-1
,0
albo1
myślę, że są to „wartościz
”, o których mowa.switch(z,...)
ją,switch(z+2,...)
więc niezależnie od tego byłaby to banalna zmiana.Galaretka , 47 bajtów
Wypróbuj online!
Pełny program
-1
=C
,0
=A
,1
=B
Argument 1:
[x, y]
Argument 3:
z
źródło
x
iy
zbalansowanie trójskładnika było dozwolone: „xiy mogą być od -3812798742493 do 3812798742493 włącznie. Pierwszym krokiem jest konwersja xiy z liczb dziesiętnych na zrównoważony trójskładnik”.