Збалансована потрійна логіка


11

Збалансована потрійна логіка

Трійчастий зазвичай інша назва для підстави 3, тобто сказати, кожна цифра 0, 1або 2, і кожне місце варто в 3 рази більше, ніж на наступному місці.

Збалансовані потрійний є модифікацією потрійного , яка використовує цифри -1, 0і 1. Це має перевагу в тому, що знак не потребує. Кожне місце все одно коштує в 3 рази більше, ніж наступне. Перші кілька позитивних цілих чисел, отже [1], [1, -1], [1, 0], [1, 1], в [1, -1, -1]той час як перші негативні цілі числа [-1], [-1, 1], [-1, 0], [-1, -1], [-1, 1, 1].

У вас є три входи x, y, z. zабо -1, 0або 1, в той час як xі yможе бути від -3812798742493до 3812798742493включно.

Перший крок - перетворення xі yз десяткової в збалансовану трійку. Це повинно дати вам 27 трит (TeRnary digITS). Тоді вам доведеться поєднувати трити з xта yв парах, використовуючи потрійну операцію, а потім перетворити результат назад у десятковий.

Ви можете вибрати, які значення zвідображати для однієї з цих трьох потрійних операцій кожна:

  • A: Дано два трити, якщо будь-який дорівнює нулю, то результат дорівнює нулю, інакше результат -1, якщо вони різні, або 1, якщо вони однакові.
  • B: Дано два трити, якщо будь-який дорівнює нулю, то результат - інший трит, інакше результат дорівнює нулю, якщо вони різні, або заперечення, якщо вони однакові.
  • C: Враховуючи два трити, результат дорівнює нулю, якщо вони різні, або їх значення, якщо вони однакові.

Приклад. Припустимо, xє 29і yє 15. У збалансованому потрійному, вони стають [1, 0, 1, -1]і [1, -1, -1, 0]. (Решта 23 нульових трититів були опущені для стислості.) Після кожної з відповідних операцій вони стають A: [1, 0, -1, 0], B: [-1, -1, 0, -1], C: [1, 0, 0, 0]. Старовинні назад в десяткових результатах 24, -37і 27відповідно. Спробуйте наступну посилання на реалізацію для додаткових прикладів:

Реалізація посилань дотримується наведених вище кроків, але ви, звичайно, вільні використовувати будь-який алгоритм, який дає ті самі результати.

Це , тому перемагає найкоротша програма або функція, яка не порушує жодних стандартних лазів!


2
Якщо власний формат чисел є збалансованим потрійним (на відміну від двійкового), чи можемо ми сприймати його як вхід звичайним способом (що не призводить до перетворення на збалансований потрійний)?
wizzwizz4


1
чи zмає бути одне -1,0,1або ми можемо вибрати будь-які три послідовні та чіткі значення? Я вибрав 1,2,3у своїй відповіді, і в цьому є деяка плутанина.
Джузеппе

2
@Giuseppe Вибачте, дозволяються лише збалансовані потрійні цифри.
Ніл

2
Я прочитав щось прохоже ... Занадто багато слів і жодної формули
RosLuP

Відповіді:


2

Чистота , 231 ... 162 байти

import StdEnv
$n=tl(foldr(\p[t:s]#d=sign(2*t/3^p)
=[t-d*3^p,d:s])[n][0..26])
@x y z=sum[3^p*[(a+b)/2,[1,-1,0,1,-1]!!(a+b+2),a*b]!!(z+1)\\a<- $x&b<- $y&p<-[0..26]]

Визначає функцію @, приймаючи три Ints і даючи an Int.
Оператори відображають як 1 -> A, 0 -> B, -1 -> C.

Спробуйте в Інтернеті!

Функція $складає лямбда над розрядними місцями [0..26]до списку потрійних цифр. Він використовує заголовку списку, який він отримує, щоб зберегти поточну загальну різницю від необхідної кількості (саме тому вона відкладається перед поверненням) та sign(2*t/3^p)визначає поточну цифру для отримання. Знаковий трюк рівнозначний if(abs(2*t)<3^p)0(sign t).


Я не знаю Чистого, але мене заінтригує те, як ти $n(на мою думку) перетворився на збалансований потрійний . Чи можете ви додати пояснення до цього?
Джузеппе

@Giuseppe Абсолютно, я додам пояснення сьогодні, коли встигну.
Οurous

@Giuseppe це відповідає на ваше запитання?
Οurous

Так! Що має сенс. Досить розумний!
Джузеппе

1

Желе , 39 байт

×=
×
+ị1,-,0
A-r1¤ṗœs2ṚẎị@ȯµ€Uz0ZU⁹ŀ/ḅ3

Повна програма, яка бере два аргументи [x,y], і z
… де zє те, {A:-1, B:0, C:1}
що друкує результат

Спробуйте в Інтернеті! Примітка: метод гольфу робить його повільним - ця змінена версія є швидшою (журнали на 3, стелі та кроки перед кожним декартовим продуктом)

Як?

×=       - Link  1 (1), B: list of trits L, list of trits R
×        - L multiplied by... (vectorises):
 =       -   L equal R? (vectorises)

×        - Link -1 (2), A: list of trits L, list of trits R
×        - L multiplied by R (vectorises)

+ị1,-,0  - Link  0 (3), C: list of trits L, list of trits R
+        - L plus R (vectorises)
  1,-,0  - list of integers = [1,-1,0]
 ị       - index into (vectorises) - 1-based & modular, so index -2 is equivalent to
         -                           index 1 which holds the value 1.

A-r1¤ṗœs2ṚẎị@ȯµ€Uz0ZU⁹ŀ/ḅ3 - Main link: list of integers [X,Y], integer Z
              µ€           - for each V in [X,Y]:
A                          -   absolute value = abs(V)
    ¤                      -   nilad followed by link(s) as a nilad:
 -                         -     literal minus one
   1                       -     literal one
  r                        -     inclusive range = [-1,0,1]
     ṗ                     -   Cartesian power, e.g. if abs(V)=3: [[-1,-1,-1],[-1,-1,0],[-1,-1,1],[-1,0,-1],[-1,0,0],[-1,0,1],[-1,1,-1],[-1,1,0],[-1,1,1],[0,-1,-1],[0,-1,0],[0,-1,1],[0,0,-1],[0,0,0],[0,0,1],[0,1,-1],[0,1,0],[0,1,1],[1,-1,-1],[1,-1,0],[1,-1,1],[1,0,-1],[1,0,0],[1,0,1],[1,1,-1],[1,1,0],[1,1,1]]
                           -                   (corresponding to: [-13       ,-12      ,-11      ,-10      ,-9      ,-8      ,-7       ,-6      ,-5      ,-4       ,-3      ,-2      ,-1      ,0      ,1      ,2       ,3      ,4      ,5        ,6       ,7       ,8       ,9      ,10      ,11     ,12     ,13     ] )
        2                  -   literal two
      œs                   -   split into equal chunks           [[[-1,-1,-1],[-1,-1,0],[-1,-1,1],[-1,0,-1],[-1,0,0],[-1,0,1],[-1,1,-1],[-1,1,0],[-1,1,1],[0,-1,-1],[0,-1,0],[0,-1,1],[0,0,-1],[0,0,0]],[[0,0,1],[0,1,-1],[0,1,0],[0,1,1],[1,-1,-1],[1,-1,0],[1,-1,1],[1,0,-1],[1,0,0],[1,0,1],[1,1,-1],[1,1,0],[1,1,1]]]
         Ṛ                 -   reverse                           [[[0,0,1],[0,1,-1],[0,1,0],[0,1,1],[1,-1,-1],[1,-1,0],[1,-1,1],[1,0,-1],[1,0,0],[1,0,1],[1,1,-1],[1,1,0],[1,1,1]],[[-1,-1,-1],[-1,-1,0],[-1,-1,1],[-1,0,-1],[-1,0,0],[-1,0,1],[-1,1,-1],[-1,1,0],[-1,1,1],[0,-1,-1],[0,-1,0],[0,-1,1],[0,0,-1],[0,0,0]]]
          Ẏ                -   tighten                            [[0,0,1],[0,1,-1],[0,1,0],[0,1,1],[1,-1,-1],[1,-1,0],[1,-1,1],[1,0,-1],[1,0,0],[1,0,1],[1,1,-1],[1,1,0],[1,1,1],[-1,-1,-1],[-1,-1,0],[-1,-1,1],[-1,0,-1],[-1,0,0],[-1,0,1],[-1,1,-1],[-1,1,0],[-1,1,1],[0,-1,-1],[0,-1,0],[0,-1,1],[0,0,-1],[0,0,0]]
                           -                   (corresponding to: [1      ,2       ,3      ,4      ,5        ,6       ,7       ,8       ,9      ,10     ,11      ,12     ,13     ,-13       ,-12      ,-11      ,-10      ,-9      ,-8      ,-7       ,-6      ,-5      ,-4       ,-3      ,-2      ,-1      ,0      ] )
           ị@              -   get item at index V (1-based & modular)
             ȯ             -   logical OR with V (just handle V=0 which has an empty list)
                U          - upend (big-endian -> little-endian for each)
                  0        - literal zero           }
                 z         - transpose with filler  } - pad with MSB zeros
                   Z       - transpose              }
                    U      - upend (little-endian -> big-endian for each)
                       /   - reduce with:
                      ŀ    -   link number: (as a dyad)
                     ⁹     -     chain's right argument, Z
                         3 - literal three
                        ḅ  - convert from base

Я не можу за все життя читати мови для гри в гольф, тож коли ти кажеш "повільно", наскільки погана часова складність?
Οurous

Для отримання збалансованого потрійного елемента N створюється список усіх (3 ^ n) списків трит (abs) (N) довжини тритів (0, -1 та 1). Так O (3 ^ max (abs (X), abs (Y)))
Джонатан Аллан

Дякую, і за пояснення, я бачу, ви теж додали!
Οurous

1
Також додали більш швидку версію, використовуючи той самий метод :)
Джонатан Аллан

1

R , 190 172 151 байт

function(a,b,z){M=t(t(expand.grid(rep(list(-1:1),27))))
P=3^(26:0)
x=M[M%*%P==a,]
y=M[M%*%P==b,]
k=sign(x+y)
switch(z+2,x*y,k*(-1)^(x+y+1),k*!x-y)%*%P}

Спробуйте в Інтернеті!

Обчислює всі комбінації тритів і підбирає правильну. Насправді це призведе до помилки пам'яті 27, оскільки 3^27це дещо велика кількість, але це теоретично працює. Посилання TIO підтримує лише 11цілочисельну підтримку триту; Я не впевнений, в який момент спочатку виникає помилка або помилки пам’яті, і я не хочу, щоб Деніс злився на мене за зловживання TIO!

стара відповідь, 170 байт

Цей має працювати для всіх входів, хоча з 32-бітовими цілими числами є можливість неточності, оскільки R автоматично перетворить їх у double.

function(a,b,z){x=y={}
for(i in 0:26){x=c((D=c(0,1,-1))[a%%3+1],x)
y=c(D[b%%3+1],y)
a=(a+1)%/%3
b=(b+1)%/%3}
k=sign(x+y)
switch(z+2,x*y,k*(-1)^(x+y+1),k*!x-y)%*%3^(26:0)}

Спробуйте в Інтернеті!

Приймає -1для A, 0для Bі 1для C.

Розробляє підхід у цій відповіді для перетворення на збалансований трійник, хоча оскільки нам гарантовано не більше 27 збалансованих трит, він оптимізований для цього.

R , 160 байт

function(a,b,z){s=sample
x=y=rep(0,27)
P=3^(26:0)
while(x%*%P!=a&y%*%P!=b){x=s(-1:1,27,T)
y=s(-1:1,27,T)}
k=sign(x+y)
switch(z+2,x*y,k*(-1)^(x+y+1),k*!x-y)%*%P}

Спробуйте в Інтернеті!

Ця версія припинятиметься надзвичайно повільно. Богосорт базового перетворення, ця функція випадковим чином вибирає трити, доки вона якось магічно ( 3^-54шанс виникнення) не знайде правильні трити для aі b, а потім виконає необхідну операцію. Це в основному ніколи не закінчиться.


Я думаю, що zце обмежено {-1, 0, 1}.
Ерік Аутгольфер

@EriktheOutgolfer Ви можете вибрати, які значення zвідображати для однієї з цих трьох потрійних операцій кожна: [...]
Денніс

@ Денніс zє або -1, 0або1 , і я думаю, що це "значення z", про які йдеться.
Ерік Аутгольфер

Це різниця два байта, замінивши switch(z,...)з switch(z+2,...)таким чином було б тривіальне зміна незалежно.
Джузеппе

0

Желе , 47 байт

×=
×
N0⁼?ȯȧ?"
ḃ3%3’
0Çḅ3$$⁼¥1#ḢÇṚµ€z0Z⁹+2¤ŀ/Ṛḅ3

Спробуйте в Інтернеті!

Повна програма.

-1= C, 0= A, 1=B

Аргумент 1: [x, y]
Аргумент 3:z


Я не думаю , що приймати xі yв збалансованому троичной допускається: «х і у може бути від -3812798742493 до 3812798742493 включно Перший крок полягає в перетворенні х і у з десятковою маються на збалансованій троичной ..»
Джонатан Аллан


... але рідний формат для чисел не врівноважений потрійним в Jelly.
Джонатан Аллан

@JonathanAllan О, схоже, я неправильно зрозумів ....
Erik the Outgolfer

@JonathanAllan eugh ... виправлено
Erik the Outgolfer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.