Zadanie
Znajdź zestaw liczb w taki sposób, że reprezentacja binarna zawiera dwa lub więcej przebiegów 1
oddzielonych co najmniej jednym 0
.
Na przykład liczby o długości 4 bitów:
0 0000 (no ones)
1 0001 (only one run)
2 0010 (only one run)
3 0011 (only one run)
4 0100 (only one run)
5 0101 Valid
6 0110 (only one run)
7 0111 (only one run)
8 1000 (only one run)
9 1001 Valid
10 1010 Valid
11 1011 Valid
12 1100 (only one run)
13 1101 Valid
14 1110 (only one run)
15 1111 (only one run)
Wkład
Liczba całkowita dostarczona do aplikacji za pośrednictwem niektórych danych wejściowych z zakresu 3 .. 32
. Jest to maksymalna liczba bitów do zliczenia.
Dane wejściowe n
wskazują, że liczby muszą zostać zbadane.0 .. 2n-1
Wydajność
Ograniczona (do wyboru) lista wszystkich liczb spełniających kryteria. Liczby należy przedstawić w kolejności numerycznej. Dopuszczalny jest dodatkowy ogranicznik końcowy. []
Dopuszczalne są również załączniki struktury danych (np. I podobne).
Przykład
Input: 3
Output: 5
Input: 4
Output: 5, 9, 10, 11, 13
Input: 5
Output: 5, 9, 10, 11, 13, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 29
To jest golf golfowy - wygrywa odpowiedź z najmniejszą ilością bajtów.
\n
wyznacza i umieszcza znak\n
w ostatnim wierszu, to dopuszczalne jest również,
rozdzielanie znakiem końca,
. Zaktualizowano[1, 2, 3]
?Odpowiedzi:
Pyth, 12 bajtów
Wypróbuj online.
Pomysł
Binarna reprezentacja dowolnej liczby dodatniej zawsze zaczyna się od ciągu 1 s, po którym ewentualnie następują inne przemienne przebiegi od 0 do 1 s. Jeśli istnieją co najmniej trzy oddzielne przebiegi, dwa z nich są gwarantowane przez 1 s.
Kod
źródło
Python, 48
Bardzo się nad tym zastanawiałem. Musimy tylko sprawdzić, czy zawiera to rozszerzenie binarne
'01'
.Aby były dwa biegi jednego, ten po prawej musi być poprzedzony znakiem
0
. Jeśli jest tylko jeden bieg, nie będzie żadnych wiodących0
, więc tak się nie stanie.Stara odpowiedź:
Reprezentacja binarna Pythona działa tutaj bardzo dobrze. Liczba binarna jest zapisana jak
bin(9)=='0b10110'
. Podział na'0'
wyniki w postaci listy0
, między dowolnymi dwoma kolejnymi0
i po prawej stronie dowolnego finału0
b
po której następuje jeden lub więcej wiodących1
, które nie prowadząDwie pierwsze kategorie zawsze istnieją, ale ostatnia istnieje tylko wtedy, gdy istnieje taka
1
seria, która nie zawiera wiodącej'1'
, a więc tylko wtedy, gdy jest więcej niż jedna seria1
. Wystarczy więc sprawdzić, czy lista zawiera więcej niż2
odrębne elementy.Python 3.5 zapisuje 2 znaki poprzez rozpakowanie
{*_}
zamiastset(_)
.źródło
/01/
zamiast/10+1/
. Skorzystałem z tego w Perlu .Ruby,
444038 znakówprzekreślone 44 jest nadal regularne 44; (
Anonimowa funkcja (właściwie proc), która przyjmuje liczbę całkowitą i zwraca tablicę.
Używa wyrażenia regularnego@histocrat wskazuje, że jeśli/10+1/
: a1
, co najmniej jeden0
, a następnie inny1
.01
jest gdziekolwiek w ciągu, musi być1
gdzieś przed nim.źródło
/10+1/=~'%b'%x
. Możesz także zapisać postać, używając zakresu włącznie (0..2**n
), ponieważ2**n
nigdy nie będzie ona miała wielu przebiegów.=~
. Dzięki!/01/
działa równie dobrze. Jeśli jest01
, musi być gdzieś 1 po lewej stronie.Julia,
4341 bajtówTworzy to nienazwaną funkcję, która akceptuje liczbę całkowitą i zwraca tablicę. Wykorzystuje sztuczkę wyrażenia regularnego histokratów (stosowaną w odpowiedzi Doorknob), gdzie
01
będzie pasować tylko, jeśli jest poprzedzająca 1.Nie golfowany:
źródło
Matlab,
79 68 6459Chodzi o interpretację liczby binarnej jako tablicy zer i jedynek, a następnie obliczenie bezwzględnej różnicy między każdą parą sąsiadów. Jeśli mamy dwa lub więcej razy różnicę 1, to oczywiście mamy ciąg dwóch lub więcej. Zauważ, że działa to tylko wtedy, gdy reprezentujemy liczbę binarną bez zer wiodących.
Stare wersje:
źródło
JavaScript (ES7),
8985726962 bajtówŚwięta krowa, tworzenie zakresów w JS nie jest łatwe.
Być może byłby krótszy z rzeczywistąNie, skłamałem; to właściwie trochę dłużej. No cóż. Chyba będę musiał zadowolić się zapisanymi 27 bajtami. (7 dzięki Mwr247!)for
pętlą.Działa poprawnie w najnowszych wersjach Firefox, ale prawdopodobnie nie w żadnej innej przeglądarce. Wypróbuj to:
(Fragment pochodzi z tej strony )
Sugestie mile widziane!
źródło
.keys()
zamiast.fill()
ia
zamiast,i
aby powiązać moje za 62:x=>[for(a of Array(1<<x).keys())if(/01/.test(a.toString(2)))a]
Haskell,
686153 bajtówUlepszenie od Damiena
Historia:
To naprawia błąd (Zamienione == i = i kwadrat zamiast potęgi dwóch). I zamień true na 2> 1, a false na 1> 2. Również dzięki wskazaniu, że 2 ^ x zawsze kończy się niepowodzeniem. Dzięki Thomas Kwa i nimi
Pierwotnie
Jeśli to musi być pełny program,
źródło
1..(2^x-1)
co może być,1.. (2^x)
ponieważ 2 ^ x zawsze zawodzi.False
oraz zaTrue
pomocą1>2
i1<2
. Nie ma potrzeby nawiasów wokół2^x-1
. (BTW: masz literówkę: musi być4==1=True
).mod
4 == 1 = x> 4 | 2> 1 = g $ xdiv
2APL,
3427 bajtówTworzy to nienazwaną funkcję monadyczną, która akceptuje liczbę całkowitą po prawej stronie i zwraca tablicę.
Wyjaśnienie:
Zaoszczędź 7 bajtów dzięki Dennisowi!
źródło
R
55 55bajtów(z pewną pomocą @ Alex.A)
R nie ma wbudowanej funkcji do wyświetlania konwertowanych liczb w wygodny sposób, więc używam
R.utils::intToBin
do tego, podczas gdy cała reszta to po prostu zgłoś lokalizację dopasowanego wyrażenia regularnego i drukuj do STDOUT, oddzielając je przestrzeń.źródło
cat
spacji jest spacja, więc można,sep=","
całkowicie pominąć , oszczędzając 7 bajtów.CJam, 14
3 bajty krótsze dzięki Dennisowi. Wypróbuj online
źródło
2be`,2>
.2be`2>
i2,#)
powinien również działać. Ponadto PO wyjaśnił, że wyniki można wydrukować w formie listy.JavaScript (ES6),
69686762 bajtówDzisiaj odkryłem nowy, krótszy sposób dynamicznego wypełniania tablic bez użycia wypełnienia lub mapy. Wykonanie
x=>[...Array(x).keys()]
spowoduje zwrócenie tablicy z zakresu od 0 do x. Jeśli chcesz zdefiniować własny zakres / wartości, użyjx=>[...Array(x)].map((a,i)=>i)
, ponieważ jest to tylko kilka bajtów dłużej.źródło
Java,
214165155154148141110 110 bajtówTo przesłanie wykorzystuje fakt, że binarna reprezentacja ciągu liczbowego w Javie nigdy nie ma wiodącego zera. Jeśli ciąg „01” pojawia się w binarnej reprezentacji liczby, musi to oznaczać drugie wystąpienie liczby „1”.
Gra w golfa:
Nie golfowany:
Dane wyjściowe programu (pamiętaj, że dopuszczalne są końcowe ograniczniki):
źródło
int
zmiennej zmiennej licznika?long
wymagany jest 64-bitowy . Co więcej, użycie aint
faktycznie zwiększyłoby rozmiar kodu z powodu odwołania się doInteger
klasy opakowania, która wykonuje parsowanie liczb. Myślę, że prawdopodobnym miejscem na zaoszczędzenie miejsca byłaby regex, ale moje testy wykazały, że muszę mieć wiodącego i końcowego użytkownika.*
Long
opakowaniaint
? (Cóż, nie w tym przypadku, ale ogólnie?)int
promuje się,long
gdy zostanie użyty jako parametr w parametrzeLong
. W tym przypadku jednak nie ma żadnego sposobu na użycieint
znaku bitowego iInteger
jest on dłuższy niżLong
. Mimo to znalazłem kilka sposobów na wyciśnięcie dodatkowej przestrzeni z języka tak pełnego języka jak Java.new Long()
zamiastLong.parseLong()
?C (gcc) ,
11199 bajtówWypróbuj online!
Ogolono 12 bajtów dzięki @ceilingcat!
Nie golfowany:
Funkcja ffsl () daje indeks pierwszego bitu, który jest ustawiony na długą liczbę całkowitą. Więc zapętlamy od
i = 1
do 2 ^ liczba_bitów. Stawiamyx
nai
przesunięty w prawo, aż usunęliśmy wszystkie kolejne bity zerowe w najmniej znaczącym końca. Następnie przesuwamy się wx
prawo, dopóki nie usuniemy wszystkich kolejnych 1 bitów na najmniej znaczącym końcu. Jeśli wynik jest wciąż niezerowy, znaleźliśmy dopasowanie.źródło
if (popcount(i ^ (i*2))>3)
i rozwinąć popcount () do szeregu bitowych AND i operacji shift. Ale to spowodowałoby dość długi kod.JavaScript (ES6) 76
źródło
,,,,,5,,,,9,10,11,,13,,,,17,18,19,20,21,22,23,,25,26,27,,29,,
K5, 19 bajtów
Działa to zgodnie z podobnymi zasadami jak rozwiązanie Dennisa, ale z mniejszą liczbą wbudowanych do skorzystania.
Najpierw wygeneruj serię binarnych x-krotek (
+!x#2
), a następnie dla każdej krotki znajdź każdy punkt, w którym cyfra nie pasuje do poprzedniego, jeśli w tym celu traktujemy -1-szy element listy jako 0~0=':'
. Nasze rozwiązania polegają na tym, że dwa są mniejsze niż suma każdego przebiegu. (&2<+/'
).Pokazanie każdego kroku pośredniego jest wyraźniejsze:
A wszystko razem:
źródło
Pip, 13 + 1 = 14 bajtów
Pobiera dane z wiersza poleceń i używa
-s
flagi do spacji między liczbami wyjściowymi.Całkiem proste: buduj
range(2**a)
i filtrujlambda _: "01" in toBinary(_)
. Byłem bardzo zadowolony z01
samodzielnego wymyślania tego pomysłu. Nie są potrzebne żadne cudzysłowy,01
ponieważ skanuje się je jako literał liczbowy (liczby i ciągi znaków są tego samego typu w Pipie).źródło
Julia, 40 bajtów
Wykorzystuje to nieco inne podejście do innego rozwiązania Julii - zamiast wyszukiwać ciąg „01” w ciągu bitowym, używa pewnej matematyki do ustalenia, czy liczba spełnia warunek.
i$i>>1
będą miały tylko te miejsca, w których cyfra zmienia się od zera do jednego lub od jednego do zera. W związku z tym muszą istnieć co najmniej trzy,i
aby przełączać się między zerem a wystarczającą liczbą razy.count_ones
znajduje liczbę, a następniefilter
usuwa te, które nie mają wystarczającej liczby.źródło
C ++,
197188141 bajtówUwaga: zostało to napisane i przetestowane przy użyciu MSVC ++ 2013. Wygląda na to, że
#include
ing<iostream>
zawiera wszystkie niezbędne nagłówki C, aby to zadziałało. Wygląda również na to, że kod nie jest już tak naprawdę C ++, ale kompilacja przy użyciu C ++ pozwala na tę sztuczkę nagłówka, która zmniejsza rozmiar kodu w porównaniu z dołączeniem większej liczby nagłówków C.Używanie
printf
zamiastcout
oszczędza również kilka bajtów.Gra w golfa:
Nie golfowany:
źródło
'\n'
zamiast std :: endl (ogólnie), lub','
ponieważ dowolny separator jest poprawny, a separator końcowy jest w porządku.strstr(c,"01")
.1<<atol(b[1])
powinny być1L<<atol(b[1])
, w przeciwnym razie wynikiem tego wyrażenia będzie 32-bitowa liczba całkowita ze znakiem, co oznacza, że kod będzie działał tylko do 2 ^ 30. Printf powinien używać%ld
do prawidłowego drukowania liczb między 2 ^ 31 a 2 ^ 32.Perl 5,
5553494741 bajtów5452484640 bajtów plus jeden na-E
flagę zamiast-e
.Dzięki xnor za podpowiedź na temat używania
/01/
zamiast/10+1/
, co pozwoliło zaoszczędzić dwa bajty.Dzięki Dennisowi za radę, której należy użyć
<>
zamiast$ARGV[0]
, co pozwoliło zaoszczędzić sześć bajtów.źródło
C,
8481 bajtówJest to oparte na komentarzach, które wypowiedziałem na temat innej odpowiedzi C na to pytanie dotyczące możliwości korzystania z prostych operatorów bitowych. Działa poprzez przełączenie wszystkich końcowych 0 bitów na 1 w instrukcji i | (i-1). Następnie przełącza wszystkie końcowe 1 bity na 0 za pomocą k & (k + 1). Doprowadzi to do zera, jeśli jest tylko jeden ciąg jednych, a niezerowego w przeciwnym razie. Przyjmuję założenie, że długi jest 64-bitowy, ale mógłbym to poprawić kosztem trzech bajtów, używając zamiast tego int64_t.
Bez golfa
źródło
int64_t
jest zdefiniowane tylko, jeśli ty#include<stdint.h>
. zapewnienie 64-bitowej operacji wymagalong long
typu za cenę 5 bajtów.long i
do%d
formatu. Zauważ też, że()
są zbędne dla operatorów&
i|
. Naprawienie tego pozwala zaoszczędzić 3 bajty!long i,j,k;main(){for(scanf("%ld",&j);++i<1L<<j;k&k+1&&printf("%ld ",i))k=i|i-1;}
Pyth,
201716 bajtówDemo na żywo.
źródło
"01"
. Z wyjątkiem 0, reprodukcja binarna. zawsze zacznie się od 1.Python 2.7, 89 bajtów
Myślę, że można to trochę pograć w golfa.
źródło
0
na wyjściu.print[i for i in range(2**input())if[n[:1]for n in bin(i)[2:].split("0")].count("1")-1]
Jest także dwa bajty krótszy. Ale z poprawką dla0
byłoby tej samej długości (89), jeśli użyjeszrange(1,2**input())
.TI-BASIC,
343230 bajtówDo kalkulatora serii TI-83 + / 84 +.
Aby liczba zawierała dwa przebiegi 1s, musi zawierać dwa
10
s, gdy przyczepimy końcowe zero do reprezentacji binarnej.Zamiast generować reprezentację binarną i sprawdzać, a
10
, bity matematycznie testujemy parami, używając reszty o wartości 4 (int(4fPart(
), co da,2
gdzie jest10
. Ponieważ nie dbamy o porządek,randIntNoRep(
jest to najkrótszy sposób na wygenerowanie listy wykładników.Używamy
log(
do sprawdzania liczby przebiegów:Jeśli są co najmniej 2 przebiegi, to
log(
jest dodatni, a liczba jest wyświetlana.Jeśli jest jeden przebieg, to
log(
jest 0, a numer nie jest wyświetlany.Jeśli nie ma żadnych uruchomień (co najpierw dzieje się przy X = 2 ^ Ans), następnie
log(
zgłasza ERR: DOMAIN, zatrzymując dane wyjściowe dokładnie we właściwym punkcie.Używamy
e^(Ans
jako argumentu końcowegoFor(
pętli - zawsze jest większy niż2^Ans
, alee^(
jest to pojedynczy token, więc jest o jeden bajt krótszy.Wejście / wyjście dla N = 4:
Następnie kalkulator zgłasza błąd; ekran błędu wygląda następująco:
Po naciśnięciu przycisku 1 ponownie pojawia się ekran główny:
Kalkulatory TI przechowują wszystkie liczby w liczbie zmiennoprzecinkowej BCD z 14 cyframi dokładności, a nie liczbami całkowitymi lub binarnymi. Dlatego podziały przez potęgi dwóch większych niż
2^14
mogą nie być dokładne. Chociaż zweryfikowałem, że najtrudniejsze liczby3*2^30-1
i2^32-1
są obsługiwane poprawnie, nie wykluczyłem możliwości zaokrąglania błędów. Byłbym jednak zaskoczony, gdyby wystąpiły błędy w danych wejściowych.źródło
Matlab
(90)(70)wykonanie
4
ans =
ans =
ans =
zasada
Dowolna liczba pobrana z przedziału] f (n, l), f (n, l) + 2 ^ (l-1) [gdzie l> 1 weryfikuje ten warunek, więc wynik jest wynikiem negacji tej serii w warunki n.
x = 1
x = x + 1 =
01
,x = x + 2 ^ 0 =
11
,x = x + 1 =
001
,x = x + 2 ^ 1 =
011
,x = x + 2 ^ 0 =
111
,x = x + 1 =
0001
,x = x + 2 ^ 2 =
0011
,x = x + 2 ^ 1 =
0111
,x = x + 2 ^ 0 =
0111
,x = x + 1 =
1111
...x + 1, x = x + 2 ^ n, x = x + 2 ^ (n-1) ... x = x + 2 ^ 0
Mój program drukuje zakres między każdą z dwóch linii (jeśli istnieje)
po okresie zmagań udało mi się znaleźć matematyczną reprezentację tej serii:
2 ^ l (0 + 1 + 2 ^ 1 + ... 2 ^ k) z l + k <n
= 2 ^ l (2 ^ k-1)
wynik = 90
źródło
C,
103102 bajtówRozszerzanie (właściwie kurczenie się) wpisu G.Sliepen, korzystając z uwagi xnor na
01
wzorzec w reprezentacji binarnej, ale używając tylko standardowych funkcji i nieco przewracając się.Wersja bez golfa:
Wewnętrzna pętla skanuje
i
wzór binarny01
, iteracyjnie przesuwającx
w prawo, o ile ma jeszcze 3 bity.printf
zwraca liczbę wydrukowanych znaków, a więc nigdy0
, więc test pętli wewnętrznej kończy się niepowodzeniem poprintf
, unikając potrzebybreak
wyrażenia.C ++,
129128 bajtówDostosowując ten sam pomysł, wariant C ++ jest tutaj:
Technicznie rzecz biorąc, należy dokonać aby zapewnić 64 bitową operację i obliczyć września za dodatkową opłatą 5 bajtów, ale nowoczesne platformy mają 64-bitowych ints.
i
long long
2^32
źródło
JavaScript ES6, 60 bajtów
Kod
Wypróbuj online!
Wyjaśnienie
źródło
C (rodzaj - kompiluje z ostrzeżeniami w GCC) - 103
Nie używa to żadnych funkcji bibliotecznych z wyjątkiem printf. Patrząc na to, widać, że nie dołożono żadnych starań, aby był on zgodny ze standardami lub unikał UB.
Aby był zgodny, musisz zrobić wiele rzeczy, takich jak stdio.h, co byłoby sprzeczne z duchem zmniejszania go do minimum.
Jeśli ktoś ma sugestie dotyczące skrócenia, daj mi znać.
źródło
PowerShell, 80 bajtów
źródło
Python, 44 bajty
Okej, to prawdopodobnie może być krótsze, ale to mój pierwszy codegolf:
Pomyśl, że to odpowiada na pytanie, proszę nie głosować, jeśli nie, po prostu opublikuj poniżej, co jest nie tak.
źródło
input()
idealne), aby je zdobyćn
, a następnie policzyć tylko do2^n-1
, a nie zapętlić w nieskończoność. Możesz również użyć 1 i 2 spacji do zagnieżdżenia, zamiast 4 i 8, a użyciemap
lub zrozumienie listy prawdopodobnie znacznie skróci twój kod.kolejna inna odpowiedź Matlaba na dobry wynik.
Matlab
60(57)wykonanie
ans =
>> ans(5)
ans =
1
przykład:
0000111
jest odrzucany, ponieważ ~ x =1111
, ~ x + 1 =00001
zawiera jedną cyfrę = 10100111
jest akceptowane, ponieważ ~ x =1011
, ~ x + 1 =0111
zawiera wiele 1źródło