Liczba całkowita jest obciążeniem binarnym, jeśli jej reprezentacja binarna zawiera więcej 1
niż 0
s, ignorując początkowe zera. Na przykład 1 jest obciążeniem binarnym, ponieważ jego reprezentacja binarna jest po prostu 1
, jednak 4 nie jest obciążeniem binarnym, tak jak jego reprezentacja binarna 100
. W przypadku remisu (na przykład 2, z reprezentacją binarną 10
), liczba nie jest uważana za binarną.
Biorąc pod uwagę dodatnią liczbę całkowitą jako dane wejściowe, wypisz prawdziwą wartość, jeśli jest binarnie ciężka, i wartość falsey, jeśli nie jest.
Przypadki testowe
Format: input -> binary -> output
1 -> 1 -> True
2 -> 10 -> False
4 -> 100 -> False
5 -> 101 -> True
60 -> 111100 -> True
316 -> 100111100 -> True
632 -> 1001111000 -> False
2147483647 -> 1111111111111111111111111111111 -> True
2147483648 -> 10000000000000000000000000000000 -> False
Punktacja
To jest golf golfowy, więc wygrywa najmniej bajtów w każdym języku
code-golf
number
decision-problem
binary
Skidsdev
źródło
źródło
Odpowiedzi:
Kod maszynowy x86,
1514 bajtówJest to funkcja wykorzystująca konwencję wywoływania __fastcall Microsoftu (pierwszy i jedyny parametr w ecx, zwracana wartość w eax, callee ma prawo zamykać edx), chociaż może być w trywialny sposób modyfikowana dla innych konwencji wywoływania, które przekazują argumenty w rejestrach.
Zwraca 255 jako prawdę, a 0 jako falsey.
Używa nieudokumentowanego (ale szeroko obsługiwanego) kodu operacyjnego
salc
.Demontaż poniżej:
Wypróbuj online!
Podziękowania dla Petera Cordesa za sugestię zastąpienia
lzcnt
gobsr
.źródło
popcnt
zanim przewinąłem w dół, aby spojrzeć na odpowiedzi, ale nie myślałem olzcnt
zajmowaniu się tylko znaczącymi cyframi, jak wymaga tego pytanie.bsr
zamiastlzcnt
(akarep bsr
)? Musisz użyćsub
zamiast,lea
ponieważ daje to 32-lzcnt. (Lub pozostawia dst niezmodyfikowany dla src = 0, na wszystkich istniejących urządzeniach Intel i AMD. AMD nawet dokumentuje to zachowanie, ale Intel twierdzi, że jest niezdefiniowany ... W każdym razie OP powiedział pozytywnie , co wyklucza0
.)popcnt
ibsr
, ale było 17 bajtów. Myślałem, że to całkiem nieźle w porównaniu z pierwszą odpowiedzią asm, którą zobaczyłem , ale ta sprytnalea
sztuczka nie pozwala na to. Patrzyłem również na porównywaniebsf
ipopcnt
. Ale nie widzę żadnego sposobu na pokonanie tego rozwiązania, nawet biorąc pod uwagę 1 bajt, który można zaoszczędzić, upuszczającrep
prefiks.salc
nie jest równoważny zsetc al
: ostatnie zestawyal
do 1 CF, jeśli zestaw, a nie 255salc
tosbb al, al
, ale można zaoszczędzić 1 bajt, aby go zakodować. Nawiasem mówiąc, jest to udokumentowane przez AMD i jest szeroko wspierane przez Intel, a mnemonik pochodzi nawet z mapy operacyjnej P6 Intela. Tak więc ten jest właściwie całkiem bezpieczny w użyciu. Również miłe ulepszenie tutaj, aby pomyśleć o użyciu tej instrukcji! Jest to w zasadzie to, co zrobił mój oryginalny szkic, z wyjątkiem tego, że (1) użyłem kodu x86-64, więcinc
kodowanie było dwa razy dłuższe i (2) nie myślałemsalc
, więc wykonałem tę samą pracę w dłuższa droga. Szkoda, że mogę głosować tylko raz.Galaretka , 5 bajtów
Daje niepuste wyjście (prawda) lub puste wyjście (fałsz).
Wypróbuj online!
Jak to działa
źródło
Bo-S
, ale nie mogłem znaleźć 1-bajtowego atomu, który zamieniłby pozytywne / nie-pozytywne w prawdę / fałsz ...Æṃ
wtedy nie istniało.Python 2 , 35 bajtów
Wypróbuj online!
Stara odpowiedź, 38 bajtów
Wyjścia
0
jak falsy i-2
czy-1
jako truthyWypróbuj online!
źródło
bin
powoduje to rozwiązanie problemu?max
działania. W przypadku remisu, max zwróci pierwszą wartość w iteracji, która ma maksymalną wartość. Ten kod wykorzystuje ten fakt, aby upewnić się, że 1 jest zwracane w przypadku remisu, co w rzeczywistości oznacza, że jest ich więcej niż zera, ponieważ dodano dodatkowe zerobin
. W rzeczywistości byłby niepoprawny, gdyby został napisany w ten sposób, gdyby nie dodatkowe zero.cmp
zwroty0
są równeOktawa , 18 bajtów
TIO nie działa, ponieważ zestaw narzędzi do komunikacji nie jest dołączony. Można to przetestować w Octave-Online .
Jak to działa:
de2bi
konwertuje liczbę dziesiętną na binarny wektor numeryczny, a nie ciąg, jak todec2bin
robi.mode
zwraca najczęstszą cyfrę w wektorze. Domyślnie jest najniższy w przypadku remisu.źródło
JavaScript (ES6),
3634 bajtówźródło
f=(n,x=0)=>n?f(n>>>1,x+=n%2-.5):x>0
dla 35 bajtów.n>>1
zamiast,n>>>1
aby zapisać bajt, ponieważ dane wejściowe nigdy nie są ujemne.n/2|0
nie ma nic lepszego: /MATL , 3 bajty
Wypróbuj online!
Naprawdę nie znam MATL-a, zauważyłem, że to
mode
może zadziałać w odpowiedzi Octave na alphalpha i doszedłem do wniosku, że w MATL-ie jest jakiś odpowiednik.źródło
Mathematica, 22 bajty
Oszczędność jednego bajtu dzięki @MartinEnder i @JungHwanMin .
źródło
@@
.#>#2&@@#~DigitCount~2&
Brachylog , 6 bajtów
Wypróbuj online!
Wyjaśnienie
Ponieważ
ḃ
nigdy nie ujednolici wyników za pomocą listy cyfr z zerami wiodącymi, wiemy, że wystąpienia1
zawsze będą pierwsze, a wystąpienia0
zawsze będą drugie poọ
.źródło
Python 3 ,
44(dzięki @ c-mcavoy) 40 bajtówWypróbuj online!
źródło
C (gcc) ,
51484140 bajtówWypróbuj online!
źródło
unsigned
n>>=1
nan/=2
. Myślę też, że możesz użyć~n
zamiast tegon^-1
, co powinno również pozwolić ci się zmienić&&
na&
n
, nie mówiąc już o zmianie&&
na&
, nie sądzę, żeby to zadziałało. Ale zmiana*
wydaje się działać&&
Miałem tylko obsłużyć przypadek bez znaku, ale ponieważ potrzebuję tylko dodatnich liczb całkowitych, mogę to wszystko usunąć razem. Dobry pomysł na/=
bycie krótszym,>>=
ale dzięki!n&1?++i:--1
nai+=n%2*2-1
. Możesz się także pozbyć>0
, stwierdzając, że wyślesz zero dla ciężkich i niezerowych dla nie ciężkichR ,
545351 bajtów-1 bajt dzięki Maxowi Lawnboyowi
czyta ze standardowego; zwraca
TRUE
binarne liczby ciężkie.d
to liczba cyfr binarnych;sum(n%/%2^(0:d)%%2
oblicza sumę cyfr (tj. liczbę jedności).Wypróbuj online!
źródło
log2(n)
zamiastlog(n,2)
zaoszczędzić 1 bajtkod maszynowy x86_64,
232221 bajtówZdemontowano:
Dzięki @Ruslan, @PeterCordes za
-1
bajt!Wypróbuj online!
źródło
8d 1f
zamiast89 fb
?add eax, 2
+dec eax
, ale twoje komentarze sugerują, że chcesz zwiększyćebx
, a nieeax
.jnz Next
/add
/dec
(7 bajtów) nalea -1(%rax, %rbx, 2), %eax
(4 bajty) do zrobieniaeax += 2*ebx - 1
(jak w innej odpowiedzi kodu maszynowego x86 ). Następnie poza pętląneg %eax
(2 bajty) przed przesunięciem bitu znaku na dół. Oszczędność netto 1 bajta. Lubtest %eax,%eax
/setge %al
działałby również, jeśli twoją wartością zwracaną jest abool
lubint8_t
.lea -1(%rax,rbx,2)
alelea -1(%eax,%eax,2)
zmarnowałem bajty w ten sposób. W każdym razie oboje mieliście rację, mogę zapisać taki bajt. Wielkie dzięki (w zamian zmienię tolea
namov
chwilę).Perl 6 ,
3230 bajtówSprawdź to
Sprawdź to
Rozszerzony:
źródło
Mądry ,
4039 bajtówWypróbuj online!
Wyjaśnienie
źródło
Haskell,
4134Jeśli
n
jest nieparzysty, weź,-1
jeśli to jest parzyste, weź1
. Dodaj połączenie rekurencyjne za pomocąn/2
i zakończ, jeślin = 0
. Jeśli wynik jest mniejszy niż0
liczba jest binarna.Wypróbuj online!
Edycja: @ Ørjan Johansen znalazł kilka skrótów i zapisał 7 bajtów. Dzięki!
źródło
mod n 2
może być sprawiedliwyn
, a bajt jest krótszy bez akumulatora. Wypróbuj online!Siatkówka ,
3734 bajtówWypróbuj online! Link zawiera mniejsze przypadki testowe (w większych prawdopodobnie zabraknie pamięci). Edycja: Zapisano 3 bajty dzięki @MartinEnder. Objaśnienie: Pierwszy etap konwertuje z postaci dziesiętnej na unarną, a kolejne dwa stopnie konwertują z unaryjnej na binarną (jest to prawie prosto z jednostronnej strony arytmetycznej na wiki Retina, tyle że używam
@
zamiast niej0
). Trzeci etap szuka pary znaków niepodobnych, które mogłyby być@1
albo1@
i usuwa je, dopóki żaden pozostają. Ostatni etap sprawdza następnie pozostałe 1s.źródło
${1}
może być$+
. Lub możesz użyć!
zamiast,0
a następnie skrócić01|10
do.\b.
.$+
robi dobrą rzecz, gdy wzór zawiera znak|
? Zastanawiam się, czy mógłbym użyć tego wcześniej ...$+
jest super głupi i po prostu używa grupy z największą liczbą, bez względu na to, czy została użyta, czy nie. Przydaje się to do gry w golfa, gdy masz więcej niż dziewięć grup lub w sytuacji takiej jak ta tutaj, i nie wiem, dlaczego kiedykolwiek używałbym go w regexie produkcyjnym.R , 43 bajty
Wypróbuj online!
źródło
intToBits
Kotlin , 50 bajtów
Lambda typu niejawnego
(Int) -> Boolean
. Wersja 1.1 i wyższa tylko ze względu na użycieInt.toString(radix: Int)
.Niestety środowisko uruchomieniowe TIO Kotlin wydaje się być 1.0.x, więc tutaj jest smutny pies zamiast linku TIO:
źródło
Pyth,
97 bajtówWypróbuj tutaj.
-2 dzięki FryAmTheEggman .
źródło
>ysJjQ2lJ
.B
!)R,
3937 bajtówJest to kombinacja metod używanych przez @MickyT i @Giuseppe, oszczędzając kolejne kilka bajtów.
sum(intToBits(x) > 0)
zlicza liczbę1
bitów i2+log2(x)/2
stanowi połowę całkowitej liczby bitów po zaokrągleniu w dół. Nie musimy zaokrąglać w dół z powodu zachowania, gdy obie wartości są równe.źródło
C # (.NET Core) ,
62, 49 bajtówBez LINQ.
EDYCJA: dana z 13-bajtowym golfem zmieniającym czas na rekurencyjny i zwracającym bool zamiast liczby całkowitej.
Wypróbuj online!
źródło
Regex (ECMAScript),
857371 bajtówWypróbuj online!
wyjaśnienie przez Deadcode
Wcześniejsza 73-bajtowa wersja została wyjaśniona poniżej.
^((?=(x*?)\2(\2{4})+$)\2|(?=(x*?)(\4\4xx)*$)(\4|\5(x*)\7\7(?=\4\7$)\B))+$
Z powodu ograniczeń wyrażenia regularnego ECMAScript skuteczną taktyką jest często przekształcanie kroku numer jeden na raz, przy zachowaniu wymaganej właściwości niezmiennej na każdym kroku. Na przykład, aby przetestować idealny kwadrat lub potęgę 2, zmniejsz liczbę, zachowując kwadrat lub potęgę 2 (odpowiednio) na każdym kroku.
Oto, co robi to rozwiązanie na każdym kroku:
1
1
1
10
01
01
Gdy te powtarzające się kroki nie mogą pójść dalej, wynikiem końcowym będzie ciągły ciąg
1
bitów, który jest ciężki i wskazuje, że pierwotna liczba była również ciężka, lub potęga 2, co wskazuje, że pierwotna liczba nie była ciężka.I oczywiście, chociaż te kroki są opisane powyżej w kategoriach manipulacji typograficznych na binarnej reprezentacji liczby, w rzeczywistości są one realizowane jako jednowymiarowa arytmetyka.
źródło
\5
są wyłączone o jeden). Przestudiowałem to, wyjaśniłem i skomentowałem w mojej odpowiedzi (ponieważ StackExchange nie zezwala na odpowiedzi wielowierszowe).Regex (ECMAScript), 183 bajty
Był to kolejny interesujący problem do rozwiązania z wyrażeniem regularnym ECMA. „Oczywistym” sposobem na poradzenie sobie z tym jest policzenie liczby
1
bitów i porównanie ich z całkowitą liczbą bitów. Ale nie można bezpośrednio liczyć rzeczy w wyrażeniu regularnym ECMAScript - brak trwałych odwołań zwrotnych oznacza, że tylko jedna liczba może być modyfikowana w pętli, a na każdym kroku można ją tylko zmniejszyć.Ten jednoargumentowy algorytm działa w następujący sposób:
1
bit do najmniej znaczącej pozycji, w której jest0
bit. Każdy z tych kroków jest odejmowaniem. Na końcu pętli pozostała liczba (jak byłaby reprezentowana w postaci binarnej) to ciąg1
s bez0
s. Operacje te są faktycznie wykonywane jednostkowo; tylko koncepcyjnie są one wykonywane binarnie.1
s” z pierwiastkiem kwadratowym uzyskanym wcześniej. Jeśli pierwiastek kwadratowy musiał zostać zaokrąglony w dół, użyj jego podwójnej wersji. Zapewnia to, że „ciąg binarny1
s” musi mieć więcej niż połowę liczby cyfr binarnych niż N, aby możliwe było ostateczne dopasowanie.Aby uzyskać pierwiastek kwadratowy, stosuje się wariant algorytmu mnożenia krótko opisany w moim wyrażeniu regularnym liczb Rocco . Aby zidentyfikować najmniej znaczący
0
bit, zastosowano algorytm podziału krótko opisany w moim wyrażeniu regularnym wyrażenia regularnego . To są spoilery . Więc nie czytaj dalej, jeśli nie chcesz, aby zepsuła Ci się jakaś zaawansowana magia wyrażeń regularnych . Jeśli chcesz spróbować samemu odkryć tę magię, zdecydowanie polecam zacząć od rozwiązania niektórych problemów z listy zalecanych problemów oznaczonych spoilerem w tym wcześniejszym poście i samodzielnego wymyślenia matematycznych spostrzeżeń.Bez zbędnych ceregieli wyrażenie regularne:
^(?=.*?(?!(x(xx)+)\1*$)(x)*?(x(x*))(?=(\4*)\5+$)\4*$\6)(?=(((?=(x(x+)(?=\10$))*(x*))(?!.*$\11)(?=(x*)(?=(x\12)*$)(?=\11+$)\11\12+$)(?=.*?(?!(x(xx)+)\14*$)\13(x*))\16)*))\7\4(.*$\3|\4)
Wypróbuj online!
źródło
Galaretka , 6 bajtów
Wypróbuj online!
źródło
Bo-S
można użyć do obliczenia binarnej „wagi” danych wejściowych, niestety najkrótszym sposobem, który wydaje się byćBo-S>0
…Ḷ
działa: PJ , 12 bajtów
J wykonuje czasowniki od prawej do lewej, więc zacznijmy od końca i zmierzajmy do początku.
Wyjaśnienie
źródło
(#<2*+/)@#:
powinienem uratować 1, chyba że coś mi umknie.Julia, 22 bajty
źródło
Oktawa , 26 bajtów
Wypróbuj online!
źródło
mode(dec2bin(a)-48)
PHP , 44 bajty
Wypróbuj online!
PHP , 48 bajtów
Wypróbuj online!
źródło
Python 2 , 44 bajty
Wypróbuj online!
Stara odpowiedź, 47 bajtów
Jest to po prostu port odpowiedzi na C w @ cleblanc . Jest dłuższy niż inne odpowiedzi w Pythonie, ale pomyślałem, że warto było to opublikować, ponieważ jest to zupełnie inna metoda znalezienia odpowiedzi.
Wypróbuj online!
źródło
C #, 82 bajty
źródło
n=>{var s=Convert.ToString(n,2);return s.Count(c=>c=='1')>s.Length/2;}
Convert
i dołączyćusing System.Linq;
(napisane krótszy jakonamespace System.Linq{}
). Fajny pomysł po prostu nie goli się wystarczająco, aby uzasadnić oszczędność w tym przypadku.