数数,替换,重复!


18

定义

如下定义CURR序列的n 数组。

  1. 从单例数组A = [n]开始

  2. 对于A中的每个整数k,用k个自然数替换条目k,从1k递增

  3. 重复上一步骤n-1次。

例如,如果n = 3,我们从数组[3]开始

我们替换31,2,3,得到[1,2,3]

我们现在更换12,和31 ; 1,21,2,3(resp。),产生[ 1,1,2,1,1,2,3 ]

最后,我们对数组中的所有六个整数执行与上一步相同的替换,得到[ 1,1,1,2,1,1,1,2,1,2,3 ]。这是第三个CURR阵列。

任务

编写一个函数程序,给定严格的正整数n作为输入,该程序将计算第n CURR数组。

输出必须是某种类型的平面列表(以及从函数返回的数组,您语言的数组语法的字符串表示形式,以空格分隔的等)。

这是。可能以字节为单位的最短代码获胜!

测试用例

 1 -> [1]
 2 -> [1, 1, 2]
 3 -> [1, 1, 1, 2, 1, 1, 2, 1, 2, 3]
 4 -> [1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4]
 5 -> [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5]
 6 -> [1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6]


我们可以将输入作为单例数组(例如[2])而不是整数吗?
Mego 2016年

@Mego让我们将其保留为整数。
丹尼斯

我觉得应该为此有一个OEIS序列。
DanTheMan '16

@DanTheMan它实际上不是当前形式的整数序列,但我想可以通过将所有正整数的结果连接起来将其变成一个整数序列。
丹尼斯

Answers:


23

果冻,3个字节

R¡F

在线尝试

说明

R¡F    Argument n

R      Yield range [1..n]
 ¡     Repeat n times
  F    Flatten the result

与我的果冻答案相比,这真是太好了。
Leaky Nun

6
很棒的第一篇文章!
2016年

16

Python,50个字节

lambda i:eval("[i "+"for i in range(1,i+1)"*i+"]")

范围滥用!例如,对于i=3,要评估的字符串扩展为。

[i for i in range(1,i+1)for i in range(1,i+1)for i in range(1,i+1)]

不知何故,尽管所有函数i都使用了函数输入变量,Python还是将每个迭代索引都区分为属于一个单独的作用域,就好像表达式是

[l for j in range(1,i+1)for k in range(1,j+1)for l in range(1,k+1)]

i功能的输入。


这个技巧也可以在Firefox 30+中使用,并为我节省了3个字节,谢谢!
尼尔

@DigitalTrauma python和JavaScript都具有eval,显然代码本身需要移植,但是我认为无论如何都可以假设。
尼尔

@Neil哦,我明白了-我完全被误解了:)
Digital Trauma



6

Python 2,82个字节

lambda n:[1+bin(i)[::-1].find('1')for i in range(1<<2*n-1)if bin(i).count('1')==n]

这不是最短的解决方案,但是它说明了一个有趣的方法:

  • 2^(2*n-1)用二进制记下第一个数字
  • 保持那些与n那些
  • 对于每个数字,计算尾随零的数目,然后加1。

4

其实是9个位元组

;#@`♂RΣ`n

在线尝试!

说明:

;#@`♂RΣ`n
;#@        dupe n, make a singleton list, swap with n
   `♂RΣ`n  call the following function n times:
    ♂R       range(1, k+1) for k in list
      Σ      concatenate the ranges

感谢Leaky Nun提供了一个字节,并感谢了另外2个字节。


;#@"♂R♂i"*ƒ保存一个字节
Leaky Nun

@LeakyNun好收获- ;#@`♂R♂i`n保存另一个!
Mego

我正要尝试求和,大声笑。
Leaky Nun

我认为9将是此处的最佳解决方案
Mego 2016年

您的链接仍然过时。
Leaky Nun

4

C#,128字节

List<int>j(int n){var l=new List<int>(){n};for(;n>0;n--)l=l.Select(p=>Enumerable.Range(1,p)).SelectMany(m=>m).ToList();return l;

使用using static System.Linq.Enumerable,您可以执行以下操作:int[]J(int n){var l=new[]{n};while (n-- > 0){l = l.Select(p => Range(1, p)).SelectMany(m => m).ToArray();}return l;}
死于maus 2016年

4

APL,11个字节

{∊⍳¨∘∊⍣⍵+⍵}

测试:

      {∊⍳¨∘∊⍣⍵+⍵} 3
1 1 1 2 1 1 2 1 2 3

说明:

  • +⍵:以,开头
  • ⍣⍵:执行以下次数:
    • ⍳¨∘∊:拼合输入,然后为输入中的每个N生成一个列表[1..N]
  • :将结果扁平化

2
更简单:{(∊⍳¨)⍣⍵⊢⍵}
亚当

@亚当:嗯,是的,列车从J.我的工作方式不同会开始了{(∊∘(⍳¨))⍣⍵+⍵},然后想,我怎样才能摆脱这些括号的?
marinus

2

CJam,14个字节

{_a\{:,:~:)}*}

在这里测试。

说明

_a   e# Duplicate N and wrap it in an array.
\    e# Swap with other copy of N.
{    e# Do this N times...
  :, e#   Turn each x into [0 1 ... x-1].
  :~ e#   Unwrap each of those arrays.
  :) e#   Increment each element.
}*

2

Mathematica,27 26字节

从Essari的答案中得到一些启发,节省了1个字节。

Flatten@Nest[Range,{#},#]&

相当简单:输入x我们开始{x},然后应用Range到它x的时间(RangeListable这意味着它会自动适用于整数内任意嵌套列表)。最后Flatten的结果。


2

Clojure,59个字节

(fn[n](nth(iterate #(mapcat(fn[x](range 1(inc x)))%)[n])n))

说明:

确实是解决问题的直接方法。由内而外的工作:

(1) (fn[x](range 1(inc x))) ;; return a list from 1 to x
(2) #(mapcat (1) %)         ;; map (1) over each item in list and flatten result
(3) (iterate (2) [n])       ;; call (2) repeatedly e.g. (f (f (f [n])))
(4) (nth (3) n))            ;; return the nth value of the iteration

2

Python 3,75 74字节

def f(k):N=[k];exec('A=N;N=[]\nfor i in A:N+=range(1,i+1)\n'*k+'print(N)')

这只是问题描述到代码的直接转换。

编辑:感谢@Dennis,节省了一个字节。


print可以去外面exec
xnor

是的,那是我刚开始拥有的东西,但是[k]出于某种原因它只是打印出来。我放弃了试图弄清楚这是一个范围问题还是其他问题。
Andrew Epstein 2016年

是的,它看起来像一个范围问题。它在Python 2中可以正常工作
。– xnor

2

R,60 49字节

unlist和的使用非常简单sapply

y=x=scan();for(i in 1:x)y=unlist(sapply(y,seq));y

感谢@MickyT节省了11个字节


@MickyT thx作为提示,我可以使用它seq来减少字节数
bouncyball

抱歉,我读错了问题
MickyT 2016年

2

PHP 121

在这背后的花样并不是很多。在php中扁平化数组并不短,因此有必要首先将其扁平化

<?php for($a=[$b=$argv[1]];$b--;)$a=array_reduce($a,function($r,$v){return array_merge($r,range(1,$v));},[]);print_r($a);

保持平坦是一个好主意。但是回调函数也不短。用15个字节击败您。您可以使用short标签保存4个字节,<?或者使用-r没有标签保存6个字节。
泰特斯(Titus)

2

Haskell,33个字节

f n=iterate(>>= \a->[1..a])[n]!!n

感谢nimi节省了一个字节。

无点版本较长(35字节):

(!!)=<<iterate(>>= \a->[1..a]).pure

iterate(>>= \a->[1..a])少一个字节。
nimi 2016年

2

JavaScript(Firefox 30-57),63 60字节

f=n=>eval(`[${`for(n of Array(n+1).keys())`.repeat(n--)}n+1]`)

@xnor的Python答案的端口。


我使用Firefox 42(SyntaxError: missing : in conditional expression)和Babel(Unexpected token (1:21))进行了尝试。我究竟做错了什么?
丹尼斯

@丹尼斯抱歉,但我不知道;实际上,出于某种原因,我确实在其中一台计算机上安装了Firefox 42,然后我仔细检查了一下,结果表明该设备运行良好。(为了确定
Neil

h,页面没有刷新,我测试了您的旧版本。新的一个很好用。
丹尼斯

@Dennis Ah,它看起来像是某种杂乱无章的东西)
尼尔

1

J,18个字节

([:;<@(1+i.)"0)^:]

基于挑战中描述的过程的简单方法。

用法

   f =: ([:;<@(1+i.)"0)^:]
   f 1
1
   f 2
1 1 2
   f 3
1 1 1 2 1 1 2 1 2 3
   f 4
1 1 1 1 2 1 1 1 2 1 1 2 1 2 3 1 1 1 2 1 1 2 1 2 3 1 1 2 1 2 3 1 2 3 4

说明

([:;<@(1+i.)"0)^:]  Input: n
                 ]  Identity function, gets the value n
(     ...     )^:   Repeat the following n times with an initial value [n]
      (    )"0        Means rank 0, or to operate on each atom in the list
         i.           Create a range from 0 to that value, exclusive
       1+             Add 1 to each to make the range from 1 to that value
    <@                Box the value
 [:;                  Combine the boxes and unbox them to make a list and return
                    Return the final result after n iterations

1

Pyth,8个字节

usSMGQ]Q

在线尝试!

usSMGQ]Q   input as Q

u    Q     repeat for Q times,
      ]Q   starting as [Q]:

  SMG          convert each number in the array to its range
 s             flatten

           then implicitly prints the result.

1

果冻,7个字节

快速,在丹尼斯回答之前(jk)

WR€F$³¡

在线尝试!

WR€F$³¡  Main monadic chain. Argument: z

W        Yield [z].
     ³¡  Repeat the following z times:
 R€          Convert each number in the array to the corresponding range.
   F         Flatten the array.

1

F#,63字节

fun n->Seq.fold(fun A _->List.collect(fun k->[1..k])A)[n]{1..n}

返回以n为输入的匿名函数。

用[1..k]替换A中的每个条目k,从A = [n]开始重复n次。


1

Swift 3,58字节

打算直接在操场上跑步,将n设置为输入:

var x=[n];for i in 0..<n{x=x.reduce([]){$0+[Int](1...$1)}}

取消高尔夫,最短的手写符号恢复为:

let n = 3 //input

var x: Array<Int> = [n]
for i in 0..<n {
    x = x.reduce(Array<Int>[], combine: { accumulator, element in
        accumulator + Array<Int>(1...element)
    })
}

1

Java,159字节

程序

int[] q(int y){int z[]=new int[]{y};for(int i=0;i<y;i++){int d=0,a=0;for(int c:z)d+=c;int[]r=new int[d];for(int c:z)for(int j=0;j<c;)r[a++]=++j;z=r;}return z;}

用法

public static void main(String[] args){String out = "["; int [] b = q(6);for(int c:b)out+=c+", ";System.out.println(out+"]");}

public static int[] q(int y){int z[]=new int[]{y};for(int i=0;i<y;i++){int d=0,a=0;for(int c:z)d+=c;int[]r=new int[d];for(int c:z)for(int j=0;j<c;)r[a++]=++j;z=r;}return z;}

样本输出:

[1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 1, 2, 3, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, ]

1

Python 2,69 68 66字节

def f(n):a=[n];exec'a=sum([range(1,i+1)for i in a],[]);'*n;print a

编辑:感谢@xnor,节省了1个字节。@ Dennis♦节省了2个字节。


您可以删除周围的括号exec。在Python 2中,它是关键字,而不是函数。我算了68个字节。
丹尼斯

@Dennis Ah,这意味着我记错了它,最初是69个字节……
Neil

1

Bash + GNU实用程序,49

  • 感谢@Dennis,节省了1个字节。

管道递归函数FTW!

f()((($1))&&xargs -l seq|f $[$1-1]||dd)
f $1<<<$1

n在命令行上传递。输出以换行符分隔。

使用dd原因统计信息将发送到STDERR。我认为这是可以的,但如果不能,dd则可以用cat1个额外的字节替换。


1
默认情况下,允许将多余的输出输出到STDERR。您可以替换{...;}使用(...),以节省一个字节。
丹尼斯

@丹尼斯,是的,当然!显然您从我这里得到了这个提示:)
Digital Trauma

0

Perl 5,53个字节

子程序:

{($i)=@_;for(1..$i){my@c;push@c,1..$_ for@_;@_=@c}@_}

将其视为

perl -e'print "$_ " for sub{($i)=@_;for(1..$i){my@c;push@c,1..$_ for@_;@_=@c}@_}->(3)'


0

PHP,100 98字节

用运行php -r '<code>' <n>

for($a=[$n=$argv[1]];$n--;$a=$b)for($b=[],$k=0;$c=$a[$k++];)for($i=0;$i++<$c;)$b[]=$i;print_r($a);

在每次迭代中,创建一个从1 ..(删除第一个值)直到$a为空的临时副本循环。


这两个仍然并且可能保持100个字节:

for($a=[$n=$argv[1]];$n--;)for($i=count($a);$i--;)array_splice($a,$i,1,range(1,$a[$i]));print_r($a);

在每个迭代中,通过数组向后循环,将每个数字替换为一个范围。

for($a=[$n=$argv[1]];$n--;)for($i=$c=0;$c=$a[$i+=$c];)array_splice($a,$i,1,range(1,$c));print_r($a);

在每个迭代循环中,通过数组按先前编号增加索引,并用范围替换每个索引元素

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.