Wygeneruj sekwencję remika

18

Twoim zadaniem jest pobranie elementu wejściowego ni wyjściowego nSekcji remika, sekwencji, którą zrobiłem (przeglądanie OEIS ci nie pomoże).

Definicja

Każdy element Sekwencji remika jest zbiorem prawdziwych lub falseyowych wartości. Np [true, false].:

Kroki do stworzenia członka Sekwencji remika są dość proste:

  1. Zacznij od pierwszego indeksu [](jest to element 0).
  2. Ustaw lewy falsey na prawdę. Jeśli nie ma żadnych fałszów do zmiany, zwiększ długość listy o 1 i ustaw wszystkich członków nowej listy na falsey.
  3. Powtarzaj krok 2, aż osiągniesz element n.

Przykład

Zdefiniujmy naszą funkcję jako rummy(int n)(wpis {}jest krokiem do uzyskania odpowiedzi):

>>> rummy(5)
{[]}
{[false]}
{[true]}
{[false, false]}
{[true, false]}
[true, true]

Zasady

  • Obowiązują standardowe luki.
  • Musi działać dla danych wejściowych 0 przez górną granicę liczbową języka.
  • Możesz wyprowadzać dane w dowolny sposób, jaki uznasz za stosowny, pod warunkiem, że jest jasne, że dane wyjściowe są zbiorem prawdy / fałszu.

Drobnostki

Nazywam to „Sekwencją remika”, ponieważ począwszy od indeksu 2, określa zestawy, które należy ustawić w każdej rundzie Progresywnego Remika , gdzie falsey jest książką, a prawdą jest bieg.

Przypadki testowe

>>> rummy(0)
[]

>>> rummy(1)
[false]

>>> rummy(6)
[false, false, false]

>>> rummy(20)
[true, true, true, true, true]

>>> rummy(1000)
[true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
Addison Crump
źródło
To trochę jak liczenie binarne w odwrotnej kolejności
ThreeFx
@ThreeFx Tyle, że dodając 1do 11, dostajesz 000zamiast 100. ; P
Addison Crump
1
Czy nasza odpowiedź może być zindeksowana?
Downgoat 18.07.16
Myślę, że powinieneś dołączyć jeszcze kilka przypadków testowych, nawet jeśli wyniki są domyślnie wymienione w przykładzie. Moja pierwsza wersja zepsuła się ze skrzynką narożną 1 ...
Dennis,
@VTCAKAVSMoACE To by sprawiło, że byłby to dwuskładnikowy binarny (dla którego również mamy wyzwanie), ale jest więcej różnic w tym, że każda liczba ma zawsze formę 1*0*.
Martin Ender

Odpowiedzi:

10

JavaScript ES6, 94 92 72 70 66 64 bajtów

Zaoszczędź 6 bajtów dzięki Neilowi!

n=>[...Array(a=Math.sqrt(8*n+1)-1>>1)].map((_,l)=>l<n-a*(a+1)/2)

Nie sądzę, że można bardziej grać w golfa. Przynajmniej z równaniami.

Wyjaśnienie

Są to dwa główne równania ( njest wprowadzane):

(Math.sqrt(8*n+1)-1)/2

To da całkowity rozmiar tablicy wyjściowej. W moim programie użyłem >>1zamiast (...)/2nich są takie same, ponieważ pierwszy bit w pliku binarnym ma wartość 2. Przesunięcie spowodujefloor(.../2)


n-a*(a+1)/2

To będzie ilość trues. ajest wynikiem poprzedniego wyrażenia.


Oto, co robi składnia:

[...Array(n)]

Ten kod generuje tablicę z zakresem [0, n)w tej odpowiedzi njest pierwszym równaniem.


.map((_,l)=>l<n)zapętli to powyżej powyższego zakresu, ljest to zmienna zawierająca bieżący element w tym zakresie. Jeśli przedmiot jest mniejszy niż liczba faktów, które są (określone na podstawie drugiego równania), to wróci true, w przeciwnym razie false.

Downgoat
źródło
2
Użyj >>1zamiast /2|0. Użyj (_,l)=>zamiast .keys().
Neil,
@Neil dzięki! To sporo zaoszczędziło. Czy w swoim ostatnim punkcie zamierzasz użyć Array.from()?, Wypełnić, czy czegoś innego?
Downgoat
1
Nie, myślałem o tym, [...Array(a)].map((_,l)=>)co moim zdaniem jest nieco krótsze, ale dobrze złapałem usunięcie niektórych ()s przy zmianie na >>1, nie zauważyłem tego!
Neil,
Och, jest też a*-~a/2; Nie wiem, dlaczego wcześniej o tym nie myślałem.
Neil,
6

Python, 51 bajtów

f=lambda n,i=0:n>i and f(n+~i,i+1)or[1]*n+[0]*(i-n)

Zwraca listę 1 i 0.

xnor
źródło
5

Pyth, 8 bajtów

_@{y/RQy

Wypróbuj online: pakiet demonstracyjny lub testowy

Jest to wykładniczo powolne.

Wyjaśnienie:

_@{y/RQyQQ    implicit Qs at the end, (Q = input)
       yQ     2*Q
    /RQ       divide each number in [0, 1, ..., 2*Q-1] by Q
              this results in a list of Q zeros and Q ones
   y          take all subsets
  {           remove duplicates
 @       Q    take the Qth element
_             print it reversed
Jakube
źródło
5

Galaretka , 13 11 bajtów

Ḷṗ2SÞ⁸ị1,0x

Kod nie działa w najnowszej wersji Jelly przed opublikowaniem wyzwania, ale działał w tej wersji , która poprzedza wyzwanie.

Wskaźniki są oparte na 1. Wypróbuj online! (zajmuje kilka sekund) lub zweryfikuj wiele danych jednocześnie .

Jak to działa

Ḷṗ2SÞ⁸ị1,0x  Main link. Argument: n (integer)

Ḷ            Unlength; yield [0, ..., n - 1].
 ṗ2          Take the second Cartesian power, i.e., generate the array of all
             pairs of elements of [0, ..., n - 1].
   SÞ        Sort the pairs by their sum. The sort is stable, so ties are broken
             by lexicographical order.
     ⁸ị      Retrieve the pair at index n.
       1,0x  Map [a, b] to a copies of 1 and b copies of 0.
Dennis
źródło
4

05AB1E, 27 bajtów

8*>t<;ïÐ>*;¹s-ïD1s׊-0s×JSï

Zobaczę, czy mogę jeszcze trochę zagrać w golfa i dodam rano wyjaśnienie.

Wypróbuj online

Emigna
źródło
4

Java, 117 110 bajtów

enum B{T,F};B[]r(int n){int i=0,c=0,j=0;while(n>=i)i+=++c;B[]a=new B[c-1];for(;j<n-i+c;)a[j++]=B.T;return a;}

utworzyłem własny typ logiczny, który pozwolił mi zaoszczędzić 7 bajtów

użytkownik902383
źródło
To użycie wyliczenia jest sprytne. +1
Addison Crump,
2

Python 2, 69 63 bajtów

a=b=0
exec'a,b=[a-1,b+1,0][a<1:][:2];'*input()
print[1]*b+[0]*a

Przetestuj na Ideone .

Dennis
źródło
2

Python 2, 61 bajtów

j=(2*input()+.25)**.5-.5
print[i/j<j%1for i in range(int(j))]

Rozwiązuje dla n = j · (j + 1) / 2 . Dane wejściowe są pobierane ze standardowego wejścia.

Przykładowe użycie

$ echo 20 | python rummy-seq.py
[True, True, True, True, True]

$ echo 50 | python rummy-seq.py
[True, True, True, True, True, False, False, False, False]

Demo .

primo
źródło