Baum-Sweet Sequence (A086747 with a Twist)
Weź dodatnią liczbę całkowitą n
i wydrukuj liczby całkowite od 1 do n, dla których sekwencja Baum-Sweet zwraca wartość true. Sekwencja Bauma-Sweeta powinna zwrócić wartość falsy, jeśli binarna reprezentacja liczby zawiera nieparzystą liczbę kolejnych zer w dowolnym miejscu liczby, i tak naprawdę jest inaczej. Aby uzyskać więcej informacji, kliknij link. Oto kilka przykładów:
1 -> 1 -> Truthy
2 -> 10 -> Falsy
3 -> 11 -> Truthy
4 -> 100 -> Truthy (Even run of zeros)
Oto podany przykład n=32
Krok 1: Wizualizacja sekwencji Baum-Sweet n=32
1 1 (1)
1 0 0 (2)
11 1 (3)
1 00 1 (4)
1 0 1 0 (5)
11 0 0 (6)
111 1 (7)
1 000 0 (8)
1 00 1 1 (9)
1 0 1 0 0 (10)
1 0 11 0 (11)
11 00 1 (12)
11 0 1 0 (13)
111 0 0 (14)
1111 1 (15)
1 0000 1 (16)
1 000 1 0 (17)
1 00 1 0 0 (18)
1 00 11 1 (19)
1 0 1 00 0 (20)
1 0 1 0 1 0 (21)
1 0 11 0 0 (22)
1 0 111 0 (23)
11 000 0 (24)
11 00 1 1 (25)
11 0 1 0 0 (26)
11 0 11 0 (27)
111 00 1 (28)
111 0 1 0 (29)
1111 0 0 (30)
11111 1 (31)
1 00000 0 (32)
Po obliczeniu sekwencji Bauma-Sweeta dla n, weź liczby, które były zgodne z prawdą dla sekwencji i zbierz je dla ostatecznego wyniku. Na n=32
to mamy:
[1, 3, 4, 7, 9, 12, 15, 16, 19, 25, 28, 31]
Jako ostateczna odpowiedź.
To jest golf golfowy , wygrywa najmniejsza liczba bajtów.
code-golf
sequence
base-conversion
binary
Urna Magicznej Ośmiornicy
źródło
źródło
Odpowiedzi:
05AB1E ,
109 bajtówOszczędność bajtu dzięki Adnanowi
Wypróbuj online!
Wyjaśnienie
źródło
ƒ
działa zamiast>G
?.¡
wykorzystana;).JavaScript (ES6),
706863 bajtówNieco ciekawsze rozwiązanie rekurencyjne:
67 bajtów dzięki @Neil.
g
to funkcja do wywołania.źródło
f
jest podobny do funkcji, której czasami używam do zliczania liczby 1-bitów w liczbie.f
zawodzi, kiedyn=0
? Ponieważf
tylko zwraca 0 lub 1, możesz zgolić dwa bajty za pomocąn&f(n>>1)
.n = 0
nie jest to przypadek;).filter
:n=>[...Array(n+1).keys()].filter(f=n=>n<2?n:n%4?n&f(n>>1):f(n/4))
Python 2, 62 bajty
Sprawdza nieparzyste przebiegi 1 w reprezentacji binarnej, dzieląc
00
i sprawdzając, czy w reprezentacji łańcuchowej wynikowej listy pozostały zera. Irytujące są liczby binarne zaczynające się0b
od zera, który należy usunąć, aby uniknąć fałszywie dodatniego wyniku.Wyliczenie odbywa się poprzez rekurencję w dół.
źródło
Grzmotnąć,
58, 46 bajtówEDYCJE:
Grał w golfa
Test
Wyjaśnił
muszla
sed
Wypróbuj online!
źródło
Partia, 143 bajty
źródło
Perl 6 , 40 bajtów
Spróbuj
(
[]
są używane do grupowania nie przechwytywania, z<[]>
klasami znaków)źródło
PowerShell ,
7961 bajtówWypróbuj online!
Dziś rano zainspirowałem się, aby zmienić sposób wykonywania
-split
operacji, a następnie przekonać się, że jest to podobne do budowy odpowiedzi xnor , więc myślę, że wielkie umysły myślą podobnie?Pętlujemy od
1
wejścia do wejścia$args[0]
i używamyWhere-Object
operatora, aby wyciągnąć odpowiednie liczby|?{...}
. Klauzula jest prostą wartością logiczną - zapewniamy, że0
są-notin
to wyniki(...)
.Wewnątrz parenów bierzemy
[convert]::
bieżącą liczbę$_
ToString
z podstawą2
(tzn. Zamieniamy ją na ciąg binarny). Następnie-split
ciąg znaków w wyrażeniu regularnym1|00
- jest to zachłanne dopasowanie i skutkuje tablicą ciągów (na przykład100010
zamieniłoby się w'','','0','','0'
itd.).Tak więc, jeśli każdy
0
ciąg s w ciągu binarnym jest parzysty (co oznacza, że wyrażenie regularne podzieliło je na puste ciągi), to0
będzie-notin
wynik, więcWhere
klauzula jest prawdziwa, a liczba jest wybrana. Te liczby są pozostawione w potoku, a dane wyjściowe są niejawne.źródło
Python 2 ,
6747 bajtówDzięki @xnor do gry w golfa z 20 (!) Bajtów!
Zwraca nieuporządkowaną listę. Jest dość wydajny: wejście 100 000 zajmuje około 40 ms w TIO.
Wypróbuj online!
źródło
[1][n:]or
. Równieżx-~x
dla2*x+1
.f=lambda n,k=1:n/k*[1]and[k]+f(n,k-~k)+f(n,4*k)
tego rekurujesz drzewo: zakładając, że wyjścia mogą być w dowolnej kolejności.Mathematica, 59 bajtów
Mathematica odpowiedź numer 4 ...
źródło
MATL ,
1211 bajtówWypróbuj online!
Wyjaśnienie
Aby wykryć, czy liczba jest poprawna, konwertuje się na binarną, stosuje kodowanie długości przebiegu, zachowuje tylko przebiegi o nieparzystej długości i sprawdza, czy nie zachodzi żaden ciąg zer.
źródło
R, 75 bajtów
Odczytuje dane wejściowe ze standardowego wejścia i używa
bin
funkcji zmiscFuncs
pakietu do konwersji z wektora dziesiętnego na binarny. W konsekwencji wykonuje kodowanie długości przebiegu, aby sprawdzić wartości,== 0
a długości są nieparzyste.źródło
Skumulowane , 69 bajtów
Wypróbuj tutaj!
Lub niekonkurencyjny przy 67 bajtach:
I jeszcze więcej niekonkurencyjnych przy 49 bajtach:
Wszystkie przyjmują dane wejściowe jako TOS i pozostawiają dane wyjściowe w TOS.
Wyjaśnienie
Funkcja:
Wyjaśnienie niekonkurencyjnych:
Jest taki sam jak powyżej, z kilkoma kluczowymi różnicami:
źródło
Befunge,
845149 bajtówPo drobnych eksperymentach zdałem sobie sprawę, że mogę zrobić trochę lepiej niż moje oryginalne rozwiązanie, stosując technikę podobną do odpowiedzi wsadowej, którą wymyślił Neil .
Wypróbuj online!
Podobnie jak w moim oryginalnym rozwiązaniu, istnieją dwie pętle - zewnętrzna pętla iterująca liczby, które chcemy przetestować, oraz wewnętrzna pętla testująca sekwencję bitów dla każdej liczby. Sposób działania testu polega na badaniu dwóch bitów na raz (moduł 4 bieżącej wartości). Jeśli jest to równe 2, mamy nieparzystą sekwencję zer i możemy przerwać wewnętrzną pętlę i przejść do następnej liczby.
Jeśli moduł 4 nie jest równy 2, musimy kontynuować testowanie pozostałych bitów, więc przesuwamy bity, które zostały już przetestowane. Odbywa się to poprzez podzielenie wartości, nazwijmy ją n , przez
2+2*!(n%2)
. Oznacza to, że jeśli pierwszy bit miał wartość 1, dzielimy przez 2 (upuszczając ten 1 bit), ale jeśli był to 0, dzielimy przez 4, więc zawsze będziemy upuszczać pary zer.Jeśli w końcu dojdziemy do zera, oznacza to, że nie było żadnych dziwnych sekwencji zerowych bitów, więc wypisujemy liczbę.
źródło
Visual Basic (.net 4.5) 163 bajty
Pierwsza odpowiedź tutaj, więc jestem pewien, że coś spieprzyłem. Daj mi znać, a naprawię. Czy lambda Visual Basic są w ogóle dozwolone?
Dzięki MamaFunRoll za pomysł na usunięcie kolejnych zer
Wyjścia R (32)
źródło
Java,
144130128 bajtówNie jest to tak golfowe, jak mi się wydaje, ale pomyślałem, że byłoby uroczym rozwiązaniem, aby użyć Regexa, mimo że nigdy go nie użyłem.
Gra w golfa:
static String a(int n){String s="";for(Integer i=0;i++<n;)if(i.toString(i,2).replaceAll("00|1","").isEmpty())s+=i+" ";return s;}
Nie golfowany:
Edycja: Udało mi się zapisać 14 bajtów, tworząc wyrażenie regularne 00 | 1 zamiast 00 i usuwając „.replace („ 1 ”,„ ”)” między replaceAll i isEmpty!
Edycja 2: Byłem w stanie zapisać 2 bajty, czyniąc i liczbą całkowitą i odwołując się do Integer.toString za pomocą i.toString.
źródło
Clojure, 103 bajty
Nie sądzę, że to najkrótsza droga ...
Używa
re-seq
do znajdowania kolejnych zer, mapuje ich długości modulo-2 na aset
, odrzuca je, jeśli liczba1
zostanie znaleziona z zestawu.źródło
Cud , 38 bajtów
Stosowanie:
Wyjaśnienie
Bardziej czytelny:
rng 1 +1 #0
: Zakres od 1 do wejścia.fltr@ ...
: Zakres filtru z następującym predykatem.bn #0
: Konwertuj bieżący element na binarny. (To będzie miało wiodące0b
).Rstr #["00"]
: Rekurencyjnie przycinaj wszelkie wystąpienia00
ciągu.len iO 0
: Policz ilości0
s w ciągu.=1
: Sprawdź, czy kwota jest równa 1. Jeśli pozostała tylko0
część łańcucha po przycinaniu znajduje się na początku0b
, to zwraca wartość true; w przeciwnym razie zwraca false.źródło
Rubin,
786968 bajtówStarsza wersja:
źródło
Mathematica, 81 bajtów
Oblicza dla każdego przebiegu kolejnych cyfr w liczbie {wspólna cyfra w tym przebiegu plus (1, jeśli długość jest nieparzysta, 2, jeśli długość jest parzysta)}; jeśli którakolwiek z odpowiedzi to {1}, to liczby nie ma w sekwencji.
źródło
Mathematica, 75 bajtów
#~IntegerDigits~2
oblicza listę cyfr binarnych wejścia#
.Split
tę listę do serii identycznych elementów, weźCases
to dopasowanie{0..}
, weźLength
każdy z nich, weźEvenQ
długości, a następnie zwróćAnd
wyniki.źródło
!Or@@OddQ/@...
Python 3,
8682 bajtówGra w golfa w toku ...
Grałem w golfa 4 bajty, zmieniając
bin(x)[2:]
na justbin(x)
- pozostawia to0b
na początku łańcucha, ale zdałem sobie sprawę, że to tak naprawdę nie wpływa na obliczenia :)źródło
Python, 142 bajty
Ma to głównie na celu ćwiczenie gry w golfa w moim Pythonie.
źródło
Galaretka , 10 bajtów
Okropnie nieefektywny. Wypróbuj online!
źródło
Rubin,
545348 bajtówNie sądziłem, że regex tego będzie tak prosty.
edycja 1: przełączono na odrzucanie, aby pozbyć się negacji dla -1.
edycja 2: zmieniono
match
na=~
na -5.źródło
C #
159157155 bajtówZaoszczędź 2 x dwa bajty dzięki TuukkaX.
Uwaga: wypisuje ints w odwrotnej kolejności.
Wyjaśnienie:
źródło
c%2==0
może byćc%2<1
.N
.b[i++] == '0'
może byćb[i++]==48
, ale ponieważ innym możliwym znakiem jest „1” (ASCII 49), możesz po prostu sprawdzić, czyb[i++]<49
.Mathematica, 69 bajtów
Ta sama długość:
źródło
Ruby, 53 bajtów
źródło
Galaretka,
151310 bajtówzapisał dwa bajty po przeanalizowaniu innych odpowiedzi, kolejne 3 bajty dzięki Dennisowi
Wyjaśnienie
źródło