Zwykle rozkładamy liczbę na cyfry binarne, przypisując jej potęgę 2, o współczynniku
0
lub1
dla każdego terminu:
25 = 1*16 + 1*8 + 0*4 + 0*2 + 1*1
Wybór
0
i1
... nie jest bardzo binarny. Dokonamy prawdziwej ekspansji binarnej poprzez rozszerzenie o potęgach 2, ale o współczynniku1
lub-1
zamiast tego:
25 = 1*16 + 1*8 + 1*4 - 1*2 - 1*1
Teraz wygląda to na binarne.
Biorąc pod uwagę dowolną liczbę dodatnią, stwierdzenie, że:
- Każda liczba nieparzysta ma nieskończenie wiele prawdziwych rozszerzeń binarnych
- Każda liczba parzysta nie ma prawdziwych rozszerzeń binarnych
Dlatego, aby prawdziwa interpretacja binarna była dobrze zdefiniowana, wymagamy, aby była ona najmniejsza , tj. Najkrótsza.
Biorąc pod uwagę każdą dodatnią, nieparzystą liczbę całkowitą n
, zwróć jej prawdziwe rozwinięcie binarne, od najbardziej znaczącej cyfry do najmniej znaczącej cyfry (lub w odwrotnej kolejności).
Zasady:
- Jak to jest golf-golf, powinieneś dążyć do tego, aby uzyskać jak najkrótszą liczbę bajtów. Wbudowane są dozwolone.
- Dowolne dane wyjściowe, które mogą przedstawiać i wyświetlać współczynniki, są dopuszczalne: tablica, ciąg współczynników z separatorami itp.
- Obowiązują standardowe luki w grze w golfa.
- Twój program powinien działać dla wartości w standardowym rozmiarze całkowitym twojego języka.
Przypadki testowe
25 -> [1,1,1,-1,-1]
47 -> [1,1,-1,1,1,1]
1 -> [1]
3 -> [1,1]
1234567 -> [1,1,-1,-1,1,-1,1,1,-1,1,-1,1,1,-1,1,-1,-1,-1,-1,1,1]
0
zamiast stanu-1
niskiego napięcia. Dzwoniący odbierający bity wie, co mają na myśli. (To wciąż nie jest trywialne ćwiczenie polegające na manipulowaniu bitami, ponieważ obrót w prawo działa tylko wtedy, gdy ma 32 znaczące bity. Np. Liczba 5-bitowa wymaga szerokości obrotu 5).111-1-1
ważne jest wyjście dla25
?Odpowiedzi:
Japt , 6 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Pyth ,
1211 bajtówWypróbuj tutaj!
W jaki sposób?
Po pierwsze, zauważamy, że zadaniem jest po prostu „zastąpić
0
s w zapisie binarnym-1
s i przesunąć w prawo o 1 miejsce”. - Właśnie to powinniśmy zrobić! Konwersja binarna daje nam listę0
s i1
s. Wszystko trzeba zrobić tutaj jest znalezienie Golfy sposób przekonwertować0
do-1
. Operator bitowy|
(bitowy OR) jest naszym przyjacielem. Mapa nad reprezentacją binarną przesunięta o|
i-1
. Jeśli bieżący numer to0
, zostanie przekonwertowany na-1
.źródło
Perl 6
Wersja łańcuchowa, 31 bajtów
Wypróbuj online!
Wersja listy, 36 bajtów
Wypróbuj online!
źródło
JavaScript (ES6),
3534 bajtówTestowy fragment kodu
Pokaż fragment kodu
źródło
Perl 6 , 72 bajtów
Z pewnością jest lepszy sposób, ale to właśnie mam ...
Wypróbuj online!
Objaśnienie : Jest to funkcja, która pobiera jeden argument (
->$a
). Najpierw otrzymujemy wymaganą liczbę współczynników ($a.base(2).chars
= liczbę znaków w reprezentacji podstawy 2), a następnie tworzymy iloczyn kartezjański (X
) z wielu par(1,-1)
. ([X]
Oznacza: zmniejsz poniższą listę za pomocąX
.) Otrzymujemy więc listę wszystkich możliwych kombinacji 1s i -1s. Następnie filtrujemy (grep
) tylko listy, które kodują podaną liczbę$a
. Jest tylko jedna, więc otrzymujemy listę jednej listy ze współczynnikami.Blok grep robi to: bierze argument jako list (
@^a
), odwraca go i zamyka z nieskończoną listą0,1,2,...
za pomocą operatora „left bit shift”+<
. Zipowanie zatrzymuje się, gdy tylko krótsza lista się wyczerpie (dla nas dobre!) Następnie sumujemy wszystkie wyniki i porównujemy je z podaną liczbą. Musieliśmy użyć,.reverse
ponieważ PO wymaga, aby współczynniki były w kolejności od najbardziej znaczącej do najmniej znaczącej.źródło
Galaretka , 5 bajtów
Wypróbuj online!
źródło
05AB1E ,
65 bajtówWypróbuj online!
źródło
D<
może być®
(®
jest domyślny-1
).J, 11 bajtów
Wypróbuj online!
Dzięki @JosiahWinslow za algorytm.
Masz jakieś przemyślenia na temat skrócenia konwersji?
!.
Myślę o użyciu -fit (nvm, to tylko zmienia tolerancję konwersji).Użycie
{
-take jest dłuższe o 1 znak.źródło
Java 8, 101 bajtów
Port odpowiedzi Japt @Oliver , z kilkoma dodatkowymi bajtami ..;)
Można zdecydowanie zagrać w golfa, stosując podejście matematyczne zamiast tego podejścia strunowego.
Wyjaśnienie:
Wypróbuj tutaj.
źródło
R ,
908846 bajtówWypróbuj online!
Implementuje algorytm Olivera , ale zwraca cyfry w odwrotnej kolejności. Ponieważ gwarantujemy, że
n
nigdy się nie wyrówna, zawsze jest najmniej znaczący bit (pierwszy)1
, więc usuwamy go i dopisujemy1
do końca, aby symulować obrót w R. Dzięki Shaggy za nakłonienie mnie do poprawienia matematyki .Po prostu
rev( )
wywołań funkcji w stopce powinno zwrócić wartości w tej samej kolejności.oryginalna odpowiedź, 88 bajtów:
Funkcja anonimowa; zwraca wartości w odwrotnej kolejności z dołączonymi nazwami kolumn.
Wypróbuj online!
Wyjaśnienie:
źródło
from the most significant digit to the least significant digit (or in reversed order).
dlatego powinno to być całkowicie dopuszczalne.25
, że na przykład prawidłowym wyjściem byłoby[1,1,1,-1,-1]
lub[-1,-1,1,1,1]
.2*bits - 1
zamiast1-2*bits
. Dziękuję Ci.Perl 5 , 30 bajtów
Kod 29 bajtów, 1 bajt na
-p
przełącznik.Wypróbuj online!
źródło
CJam, 12 bajtów
Port mojej odpowiedzi w Golfscript.
źródło
Rubinowy ,
44 37 3332 bajtyWypróbuj online!
źródło
Golfscript,
141314 bajtów-1 bajt, ponieważ zapomniałem o
%
istnieniu. +1 bajt, ponieważ zapomniałem również, że jest to ciąg znaków.źródło
{}
aby był blokiem. Pełne programy mogą pobierać dane tylko jako ciągi znaków.{2base{.+(}%\}
dotyczy 15 bajtów. Podobnie twoja odpowiedź na CJam.~
.