繰り返される数字で配列を作成する


19

チャレンジ

この質問のタスクは、nSTDIN、ARGV、または関数の引数を介して入力として正の整数(0より大きい)を取り、STDOUTまたは関数の戻り値を介して配列を出力するプログラムまたは名前付き関数を作成することです。

簡単に聞こえますか?今ここにルールがあります

  • 配列は唯一の整数が含まれています1n
  • から1までの各整数は、各整数の値である回数n繰り返される必要があります。xx

例えば:

入力:

5

出力:

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

配列はソートされる場合とされない場合があります。

これはので、勝者はバイト単位の最短コードです。

ボーナス

0.5出力配列内の隣接する2つの整数が同じでない場合、スコアを乗算します。

たとえばn = 5、そのような構成の1つは

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

回答:


6

APL、4文字

/⍨⍳⎕

使い方:

ユーザー入力を読み取ります。出力に関しては、APLはデフォルトですべての行から結果を出力します。

⍳nは1からの整数nです。例:⍳3←→ 1 2 3

/replicateを意味ます。右引数の各要素は、左引数の対応する要素で指定された回数だけ繰り返されます。例:2 0 3/'ABC'←→ 'AACCC'

通勤オペレーターです。関数の右側で発生すると、その動作を変更するため、引数を交換する(A f⍨ B ←→ B f A、つまり「通勤」)か、両側で同じ引数を提供する(f⍨ A ←→ A f A、「自分撮り」)かのいずれかです。後者の形式はこのソリューションで使用されます。


ボーナス:

6-∊⌽⍳¨⍳⎕(8文字、@ phil-hに感謝

⍳5(iota five)は1 2 3 4 5です。

⍳¨ ⍳5(iota各iota 5)は(,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 14

ご希望のように、私はテキストを更新しました。しかし、あなたの異論は、関数にラップされていない他のソリューションに適用する必要がありますか?
ngn 14

3
Dyalog APLには、「クラシック」と「ユニコード」の2つのフレーバーがあります。Classicバージョンは、Unicode標準が登場する前から何十年も存在しており、APL文字セットにカスタムの文字ごとのバイトエンコーディングを使用しています。使用は推奨されていませんが、引き続きサポートされています。だから、これを言い訳として使いたい。もっと広く言えば、ゴルフではバイトではなくキャラクターを数えるべきだと思います。Unicodeの最も低いコードポイントが英語中心のASCIIで占められているという事実は、今日では重要ではない歴史的な事故です。興味深いことに、APLはASCIIが登場する前に考案されました。
ngn 14

3
@ngn は文字を数えることは良い考えはありません。答えは一般的にアルファベットスープデコードになるからです。APL文字は、そのエンコーディングが存在するため、バイトとしてカウントされます。これはこのサイトで確立されています。これは、質問の前に存在していたバイトエンコーディングで機能します。
FryAmTheEggman 14

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を引いたものであるため、それほど遠くないように感じる最初の答えから。
フィルH 14

11

Ruby(再帰的)、41バイト* 0.5 = 20.5

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

または、ラムダを使用して(histoccratおよびVenteroが推奨):34バイト* 0.5 = 17

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

(を使用して呼び出しますr[argument]


2
それは本当にクールなソリューションです。メソッド(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


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

誇り高きHaskellerにBeatられて


最初の解決策は正しくありません。考えられる修正はg n = [y|x<-[n,n-1..1],y<-[x..n]]
karakfa 14

@karakfa oops:-/と修正のおかげで
ジョンドヴォルザーク14

私のHaskellの答えは、あなたよりも少し低いです
誇りに思ってhaskeller 14

それを促進するために、ソリューションからリンクする必要がありますか?
ジョンドヴォルザーク14

@JanDvorak私が...実際には、したい
誇りhaskeller

7

C、22 = 44バイト* 0.5

この関数hは2つのパラメーターを取ります。最初はnをint指定することです。2番目は、出力バッファです。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);
}

わかりません。説明してください?
バッカスビール14

@bacchusbeale Ok .. nから0までの降順のシーケンスを再帰的に書き込みます。短いシーケンスは、より深い再帰レベルでより早く書き込まれます。引数nが0の場合、nは偽であるため、再帰はなく、0のみが書き込まれます。これは、配列の終わりをマークするのに役立ちます。
feersum

7

Pyth - 15 10 * .5 = 5

smr-QdhQUQ

オンラインでお試しください。

stdinへの入力を期待します。独立して発見されたアルゴリズム。そこに最後のQを付けてくれてありがとう@ 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 コードゴルフに勝てない状況はありますか?:)
アレックスA. 14

2
@Alex問題の性質に応じて、スタックベースのゴルフ言語(Golfscript、CJam)はそれをクリーム状にすることができます。また、ライブラリのもの( bash )を失うこともあります;)
FryAmTheEggman 14


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

GolfScript(14バイト* 0.5 =スコア7)

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

オンラインデモ

これはおそらく、配列を構築するという点で既存の回答と似ていると思います concat( [n], [n-1, n], [n-2, n-1, n], ..., [1, 2, ..., n] )

悲しいことに、おそらくこれ以上エレガントなゴルフはできませんでした。

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

入力xを配列に入れてから2回適用します{,{x\-}/}%。これにより、配列内の各要素がからその数の要素のカウントダウンにマップされxます。


5

C#-81(161バイト* 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 14

1
@MarkKnol System.Consoleは静的であり、変数に割り当てることはできませんが、C#6または次のものでは、あなたはできることがありますusing System.Console;using System;このインスタンスでは支払いません)この理由により、多くの古いゴルフの質問に正確に影響します;)
VisualMelon 14

1
@IchabodClayそれは悪化し、using C=System.Console3バイトを節約し、おそらく@MarkKnolが意味することです(ごめんなさい!)、私の側の恥ずべき過失。
VisualMelon 14

1
また、ルールに従って、完全なプログラムを作成する代わりに、メソッド自体を保持することもできます。こんな感じ... これ。(空白などが削除された114バイト。ボーナス付きで57バイト。)
Ichabod Clay 14

1
@IchabodClay確かに; 完全なプログラムを関数に送信することを好みますが、正当な理由はありません。IOは楽しみの一部のように思えます(私もargvを使用する傾向はありません)。これらの無制限の制約なしで、より良いスコアリング回答を投稿してください!
VisualMelon 14

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]

=<<空白を避けることができますか?私はそれができるように感じますが、あなたがまだそれを考慮していなかったならば、私は驚きます。
ジョンドボラック14

@JanDvorak使用した場合=<<、ラムダの括弧が必要になります
誇りに思ってhaskeller 14

正確にラムダが括弧を必要とするとき、私は混乱しています。ラムダヘッダーの固定性は同じ>>=ですか?
ジョン・ドヴォルザーク

@JanDvorak彼らは固定性を持っていません。後:私は確かにこのルールがどのように正確でないんだけど、オペレーターは(セクションを無視)することはできませんどこラムダしか現れることができ([=,、任意のオペレータの後、など
誇りhaskeller

ラムダも演算子もパターンとして表示できないと思いますか?let \x->y = (2+) in (x,y)ちょっと無理だ
ジョンドヴォルザーク14



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はありませんか?
オプティマイザー14

@オプティマイザーは多分後で:)
MickyT 14

2

JavaScript、ES6、66バイト* 0.5 = 33

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

オプティマイザーの再帰的アプローチに基づいて、のように長さが減少する下降ランを構築でき[4,3,2,1, 4,3,2, 4,3, 4]ます。

と同じ値のサブ配列を作成する代わりに、適切な長さのサブアレイArray(i).fill(i)を作成し、を使用して値を降順の実行に変更します。また、内部関数を定義して再帰します。外部関数は、whileの値を保存するためだけに存在します。undefinedArray(n).fill().map((v,x)=>i-x)gfig


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
アレックスA.

これは、Perl 6の下で私のために実行されません
アレックスA.

@Alex、エラーが何であるか、5.10の下で働く
michael501

Unable to parse postcircumfix:sym<{ }>, couldn't find final '}' at line 3。ideone.comで試してみました。
アレックス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 14

2

JavaScript(読み取り可能)、131バイト

私はコードゴルフが初めてなので、これは最高ではありません

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 14

@VisualMelonそれは、変数の名前を変更した後に変数の名前を再確認しないことで得られるものです。頭を上げてくれてありがとう:D。コメントの短いバージョンを説明する回答を編集しました。
イカボッドクレイ14

あなたは長さがインライン化により安全なバージョン少しオフを切ることができますvar a=new int[(int)((n/2f)*(n+1))];109にそれを取ると思う
ジェームズ・ウェブスターの

もう一つのオフとしてCALCを書き換えることにより:(n*(n+1)/2)
ジェームズ・ウェブスター


1

C#、116 115 + 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.5では11.5ない10.5
ProgramFOX 14

@ProgramFOX良いキャッチ。編集しますか?IMOに投票する大きな理由ではありません。
ジョンドヴォルザーク14

@JanDvorakただ編集した。そして、私はダウン票を投じなかった、私は間違いを見る前でさえそれをアップ票した。
ProgramFOX 14

間違いが修正されたので、ボーナスソリューションを一番下に移動する必要がありますか?
ジョンドヴォルザーク14

-1バイト:f=.-[:;<@|.@i."0@>:@i.、スコアを等しくします!
ボルチェビュシエール

1

JavaScript(ES6)29(58 * 0.5)

編集削除; thx @Optimizer

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}

これにかなり満足しています...元のサイズの約4分の1です。

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 it self :)にかなり慣れている必要があります。(1)引数部分の括弧を削除d、(2)a=b=c=[]宣言部分に(3)c[a].map(e=>a)(4)b.push(...c)
オプティマイザー14

コメントを読む前に短いバージョンを作成しました。これを投稿に入れます。JSでの私の経験は、単純なWebアプリのDOM /スタイル操作にほとんど限定されています...そして、今日まで新しいES6機能をほとんど使用していませんでした。
異常な14

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 []を返すことを主張する場合)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.