Javascript: 1s 10x10 dizi oluşturun


18

Açıkçası bu meydan okuma, ayrı işlevler ve kütüphanelerle önemsizdir, bu yüzden izin verilmez.

Kodunuzun bir ECMAscript spesifikasyonuna (herhangi bir spesifikasyon yapacaktır) uyması gerekir, bu nedenle tarayıcıya özgü cevaplar olmaz.

Diziye, somutlaştırıldıktan sonra erişilebilir olmalıdır.

Şimdilik saklayacağım bir cevabım var.

Not: Bu zorluk javascript'e özgüdür, çünkü javascript'te çok boyutlu diziler yapmak çok zahmetli değildir.


57 karakterdeyim. Bu iyi bir puan mı?
John Dvorak

Tamam, kesinlikle değil :-)
John Dvorak

15
Sadece bu güzel 10x1 dizisini istemediğinizden emin misiniz? [10]
Ocak'ta kojiro

8
Bu olur [[10]]mu?
Mart'ta

Yanıtlar:


10

Javascript ES6, 30

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

ES6 iş başında :)


2
Merhaba, bu soru 2 yaşında. Muhtemelen daha yeni soruları yanıtlamak için JS kodu golf becerilerinizi daha iyi kullanmanız gerekir;)
George

6
@George Eski zorluklara cevap vermede yanlış bir şey olduğunu sanmıyorum. (Bazı meydan okuma yazarları, meydan okuma kaç yaşında olursa olsun, yeni bir kazanan gelirse kabul edilen cevabı da güncelleyecektir.)
Martin Ender

2
@ MartinBüttner Bu cevap, ES6'nın bu meydan okumadan daha genç (2015'te geldi :)) olarak kabul edilmesi için uygun değildir ve Array.fill () sadece ES6'dır :)
Katenkyo

Az önce cevap verdim çünkü diğer ES6 cevaplarını da gördüm. Bunda yanlış bir şey olduğunu sanmıyorum. Yazar sorusunu güncelleyebilir ve diğerleri yukarıdaki sorunu çözmenin çeşitli yollarından yararlanabilir.
Afonso Matos

ES6, taslağının gerçekten dondurulmasından çok önce kabul edildi (yani 2015'te, birkaç gün önce). Doğru ya da yanlış olup olmadığından emin değilim.
Doktor

27

Javascript, 34 bayt

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

Görünüşe göre satırları referans olarak eşit yapmak sorun değil, sanırım bu gerçeğe güvenmek tamam. Bu, tabloyu satırlarıyla aynı zamanda oluşturarak bir for-loop'u tıraş etmemize yardımcı olur. İşte yeni yarışmacım.

Yana r[0]ve b[0]döngü sırasında yazılır, bunlar çöp içerebilir. Bu bize bazı virgülleri tıraş etmek için başka bir ücretsiz yürütme yuvası verir. Ne yazık ki, r=b=[]yapmayacak, çünkü o zaman onlar eşit by-ref.

Ayrıca, iyi ölçeklenir (99x99 hala 34 bayttır), ES5 gerektirmez (yeni işlevlerin çok uzun isimleri vardır, her neyse) ve bonus olarak, okunamaz :-)


3
Güzel. Kesinlikle güzel.
Briguy37

1
Kahretsin, ile sona erdi: c=[b=[i=10]];while(i--)b[i]=c,c[i]=1. Bilmeliydim !!!
mowwwalker

19

ECMAScript 6 - 33 Karakter

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

10x10'luk bir dizi "1" çıkar.

Bu, "1111111111" dizesinin, bir diziymiş gibi işlem görmesi için gerekli tüm özelliklere sahip olması gerçeğini kötüye kullanır, böylece forma işlecini kullanabilirsiniz ... karakter dizisine dönüştürmek ve ardından dizinin bir kopyasına eşlemek için kullanabilirsiniz. "orijinal" e atıfta bulunan her eleman.

Veya yalnızca bir değişken adıyla (35 karakter için):

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

Ekstra karışıklık için (45 karakterde)

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

veya (43 karakter)

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

...Operatörün güzel istismarı !
nderscore

13

44 bayt

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

Önceki versiyon:

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

Çok akıllı güncelleme!
Shmiddty

(a = [i = 9]; i;) a [i -] = [1,1,1,1,1,1,1,1,1,1]
AmericanUmlaut

1
@AmericanUmlaut işe yaramaz
kopyalayın

1
Sevdiğim ^için!=
John Dvorak

13

45 karakter

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

Her öğe aynı diziyi gösterir, ancak özellik buna karşı hiçbir şeyden bahsetmez!


4
teknik özellik "Diziye somutlaştırıldıktan sonra erişilebilir olması gerektiğini" söylüyor . . Sanırım bu x=başlangıçta fazladan olması gerektiği anlamına geliyor
Cristian Lupascu

yine de çok güzel bir çözüm (+1)
Cristian Lupascu

Bir değerde yapılan değişiklik tüm dizilere yansıyacağından, bu çok pratik değildir.
Gabriele Petrioli

7

Javascript, 51

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

Veya tüm dizinlerin aynı diziyi göstermesine izin verilirse:

Javascript, 41

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

Tüm endeksler artık aynı sütuna işaret ediyor, bu da muhtemelen istenmeyen. (Deneyin a[0][1] = 5; console.log(a[1][1])).
copy

Evet, görmedim. Cevabımı güncelledim.
grc

6

JavaScript, 45 44 Bayt

En iyi ben şimdiye kadar var. (Hala deniyorum).

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

Daha kısa (teşekkürler mellamokb!)

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

Not forhemen her zaman tercih edilir whilegolf zaman. Temel ifade aynı uzunluktadır ( while()vs for(;;)), ancak forsize daha fazla esneklik sağlar. Bu durumda, bir karakterin x=[]başlatıcısını koyabilir forve bir karakterin kaydedilmesini sağlayabilirsiniz .
Ocak'ta mellamokb

@mellamokb, bahşiş için teşekkürler :-)
Brigand

5

Javascript, 47

Orijinal çözümüm dövüldüğünden, şimdi göndereceğim.

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

Ne yazık ki, 0x3FF.toString(2) sadece dizeyi listelemek kadar verimli değil, bu da diziyi statik olarak bildirmek kadar etkili değil.

Bir karakteri bu şekilde tıraş edebilirsiniz ( 46 ):

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

Bunun gibi 2 karakter daha kaydedebilirsiniz: ( 44 )

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

JS 1.8 işlev ifadesi kapanışlarını kullanan başka bir 44 bayt çözüm (yalnızca FF yalnızca atm):

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

1
Sen başlatılıyor tarafından tek bir karakter kaydedebilirsiniz iiçinde aböyle:a=[i=10]
codeporn

4

JavaScript, 57 bayt

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

Golf oynamadan önce:

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

Not: Bunun ES5'e ihtiyacı vardır, bu yüzden IE'den fazla beklemeyin.


Vaov! Ben yazdım eval('a=['+(b=Array(11)).join('['+b.join("1,")+'],')+']'). Farklı teklifler ve değişken içindeki eval sahip olmak dışında, bunlar tamamen aynı
mowwwalker

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

3

54

Bu zaten dövüldü, ama işte benim çözümüm:

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

Ok işlevleri JavaScript golf için ilginç şeyler yapacak. Şimdi sadece önemsiz bir şekilde Curry yerleşimlerini nasıl anlayabilseydim.
Ocak'ta kojiro

Sen eklemek gerekiyordu x=önce x().map(veya y=sağa, erişilebilir hale getirmektir, vs)?
Shmiddty

@Schmiddty Evet, çok güncellendi.
Ocak'ta kojiro

3

39 bayt

ECMAScript 7'de dizi kavrayışı kullanma:

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

ES6'da dizi kavrayışı yoktur, bu bir ES7 önerisidir.
Afonso Matos

@afonsomatos bu cevabı verdiğim zaman, hala ES6 taslağının bir parçasıydı. Yine de güncellendi :)
nderscore

Tıraş [1,1,1,1,1,1,1,1,1,1]ile değiştirilmesi Array(10).fill(1)4 karakter.
Shmiddty

2

56 karakter

Oldukça uzun cevap, ama 100x100 vb için daha iyi olacak.

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

2

Javascript, 36 karakter (ECMA 6)

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

Tarayıcımda (Ubuntu üzerinde Firefox) ve Codecademy Javascript yorumlayıcısında test edildi


2

ES6, 54

En kısa değil, ama zaten burada olanlara farklı bir yaklaşım yapacağımı düşündüm.

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

Bir nesneyi "[object Object]"
dizeye yayınlama Dizeyi karakterlere ayırın ["[", "o", "b", ... "]"]
Sadece 10'luk bir dilim alın
1 Eşlemenin sonucunu ilk dilime eşleyin


Nerede test edebilirim? FF'imde düzgün çalışmıyor.
Qwertiy

Bununla birlikte, bazı ebeveynleri kaçırmıştım, çünkü azaten var olan bu sürüm işe yaramış gibiydi. Güncellenmiş sürüm Fharm ve düğümde --harmony bayrakları ile çalışmalıdır.
Dan Prince

Şimdi doğru diziyi döndürüyor, ancak herhangi bir değişkene atanmamış.
Qwertiy

1

Eğlence için 61

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

0

Javascript - 64 63 59 karakter

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=[]}

Dizideki yineleyiciyi gizleyerek bir karakter kaydedildi.

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

Jans önerileri ile bazı karakterleri kaydetti.

Okunabilir sürüm:

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

Evet, en kısa çözüm değil, hazır [1,1,1,1,1,1,1,1,1,1]diziler kullanmadan başka bir yaklaşım .


1
Değişim i-->0için i--. "Downto" operatörü güzel olsa da, gerçekten gerekli değildir. ==0iki bit tarafından da tıraş edilebilir. Ayrıca, dışarıda bırakın var. Normalde yararlı olsa da, burada dört yararsız bayt kabul edilemez.
John Dvorak

0

Javascript 69 karakter (şimdilik)

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

0

JavaScript 73

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

1
r=[10],hemen üzerine yazdığınızda hiçbir şey yapmaz r[0]. Beyan etmeniz gerekmiyor sve sadece yapabiliyorsunuz "1111111111".split("")ama bu 22 karakter [1,1,1,1,1,1,1,1,1,1], sadece 21 karakter.
MT0

0

Javascript ES6, 53

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

Ama dizide olanlar dizgiler :)


0

Javscript ES6, 53

x=eval("["+("["+"1,".repeat(10)+"],").repeat(10)+"]")

0

JavaScript (ES6), 35 bayt

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

1
Değişken belirlemek onaylanmış bir çıktı yöntemi değildir. Ancak, f=>Array(10).fill(Array(10).fill(1))36 bayt için (anonim bir işlev tanımlayarak) yapabilirsiniz.
Rɪᴋᴇʀ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.