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.


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 :)


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 :-)


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

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]

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!


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)

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;);

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)

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.


Ł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)

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

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

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


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


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)+"]")

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.


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

0

JavaScript 73

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

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 :)


0

Javscript ES6, 53

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

0

JavaScript (ES6), 35 bajtów

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

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ɪᴋᴇʀ
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.