... Ach, przepraszam, nie ma tu popcornu, tylko POPCNT.
Napisz najkrótszy program lub funkcję, która pobiera liczbę ni wypisuje wszystkie liczby całkowite od 0 do 2 n - 1, w porządku rosnącym liczby 1 bitów w binarnej reprezentacji liczb (popcount). Duplikaty nie są dozwolone.
Kolejność liczb z tym samym popcount jest zdefiniowana w implementacji.
Na przykład dla n = 3wszystkich tych danych wyjściowych są poprawne:
0, 1, 2, 4, 3, 5, 6, 7
[0, 4, 1, 2, 5, 3, 6, 7]
0 4 2 1 6 5 3 7
Format wejściowy i wyjściowy są zdefiniowane w implementacji, aby umożliwić korzystanie z funkcji językowych w celu dalszego kodowania kodu. Istnieje kilka ograniczeń dotyczących wyjścia:
- Liczby muszą być wyprowadzane w formacie dziesiętnym.
Dane wyjściowe muszą zawierać rozsądny separator między liczbami (dozwolony separator końcowy, ale nie wiodący).
Nowego wiersza (
\n), zakładka (\t), przestrzeń,,,.,;,|,-,_,/są dość rozsądne separator. Nie mam nic przeciwko dodatkowym odstępom na ładne drukowanie, ale nie używam liter ani cyfr jako separatorów.- Liczby i separatory mogą być otoczone
[ ],{ }lub dowolnej macierzy lub listy notacji. - Nie drukuj niczego, co nie zostało wymienione powyżej.
Premia
Pomnóż swój wynik przez 0,5, jeśli Twoje rozwiązanie może wygenerować liczbę w locie. Duch tej premii polega na tym, że jeśli chcesz bezpośrednio przekonwertować swoje rozwiązanie drukowania na generator, generator używa tylko co najwyżej pamięci O (n), gdzie n jest liczbą bitów, jak zdefiniowano powyżej. (Nie musisz tak naprawdę przekształcać swojego rozwiązania w generator). Zauważ, że chociaż narzucam n <= 28, pamięć potrzebna do przechowywania wszystkich liczb wciąż rośnie wykładniczo, a naiwne rozwiązanie sortujące pochłonie co najmniej 4 GB pamięci przy n = 28.
Przed skorzystaniem z tej premii proszę dodać proste wyjaśnienie dotyczące działania rozwiązania.