Zmienna liczba bitów to tablica 0 lub więcej bitów. Podobnie [0, 1]
jest ze zmienną liczbą bitów, ale tak też jest []
.
Napisz funkcję lub program, który przy nieujemnej liczbie całkowitej zwraca zmienną liczbę bitów, dzięki czemu każda liczba całkowita ma odwzorowanie jeden na jeden (bijective) z tablicą.
Istnieje nieskończona ilość takich mapowań, możesz dowolnie je budować, ale musi to być jeden na jeden. Twoje mapowanie musi być koncepcyjnie jeden na jeden dla liczby całkowitej o dowolnym rozmiarze, ale jest OK, jeśli twoja implementacja nie powiedzie się dla dużych liczb całkowitych z powodu ograniczeń liczbowych typów w preferowanym języku (np. C int
).
Przykładem tego, co nie jest mapowaniem jeden na jeden, jest po prostu wyświetlenie cyfr binarnych liczby całkowitej. W takim systemie 5 staje się [1, 0, 1]
(lub 0b101
), ale nie jest to jeden do jednego, ponieważ 0b0101
lub [0, 1, 0, 1]
też oznacza 5.
Powinno być całkiem oczywiste, że mapowanie nie jest jeden do jednego, jeśli pomija liczbę całkowitą (np. Nie działa dla 5), ale chciałbym jasno powiedzieć, że pomijanie zmiennej tablicy bitów również nie jest jednym -do jednego. Musisz odwzorować na każdą możliwą zmienną tablicę bitów, w tym []
.
Najkrótszy kod w bajtach wygrywa.
Odpowiedzi:
Galaretka, 3 bajty
Ten sam pomysł, co xnor: mapuje
0 1 2 3 4 ...
na[] [0] [1] [0 0] [0 1] ...
; kod jest w zasadzieincrement → binary → remove first
.Wypróbuj online .
źródło
Python, 20 bajtów
Test:
Wykonanie
lambda n:bin(n+1)[3:]
zwiększa dane wejściowe, a następnie pobiera reprezentację binarną z usuniętym pierwszym symbolem ([3:]
ponieważ prefiks0b
to dwa znaki znaku). Ponieważ każda liczba dodatnia zaczyna się od 1 w postaci binarnej, to wyjątkowo daje reprezentację binarną.Bajt jest zapisywany przez użycie dopełniacza bitowego w
~n
celu uzyskania negacji-(n+1)
i usunięcie znaku ujemnego przez odcięcie jeszcze jednego symbolu.źródło
lambda s:int('1'+s,2)-1
.Pyth, 5 bajtów
Po prostu tłumaczenie odpowiedzi xnora na Pyth.
Q
jest eval () 'd input (),h
inkrementuje go,.B
konwertuje na ciąg binarny it
bierze „ogon” (czyli wszystko oprócz pierwszego znaku).źródło
Haskell,
41383029 bajtówPrzykład użycia:
(l!!) 4
->"10"
.Począwszy od pustej listy jako pierwszy element, chodzić leniwie przez liście i dołączyć bieżący element z
0
i1
przed nim.Edycja: @xnor zapisał
311 bajtów. Dzięki!źródło
[(0:),(1:)]<*>
<*>
sztuczkę, ale zapomniałem o tym. Dzięki jeszcze raz!l=[]:[b:x|x<-l,b<-[0,1]];(l!!)
.[b:x|x<-l,b<-"01"]
za pomocą produktu lub mapy(:)<$>[0,1]<*>l
konkatacji , ale wyrażenie produktu idzie w niewłaściwej kolejności, najpierw przygotowując 0 do wszystkiego, nigdy nie przechodząc do 1, ponieważ lista jest nieskończona. Czy masz jakies pomysły?JavaScript (ES6), 29 bajtów
Taki sam pomysł jak xnor.
źródło
Jolf, 4 bajty
Wypróbuj tutaj!
Bardzo prosta strategia, również najkrótsza.
źródło
Haskell, 35 bajtów
Haskell nie ma wbudowanego pliku binarnego, więc konwersja (odwrócona) jest wykonywana ręcznie. Aby usunąć początkową 1, przypadek podstawowy
1
przekształcił się w pustą listę.Edycja: Zapisano bajt, koniugując przez
+1
zamiast.źródło
C, 40 bajtów
Konwertuje dane wejściowe na bazę bijective 2 (z symbolami
0
i1
), podobnie jak inne odpowiedzi.ideone to!
źródło