Cel
Biorąc pod uwagę nieujemną liczbę całkowitą, utwórz funkcję, która zwraca pozycję początkową liczby największych kolejnych 1 w wartości binarnej tej liczby całkowitej.
Po otrzymaniu danych wejściowych 0
powróć 0
.
Jeśli liczba ma wiele pasów o równej długości, musisz zwrócić pozycję ostatniej pasma.
Wkład
Liczba całkowita większa lub równa 0.
Wydajność
Liczba całkowita obliczona jak wyjaśniono poniżej.
Zasady
- To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach w każdym języku.
- Standardowe luki są zabronione.
Przykłady i przypadki testowe
Przykład 1
- Twoja funkcja ma liczbę całkowitą 142
- 142 jest równa 10001110 w systemie binarnym
- Najdłuższa seria to „111” (seria trzech)
- Smuga zaczyna się od pozycji 2 ^ 1
- Twoja funkcja zwraca 1 jako wynik
Przykład 2
- Twoja funkcja ma liczbę całkowitą 48
- 48 jest równa 110000 w systemie binarnym
- Najdłuższa seria to „11” (seria dwóch)
- Seria zaczyna się od pozycji 2 ^ 4
- Twoja funkcja zwraca 4 jako wynik
Przykład 3
- Twoja funkcja ma liczbę całkowitą 750
- 750 jest równa 1011101110 w systemie binarnym
- Najdłuższa seria to „111” (seria trzech)
- Ponieważ są dwie smugi o równej długości, zwracamy później smugę.
- Późniejsza seria rozpoczyna się od pozycji 2 ^ 5
- Twoja funkcja zwraca 5 jako wynik
0
. To ważny przypadek testowy.Odpowiedzi:
Galaretka ,
108 bajtówWypróbuj online!
Jak to działa
źródło
JavaScript (ES6),
41403634 bajtówZaoszczędź 4 bajty dzięki @ThePirateBay
Przypadki testowe
Pokaż fragment kodu
W jaki sposób?
Przypadek ogólny x> 0
Rekurencyjnie ORAZ wejście x za pomocą x / 2, które stopniowo zmniejsza wzorce kolejnych ustawionych bitów, aż pozostanie tylko najbardziej prawy bit sekwencji. Przechowujemy kopię ostatniej niezerowej wartości i określamy pozycję jej najbardziej znaczącego bitu, zaokrąglając podłogę do logarytmu podstawy 2.
Poniżej znajdują się kroki, które wykonujemy dla x = 750 ( 1011101110 w systemie binarnym).
Przypadek krawędzi x = 0
Specjalny przypadek
x = 0
natychmiast prowadzi doMath.log2(0) | 0
. Logarytm0
wartościowania-Infinity
i binarna OR bitowa wymusza przymus na 32-bitową liczbę całkowitą. Zgodnie ze specyfikacją abstrakcyjnej operacji ToInt32 daje to oczekiwane0
:źródło
0
, które są częścią zakresu wejściowego.Math.log2(k)|0
zamiast31-Math.clz32(k)
? A może coś mi brakuje?Math.log2(k)|0
jest w rzeczywistości zarówno krótszy, jak i prostszy w specjalnym przypadkux=0
. Dzięki. :)kod maszynowy x86, 14 bajtów
Korzystanie @ algorytmu Arnauld za dnia
x &= x>>1
i biorąc najwyższą ustaloną pozycję bit w kroku zanimx
staje0
.Możliwość wywołania z C / C ++ z podpisem
unsigned longest_set(unsigned edi);
w x86-64 System V ABI. Te same bajty kodu maszynowego będą dekodowane w ten sam sposób w trybie 32-bitowym, ale standardowe 32-bitowe konwencje wywoływania nie umieszczają pierwszego argumentuedi
. (Zmiana rejestru wejściowego naecx
lubedx
na Windows_fastcall
/_vectorcall
lubgcc -mregparm
może być wykonana bez zerwania czegokolwiek.)BSR
Instrukcja x86 (Bit Scan Reverse) jest do tego idealna, dając nam bezpośrednio indeks bitowy, zamiast zliczać wiodące zera. (bsr
nie tworzy bezpośrednio 0 dla wejścia = 0, tak jak32-lzcnt(x)
byśmy potrzebowali, ale potrzebujemy bsr = 31-lzcnt dla niezerowych danych wejściowych, więclzcnt
nawet nie zapisałbym instrukcji, nie mówiąc już o liczeniu bajtów. Zerowanie eax przed pętlą działa z powodubsr
' s półoficjalne zachowanie pozostawiania celu niezmodyfikowanego, gdy wartość wejściowa wynosi zero).Byłoby to jeszcze krótsze, gdybyśmy mogli zwrócić pozycję MSB najdłuższego biegu. W takim przypadku
lea ecx, [rdi+rdi]
(3 bajty) skopiuje + lewy Shift zamiastmov
+shr
(4 bajty).Zobacz ten link TIO dla dzwoniącego asm, który to robi
exit(longest_set(argc-1));
Testowanie za pomocą pętli powłoki:
źródło
Galaretka ,
191711 bajtówWypróbuj online!
-6 (!) Bajtów dzięki bystrym obserwacjom @ Dennisa
Jak to działa
źródło
0
, który jest w zakresie wejściowym.ȯ-µ...
B
zawsze zwraca tablicę rozpoczynającą się od 1 ,BUṪMṪ’×Ṡ
może się staćṪBL’
. Ponadto nie potrzebujeszḞ
iḟ0
oszczędzasz jeden bajt¹Ðf
.Python 2 , 45 bajtów
Wypróbuj online!
Zaoszczędź mnóstwo bajtów dzięki Dennis! (Heads up
len(bin(...))-3
zamiast zamiastmath.frexp
)Dzięki @xnor za znalezienie błędu, który na szczęście łatwo było naprawić!
źródło
x=3
, jak sądzę, ponieważand/or
zwarcia są nieprawidłowe, gdy funkcja zwraca 0.Perl 6 ,
4535 bajtówTa wysoce ulepszona wersja udostępniona dzięki uprzejmości @nwellnhof.
Wypróbuj online!
źródło
:g
aby uzyskać wszystkie dopasowania. Dzięki operatorowi smart-matchu mogłem{sort(.base(2).flip~~m:g/1+/).tail.from}
{.msb+1-(.base(2)~~m:g/1+/).max.to}
:g
i nie wymyśliłem, jak mogę używać przysłówka z operatorem smartmatch. Również.msb
metoda jest tutaj bardzo pomocna i wcześniej o niej nie wiedziałem.Python 2 ,
8978 bajtówWypróbuj online!
EDYCJA: Oszczędź 11 bajtów dzięki Mr. Xcoder.
źródło
05AB1E ,
141211 bajtówWypróbuj online! lub uruchom przypadki testowe .
Wyjaśnienie
źródło
J ,
1817 bajtówWypróbuj online!
Wyjaśnienie
źródło
x
diadadzie mają wartość 0 i 1, co to oznacza? Numer bazowy 2 ma cyfry,0
a1
więc1
numer bazowy ma cyfry ...0
? co zatem1
oznacza w tym kontekście? I czy0
liczba podstawowa jest zawsze zawsze0
?x #. y
najpierw oblicza,w =: */\. }. x , 1
a potem wraca+/ w * y
#.
, ponieważ polegasz na wewnętrznych szczegółach implementacyjnych, a nie na publicznym API?C # (.NET Core) ,
6460 bajtówWypróbuj online!
AC # wersja odpowiedzi @ Arnauld
Podziękowanie
4 bajty zapisane dzięki Kevin Cruijssen.
C # (.NET Core) ,
131123 + 18 = 141 bajtówWypróbuj online!
+18 bajtów dla
using System.Linq;
Podziękowanie
8 bajtów zaoszczędzonych dzięki Grzegorzowi Puławskiemu.
Degolfed
C # (.NET Core) ,
164161 bajtówWypróbuj online!
To nierozwiązanie
Linq
, które z pewnością można poprawić, choć nic nie jest od razu widoczne.Degolfed
źródło
r
pierwszą odpowiedź: tio.run/##dY9RS8MwFIWfza/…T=a=>{int x=(int)Math.Log(a,2);return(a&=a/2)>0?T(a):x<0?0:x;}
T=a=>(a&a/2)>0?T(a&a/2):Math.Log(a,2)<0?0:(int)Math.Log(a,2)
Łuska , 12 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Galaretka ,
14 13 1211 bajtówŁącze monadyczne przyjmujące i zwracające nieujemne liczby całkowite.
Wypróbuj online! lub zobacz zestaw testowy .
W jaki sposób?
źródło
ŒrṪP
zamiast tego użyłem prefiksów.Galaretka , 19 bajtów
Wypróbuj online!
Dziękujemy Jonathanowi Allanowi za uratowanie
46 bajtów!Za dużo pracowałem, żeby to porzucić, choć to trochę za długo. Naprawdę chciałem dodać rozwiązanie, które dosłownie wyszukuje najdłuższe podciągi
1
w reprezentacji binarnej ...Wyjaśnienie
źródło
BŒgḄṀB
zamiast tegoBwÇɓÇL+ɓBL_‘
Kotlin , 77 bajtów
Upiększony
Test
źródło
Haskell ,
101989675 bajtówWypróbuj online! Zastosowanie:
snd.maximum.(`zip`[0..]).c $ 142
plony1
.Wyjaśnienie:
c
konwertuje dane wejściowe na binarne, jednocześnie licząc długość pasm jednego, zbierając wyniki na liście.r<-c$div n 2
rekurencyjnie oblicza resztęr
tej listy, jednocześniesum[r!!0+1|mod n 2>0]:r
dodając bieżącą długość pasmar
. Zrozumienie listy sprawdza, czymod n 2>0
to znaczy, czy bieżąca cyfra binarna to jedna, a jeśli tak, bierze długość poprzedniej serii (pierwszy elementr
) i dodaje jedną. W przeciwnym razie zrozumienie listy jest puste isum[]
daje wynik0
. Dla przykładowego wejściac 142
zwraca listę[0,3,2,1,0,0,0,1,0]
.(`zip`[0..])
dodaje pozycję do każdego elementu z poprzedniej listy jako drugi składnik krotki. Na przykład daje to[(0,0),(3,1),(2,2),(1,3),(0,4),(0,5),(0,6),(1,7),(0,8)]
.maximum
znajduje leksykograficznie maksymalną krotkę na tej liście, to znaczy długości smug są uważane za pierwsze, ponieważ są one pierwszym składnikiem, aw przypadku powiązania decyduje drugi składnik, a mianowicie większy indeks. Daje to(3,1)
w przykładzie isnd
zwraca drugi składnik krotki.źródło
Python 2 lub 3 , 58 bajtów
Wypróbuj online!
źródło
C (gcc) ,
8180 bajtówWypróbuj online!
C (gcc) , 43 bajty
Wersja AC odpowiedzi @ Arnauld
Wypróbuj online!
źródło
n<1?0:log2(n)
zamiast(k=log2(n))<0?0:k
MS SQL Server,
437426407398 bajtówSQL Fiddle
Jestem pewien, że mógłbym usunąć podziały linii itp., Ale jest to tak kompaktowe, jak chciałem to zrobić:
Oto bardziej czytelna wersja:
Prawdziwa sztuczka polega na tym, że o ile mogłem znaleźć, nie ma natywnej funkcjonalności SQL do konwersji liczby z dziesiętnej na binarną. W rezultacie musiałem ręcznie zakodować konwersję do pliku binarnego, a następnie mogłem porównać to jako ciąg, jeden znak na raz, aż znajdę właściwą liczbę.
Jestem pewien, że jest lepszy sposób, aby to zrobić, ale nie widziałem (n) odpowiedzi SQL, więc pomyślałem, że ją tam wyrzucę.
źródło
APL (Dyalog Unicode) , 22 znaki = 53 bajty
Wymaga
⎕IO←0
ustawienia domyślnego w wielu systemach.Wypróbuj online!
⎕
monit o wprowadzenie⊢
dochód, (wydzielane¯1
z⎕
)2⊥⍣¯1
przekonwertować na base-2, używając tyle pozycji, ile potrzebab←
przechowaćb
(dla b inary)⌽
rewers(
…)
Zaznacz pozycje początkowe następujących pozycji:⊆⍨b
samo-podziałb
(tj. 1-pasmowyb
)↑
mix (zmień listę list w macierz, dopełnianie zerami)∨⌿
redukcja pionowa OR (daje najdłuższą smugę)⍸
Wskaźniki pozycji początkowych⌽
rewers⊃
wybierz pierwszy (daje zero, jeśli nie jest dostępny)źródło
MATL , 15 bajtów
Wypróbuj online!
Wykorzystuje połowę i AND. Jest
k
to konieczne tylko po to, aby zakończyć działanie1
- z jakiegoś powodu 1 ORAZ 0,5 zwraca 1, powodując nieskończoną pętlę.(alternatywne rozwiązanie:
BtnwY'tYswb*&X>)-
przez konwersję na kodowanie binarne i długość przebiegu)źródło
Arkusze Google, 94 bajty
Nie, to nie jest bardzo ładne. Byłoby naprawdę miło móc przechowywać
Dec2Bin(A1)
jako zmienną w celach informacyjnych.Kluczowy punkt: Podobnie jak Excel,
Dec2Bin
funkcja ma maksymalną wartość wejściową wynoszącą511
. Wszystko większe niż to zwraca błąd, jak pokazano poniżej.źródło
R, 117 bajtów
źródło
rev
, użyjReduce(...,T,T)
do kumulowania od prawej (przełączaniex,y
definicji funkcji). Następnie użyj,1+max(z)-which.max(z)
ponieważ wynik jest nieco inny. Użyj"if"
zamiast,"ifelse"
ponieważ nie potrzebujemy wektoryzacji; a jeśli użyjeszany(z)
zamiast tego!sum(z)
upuść bajt.Excel VBA,
5444 bajtów-10 Bajtów dzięki @EngineerToast
Anonimowa funkcja bezpośredniego okna VBE, która przenosi dane wejściowe z zakresu
[A1]
i wyjścia do bezpośredniego okna VBEźródło
C1
wciąż tam jestA1
, myślę, że możesz wyprowadzaćInstr
wyniki bezpośrednio z niewielkim przekręceniem dla zerowej korekcji wejściowej:?Instr(1,StrReverse([Dec2Bin(A1)]),1)+([A1]>0)
(46 bajtów). Prawda = -1, ponieważ ... VBA.>0
do[A1]
notacjiAPL (Dyalog Classic) ,
2421 bajtówWypróbuj online!
źródło
Pyth , 17 bajtów
To jest funkcja rekurencyjna. Link zawiera
y
w celu wywołania funkcji na danym wejściu.Sprawdź wszystkie przypadki testowe.
Pyth , 20 bajtów
Sprawdź wszystkie przypadki testowe.
źródło
R, 66 bajtów
Wyjaśnienie:
źródło
a$l
zamiasta[[1]]
ia$v
zamiast,a[[2]]
aby zapisać niektóre bajty :), a także>0
zamiast==1
.Python 2 , 41 bajtów
Wypróbuj online!
Na podstawie tego rozwiązania autorstwa pana Xcodera .
źródło
JavaScript, 54 znaki
i.toString(2)
pobiera ciąg binarny dla liczby całkowitej..split(0)
Dostaje każdy sekwencyjną jedynek udział w elemencie tablicy..sort().reverse()
dostaje pierwszą najwyższą wartość.[0].length
Daje nam długość tej pierwszej wartości.źródło
the starting position of number of largest consecutive 1's
Perl 5, 45 + 1 (-p)
Jeśli wypiszesz to w wierszu poleceń większości powłok, być może będziesz musiał wpisać to jako:
Taniec cytatów na końcu polega na tym, aby perl zobaczył a
'
, który w innym przypadku zostałby zużyty przez powłokę.źródło
Siatkówka ,
5243 bajtyKonwertuj na binarny, a następnie zamień na długość ciągu największego z nich.
Wypróbuj online - wszystkie przypadki testowe
Zaoszczędź 9 bajtów dzięki Martinowi.
źródło
$+
do${1}
. Ale możesz zaoszczędzić jeszcze więcej, zastępując ostatni etap kilkoma etapami: tio.run${1}
Została skopiowana z samouczka na Github.