Jedną z wielu unikalnych cech języka programowania Malbolge jest jego wysoce nieintuicyjny OP
operator, określany tylko jako „op” w dokumentacji i kodzie źródłowym, ale popularnie znany jako „zwariowany” operator. Jak opisuje Ben Olmstead, twórca języka, w swojej dokumentacji: „ nie szukaj wzoru, nie ma go ”.
op jest operatorem „trójstronnym” - działa na odpowiednich cyfrach trójskładnikowych dwóch argumentów. Dla każdego trytu (bitu trójskładnikowego) wynik operacji jest podawany przez następującą tabelę wyszukiwania:
a
op(a,b) 0 1 2
+-------
0 | 1 0 0
b 1 | 1 0 2
2 | 2 2 1
Na przykład, aby obliczyć op(12345, 54321)
, najpierw wypisz obie liczby w trójce, a następnie sprawdź każdą parę tritów w tabeli:
0121221020 (12345_3)
op 2202111220 (54321_3)
--------------
2202220211 (54616_3)
Ostatnim ważnym punktem jest to, że wszystkie wartości w Malbolge mają szerokość 10 tritów, więc wartości wejściowe należy uzupełnić zerami do szerokości 10. (Na przykład op(0, 0)
jest 1111111111
trójskładnikowy).
Twoim zadaniem jest przyjęcie dwóch liczb całkowitych 0 ≤ a
, b
<59049 jako wartości wejściowej i wyprowadzenie wartości całkowitej op(a,b)
.
Przypadki testowe (w formacie a b op(a,b)
):
0 0 29524
1 2 29525
59048 5 7
36905 2214 0
11355 1131 20650
12345 54321 54616
Oto implementacja referencyjna (skopiowana bezpośrednio z kodu źródłowego Malbolge).
54616_3
nie oznacza „ta druga rzecz to liczba dziesiętna 54616, ale reprezentowana jako podstawa trzy”. Oznacza to „Odczytaj54616
jako podstawę 3”. Czego oczywiście nie możesz zrobić (są tam cyfry, których Valve nie może policzyć). Prawdopodobnie byłoby tak samo jasne, jeśli pozbyłeś się_3
całkowicie i dokładniej.Odpowiedzi:
C (gcc) ,
999896 bajtów19683
w golfaL'䳣'
.108609
w golfaL''
.Wypróbuj online!
źródło
JavaScript (ES7), 56 bajtów
Wypróbuj online!
W jaki sposób?
Biorąc i w , obliczamy:b [ 0..2 ]za b [ 0..2 ]
Prowadzący do:
Wybór funkcji
Istnieje kilka innych możliwych funkcji kandydata w formularzu:
Jednym z najkrótszych jest:
Ale dobrą zaletą jest to, że można go wykonać za pomocą operatorów bitowych, w ten sposób domyślnie odrzucając części dziesiętne i . Dlatego możemy po prostu podzielić je przez bez zaokrąglania między każdą iteracją.a b 3( a + 512 b + 8 ) za b 3)
Skomentował
źródło
(1581093>>b%3*2+a%3*8&3)
oszczędza cały bajt!a/3
ib/3
nie zaokrąglam. Z tego powodu to by się nie udało.k = 9 ... => ~k && ...
sięk = 10 ... => k && ...
?for(k=9;k>=0;k--)
niżfor(k=10;k>=1;k--)
.05AB1E , 18 bajtów
Kod:
Wykorzystuje kodowanie 05AB1E . Wypróbuj online!
Algorytm Wyjaśnienie
Aby uzyskać liczbę uzupełnioną zerami, musimy dodać 59049 do obu liczb (ponieważ 59049 w trójce to 10000000000 ). Nie musimy pomijać wiodącej 1 jako . Konwertujemy liczby z dziesiętnego na trójskładnikowe i łączymy każdą parę jako każdą własną liczbę.(1,1)→0
Na przykład dla danych wejściowych 12345 i 54321 są one mapowane na:
Co daje następującą listę połączonych liczb całkowitych:
Te liczby całkowite muszą być odwzorowane przez podaną tabelę odnośników w PO. Stosowana obecnie formuła mapuje te liczby na odpowiadające im tryty ( ):0→1,10→0,…
Natomiast oznacza bitową funkcję xor .⊕
Ostatecznie po odwzorowaniu tej funkcji na listę połączonych liczb całkowitych traktujemy tę wynikową listę jako liczbę reprezentowaną w podstawie 3 i przekształcamy ją z podstawy 3 na dziesiętną.
Objaśnienie kodu
źródło
3Tm+3Bø19sm74%3%3β
można grać w golfa?R ,
6462 bajtówWypróbuj online!
Dzięki JAD za kilka sztuczek golfowych z
czarną magiąi -2 bajty!30801
, po przekonwertowaniu na dziesiętną trójwartościową liczbę całkowitą, to1120020210
po prostu dodaje końcowe zero do tabeli operacyjnej po odczytaniu kolumn. Następnie przekształcamy cyfry trójskładnikowea
ib
elementarne na liczbę całkowitą i używamy tego jako indeksu na cyfry trójskładnikowe30801
.źródło
x
za pomocą[.*]
. Potem mają miejsce wszystkie%any%
operacje. Część zabawy jest to, że jeśli widzisz30801%/%x%%3
jakof=function(x)30801%/%x%%3
, żef(x[index]) == (f(x))[index]
. Ratowanie aparatów ortodontycznych :)C (gcc) ,
747271 bajtówWypróbuj online!
Awaria
Tabela prawdy
Można go traktować jako tablicę 3x3, gdzie a to kolumna, a b to rząd. Przekształcenie tego w jednowymiarową listę daje nam 100102221. Aby zaoszczędzić miejsce, unikamy list i ciągów znaków, a zamiast tego przekształcamy je w liczbę. Aby to zrobić, odwracamy kolejność i przekształcamy każdą trit w liczbę 2-bitową. Sklej je ze sobą, a mamy liczbę binarną, na którą możemy „indeksować”, przesuwając w prawo
2 * (b * 3 + a)
i maskując:Następnie masujemy to wyrażenie, używając mocy pierwszeństwa działania, aby stać się ohydą powyżej.
3 ^ 9 = 19683, więc jest to dobry limit pętli. Ponieważ mnożymy licznik przez 3 za każdym razem, możemy zapisać limit jak2e4
zamiast tego. Również oszczędzamy sobie kłopotówpow()
lub podobnych.Po zastanowieniu zacznijmy od 3 ^ 10 i pracujmy w dół z podziałem i testem przed pętlą.
źródło
Haskell , 108 bajtów
Wypróbuj online!
źródło
APL (Dyalog) ,
4125 bajtów9 bajtów zapisanych dzięki @ Adám
Wypróbuj online!
źródło
3⊥(b⊤6883)[3⊥⍉⎕⊤⍨3,b←9⍴3]
Galaretka ,
2318 bajtów-1 dzięki Eryka Outgolfer (Przegrupuj
3*⁵¤
się⁵3*
)Monadyczny link akceptujący listę dwóch liczb całkowitych.
Wypróbuj online! Lub zobacz zestaw testowy .
⁹*%733%3
jest bajtem dłuższym niżị⁽½Ṡb3¤
:(W jaki sposób?
Również 18:
⁵3*+b3ZḌ19*%74%3ḅ3
(używa magicznej formuły po uzyskaniu par tritów konwersji z bazy dziesięciu, a następnie wzięciu 19 do tej mocy, modulo 74, modulo 3, aby uzyskać wymagane trity wyniku - znalezione przy użyciu wyszukiwania w Pythonie)źródło
y
0
s”)Python 2 ,
79656361 bajtówdzięki Arnauldowi za jego formułę (-2 bajty).
Wypróbuj online!
źródło
J , 37 bajtów
Wyjaśnienie:
Skończyło się to względnie czytelnością, tbh.
źródło
Python 2 ,
9087 bajtówWypróbuj online!
źródło
Węgiel drzewny , 31 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Alternatywne rozwiązanie, również 31 bajtów:
Wypróbuj online! Link jest do pełnej wersji kodu.
źródło
Rubinowy , 70 bajtów
Wypróbuj online!
Rozkłada się
a
ib
rekurencyjnie, dopóki nie otrzymamy 10 cyfr każdego.6883
daje spłaszczony trójskładnikowy stół (odwrócony). Odtwarza z trójki na dziesiętną, mnożąc przez3**(10-l)
.źródło
Cjam, 31 bajtów
Wypróbuj online!
źródło
J , 43 bajty
Z pewnością można dalej grać w golfa.
Wyjaśnienie:
Wypróbuj online!
źródło
Stax , 22 bajty
Uruchom i debuguj
źródło
Pyth
26 2524 bajtówZapisano 1 bajt dzięki @ErikTheOutgolfer
Zapisz inną bajt, zainspirowany @ JonathanAllan za odpowiedź
Dane wejściowe to lista 2 elementów
[a,b]
. Spróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe tutaj .źródło
.T
może byćC
.K (ngn / k) ,
2522 bajtówWypróbuj online!
źródło
Japt ,
2423 bajtySprawienie, by piłka rzuciła się na bieg Japt'a jako język miesiąca - w pełni oczekuję, że zostanę obeznany z tym!
Pobiera dane wejściowe w odwrotnej kolejności jako tablicę liczb całkowitych (tj
[b,a]
.).Spróbuj
źródło
Perl 5
-p
, 102 bajtówWypróbuj online!
źródło
Wolfram Language (Mathematica) ,
757260 bajtówWypróbuj online!
wersja bez gry w golfa:
Zarówno
a
ib
są konwertowane na liście dziesięciu trit parami, następnie wykorzystywane jako wskaźnik 2D w tabeli przeglądowej numerów{1, 0, 0, 1, 0, 2, 2, 2, 1}
. Wynik jest ponownie interpretowany jako lista dziesięcioliniowa i konwertowany z powrotem do postaci całkowitej.Tabela odnośników jest zakodowana jako
IntegerDigits[6883,3]
, co jest krótkie, ponieważ przetwarzamyIntegerDigits
symbol.źródło