Gere a sequência Rummy


18

Sua tarefa é pegar um nelemento nde entrada e saída da Rummy Sequence, uma sequência que eu criei (ver o OEIS não ajudará).

Definição

Cada elemento da sequência Rummy é um conjunto de valores de verdade ou falsey. Ex [true, false]. : .

As etapas para produzir um membro da sequência Rummy são bastante simples:

  1. Comece com o primeiro índice [](este é o elemento 0).
  2. Defina a falsey mais à esquerda como verdade. Se não houver falseys a serem alterados, aumente o comprimento da lista em 1 e defina todos os membros da nova lista como falsey.
  3. Repita a etapa 2 até alcançar o elemento n.

Exemplo

Vamos definir nossa função como rummy(int n)(o material {}é um passo dado para chegar à resposta):

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

Regras

  • Aplicam-se brechas padrão.
  • Deve funcionar para as entradas 0 através do limite numérico superior do seu idioma.
  • Você pode enviar da maneira que achar melhor, desde que fique claro que a saída é um conjunto de verdade / falso.

Curiosidades

Eu chamo isso de "Sequência Rummy" porque, começando no índice 2, define os conjuntos que você precisa estabelecer em cada rodada do Rummy Progressivo , onde a falsey é um livro e a verdade é uma corrida.

Casos de teste

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

Isto é como contar binário ao contrário
— ThreeFx:

@ThreeFx Exceto que, ao adicionar 1a 11, você recebe o que 000não 100. ; P
— Addison Crump

1
Nossa resposta pode ser unificada?
— Downgoat

Eu acho que você deve incluir mais alguns casos de teste, mesmo que os resultados sejam mencionados implicitamente no exemplo. Minha primeira revisão rompeu com o caso canto 1 ...
— Dennis

@VTCAKAVSMoACE Isso tornaria o binário bijetivo (para o qual também temos um desafio), mas há mais diferenças em que todo número é sempre da forma 1*0*.
— Martin Ender

Respostas:


10

JavaScript ES6, 94 92 72 70 66 64 bytes

Economizou 6 bytes graças a Neil!

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

Eu não acho que isso possa ser jogado mais. Pelo menos com as equações.

Explicação

São duas equações principais ( né entrada):

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

Isso fornecerá o tamanho total da matriz de saída. No meu programa, eu usei, em >>1vez (...)/2disso, são os mesmos que o primeiro bit em binário tem um valor de 2. Mudar resultará emfloor(.../2)


n-a*(a+1)/2

Esta é a quantidade de trues que haverá. aé o resultado da expressão anterior.


Isto é o que a sintaxe faz:

[...Array(n)]

Este código gera uma matriz com intervalo [0, n)nesta resposta né a primeira equação.


.map((_,l)=>l<n)isso passará pelo intervalo acima, lé a variável que contém o item atual no intervalo. Se o item for menor que a quantidade de verdadeiras (determinada pela segunda equação), ele retornará true, caso contrário false.


2
Use em >>1vez de /2|0. Use em (_,l)=>vez de .keys().
— Neil

@ Neil thanks! Isso economizou um pouco. No seu último ponto, você pretende usar Array.from()?, Fill ou algo mais?
— Downgoat 19/07/16

1
Não, eu estava pensando no [...Array(a)].map((_,l)=>)que eu acho que é um pouco mais curto, mas é bom pegar alguns ()s ao mudar para >>1, eu não tinha percebido isso!
— Neil

Ah, tem também a*-~a/2; Não sei por que não pensei nisso antes.
— Neil

6

Python, 51 bytes

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

Produz uma lista de 1 e 0.


5

Pitão, 8 bytes

_@{y/RQy

Experimente on-line: Demonstration or Test Suite

Isso é exponencialmente lento.

Explicação:

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

5

Geléia , 13 11 bytes

Ḷṗ2SÞ⁸ị1,0x

O código não funciona na versão mais recente do Jelly antes do lançamento do desafio, mas funcionou nesta versão , que antecede o desafio.

Os índices são baseados em 1. Experimente online! (leva alguns segundos) ou verifique várias entradas ao mesmo tempo .

Como funciona

Ḷṗ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.

4

05AB1E, 27 bytes

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

Vou ver se consigo jogar um pouco mais e adicionar uma explicação pela manhã.

Experimente online


4

Java, 117 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;}

criei meu próprio tipo booleano, o que me permitiu economizar 7 bytes


Esse uso do enum é inteligente. +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 em Ideone .


2

Python 2, 61 bytes

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

Resolve para n = j · (j + 1) / 2 . A entrada é retirada do stdin.

Uso da amostra

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


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.