Generieren Sie die Rommé-Sequenz

18

Ihre Aufgabe ist es, ein Eingabe- nund Ausgabeelement nder Rommé-Sequenz zu übernehmen, eine Sequenz, die ich erstellt habe (ein Blick auf OEIS wird Ihnen nicht helfen).

Definition

Jedes Element der Rommé-Sequenz besteht aus einer Reihe wahrer oder falscher Werte. Bsp .: [true, false].

Die Schritte zum Erstellen eines Mitglieds der Rommé-Sequenz sind recht einfach:

  1. Beginnen Sie mit dem ersten Index [](dies ist Element 0).
  2. Setzen Sie den Falsey ganz links auf "Wahr". Wenn keine zu ändernden Falseys vorhanden sind, erhöhen Sie die Länge der Liste um 1 und setzen Sie alle Mitglieder der neuen Liste auf Falsey.
  3. Wiederholen Sie Schritt 2, bis Sie das Element erreicht haben n.

Beispiel

Definieren wir unsere Funktion als rummy(int n)(Stuff in {}ist ein Schritt, um zur Antwort zu gelangen):

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

Regeln

  • Es gelten Standardlücken.
  • Muss für Eingaben 0 über die obere Zahlengrenze Ihrer Sprache funktionieren.
  • Sie können auf jede Weise ausgeben, die Sie für richtig halten, vorausgesetzt, es ist klar, dass es sich bei der Ausgabe um eine Reihe von Wahrheiten / Falschheiten handelt.

Trivia

Ich nenne dies die "Rommé-Sequenz", weil sie ab Index 2 die Mengen definiert, die Sie in jeder Runde von Progressive Rommé benötigen , in der Falsey ein Buch und Truthy ein Lauf ist.

Testfälle

>>> 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
quelle
Dies ist ein bisschen wie das Zählen von Binärdateien in umgekehrter Richtung
ThreeFx
Außer @ThreeFx , dass bei Zugabe 1zu 11, erhalten Sie 000statt 100. ; P
Addison Crump
1
Kann unsere Antwort mit einem Index versehen werden?
Downgoat
Ich denke, Sie sollten noch ein paar Testfälle hinzufügen, auch wenn die Ausgaben im Beispiel implizit erwähnt werden. Meine erste Überarbeitung brach mit dem Eckfall 1 ...
Dennis
@VTCAKAVSMoACE Das würde es bijektiv binär machen (wofür wir auch eine Herausforderung haben), aber es gibt mehr Unterschiede darin, dass jede Zahl immer von der Form ist 1*0*.
Martin Ender

Antworten:

10

JavaScript ES6, 94 92 72 70 66 64 Bytes

6 Bytes gespart dank Neil!

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

Ich glaube nicht, dass man mehr Golf spielen kann. Zumindest mit den Gleichungen.

Erläuterung

Dies sind zwei Hauptgleichungen ( nwird eingegeben):

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

Dies gibt die Gesamtgröße des Ausgabearrays an. In meinem Programm habe ich >>1stattdessen (...)/2dasselbe verwendet, da das erste Bit in der Binärdatei den Wert 2 hat. Wird es verschoben, führt dies zufloor(.../2)


n-a*(a+1)/2

Dies ist die Menge an trues, die es geben wird. aist das Ergebnis des vorherigen Ausdrucks.


Das macht die Syntax:

[...Array(n)]

Dieser Code generiert ein Array mit Bereich [0, n)in dieser Antwort nist die erste Gleichung.


.map((_,l)=>l<n)Dies durchläuft den obigen Bereich und list die Variable, die das aktuelle Element im Bereich enthält. Wenn der Gegenstand weniger als die Anzahl der Wahrheiten ist, die sie sind (bestimmt durch die zweite Gleichung), wird er zurückgegeben true, andernfalls false.

Downgoat
quelle
2
Verwenden Sie >>1anstelle von /2|0. Verwenden Sie (_,l)=>anstelle von .keys().
Neil
@ Neil danke! Das hat einiges gespart. Meinen Sie mit Ihrem letzten Punkt Array.from()?, Füllen oder etwas anderes?
Downgoat
1
Nein, ich habe darüber nachgedacht, [...Array(a)].map((_,l)=>)was meiner Meinung nach etwas kürzer ist, aber ein guter Fang, ()wenn >>1ich einige der s beim Umschalten entferne , das habe ich nicht bemerkt!
Neil
Oh, da gibt es auch a*-~a/2; Ich weiß nicht, warum ich vorher nicht daran gedacht habe.
Neil
6

Python, 51 Bytes

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

Gibt eine Liste mit 1 und 0 aus.

xnor
quelle
5

Pyth, 8 Bytes

_@{y/RQy

Probieren Sie es online aus: Demo oder Test Suite

Dies ist exponentiell langsam.

Erläuterung:

_@{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
quelle
5

Jelly , 13 11 Bytes

Ḷṗ2SÞ⁸ị1,0x

Der Code funktioniert nicht in der neuesten Version von Jelly, bevor die Herausforderung veröffentlicht wurde, aber in dieser Version , die der Herausforderung vorausgeht, hat er funktioniert .

Indizes sind 1-basiert. Probieren Sie es online! (dauert einige Sekunden) oder überprüfen Sie mehrere Eingaben gleichzeitig .

Wie es funktioniert

Ḷṗ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
quelle
4

05AB1E, 27 Bytes

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

Mal sehen, ob ich noch mehr Golf spielen kann und morgens eine Erklärung hinzufügen.

Probieren Sie es online aus

Emigna
quelle
4

Java, 117 bis 110 Bytes

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;}

habe meinen eigenen Booleschen Typ erstellt, wodurch ich 7Byte einsparen konnte

user902383
quelle
Diese Verwendung der Aufzählung ist klug. +1
Addison Crump
2

Python 2, 69 63 Bytes

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

Teste es auf Ideone .

Dennis
quelle
2

Python 2, 61 Bytes

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

Löst nach n = j · (j + 1) / 2 auf . Die Eingabe erfolgt aus stdin.

Beispielnutzung

$ 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
quelle