tło
Większość ludzi tutaj powinna znać kilka podstawowych systemów liczb całkowitych: dziesiętny, binarny, szesnastkowy, ósemkowy. Na przykład w systemie szesnastkowym, liczba abc.de 16 stanowiłoby
a*16^2 + b*16^1 + c*16^0 + d*16^-1 + e*16^-2
Można jednak również stosować zasady niecałkowite, takie jak liczby niewymierne. Gdy takie bazowa wykorzystuje złoty stosunek cp = (1 + √5) / 2 ≈ 1,618 ... . Są one zdefiniowane analogicznie do zasad całkowitych. Zatem liczba abc.de φ (gdzie a to e są cyframi całkowitymi) reprezentuje
a*φ^2 + b*φ^1 + c*φ^0 + d*φ^-1 + e*φ^-2
Zauważ, że w zasadzie każda z cyfr może być ujemna (chociaż nie jesteśmy do tego przyzwyczajeni) - będziemy reprezentować cyfrę ujemną z wiodącym ~
. Na potrzeby tego pytania ograniczamy się do cyfr od ~9
do 9
, dzięki czemu możemy jednoznacznie zapisać liczbę jako jeden ciąg znaków (z tyldami pomiędzy nimi). Więc
-2*φ^2 + 9*φ^1 + 0*φ^0 + -4*φ^-1 + 3*φ^-2
byłoby napisane jako ~290.~43
. Nazywamy taki numer numerem fikcyjnym .
Liczbę finarną można zawsze przedstawić w postaci standardowej , co oznacza, że w reprezentacji są używane tylko cyfry 1
i 0
, bez 11
nigdzie, oraz z opcjonalnym znakiem minus wskazującym, że cała liczba jest ujemna. (Co ciekawe, każda liczba całkowita ma unikatową skończoną reprezentację w standardowej formie).
Reprezentacje, które nie są w formie standardowej, zawsze można przekształcić w formę standardową, korzystając z następujących obserwacji:
- 011 φ = 100 φ (ponieważ φ 2 = φ + 1)
- 0200 φ = 1001 φ (ponieważ φ 2 + 1 / φ = 2φ)
- 0 ~ 10 φ = ~ 101 φ (ponieważ φ - 1 / φ = 1)
Dodatkowo:
- Jeżeli najbardziej znacząca cyfra
~1
(z reszta numeru będąc formą standard), liczba jest ujemna, a my możemy przekształcić go w formie standardowej poprzez zamianę wszystkich1
i~1
, poprzedzenie znakiem minus, i stosując powyższe trzy zasady ponownie, dopóki nie uzyskaj standardowy formularz.
Oto przykład takiej normalizacji (używam dodatkowych spacji dla cyfr dodatnich, aby utrzymać wyrównanie pozycji każdej cyfry):
1~3.2~1φ
1~3. 2~1φ Rule:
= 0~2. 3~1φ (3)
= ~1~1. 4~1φ (3)
= ~1 0 0. 4~1φ (3)
= ~1 0 0. 3 0 1φ (3)
= ~1 0 1. 1 0 2φ (2)
= ~1 1 0. 0 0 2φ (1)
= ~1 1 0. 0 1 0 0 1φ (2)
= - 1~1 0. 0~1 0 0~1φ (4)
= - 0 0 1. 0~1 0 0~1φ (3)
= - 0 0 1.~1 0 1 0~1φ (3)
= - 0 0 0. 0 1 1 0~1φ (3)
= - 0 0 0. 0 1 1~1 0 1φ (3)
= - 0 0 0. 0 1 0 0 1 1φ (3)
= - 0 0 0. 0 1 0 1 0 0φ (1)
Wydajność .-0.0101φ
Do dalszego czytania Wikipedia ma bardzo pouczający artykuł na ten temat.
Wyzwanie
Stąd, lub w inny sposób, napisz program lub funkcję, która, biorąc pod uwagę ciąg reprezentujący liczbę finarną (jak opisano powyżej), wyświetla swoją standardową postać, bez zer wiodących ani końcowych. Dane wejściowe niekoniecznie zawierają punkt fikcyjny, ale zawsze będą zawierały cyfrę po lewej stronie (więc nie .123
). Wyjście musi zawsze zawierać punkt fiński i co najmniej jedną cyfrę po jego lewej stronie.
Możesz pobrać dane wejściowe za pomocą argumentu STDIN, ARGV lub funkcji i albo zwrócić wynik, albo wydrukować go do STDOUT.
Możesz użyć innego algorytmu niż powyższa procedura, o ile jest on zasadniczo poprawny i dokładny dla dowolnych (prawidłowych) danych wejściowych - to znaczy, jedynymi ograniczeniami, które mogą potencjalnie złamać twoją implementację, powinny być ograniczenia techniczne, takie jak rozmiar wbudowanego typy danych lub dostępna pamięć RAM. Na przykład, ocena danych wejściowych jako liczby zmiennoprzecinkowej, a następnie łapczywe wybieranie cyfr jest niedozwolona, ponieważ można znaleźć dane wejściowe, dla których niedokładności zmiennoprzecinkowe doprowadziłyby do niepoprawnych wyników.
To jest kod golfowy, wygrywa najkrótsza odpowiedź (w bajtach).
Przypadki testowe
Input Output
1 1.
9 10010.0101
1.618 10000.0000101
1~3.2~1 -0.0101
0.~1021 0. (or -0.)
105.~2 1010.0101
~31~5.~1 -100000.1001