Javascript:1の10x10配列を作成する


18

明らかに、この課題は関数とライブラリを分離することで簡単になるため、許可されません。

コードはECMAscript仕様に準拠する必要があります(どの仕様でも同じです)ので、ブラウザー固有の回答はありません。

配列は、インスタンス化後にアクセスできる必要があります。

私は今のところ差し控える答えがあります。

注: javascriptで多次元配列を作成するのは不便であるため、この課題はjavascriptに固有のものです。


57文字です。これは良いスコアですか?
ジョンドヴォルザーク

わかりました、間違いなく:
ジョン・ドヴォルザーク

15
この素敵な10の1x1配列だけが欲しくないのですか?[10]
小次郎

8
それでしょう[[10]]か?
発端

回答:


10

Javascript ES6、30

(x=i=>Array(10).fill(i))(x(1))

ES6の動作:)


2
こんにちは、この質問は2歳のようです。最近の質問に答えるには、おそらくJSコードのゴルフスキルをより有効に使用する必要があります;)
ジョージ

6
@George私は古い挑戦に答えることに何の問題もないとは思いません。(チャレンジの作成者の中には、チャレンジの年齢に関係なく、新しい勝者が来た場合に受け入れられた回答を更新するものもあります。)
マーティンエンダー

2
@MartinBüttnerこの回答は、ES6がこの課題よりも若い(2015年に来たので:))、Array.fill()はES6のみであるため、受け入れられる資格がありません:)
Katenkyo

他のES6の回答も見たので、答えました。これに何か問題はないと思います。著者は質問を更新し、他の人は上記の問題を解決する複数の方法を利用するかもしれません。
アフォンソマトス

ES6は、ドラフトが実際に凍結されるずっと前(2015年、数日前)に受け入れられました。それが正しいか間違っているかはわかりません。
オプティマイザー

27

Javascript、34バイト

for(r=[b=[i=10]];i--;r[i]=b)b[i]=1

参照によって行を等しくすることは明らかに問題ないので、その事実に依存することは明らかに問題ないと思います。これは、行と同時にテーブルを作成することにより、1つのforループを削減するのに役立ちます。それで、ここに私の新しい出場者がいます。

r[0]b[0]はループ中に上書きされるため、ゴミを含む可能性があります。これにより、コンマを削除するための別の無料の実行スロットが得られます。悲しいことに、r=b=[]それは、by-refに等しいので、しません。

また、それはうまくスケーリングし(99x99はまだ34バイト)、ES5を必要としません(とにかく新しい関数はひどく長い名前を持ちます)、そしてボーナスとして、それは読めません:-)


3
綺麗な。圧倒的に美しい。
Briguy37

1
くそー、私は終わりました:c=[b=[i=10]];while(i--)b[i]=c,c[i]=1。知っておくべき!!!
mowwwalker

19

ECMAScript 6-33文字

x=(y=[..."1111111111"]).map(x=>y)

「1」の10x10配列を出力します。

これは、文字列 "1111111111"が配列であるかのように処理する必要なすべてのプロパティを持っているという事実を悪用するため、スプレッド演算子...を使用して文字の配列に変換し、次に配列のコピーにマッピングできます「オリジナル」を参照する各要素。

または、1つの変数名のみ(35文字の場合):

x=(x=x=>[..."1111111111"])().map(x)

または追加の混乱のため(ただし45文字)

x=[];x[9]=x;x=[...x].map(y=>[...x].map(x=>1))

または(43文字)

y=y=>[...x].map(x=>y);x=[];x[9]=x;x=y(y(1))

...オペレーターのいい虐待!
アンダースコア


13

45文字

x=[a=[1,1,1,1,1,1,1,1,1,1],a,a,a,a,a,a,a,a,a]

各要素は同じ配列を指しますが、仕様にはそれについて何も言及されていません!


4
仕様には、「配列がインスタンス化された後にアクセス可能でなければならない」と書かれています。。私はあなたが余分に持っている必要があることを意味を推測x=冒頭に
クリスティアンLupascu

それにもかかわらず非常に素晴らしい解決策(+1)
クリスティアンルパスク

ただし、値の変更はすべての配列に反映されるため、これはあまり実用的ではありません。
ガブリエレペトリオリ

7

Javascript、51

a=[];for(i=10;i;i--,a.push([1,1,1,1,1,1,1,1,1,1]));

または、すべてのインデックスが同じ配列を指すことが許可されている場合:

Javascript、41

a=[1,1,1,1,1,1,1,1,1,1];a=a.map(a.sort,a)

すべてのインデックスが同じ列を指すようになりましたが、これはおそらく不要です。(試してみてくださいa[0][1] = 5; console.log(a[1][1]))。
コピー

ええ、私はそれを見ませんでした。回答を更新しました。
-grc

6

JavaScript、45 44バイト

これまでのところ最高です。(まだやっています)。

x=[];while(x.push([1,1,1,1,1,1,1,1,1,1])-10);

短い(mellamokbに感謝!)

for(x=[];x.push([1,1,1,1,1,1,1,1,1,1])-10;);

ゴルフforをするwhileときよりも、ほとんど常に好ましいことに注意してください。基本的なステートメントは同じ長さ(while()vs for(;;)forですが、より柔軟性があります。この場合、x=[]の初期化子を入れて、for1文字を保存できます。
mellamokb

@mellamokb、ヒントをありがとう:-)
ブリガンド

5

Javascript、47

私の元の解決策が破られたので、今それを投稿します。

for(a=[],i=10;i--;a[i]='1111111111'.split(''));

残念ながら、0x3FF.toString(2)文字列をリストするだけでは効率的ではありません。静的に配列を宣言するほど効率的ではありません。

この方法で1つのキャラクターを削ることができます(46):

for(a=[],i=10;i--;a[i]=[1,1,1,1,1,1,1,1,1,1]);

次のようにさらに2文字を保存できます:(44

for(a=[i=10];i--;)a[i]=[1,1,1,1,1,1,1,1,1,1]

JS 1.8関数式クロージャーを使用する別の44バイトソリューション(FFのみatm):

x=(x=[1,1,1,1,1,1,1,1,1,1]).map(function()x)

1
あなたは初期化することにより1つの文字を保存することができますia、このような:a=[i=10]
codeporn

4

JavaScript、57バイト

r=eval("["+(A=Array(11)).join("["+A.join("1,")+"],")+"]")

ゴルフの前に:

a=Array(11).join("1,");
b=Array(11).join("["+a+"],")
c=eval("["+b+"]")

注:これにはES5が必要なので、IEにあまり期待しないでください。


うわー!書いたeval('a=['+(b=Array(11)).join('['+b.join("1,")+'],')+']')。別の引用符とeval内の変数を持っていることを除いて、これらはまったく同じです
-mowwwalker

2
a=eval("["+Array(11).join("[1,1,1,1,1,1,1,1,1,1],")+"]")56
発端

3

54

これはすでに破られていますが、ここに私の解決策があります:

function x(){return[1,1,1,1,1,1,1,1,1,1]}x=x().map(x)

Arrow関数はJavaScriptゴルフに興味深いことをします。今度は、カリーのビルトインを些細な方法で見つけ出すことができれば。
小次郎

アクセス可能にするには、x=前にx().map(またはy=など)挿入する必要がありますか?
-Shmiddty

@Schmiddtyはい、更新されました。
小次郎

3

39バイト

ECMAScript 7で配列内包表記を使用する:

x=[x for(y in x=[1,1,1,1,1,1,1,1,1,1])]

ES6には配列の理解はありません。これはES7の提案です。
アフォンソマトス

@afonsomatosは、私がこの回答をした時点で、まだES6ドラフトの一部でした。ただし、現在は更新されています:)
nderscore

交換[1,1,1,1,1,1,1,1,1,1]Array(10).fill(1)ひげ剃り4つの文字。
Shmiddty

2

56文字

かなり長い答えですが、100x100などの方が良いでしょう。

for(a=[[i=k=0]];++i<100;m?0:a[k=i/10]=[1])a[k][m=i%10]=1

2

Javascript、36文字(ECMA 6)

(a=[b=[]]).fill(b.fill(a[9]=b[9]=1))

私のブラウザー(Ubuntu上のFirefox)およびCodecademy Javascriptインタープリターでテスト済み


2

ES6、54

それは最短ではありませんが、私はすでにここにあるものへの別のアプローチに行くと思いました。

a=(''+{}).split('').slice(0,10).map(_=>a.map(_=>1))

オブジェクトを文字列にキャストします文字列を文字に"[object Object]"
分割します["["、 "o"、 "b"、... "]"]
わずか10個のスライスを取得します
1のマッピング結果を初期スライスにマッピングします


どこでテストできますか?私のFFでは正しく機能しません。
-Qwertiy

ただし、aそのバージョンはすでに機能しているように見えたため、いくつかの括弧を逃していました。更新されたバージョンは、FFおよびノー​​ドで--harmonyフラグを使用して動作するはずです。
ダンプリンス

現在は正しい配列を返しますが、どの変数にも割り当てられていません。
-Qwertiy


0

Javascript- 64 63 59文字

for(var a=b=[],i=100;i-->0;b[i%10]=1)if(i%10==0){a[i/10]=b;b=[]}

for(var a=b=[i=100];i-->0;b[i%10]=1)if(i%10==0){a[i/10]=b;b=[]}

配列内の反復子を非表示にすることで保存された1文字。

for(a=b=[1],i=100;i--;b[i%10]=1)if(i%10==0){a[i/10]=b;b=[]}

Jansの提案でいくつかの文字を保存しました。

読み取り可能なバージョン:

for(var a = b = [i = 100]; i-- > 0; b[i % 10] = 1) {
  if(i % 10 == 0) {
    a[i / 10] = b;
    b = [];
  }
}

はい、これは最短のソリューションではなく、既成の[1,1,1,1,1,1,1,1,1,1]アレイを使用しない別のアプローチです。


1
に変更i-->0i--ます。「downto」演算子は便利ですが、必ずしも必要ではありません。==0同様に2ビット削り取ることができます。また、省いてくださいvar。通常は有用ですが、4つの無駄なバイトはここでは受け入れられません。
ジョンドヴォルザーク


0

JavaScript 73

function h(){s="1111111111",r=[10],i=-1;while(++i<10){r[i]=s.split("");}}

1
r=[10],すぐに上書きするため、何もしませんr[0]。宣言する必要はなくs、ただ行うこと"1111111111".split("")ができますが、それは22文字であるのに対して[1,1,1,1,1,1,1,1,1,1]21文字です。
MT0

0

Javascript ES6、53

x="1".repeat(100).match(/.{10}/g).map(s=>s.split(""))

しかし、配列内のものは文字列です:)



0

JavaScript(ES6)、35バイト

A=Array(10).fill(Array(10).fill(1))

1
変数の設定は、承認された出力方法ではありません。ただし、f=>Array(10).fill(Array(10).fill(1))36バイトに対して(匿名関数を定義して)行うことができます。
Rɪᴋᴇʀ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.