JavaScript: utwórz tablicę 10x10 z 1s

18

Oczywiście to wyzwanie byłoby trywialne z oddzielnymi funkcjami i bibliotekami, więc nie są dozwolone.

Twój kod musi być zgodny ze specyfikacją ECMAscript (każda specyfikacja zrobi), więc nie ma odpowiedzi specyficznych dla przeglądarki.

Tablica musi być dostępna po utworzeniu instancji.

Mam odpowiedź, której na razie odmówię.

Uwaga: to wyzwanie jest specyficzne dla javascript, ponieważ tworzenie wielowymiarowych tablic w javascript jest niezwykle niewygodne.

Shmiddty
źródło
Mam 57 znaków. Czy to dobry wynik?
John Dvorak
Ok, zdecydowanie nie :-)
John Dvorak
15
Czy na pewno nie chcesz tylko tej ładnej tablicy 10 x 1? [10]
kojiro
8
To by było [[10]]?
Yingted

Odpowiedzi:

10

JavaScript ES6, 30

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

ES6 w akcji :)

Afonso Matos
źródło
2
Cześć, to pytanie ma 2 lata. To prawdopodobnie lepsze wykorzystanie twoich umiejętności gry w golfa JS, aby odpowiedzieć na nowsze pytania;)
George
6
@George Nie sądzę, że jest coś złego w odpowiadaniu na stare wyzwania. (Niektórzy autorzy wyzwań zaktualizują również zaakceptowaną odpowiedź, jeśli pojawi się nowy zwycięzca, bez względu na to, ile lat ma wyzwanie.)
Martin Ender
2
@ MartinBüttner Ta odpowiedź nie kwalifikuje się do zaakceptowania, ponieważ ES6 jest młodszy (przyszedł w 2015 roku :)) niż to wyzwanie, a Array.fill () to tylko ES6 :)
Katenkyo
Właśnie odpowiedziałem, ponieważ widziałem też inne odpowiedzi ES6. Nie sądzę, żeby było w tym coś złego. Autor może zaktualizować swoje pytanie, a inni mogą skorzystać z wielu sposobów rozwiązania powyższego problemu.
Afonso Matos,
ES6 został zaakceptowany na długo przed faktycznym zamrożeniem jego wersji roboczej (czyli w 2015 r., Kilka dni temu). Nie jestem jednak pewien, czy jest to poprawne czy niepoprawne.
Optymalizator
27

JavaScript, 34 bajty

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

Ponieważ pozornie poprawne jest wyrównanie wierszy przez odniesienie, wydaje mi się, że można polegać na tym fakcie. Pomaga nam to ogolić jedną pętlę for, budując stół w tym samym czasie, co jego rzędy. Oto mój nowy zawodnik.

Ponieważ r[0]i b[0]są nadpisywane podczas pętli, mogą zawierać śmieci. Daje nam to kolejny darmowy automat do wykonania, który pozwala na zmniejszenie liczby przecinków. Niestety r=b=[]nie zrobi tego, ponieważ od tego czasu są równi.

Ponadto skaluje się dobrze (99x99 to wciąż 34 bajty), nie wymaga ES5 (nowe funkcje i tak mają strasznie długie nazwy), a dodatkowo jest nieczytelny :-)

John Dvorak
źródło
3
Piękny. Absolutnie piękna.
Briguy37
1
Cholera, skończyło się z: c=[b=[i=10]];while(i--)b[i]=c,c[i]=1. Powinien wiedzieć!!!
mowwwalker 27.01.13
19

ECMAScript 6 - 33 znaków

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

Wysyła tablicę 10x10 „1”.

To narusza fakt, że ciąg „1111111111” ma wszystkie wymagane właściwości, które należy traktować tak, jakby był tablicą, dzięki czemu można użyć operatora rozkładania ...do przekształcenia go w tablicę znaków, a następnie odwzorować go na kopię tablicy za pomocą każdy element odwołuje się do „oryginału”.

Lub tylko z jedną nazwą zmiennej (dla 35 znaków):

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

Lub dla dodatkowego zamieszania (ale przy 45 znakach)

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

lub (43 znaki)

y=y=>[...x].map(x=>y);x=[];x[9]=x;x=y(y(1))
MT0
źródło
Fajne nadużycie ...operatora!
nderscore
13

44 bajty

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

Poprzednia wersja:

for(a=i=[];i^10;)a[i++]=[1,1,1,1,1,1,1,1,1,1]
Kopiuj
źródło
Bardzo sprytna aktualizacja!
Shmiddty,
dla (a = [i = 9]; i;) a [i -] = [1,1,1,1,1,1,1,1,1,1,1]
AmericanUmlaut
1
@AmericanUmlaut, który nie działa
skopiuj
1
Lubię ^dla!=
John Dvorak
13

45 znaków

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

Każdy element wskazuje na tę samą tablicę, ale specyfikacja nic o tym nie wspomina!

Casey Chu
źródło
4
specyfikacja mówi, że „Tablica musi być dostępna po jej utworzeniu”. . Myślę, że to oznacza, że ​​powinieneś mieć dodatkowy x=na początku
Cristian Lupascu
bardzo fajne rozwiązanie (+1)
Cristian Lupascu,
Nie jest to jednak zbyt praktyczne, ponieważ zmiana wartości odbije się na wszystkich tablicach.
Gabriele Petrioli,
7

JavaScript, 51

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

Lub jeśli wszystkie indeksy mogą wskazywać tę samą tablicę:

JavaScript, 41

a=[1,1,1,1,1,1,1,1,1,1];a=a.map(a.sort,a)
grc
źródło
Wszystkie indeksy wskazują teraz na tę samą kolumnę, co prawdopodobnie jest niepożądane. (Spróbuj a[0][1] = 5; console.log(a[1][1])).
skopiuj
Tak, nie widziałem tego. Zaktualizowałem swoją odpowiedź.
grc
6

JavaScript, 45 44 bajtów

Jak dotąd najlepiej. (Ciągle próbuje).

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

Krótszy (dzięki mellamokb!)

for(x=[];x.push([1,1,1,1,1,1,1,1,1,1])-10;);
Bandyta
źródło
Zauważ, że forprawie zawsze jest lepsza niż whilepodczas gry w golfa. Podstawowa instrukcja ma tę samą długość (w while()porównaniu for(;;)), ale fordaje większą elastyczność. W takim przypadku możesz wprowadzić x=[]inicjalizator fori zapisać jeden znak.
mellamokb
@mellamokb, dzięki za podpowiedź :-)
Brigand
5

JavaScript, 47

Ponieważ moje oryginalne rozwiązanie zostało pobite, teraz je opublikuję.

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

Niestety, 0x3FF.toString(2)nie jest tak wydajna, jak zwykłe wypisanie łańcucha, co nie jest tak wydajne jak zwykłe deklarowanie tablicy.

W ten sposób możesz ogolić jedną postać ( 46 ):

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

Możesz zapisać 2 kolejne postacie: ( 44 )

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

Kolejne 44-bajtowe rozwiązanie wykorzystujące zamknięcia wyrażeń funkcji JS 1.8 (tylko FF atm):

x=(x=[1,1,1,1,1,1,1,1,1,1]).map(function()x)
Shmiddty
źródło
1
Możesz zapisać jeden znak, inicjując iw anastępujący sposób:a=[i=10]
codeporn
4

JavaScript, 57 bajtów

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

Przed golfem:

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

Uwaga: Wymaga ES5, więc nie oczekuj zbyt wiele od IE.

John Dvorak
źródło
Łał! Pisałem eval('a=['+(b=Array(11)).join('['+b.join("1,")+'],')+']'). Oprócz różnych cytatów i mojej zmiennej eval, są one dokładnie takie same
mowwwalker
2
a=eval("["+Array(11).join("[1,1,1,1,1,1,1,1,1,1],")+"]")ma 56 lat
2013
3

54

To już zostało pokonane, ale oto moje rozwiązanie:

function x(){return[1,1,1,1,1,1,1,1,1,1]}x=x().map(x)
kojiro
źródło
Funkcje strzałek zrobią ciekawe rzeczy w golfa JavaScript. Teraz gdybym tylko mógł wymyślić, jak trywialnie wbudować Curry.
kojiro
Musisz wstawić x=przed x().map(lub y=itp.), Aby był dostępny, prawda?
Shmiddty,
@Schmiddty Tak, tak zaktualizowane.
kojiro
3

39 bajtów

Korzystanie ze zrozumienia tablic w ECMAScript 7:

x=[x for(y in x=[1,1,1,1,1,1,1,1,1,1])]
nderscore
źródło
W ES6 nie ma żadnych interpretacji tablic, to propozycja ES7.
Afonso Matos,
@afonsomatos w chwili, gdy udzieliłem tej odpowiedzi, nadal był częścią projektu ES6. Teraz jest jednak zaktualizowany :)
nderscore
Wymiana [1,1,1,1,1,1,1,1,1,1]z Array(10).fill(1)golenia 4 znaków.
Shmiddty,
2

56 znaków

Dość długa odpowiedź, ale będzie lepsza dla 100 x 100 itp.

for(a=[[i=k=0]];++i<100;m?0:a[k=i/10]=[1])a[k][m=i%10]=1
XzKto
źródło
2

JavaScript, 36 znaków (ECMA 6)

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

Testowane w mojej przeglądarce (Firefox na Ubuntu) oraz w interpretera JavaScript Codecademy

QuadmasterXLII
źródło
2

ES6, 54

To nie jest najkrótsze, ale pomyślałem, że wybiorę inne podejście do tego, co już jest.

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

Rzuć obiekt na ciąg "[object Object]"
podzielić ciąg znaków w [ „[”, „o”, „b”, ... „]”]
Grab kawałek tylko 10
Mapie roku wynik odwzorowania 1 na początkowym plasterka

Dan Prince
źródło
Gdzie mogę to przetestować? To nie działa poprawnie w moim FF.
Qwertiy
Pominąłem jednak niektóre pareny, ponieważ aistniała już ta wersja, która chyba działała. Zaktualizowana wersja powinna działać w FF i węźle z flagami --harmony.
Dan Prince
Teraz zwraca odpowiednią tablicę, ale nie jest przypisana do żadnej zmiennej.
Qwertiy
1

61 dla zabawy

eval("r=["+("["+(Array(11).join("1,"))+"],").repeat(11)+"]")
Maxime E.
źródło
0

JavaScript - 64 63 59 znaków

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

Jeden znak uratowany przez ukrycie iteratora w tablicy.

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

Zapisałem kilka znaków z sugestiami Jansa.

Wersja do odczytu:

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

Tak, nie jest to najkrótsze rozwiązanie, ale inne podejście bez użycia gotowych [1,1,1,1,1,1,1,1,1,1]tablic.

codeporn
źródło
1
Zmień i-->0na i--. Chociaż operator „downto” jest fajny, tak naprawdę nie jest konieczny. ==0mogłyby zostać zgolone również przez dwa bity. Pomiń też var. Choć zwykle są użyteczne, cztery niepotrzebne bajty są tutaj po prostu niedopuszczalne.
John Dvorak,
0

JavaScript 69 znaków (na razie)

b=[]
a=[]
for(i=100;i-->0;){
a.push(1)
if(i%10===0){b.push(a);a=[]}
}
Bobby Marinoff
źródło
0

JavaScript 73

function h(){s="1111111111",r=[10],i=-1;while(++i<10){r[i]=s.split("");}}
Bacchusbeale
źródło
1
r=[10],nic nie robi, gdy natychmiast nadpisujesz r[0]. Nie musisz deklarować si możesz to zrobić, "1111111111".split("")ale to 22 znaki, a [1,1,1,1,1,1,1,1,1,1]tylko 21 znaków.
MT0,
0

JavaScript ES6, 53

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

Ale te w tablicy są ciągami :)

Qwertiy
źródło
0

Javscript ES6, 53

x=eval("["+("["+"1,".repeat(10)+"],").repeat(10)+"]")
Qwertiy
źródło
0

JavaScript (ES6), 35 bajtów

A=Array(10).fill(Array(10).fill(1))
użytkownik84702
źródło
1
Ustawienie zmiennej nie jest zatwierdzoną metodą wyniku. Możesz jednak zrobić f=>Array(10).fill(Array(10).fill(1))(definiując funkcję anonimową) dla 36 bajtów.
Rɪᴋᴇʀ