Générer la séquence du rami

18

Votre tâche consiste à prendre un nélément nd' entrée et de sortie de la séquence de rami, une séquence que j'ai faite (regarder OEIS ne vous aidera pas).

Définition

Chaque élément de la séquence du rami est un ensemble de valeurs véridiques ou falsey. Ex [true, false]. : .

Les étapes pour produire un membre de la séquence de rami sont assez simples:

  1. Commencez avec le premier index [](c'est l'élément 0).
  2. Réglez la falsey la plus à gauche sur la vérité. S'il n'y a pas de faux à modifier, augmentez la longueur de la liste de 1 et définissez tous les membres de la nouvelle liste sur falsey.
  3. Répétez l'étape 2 jusqu'à atteindre l'élément n.

Exemple

Définissons notre fonction comme rummy(int n)(le contenu {}est une étape pour arriver à la réponse):

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

Règles

  • Des échappatoires standard s'appliquent.
  • Doit fonctionner pour les entrées 0 via la limite numérique supérieure de votre langue.
  • Vous pouvez sortir de n'importe quelle manière, à condition qu'il soit clair que la sortie est un ensemble de vérités / faux.

Trivia

J'appelle cela la "séquence du rami", car, à partir de l'index 2, elle définit les ensembles que vous devez définir dans chaque manche de rami progressif , où falsey est un livre et vérité est une course.

Cas de test

>>> 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
la source
C'est un peu comme compter les binaires en sens inverse
ThreeFx
@ThreeFx Sauf que, lors de l'ajout 1à 11, vous obtenez 000au lieu de 100. ; P
Addison Crump
1
Notre réponse peut-elle être à un index?
Downgoat
Je pense que vous devriez inclure quelques cas de test supplémentaires, même si les sorties sont implicitement mentionnées dans l'exemple. Ma première révision a rompu avec le cas d'angle 1 ...
Dennis
@VTCAKAVSMoACE Cela rendrait le binaire bijectif (pour lequel nous avons également un défi), mais il y a plus de différences en ce que chaque nombre est toujours de la forme 1*0*.
Martin Ender

Réponses:

10

JavaScript ES6, 94 92 72 70 66 64 octets

6 octets enregistrés grâce à Neil!

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

Je ne pense pas que cela puisse être joué davantage. Au moins avec les équations.

Explication

Ce sont deux équations principales (en nentrée):

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

Cela donnera la taille totale du tableau de sortie. Dans mon programme, j'ai utilisé à la >>1place de (...)/2ceux-ci sont les mêmes que le premier bit en binaire a une valeur de 2. Le décalage entraînerafloor(.../2)


n-a*(a+1)/2

C'est le nombre de trues qu'il y aura. aest le résultat de l'expression précédente.


C'est ce que fait la syntaxe:

[...Array(n)]

Ce code génère un tableau avec plage [0, n)dans cette réponse nest la première équation.


.map((_,l)=>l<n)cela va parcourir la plage ci-dessus, lest la variable contenant l'élément en cours dans la plage. Si l'élément est inférieur au nombre de vrais qu'ils sont (déterminé par la deuxième équation), alors il reviendra true, sinon false.

Downgoat
la source
2
Utilisez >>1au lieu de /2|0. Utilisez (_,l)=>au lieu de .keys().
Neil
@Neil merci! Cela a permis d'économiser un peu. Par votre dernier point, entendez-vous utiliser Array.from()?, Fill ou autre chose?
Downgoat
1
Non, je pensais à [...Array(a)].map((_,l)=>)ce que je crois être légèrement plus court, mais bonne prise en supprimant certains des ()s lors du passage à >>1, je n'avais pas repéré ça!
Neil
Oh, il y a aussi a*-~a/2; Je ne sais pas pourquoi je n'y avais pas pensé avant.
Neil
6

Python, 51 octets

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

Affiche une liste de 1 et de 0.

xnor
la source
5

Pyth, 8 octets

_@{y/RQy

Essayez-le en ligne: démonstration ou suite de tests

C'est exponentiellement lent.

Explication:

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

Gelée , 13 11 octets

Ḷṗ2SÞ⁸ị1,0x

Le code ne fonctionnait pas dans la dernière version de Jelly avant la publication du défi, mais il fonctionnait dans cette version , antérieure au défi.

Les indices sont basés sur 1. Essayez-le en ligne! (prend quelques secondes) ou vérifiez plusieurs entrées à la fois .

Comment ça fonctionne

Ḷṗ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
la source
4

05AB1E, 27 octets

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

Va voir si je peux jouer au golf un peu plus et ajouter une explication le matin.

Essayez-le en ligne

Emigna
la source
4

Java, 117 110 octets

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

créé mon propre type booléen, ce qui m'a permis d'économiser 7 octets

user902383
la source
Cette utilisation de l'énumération est intelligente. +1
Addison Crump
2

Python 2, 69 63 octets

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

Testez-le sur Ideone .

Dennis
la source
2

Python 2, 61 octets

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

Résout pour n = j · (j + 1) / 2 . L'entrée provient de stdin.

Exemple d'utilisation

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

Démo .

primo
la source