Istnieje znany trudny algorytm zliczania liczby ustawionych bitów w 32-bitowej liczbie całkowitej bez znaku:
int popcount(unsigned x) {
x = (x & 0x55555555) + ((x >> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F);
x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF);
x = (x & 0x0000FFFF) + ((x >>16) & 0x0000FFFF);
return x;
}
Nie wyjaśnię tego tutaj. Ale wyobraź sobie podobny kod dla 512-bitowych liczb całkowitych! Stałe szesnastkowe byłyby ogromne i tworzyłyby ładny wzór. Twoim zadaniem jest po prostu wydrukować dokładnie ten wynik :
0x55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
0x33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f
0x00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff
0x0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff
0x00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff
0x0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff
0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff
0x0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
Proszę nie wstawiać spacji końcowych - chociaż pojedynczy znak nowej linii jest opcjonalny.
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź (w bajtach).
Odpowiedzi:
05AB1E ,
262221 bajtów05AB1E wykorzystuje kodowanie CP-1252 .
Wypróbuj online!
Wyjaśnienie
Inne wersje, które można ulepszyć
źródło
Python 2,
524946 bajtówK-ta liczba jest podawana przez
2**512/(2**2**k + 1)
. Jest to liczba 512-bitowa, więc rozszerzenie wzoru na różne szerokości jest banalne.3 bajty zapisane dzięki Dennisowi.
3 bajty zapisane dzięki xnor.
źródło
l=2;exec"print'0x%0128x'%(2**512/-~l);l*=l;"*9
01010101
,00010001
,00000001
, a następnie mnożony przez tych1
,11
,1111
aby uzyskać prawidłowe wzorce binarnych. Na przykład01010101
możesz uzyskać formułę dla określonej szerokości w, wykonującsum 2^(2*k) for k = 0, w/2 - 1
i sprawdzając ją(2**w - 1)/3
.PHP,
111110108 bajtówJeden bajt zapisany dzięki @ user59178.
Jaki jest wzór dla 1024 bitów? :RE
źródło
$x<65
raczej niż$i++<7
. Tym razem przetestowałem to i wszystko.Siatkówka , 43 bajty
Wypróbuj online!
Wyjaśnienie
Często korzysta się z ogólnie nieużywanej
:
opcji, która pozwala wydrukować wyniki pośrednie, ponieważ modyfikacja pojedynczego wiersza jest o wiele krótsza niż zbudowanie całego wyniku.Zastępuje to puste wejście, a
0x
następnie 1285
s i wypisuje je, aby wygenerować pierwszy wiersz.Ten zastępuje
5
s3
s, aby wygenerować drugą linię i również ją wydrukować.To ostatnia linia w specjalnej obudowie, która co dwa
3
sekundy zamienia0f
się w trzecią linię. To również uruchamia pętlę przez ostatnie dwa etapy ({
). Jednak ten etap nie zrobi nic po pierwszej iteracji oprócz drukowania bieżącego stanu. W;
hamuje wyjście na samym końcu programu, aby uniknąć powielania ostatnią linię.To podstawienie przekształca teraz każdą linię w następną, zamieniając każdą inną parę
f
s i0
s. Warunek „co druga para” jest egzekwowany przez dopasowanie zera przedf
, co uniemożliwia dopasowanie kolejnych par, ponieważ dopasowania nie mogą się pokrywać.źródło
Vim, 32 bajty
i5<CR>3<Esc>qqYpVrf$<C-V>{yPG1vr0q6@q<C-V>{I0x<Esc>
I tylko trzeba ręcznie pisać pierwszą
5
i3
, a makro dba o resztę „podwajając liczbę bit” za każdym razem, to działa. Kolejność kroków w makrze jest nieco dziwna (utwórz nowąf
linię, skopiuj blokowo, ponownie użyj wizualnego rozmiaru bloku, aby wstawić0
s dof
linii), ale jest to najszybszy wariant, jaki znalazłem.źródło
Pyth, 26 bajtów
Port mojej odpowiedzi w języku Python.
źródło
J,
4634 bajtówPracuję nad golfem, ale to dziecko lubi pozostać w 46 bajtach ...Już nie! -12 bajtów dzięki milom!Wypróbuj online! :RE
Wynik
Do tej odpowiedzi potrzebowałem (najlepiej) czasownika z rangą
0 1
, aby użyć go wu"v
definicji rangi; jednak mile zaobserwowane0 _
wystarczyło do wykonania zadania.Tutaj widać kilka reprezentacji ciągów czasowników z ich odpowiednimi szeregami. To jest skrypt, którego użyłem do jego wygenerowania.
źródło
0 _
jest w porządku. Możesz go skrócić do 34 bajtów za pomocą'0x',"1'5','3','0f'(128$#)"{~2^i.7
Właściwie 25 bajtów
Wypróbuj online!
To rozwiązanie wykorzystuje fakt, że
f(n) = 2**512//(2**2**n + 1)
(gdzie//
jest dzielenie zmiennoprzecinkowe), aby zachować wartości.Wyjaśnienie:
źródło
JavaScript (Firefox 30+),
139113112928380 bajtówW końcu trafiam w rekurencyjną słodką plamę :-) Wykorzystuje poręczny ciąg znaków dandysa do zapisania 3 bajtów ponad
.map
:.replace
ma również 83 bajty:Jeśli dozwolony byłby wiodący nowy wiersz, byłoby to również 80 bajtów:
źródło
Python 2 , 60 bajtów
Wypróbuj online!
źródło
Bubblegum , 65 bajtów
Obowiązkowa odpowiedź gumy do żucia.
źródło
Haskell,
8472 bajtyOdpowiedź Porting @ orlp:
94 bajty alternatywne bez mocy
Text.Printf
:źródło
Control.Monad
w REPL. Naprawiony.PowerShell v2 +, 68 bajtów
PowerShell nie ma liczb całkowitych precyzji bez użycia
[bigint]
wywołań, a tych nie można łatwo przekonwertować na szesnastkowy, dlatego traktujemy to jako wyzwanie oparte na łańcuchach.Pierwszy wiersz obsługuje powtarzanie
5
i3
po prostu mnożenie ciągu znaków do128
znaków i odhaczanie0x
z przodu.Następna linia zapętla się od
$a=1
do7
, a każda iteracja generuje kolejny ciąg. Znów mamy0x
dołączona na przodzie, i robimy ciąg mnożenia w środku skonstruować odpowiednią liczbę0
if
łączone ze sobą, a następnie robi ciąg mnożenie tego na zewnątrz do odpowiedniej liczby znaków. Zauważ, że używamy$a
tutaj zmiennej , a nie licznika pętli$_
, abyśmy mogli odpowiednio skalować (w innym przypadku musielibyśmy zapętlić1,2,4,8,16,32,64|%{...}
, co jest dłuższe).Powstałe ciągi znaków są pozostawiane w potoku, a dane wyjściowe za pośrednictwem niejawnego mają
Write-Output
miejsce po zakończeniu programu, z nową linią między elementami.źródło
V , 43 bajty
Wypróbuj online!
Korzysta z jednego z najdłuższych skompresowanych wyrażeń regularnych, jakich kiedykolwiek potrzebowałem w odpowiedzi V. Oto bardziej czytelna wersja, w której dodałem bajt wyrażeń regularnych i zmieniłem znak niedrukowalny na znak
<esc>
Objaśnienie (przy użyciu czytelnej wersji):
źródło
JavaScript (ES6),
747270 bajtówObejmuje opcjonalny końcowy znak nowej linii.
Pokaż fragment kodu
źródło
Pyth -
3130 bajtówAby uzyskać wzór oprócz
3
„i5
”, to kumuluje się, redukując za każdym razem podwojenie fragmentów.Wypróbuj online tutaj .
źródło
Partia, 216 bajtów
źródło
Vim 72 bajty
TryItOnline!
Materiały niedrukowalne:
4
@w
s na końcu mnie denerwują, ale ponieważ@q
polegałem na awarii na końcu linii, to również zawiesza @w. Mogę spróbować po prostu uruchomić q 32 razy i sprawdzić, czy to popsunie późniejsze linie.źródło
C, 146 bajtów
Nie golfowany:
źródło
pieprzenie mózgu , 211 bajtów
Wypróbuj online!
źródło
x
generator można teraz przenieść poza pętlęGNU sed 4.2.2 , 77
Wypróbuj online.
źródło
Rubin ,
66 6045 bajtówWypróbuj online!
Pomysł skradziony z Orlp
źródło
C #, 168 bajtów
źródło
Stax , 19 bajtów
Uruchom i debuguj
Rozpakowane, niepolowane i skomentowane, wygląda to tak.
Uruchom ten
źródło
/// , 193 bajtów
Wypróbuj online!
źródło