生成Rummy序列


18

您的任务是获取Rummy序列的输入n和输出元素n,该序列是我制作的(在OEIS上查找不会帮助您)。

定义

Rummy序列的每个元素都是一组真或假值。例如:[true, false]

生成Rummy序列的成员的步骤非常简单:

  1. 从第一个索引开始[](这是元素0)。
  2. 将最左边的falsey设置为true。如果没有要更改的错误,则将列表的长度增加1并将新列表的所有成员设置为错误。
  3. 重复步骤2直到到达element n

让我们将函数定义为rummy(int n){}插入是为得到答案所采取的步骤):

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

规则

  • 有标准漏洞。
  • 必须通过您的语言的数字上限来输入0。
  • 您可以以您认为合适的任何方式输出,只要清楚地知道输出是一组true / falseys。

琐事

我将其称为“ Rummy序列”是因为从索引2开始,它定义了在每一轮Progressive Rummy中需要放置的集合,其中falsey是一本书,而Truth是运行。

测试用例

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

这有点像反向计数二进制文件
ThreeFx

@ThreeFx除外,当添加1到时11,您得到000而不是100。; P
Addison Crump

1
我们的答案可以一索引吗?
Downgoat

我认为您应该包括更多测试用例,即使示例中隐含地提到了输出。我的第一个修订版本的第一个案例出现了问题……
丹尼斯

@VTCAKAVSMoACE这将使它成为双射的二进制数(这也是我们面临的挑战),但是还有更多的区别,因为每个数字始终都是形式1*0*
Martin Ender

Answers:


10

的JavaScript ES6,94 92 72 70 66 64字节

感谢Neil,节省了6个字节!

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

我认为这不能打更多。至少与方程式有关。

说明

它们是两个主要方程式(n是输入的):

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

这将给出输出数组所需的总大小。在我的程序中,我使用的>>1不是(...)/2这些,因为二进制的第一位的值为2。将其移位会导致floor(.../2)


n-a*(a+1)/2

这是trues 的数量。a是前一个表达式的结果。


这是语法的作用:

[...Array(n)]

这段代码生成了一个带范围的数组,[0, n)这个答案n是第一个方程。


.map((_,l)=>l<n)这将在上述范围内循环,l是包含该范围内当前项目的变量。如果该项目小于真实数量(由第二个方程确定),则它将返回true,否则返回false


2
使用>>1代替/2|0。使用(_,l)=>代替.keys()
尼尔

@尼尔,谢谢!这样节省了很多。到最后一点,您是要使用Array.from()?,fill还是其他?
Downgoat's

1
不,我在想[...Array(a)].map((_,l)=>)我认为哪一个短一些,但是()切换到时可以很好地删除一些s >>1,我没有发现!
尼尔

哦,还有a*-~a/2;我不知道为什么我以前没有想到它。
尼尔

6

Python,51个字节

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

输出1和0的列表。


5

Pyth,8个字节

_@{y/RQy

在线尝试:演示测试套件

这是指数级的。

说明:

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

果冻13 11 字节

Ḷṗ2SÞ⁸ị1,0x

在发布挑战之前,该代码在最新版本的Jelly中不起作用,但在挑战之前的此版本中才有效。

索引基于1。在线尝试!(需要几秒钟)或一次验证多个输入

怎么运行的

Ḷṗ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字节

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

请问我是否还能打高尔夫球,并在早上补充说明。

在线尝试


4

Java 117110字节

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

创建了我自己的布尔类型,这使我节省了7个字节


枚举的用法很聪明。+1
Addison Crump


2

Python 2,61字节

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

求解n = j·(j + 1)/ 2。输入来自标准输入。

样品用量

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

演示


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.