Kredyty za pomysł na wyzwanie przejdź do @AndrewPiliser. Jego oryginalna propozycja w piaskownicy została porzucona, a ponieważ nie był tu aktywny od kilku miesięcy, podjąłem wyzwanie.
Zrównoważony trójskładnikowy jest niestandardowym systemem liczbowym. To jest jak trójkątny, na które cyfry wzrost wartości o współczynnik 3, jak pójdziesz dalej w lewo - tak100
jest9
i1001
ma 28 lat.
Jednak zamiast wartości 0, 1 i 2, cyfry mają wartości -1, 0 i 1 . (Nadal możesz użyć tego do wyrażenia dowolnej liczby całkowitej).
W przypadku tego wyzwania znaczenie cyfry +1
zostanie zapisane jako +
, -1
zostanie zapisane jako -
i 0
jest słuszne 0
. Zrównoważone trójskładnikowe nie używa -
symbolu przed liczbami, aby je zanegować, podobnie jak inne systemy liczbowe - patrz przykłady.
Twoim zadaniem jest napisanie kompletnego programu, który pobiera 32-bitową liczbę całkowitą ze znakiem dziesiętnym jako dane wejściowe i konwertuje ją na zbalansowany trójskładnikowy. Żadne wbudowane funkcje konwersji jakiegokolwiek rodzaju nie są dozwolone (Mathematica prawdopodobnie ma jedną ...). Dane wejściowe mogą być na standardowym wejściu, argumentach wiersza poleceń itp.
Zera wiodące mogą być obecne w danych wejściowych, ale nie w danych wyjściowych, chyba że dane wejściowe są 0
, w takim przypadku dane wyjściowe również powinny być 0
.
Przykłady
Są to konwersje ze zrównoważonych trójskładnikowych na dziesiętne; będziesz musiał przekonwertować w drugą stronę.
+0- = 1*3^2 + 0*3^1 + -1*3^0 = 9 + 0 + -1 = 8
+-0+ = 1*3^3 + -1*3^2 + 0*3^1 + 1*3^0 = 27 + -9 + 0 + 1 = 19
-+++ = -1*3^3 + 1*3^2 + 1*3^1 + 1*3^0 = -27 + 9 + 3 + 1 = -14
źródło
Odpowiedzi:
Python 2: 58 znaków
Generuje zrównoważone trójskładnikowe cyfra po cyfrze od końca. Ostatnią cyfrą jest przez reszty
n%3
istoty-1
,0
lub+1
. Następnie usuwamy ostatnią cyfrę i dzielimy przez 3, używając podziału podłogi w Pythonien=(n+1)/3
. Następnie postępujemy rekurencyjnie z nową ostatnią cyfrą, aż liczba wyniesie 0.Potrzebny jest specjalny przypadek, aby dane wejściowe
0
podawały0
zamiast pustego ciągu.Specyfikacje na to nie pozwalają, ale jeśli ktoś mógłby napisać funkcję zamiast programu i wypisać pusty łańcuch dla 0, możliwe byłoby rozwiązanie 40 znaków.
źródło
n*"."and
w przypadku funkcji tylko.print s or 0
Działa również lepiej: Ps or 0
. Próbowałemn*"."and
, ale nie powiedzie się, kiedyn<0
.CJam, 24 bajty
Wymyśliłem to niezależnie i myślę, że jest to prawdopodobnie jedyny sposób, aby sobie z tym poradzić.
Algorytmicznie jest podobny do odpowiedzi xnora.
Wypróbuj online tutaj
Jak to działa :
źródło
JavaScript (E6) 68
Kompletny program, zgodnie z żądaniem, z I / O poprzez wyskakujące okienko. Rdzeniem jest funkcja R, 49 bajtów.
Chyba nie różni się tak bardzo od innych rozwiązań rekurencyjnych. Wykorzystując automatyczną konwersję między ciągiem a liczbą, aby uniknąć specjalnego przypadku dla „0”
Przetestuj w konsoli FireFox / FireBug, używając tylko funkcji R.
Wydajność
źródło
d=(n%3+3)%3
kiedyd=n%3
daje taką samą wartośćd
?Pyth,
712423Jest to rozwiązanie rekurencyjne, oparte na 40-znakowej funkcji rekurencyjnej @ xnor.
y
konstruuje zbalansowaną trójkę wejścia, znajdując ostatnią cyfrę za pomocą indeksu mod 3, a następnie wykorzystuje fakt, że reszta cyfr jest równa zbalansowanej trójce dla (n + 1) / 3, przy użyciu dzielenia zmiennoprzecinkowego. Następnie wywołuje funkcję, zwracając wynik lub 0, jeśli wartością wejściową jest 0.Wypróbuj tutaj.
źródło
Mathematica -
157154146128Wersja golfowa:
I z naciskiem na czytelność:
Stosowanie:
Wydajność:
Ogromne podziękowania dla Martina Büttnera za zmniejszenie liczby znaków.
źródło
Mathematica, 54 znaki
Podobne do rekurencji xnora
Symbole unikodowych używane do zastąpienia
Floor
,Part
,!=
Wydajność
Przechowywany jak
f
dla zwięzłości i napisany bez użycia kodu Unicode, którego nie można wyświetlićźródło
GNU sed, 236 bajtów
Wypróbuj online!
Wyjaśnienie
Pierwsza połowa kodu (pomniejszona o pierwszą linię) tłumaczy dziesiętnie na unarny i pochodzi prosto z „ Porad dla golfa w sed” ”. Następnie tłumaczy jednoargumentowany na zrównoważony trójgłowy jeden tryt na raz, co zademonstruję, wykonując przykład ręcznie.
Przed ostatecznym wyjściem, trójoperandowy cyfr
-
,0
i+
są reprezentowane przez!
,:
i+
, odpowiednio.Aby uzyskać interesujący wynik, zaczynamy od
-48
, który został przekonwertowany na unarny (z-
nienaruszonym). Aby obliczyć pierwszy (najbardziej na prawo) trit, musimy obliczyć resztę 48 ÷ 3. Możemy to zrobić, zastępując111
s3
s:48 ÷ 3 nie ma reszty, więc nie ma
1
s, i wiemy, że nasz pierwszy trit to:
(dla 0), więc zastępujemy go:Teraz mamy nasze „jedno miejsce”, więc wiemy, że pozostałe
3
s reprezentują trzy miejsca. Aby matematyka działała, musimy podzielić je przez 3, tj. Zastąpić je1
s:Sprawdźmy
1111111111111111
dokładnie naszą matematykę: mamy 16 (unarskich ) w trójce i zero (:
) w jednym. To 3✕16 + 1✕0 = 48. Jak dotąd tak dobrze.Teraz zaczynamy od nowa. Zamień
111
s na3
s:Tym razem mamy resztę
1
, więc umieszczamy+
trójkę i zastępujemy pozostałe3
s1
s:Czas kontroli poczytalności: Mamy 5 (unary
11111
) w dziewiątym miejscu, 1 (+
) w trójce, a 0 (:
) w jednym miejscu: 9✕5 + 3✕1 + 1✕0 = 48. Świetnie! Ponownie zamieniamy111
s na3
s:Tym razem nasza reszta to 2 (
11
). To zajmuje dwie trits (+!
), co oznacza, że mamy carry. Podobnie jak w przypadku arytmetyki dziesiętnej, oznacza to, że bierzemy cyfrę najbardziej na prawo i dodajemy resztę do kolumny po lewej stronie. W naszym systemie oznacza to, że umieszczamy!
w dziewiątce miejsce i dodajemy kolejne trzy po jego lewej stronie, a następnie zastępujemy wszystkie3
s1
s, aby reprezentować miejsce 27.:Teraz nie pozostały nam żadne 3s, więc możemy zastąpić dowolne pozostałe jednoznaczne cyfry odpowiadającymi im tritami. Two (
11
) to+!
:W rzeczywistym kodzie odbywa się to w dwóch krokach
s/1/+/
iy/1:/!0/
, aby zapisać bajty. Drugi krok zastępuje również:
s0
s, więc faktycznie robi to:Teraz sprawdzamy, czy mamy liczbę ujemną. Robimy, więc musimy pozbyć się znaku, a następnie odwrócić każdą trit:
Na koniec zamieniamy
!
s na-
s:To jest to!
źródło
Stax , 17 bajtów
Uruchom i debuguj
Najkrótsza jak dotąd odpowiedź, ale niektóre języki gry powinny ją łatwo pokonać. Algorytm jest taki sam jak odpowiedź Python @ xnor.
Odpowiednik ASCII:
źródło
JavaScript
108102 (ES6, bez wywołania rekurencyjne)Oryginalny wpis na 108
Nie tak wyszukana, jak odpowiedź @ edc65 ... Byłbym wdzięczny za wszelką pomoc w zmniejszeniu tego ...
źródło
Clojure, 242 bajty
Czy to jak dotąd najdłuższa odpowiedź Clojure?
Niegolfowany (z komentarzami):
źródło
8 ,
179171167 znakówOto kompletny program na ósmym, który pobiera na wejściu liczbę całkowitą ze znakiem dziesiętnym i konwertuje ją na zbalansowany trójskładnikowy
Test
Za pierwszym razem program prosi o liczbę do konwersji (w razie potrzeby). Następnie można wywołać słowo,
f
aby przekonwertować więcej liczb, jak w następującym wierszu:Wydajność
Wyjaśnienie kodu
To jest kod do obsługi danych wejściowych. Rdzeń kodu znajduje się w środku słowa
f
. Z dala od pola golfowego użyłbym tego słowa>bt
zamiastf
. Oto wersja bez golfaf
(z komentarzami):źródło
Java,
327269 znakówMoja pierwsza próba gry w golfa kodu. Nie znam żadnego z tych naprawdę krótkich języków, więc oto rozwiązanie w Javie. Byłbym wdzięczny za radę, aby go jeszcze skrócić.
Wypróbuj tutaj: http://ideone.com/fxlBBb
EDYTOWAĆ
Zastąpiony
BufferedReader
przezScanner
, pozwalając mi usunąćthrows
klauzulę, ale musiałem zmienić import (+2 znaki). ZastąpionyInteger
przezint
. Niestety, program nie będzie kompilować, jeśli nie maString[] h
wmain
.źródło
Scanner
zamiast swojegoBufferedReader
. Również,String[] h
ithrows java.lang.Exception
prawdopodobnie nie są konieczne, a możesz zaoszczędzić kilka bajtów, używającint
zamiastInteger
.JavaScript (ES6), 51 bajtów
Pętla przez postacie. Najpierw pomnóż poprzednie całkowite czasy 3, a następnie, jeśli isNaN (znak) jest prawdziwy, przekonwertuj ciąg (znak + „1”) na liczbę i dodaj go, w przeciwnym razie zero.
źródło
Stax , 14 bajtów
Uruchom i debuguj
źródło
05AB1E , 20 bajtów
Wypróbuj online!
źródło
APL (NARS), 26 znaków, 52 bajty
test:
możliwe, może być mniej, jeśli ⊥ jest używane, ale jest zabronione ...
źródło