创建具有重复数字的数组


19

挑战

这个问题的任务是编写一个程序或一个命名函数,该程序或命名函数采用一个正整数n(大于0)作为通过STDIN,ARGV或函数参数的输入,并通过STDOUT或函数返回值输出一个数组。

听起来足够简单?现在这是规则

  • 该数组将仅包含从1到的整数n
  • 1到的每个整数n应重复x一次,其中x是每个整数的值。

例如:

输入:

5

输出:

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

数组可以排序也可以不排序。

这是因此获胜者是最短的代码(以字节为单位)。

奖金

0.5如果输出数组中没有两个相邻的整数相同,则将您的分数乘以。

例如n = 5,一种这样的配置是

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

Answers:


6

APL,4个字符

/⍨⍳⎕

怎么运行的:

读取用户输入。对于输出,默认情况下,APL从每一行打印结果。

⍳n是从1到的整数n。例:⍳3←→ 1 2 3

/意味着复制。右自变量中的每个元素重复的次数与左自变量中其相应元素指定的次数相同。例:2 0 3/'ABC'←→ 'AACCC'

通勤者。当它出现在函数右侧时,它会修改其行为,因此它要么交换参数(A f⍨ B ←→ B f A,因此称为“通勤”),要么在两侧都提供相同的参数(f⍨ A ←→ A f A称为“ selfie”)。在该解决方案中使用后一种形式。


奖金:

6-∊⌽⍳¨⍳⎕(8个字符,谢谢@ phil-h

⍳5(五点钟)是1 2 3 4 5

⍳¨ ⍳5(每个iota五个iota)是(,1)(1 2)(1 2 3)(1 2 3 4)(1 2 3 4 5)向量的向量。 每个¨)是运算符,它接受左侧的一个函数并将其应用于右侧数组中的每个项目。

反转数组,因此得到(1 2 3 4 5)(1 2 3 4)(1 2 3)(1 2)(,1)

征募(又名扁平化)。递归遍历参数,并从中返回简单标量作为向量。


4个字符的表达式怎么样?/⍨⍳n
ngn 2014年

先生,我已按您的意愿更新了文字。但是,您的反对意见一定适用于其他未包含在函数中的解决方案吗?
ngn 2014年

3
Dyalog APL有两种风格:“经典”和“ Unicode”。从Unicode标准出现之前,Classic版本已经存在了几十年,并且为APL字符集使用了自定义的每个字符字节编码。尽管不鼓励使用它,但仍支持它。所以,我想以此为借口。更广泛地说,我认为在打高尔夫球时,我们应该计算字符数,而不是字节数。Unicode中最低的代码点被以英语为中心的ASCII占据的事实,这在今天已经不应该再有历史了。有趣的是,APL是在ASCII出现之前就想到的。
ngn 2014年

3
@ngn 计算字符数不是一个好主意,因为答案通常会变成字母汤解码。因为存在该编码,所以APL字符被计为字节。这在此站点上已经很完善。这适用于问题提出之前存在的任何字节编码。
FryAmTheEggman 2014年

1
@ngn:您能解释一下您的红利答案吗?因为它可以通过以下方式完成:5 4 3 2 1 5 4 3 2 5 4 3 5 4 5或6减去1 2 3 4 5 1 2 3 4 1 2 3 1 2 1的每一个,感觉好像不远从您最初的答案。
Phil H

11

Ruby(递归),41个字节* 0.5 = 20.5

def n(n,i=1);i>n ?[]:n(n,i+1)+[*i..n];end

或使用lambda(如histocrat和Ventero所建议):34个字节* 0.5 = 17

r=->n,i=n{i>0?[*i..n]+r[n,i-1]:[]}

(使用致电r[argument]


2
那是一个非常酷的解决方案。您可以通过将其设置为lambda而不是method(n=->x,i=1{...n[x,i+1]...)来节省一些字节,并使用来节省更多字节[*i..n]
histocrat

1
通过反转逻辑,可以在三进制中删除空格:r=->n,i=n{i>0?[*i..n]+r[n,i-1]:[]}
Ventero 2014年


8

Haskell,31个字符= 15.5分

f n=[y|x<-[n,n-1..1],y<-[x..n]]

没有奖金的27个字符

f n=[x|x<-[1..n],_<-[1..x]]

被骄傲的哈斯克勒殴打


您的第一个解决方案不正确。可能的解决方法是g n = [y|x<-[n,n-1..1],y<-[x..n]]
karakfa 2014年

@karakfa抱歉: - /和感谢修复
约翰·德沃夏克

我的Haskell答案比您的答案低一点
骄傲的haskeller 2014年

我应该从解决方案中链接到它以进行推广吗?
约翰·德沃夏克

@JanDvorak我实际上想...
骄傲的haskeller 2014年

7

C,22 = 44字节* 0.5

该函数h有两个参数。第一个是int指定n。第二个是an int*,它是输出缓冲区。

h(n,o)int*o;{for(n&&h(~-n,o+=n);*--o=n--;);}

测试程序

main(){
int wow[999],*i;
memset(wow,0,sizeof(wow));
h(6, wow);
for(i=wow;*i;i++)printf("%d ", *i);
}

我不明白 请解释?
bacchusbeale 2014年

@bacchusbeale好..它递归地写出从n到0的降序序列。更短的序列将在更深层次的递归中更快地被写入。如果参数n为0,则n为false,因此不进行递归,仅写入0,以标记数组的结尾。
feersum 2014年

7

Pyth - 15 10 * 0.5 = 5

smr-QdhQUQ

在线尝试。

期望在stdin上输入。独立发现的算法。感谢@ Sp3000帮助我在其中加入最后一个问题:P另外,具有讽刺意味吗?XD

说明:

Q=eval(input())       : implicit
s                     : The sum of...
 m      UQ            : map(...,range(Q))
  r-QdhQ              : range(Q-d,Q+1)

2
不错的解决方案。有没有Pyth 无法赢得代码高尔夫的情况?:)
Alex A.

2
@Alex根据问题的性质,基于栈的高尔夫球语言(Golfscript,CJam),它也可以失去的东西库(罐眼霜了咳嗽庆典咳嗽);)
FryAmTheEggman

6

CJam,12 15字节* 0.5 = 7.5

li_,f{),f-W%~}`

这是完整的STDIN到STDOUT程序。它串联了1 ... n范围的后缀,以确保没有两个相邻的数字相同。

在这里测试。


6

Python 2,53字节* 0.5 = 26.5

i=n=input()
x=[]
while i:x+=range(i,n+1);i-=1
print x

无耻地借用@VisualMelon的想法


6

Haskell,34个字节* 0.5 = 17

0%n=[]
i%n=[i..n]++(i-1)%n
g n=n%n

这是我第一次使用Haskell打高尔夫球。致电g <number>


5

Bash + coreutils,28/2 = 14

无耻地偷@pgy的想法并打高尔夫球:

seq -f"seq %g $1" $1 -1 1|sh

纯bash(无coreutils),30/2 = 15

评估,逃生和扩展地狱:

eval eval echo \\{{$1..1}..$1}

5

GolfScript(14个字节* 0.5 =得分7)

 ~:x,{~x),>~}%`

在线演示

我认为这可能与一些现有答案相似,因为它可以建立数组 concat( [n], [n-1, n], [n-2, n-1, n], ..., [1, 2, ..., n] )

可悲的是,我再也无法打高尔夫了。

~:x]{{,{x\-}/}%}2*`

它将输入x放入数组中,然后两次进行应用{,{x\-}/}%,它将数组中的每个元素映射到从中倒数的元素的倒数x


5

C#-81(161bytes * 0.5)

使用C#进行简单的工作,有望获得无编号的奖金。从stdin读取一个int,将类似于示例的数组写到stdout。

class P{static void Main(){int n=int.Parse(System.Console.ReadLine()),m=n-1,i;var R="["+n;for(;m-->0;)for(i=m;i++<n;)R+=", "+i;System.Console.WriteLine(R+"]");}}

更具可读性:

class P
{
    static void Main()
    {
        int n=int.Parse(System.Console.ReadLine()),m=n-1,i;
        var R="["+n;
        for(;m-->0;)
            for(i=m;i++<n;)
                R+=", "+i;
        System.Console.WriteLine(R+"]");
    }
}

示例输出:

n = 5
[5, 4, 5, 3, 4, 5, 2, 3, 4, 5, 1, 2, 3, 4, 5]

我真的是想找出一个较短的C#解决方案,但我似乎做不到……做得很好
Brandon 2014年

1
@MarkKnol System.Console是静态的,您不能将其分配给变量,但是在C#6或后续版本中,您将能够做到using System.Console;using System;在这种情况下不付款),不确定我对此功能的感觉如何,正是由于这个原因,影响了许多老高尔夫问题;)
VisualMelon 2014年

1
@IchabodClay变得更糟,using C=System.Console节省了3个字节,可能就是@MarkKnol的意思(对不起!),我这是可耻的疏忽。
VisualMelon 2014年

1
而且,根据规则,您可以只拥有方法本身,而不是创建完整的程序。像... 这样的东西。(114个字节,带空格,已删除。57个字节,带奖金。)
Ichabod Clay 2014年

1
@IchabodClay确实;我更喜欢将完整的程序提交给函数,这没有什么充分的理由,IO似乎只是一部分乐趣(我也不倾向于使用argv)。不受这些愚蠢的约束,随时发布更好的得分答案!
VisualMelon 2014年

4

JavaScript,ES6、41个字节

f=i=>[...Array(i).fill(i),...i?f(--i):[]]

这将创建一个f可以像这样调用的函数,f(6)并返回所需的数组。

这使用了一种递归方法,其中每次迭代都会创建一个i元素数组,所有元素都被赋值,i并连接一个由f(i-1)终止条件为的数组i==0

适用于最新的Firefox。


4

Haskell,14 = 28字节/ 2

f n=n:[1..n-1]>>= \r->[r..n]

示例输出:

>f 5
[5,1,2,3,4,5,2,3,4,5,3,4,5,4,5]

24个字节,没有奖金:

f n=[1..n]>>= \r->[r..n]

可以=<<帮助避免空格?我觉得可以,但是如果您还没有考虑的话,我会感到惊讶。
John Dvorak 2014年

@JanDvorak如果我会用的话,=<<我需要为lambda
加上

我对确切的lambdas需要括号感到困惑。lambda标头的固定性是否相同>>=
约翰·德沃夏克

@JanDvorak他们没有固定性;我不知道如何准确的这个规则,但lambda表达式只能出现在那里运营商不能(不考虑部分)之后([=,,任何运营商,等之后
傲haskeller

我猜lambda和运算符都不能显示为模式?let \x->y = (2+) in (x,y)似乎是不可能的。
约翰·德沃夏克



2

R,44 * .5 = 22

f=function(n){r=0;for(i in 1:n)r=c(r,n:i);r}

快速测试

> f(1)
[1] 1
> f(2)
[1] 2 1 2
> f(3)
[1] 3 2 1 3 2 3
> f(4)
 [1] 4 3 2 1 4 3 2 4 3 4

什么 ?没有TSQL?
Optimizer

@Optimizer可能会在以后:)
MickyT 2014年

2

JavaScript,ES6、66字节* 0.5 = 33

f=i=>(g=n=>[...Array(n).fill().map((v,x)=>i-x),...n?g(n-1):[]])(i)

基于Optimizer的递归方法,我们可以构建长度递减的降序运行,例如[4,3,2,1, 4,3,2, 4,3, 4]

与其使用制作相同值的子数组Array(i).fill(i)undefined不如使用制作适当长度的填充子数组Array(n).fill(),然后使用来将值更改为降序运算.map((v,x)=>i-x)。此外,我们定义并递归内部函数g;外部函数f仅用于存储iwhile g递归的值。


2

T-SQL,176 * 0.5 = 88

由于您似乎错过了T-SQL @Optimizer,因此这就是冗长的荣耀:)。

几个函数选项,一个标量和一个内联表值函数。标量函数使用while循环来递归并返回数字字符串,其中“内联表值”函数对序列使用递归CTE并返回表。当然,这些永远不会有竞争力,所以我没有花很多时间打高尔夫球。

内联表值函数,176 * .5

CREATE FUNCTION F(@ INT)RETURNS TABLE RETURN WITH R AS(SELECT @ N UNION ALL SELECT N-1FROM R WHERE N>0)SELECT B.N FROM R CROSS APPLY(SELECT TOP(R.N)N FROM R A ORDER BY N DESC)B

称为如下

SELECT * FROM dbo.F(5)

SQLFiddle示例

标量函数220 * .5

CREATE FUNCTION G(@ INT)RETURNS VARCHAR(MAX)AS BEGIN DECLARE @S VARCHAR(MAX),@N INT=1,@I INT,@C INT WHILE @N<=@ BEGIN SELECT @I=@N,@C=@ WHILE @C>=@I BEGIN SELECT @S=CONCAT(@S+',',@C),@C-=1 END SET @N+=1 END RETURN @S END

称为如下

SELECT dbo.G(5)

SQLFiddle示例



2

perl,26个字节

for(1..$n){print"$_ "x$_;}

1
请发布您的分数。另外,由于这是代码高尔夫,因此您可以通过删除多余的空格和的定义来节省字节$n
Alex A.

这不的Perl 6下运行对我来说
亚历A.

@Alex是什么错误,在5.10下工作
michael501

Unable to parse postcircumfix:sym<{ }>, couldn't find final '}' at line 3。在ideone.com上进行了尝试。
Alex A.

@Alex,请尝试:C:\ Windows \ system32> perl -e“ $ n = 5; for(1 .. $ n){print qq($ _)x $ _ ;;;;”;“ 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5
michael501

2

JavaScript(可读),131字节

我是Code Golf的新手,所以这不是最好的

function f(n) {
    var arr = [];
    for(var i = 1; i <= n; i++) {
        for(var j = 0; j < i; j++) {
            arr.push(i);
        }
    }
    return arr;
}

JavaScript(不可读),87字节

使用jscompress.com缩小

function f(e){var t=[];for(var n=1;n<=e;n++){for(var r=0;r<n;r++){t.push(n)}}return t}

2

TECO,25字节* 0.5 = 12.5

a\+1%a%b<qauc-1%b<-1%c=>>

以上仅以13个字节击败了非奖励版本:

a\%a<%b<qb=>>

2

C#,114 99 * 0.5 = 49.5字节

(在VisualMelon的回答中有一点帮助)编辑:和James Webster的评论

int[]A(int n){int m=n,i,c=0;var a=new int[n*(n+1)/2];while(m-->0)for(i=m;i++<n;)a[c++]=i;return a;}

取消高尔夫:

int[] FooBar(int n)
{
    int altCounter = n, i, arrayCounter = 0;
    var returnArray = new int[n * (n + 1) / 2];
    while(m-->0)
        for(i = altCounter; i++ < n; )
            returnArray[arrayCounter++]=i;
    return returnArray;
}

我从feersum的C答案中无耻地提取了一个不安全的版本,但是我不确定100%地确定它是否符合规则,因为您必须在调用方法之前分配内存。

C#(不安全),82 * 0.5 = 41个字节

unsafe void A(int n,int*p){int*z=p;int m=n,i;while(m-->0)for(i=m;i++<n;)z++[0]=i;}

调用如下:

int n = 5, length = (int)((n / 2f) * (n + 1));
int* stuff = stackalloc int[length];
int[] stuffArray = new int[length];
A(n, stuff);
System.Runtime.InteropServices.Marshal.Copy(new IntPtr(stuffArray), stuffArray, 0, stuffArray.Length);
//stuffArray == { 5, 4, 5, 3, 4, 5, 2, 3, 4, 5, 1, 2, 3, 4, 5 }

根据VisualMelon的建议(谢谢!),可以使用安全代码来重新编写不安全的代码,从而进一步减小了大小!仍然提出一个问题,是否允许在方法之外完成最终结果数组的创建。

C#,72 * 0.5 = 36个字节

void A(int n,int[]p){int z=0,m=n,i;while(m-->0)for(i=m;i++<n;)p[z++]=i;}

干得好!对于每个分配的版本,安全通过并int[]直接通过它要便宜得多void A(int n,int[]p){int z=0,m=n,i;while(m-->0)for(i=m;i++<n;)p[z++]=i;}-就规则而言,我同意这可能有点

您无需为不安全的版本创建本地指针,这样可以节省8个字节。另外,我可能会遗漏要点,但是不安全调用代码的最后一行应该是System.Runtime.InteropServices.Marshal.Copy(new IntPtr(stuff), stuffArray, 0, length);吗?
VisualMelon 2014年

@VisualMelon这就是我在重命名变量后不重新检查它们的名称而得到的。感谢您的注意:D。编辑了答案,以便在您的评论中使用较短的版本。
Ichabod Clay

您可以通过内联长度砍有点偏离安全的版本var a=new int[(int)((n/2f)*(n+1))];我认为需要它下降到109
詹姆斯韦伯斯特

通过将计算重写为以下一种方法:(n*(n+1)/2)
James Webster 2014年


1

C#,116115 + 33 = 148字节

不是最短的代码,但是...仍然可以工作:P

int[]l(int m){List<int>i=new List<int>();for(int j=1;j<=m;j++){for(int x=0;x<j;x++){i.Add(j);}}return i.ToArray();}

要求在文件顶部(33字节):

using System.Collections.Generic;

非高尔夫版本:

int[] RepatedNumberList(int m)
{
    List<int> intList = new List<int>();
    for (int j = 1; j <= m; j++)
    {
        for (int x = 0; x < j; x++)
        {
            intList.Add(j);
        }
    }
    return initList.ToArray();
}

1

J,23 * 0.5 = 11.5

   f=.-;@(<@|.@i."0@>:@i.)
   f 5
5 4 5 3 4 5 2 3 4 5 1 2 3 4 5

J,11

   f=.#~@i.@>:
   f 5
1 2 2 3 3 3 4 4 4 4 5 5 5 5 5

1
23 * 0.511.5,不是10.5
ProgramFOX

@ProgramFOX好抓。您要编辑还是应该编辑?否决IMO的理由不是很大。
约翰·德沃夏克

@JanDvorak刚刚编辑了它。而且我没有拒绝投票,甚至在我看到错误之前就投票了。
ProgramFOX 2014年

现在,错误已得到解决,是否应该将奖金解决方案移到最底层?
约翰·德沃夏克

-1字节:f=.-[:;<@|.@i."0@>:@i.,使分数相等!
Bolce Bussiere '18

1

JavaScript(ES6)29(58 * 0.5)

编辑删除; thx @优化器

Q=o=>(m=>{for(n=o,r=[];n>m||++m<(n=o);)r.push(n--)})(0)||r

在FireFox / FireBug控制台中测试

Q(9)

输出量

[9, 8, 7, 6, 5, 4, 3, 2, 1, 9, 8, 7, 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 9, 8, 7, 6, 5, 4, 9, 8, 7, 6, 5, 9, 8, 7, 6, 9, 8, 7, 9, 8, 9]

不打高尔夫球

Q=o=>{
  for(m=0,r=[];m<o;++m)
    for(n=o;n>m;)
      r.push(n--);
  return r
}

1

ECMAScript6,67 * 0.5 = 33.5字节

f=n=>{a=[],b=0;while(c=n+b,n--){while(c-b)a.push(c--);b++}return a}

对此感到非常满意……大约是我原来作品的四分之一。

f(4) 返回:

[ 4, 3, 2, 1, 4, 3, 2, 4, 3, 4 ]

旧答案:

f=i=>{a=b=Array;while(i)a=a.concat(b.apply(null,b(i)).map(e=>i)),i--;return a}

这是我第一次打代码高尔夫……我仍然想获得那0.5倍的奖金。任何建议都欢迎!

用f(n)调用。


您必须对JavaScript本身很陌生:)。(1)删除参数d(2)a=b=c=[]中声明部分的括号,(3)c[a].map(e=>a)(4)b.push(...c)
Optimizer

在阅读您的评论之前,我做了一个简短的版本,并将其张贴在我的帖子中。我在JS方面的经验主要限于简单Web应用程序的DOM /样式操作...直到今天,我几乎没有使用过任何新的ES6功能。
binormal

1

C#,108字节* 0.5 = 54

List<int> f(int n){var r=new List<int>();int m=n-1,i;r.Add(n);for(;m-->0;)for(i=m;i++<n;)r.Add(i);return r;}

感谢VisualMelon的辛勤工作!我以为我会尽量缩小它。

(114字节* 0.5 = 57,如果您坚持使用.ToArray()返回int [])

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.