Wyjściowe pozycje ukośne mojego kwadratu

18

Biorąc pod uwagę liczbę n, wypisz uporządkowaną listę indeksów 1 opartych na przekątnej n*nmacierzy kwadratowej.

Przykład:

Dla danych wejściowych 3:

Kwadrat powinien być:

1 2 3
4 5 6
7 8 9

Teraz możemy wybrać wszystkie indeksy reprezentowanych przez \, /lub X( #lub pozycje spoza przekątne są odrzucane)

\ # /
# X #
/ # \

Dane wyjściowe wynoszą:

[1,3,5,7,9]

Przypadki testowe:

1=>[1]
2=>[1,2,3,4]
3=>[1,3,5,7,9]
4=>[1,4,6,7,10,11,13,16]
5=>[1,5,7,9,13,17,19,21,25]

Nie będzie akceptowanej odpowiedzi. Chcę znać najkrótszy kod dla każdego języka.

sergiol
źródło
1
Pytanie dotyczy indeksów (1-indeksowanych) znaków \, / i X na obrazach. Nie jest to złe pytanie, ale nie ma wyjaśnienia.
Arfie
Jeśli zechcesz podać krótkie i jasne wyjaśnienie tego, czego chcesz, prawdopodobnie ponownie je otworzymy, ponieważ nie jest to złe wyzwanie. Na razie jest to po prostu bardzo niejasne
Pan Xcoder
Głosowałem za ponownym otwarciem, ale możesz również chcieć przenieść obrazy ascii z obszaru przykładów, aby uniknąć zamieszania. Na początku nie byłem pewien, czy muszę je również produkować (ale rozumiem, że
pożądaną
7
Czy kolejność ma znaczenie?
Pan Xcoder
9
FWIW Wydaje mi się, że nieistotna kolejność może sprawić, że golf będzie bardziej interesujący ...
Jonathan Allan

Odpowiedzi:

10

Oktawa , 28 bajtów

@(n)find((I=eye(n))+flip(I))

Anonimowa funkcja, która wprowadza liczbę i wyprowadza wektor kolumnowy liczb.

Wypróbuj online!

Luis Mendo
źródło
2
Tak proste ... :)
Stewie Griffin
7

JavaScript (ES6), 48 bajtów

Zwraca rozdzieloną myślnikiem listę liczb całkowitych w postaci łańcucha.

f=(n,k=n*n)=>--k?f(n,k)+(k%~-n&&k%-~n?'':~k):'1'

Sformatowane i skomentowane

f = (n, k = n * n) => // given n and starting with k = n²
  --k ?               // decrement k; if it does not equal zero:
    f(n, k) + (       //   return the result of a recursive call followed by:
      k % ~-n &&      //     if both k % (n - 1) and
      k % -~n ?       //             k % (n + 1) are non-zero:
        ''            //       an empty string
      :               //     else:
        ~k            //       -(k + 1) (instantly coerced to a string)
    )                 //   end of iteration
  :                   // else:
    '1'               //   return '1' and stop recursion

Przypadki testowe

Arnauld
źródło
Ładne obejście, używając znaków jako separatorów. Czy możesz użyć bitwsie, &aby zapisać bajt?
Kudłaty
@Shaggy Nie, to by nie działało. Na przykład: 4%3i 4%5nie mają wspólnego 1-bit, ale oba są niezerowe.
Arnauld
Tak, właśnie przetestowałem to n=5i zauważyłem, że to nie zadziała.
Kudłaty
k%~-n&&k%-~npowinno działać. niezła sztuczka z separatorem!
Tytus
@Titus Nie chodzi o to, że to naprawdę ma znaczenie, jeśli chodzi o golfa, ale ... tak, to może być nieco bardziej czytelne. :-) (zaktualizowano)
Arnauld
7

R , 38 35 34 38 bajtów

3 bajty zapisane, gdy przypomniałem sobie o istnieniu whichfunkcji ..., 1 bajt zapisany dzięki @Rift

d=diag(n<-scan());which(d|d[n:1,])

+4 bajty dla argumentu ec=Twywołanego przez program jako pełny programsource()

Wypróbuj online!

Wyjaśnienie:

n<-scan()            # take input
d=diag(n);           # create an identity matrix (ones on diagonal, zeros elsewhere)
d|d[n:1,]            # coerce d to logical and combine (OR) with a flipped version
which([d|d[n:1,]])   # Find indices for T values in the logical expression above
użytkownik2390246
źródło
1
-1 bajtd=diag(n<-scan());which(d|d[n:1,])
Rift
Podczas działania jako pełny program ( source) nic to nie drukuje. Musisz zadzwonić cat. Zobacz ten post na meta .
JAD,
@JarkoDubbeldam Wystarczająco! Zawsze działałem w oparciu o to, że daje on prawidłowe wyniki w TIO, nigdy tak naprawdę nie rozważałem wymagań bycia „pełnym programem”.
user2390246,
Chociaż nie zamierzam wracać i edytować wszystkich moich starych odpowiedzi, aby to naprawić!
user2390246,
Jest to trochę niejasne, ponieważ środowisko konsoli R i fragmenty kodu są głównym sposobem korzystania z niego. Podziel się spostrzeżeniami na temat tego meta wątku, który podłączyłem. Nie otrzymał tak wielu informacji.
JAD,
6

Galaretka , 8 bajtów

⁼þ`+Ṛ$ẎT

Wypróbuj online!

Wykorzystuje algorytm Luisa Mendo do odpowiedzi MATL.

Erik the Outgolfer
źródło
Mhm, jestem dość zaskoczony, że nie użyłeś ŒD.
Pan Xcoder
@ Mr.Xcoder ŒDrobi coś zupełnie innego niż X o określonym rozmiarze.
Erik the Outgolfer
5

Oktawa , 41 37 bajtów

Nawiasem mówiąc, działa to również w MATLAB. Brak podstępnej funkcji specyficznej dla Octave :)

@(x)unique([x:x-1:x^2-1;1:x+1:x*x+1])

Wypróbuj online!

Wyjaśnienie:

Zamiast tworzyć kwadratową macierz i znaleźć dwie przekątne, pomyślałem, że raczej zamiast tego obliczam przekątne bezpośrednio. To było 17 bajtów krótszych! =)

@(x)                                   % Anonymous function that takes 'x' as input
    unique(...                   ...)  % unique gives the unique elements, sorted
           [x:x-1:x^2-1                % The anti-diagonal (is that the correct word?)
                       ;               % New row
                        1:x+1:x*x+1])  % The regular diagonal

Tak to wygląda bez unique:

ans =    
    6   11   16   21   26   31
    1    8   15   22   29   36

Tak, prawdopodobnie powinienem zmienić kolejność przekątnych, aby uczynić go bardziej przyjaznym dla człowieka.

Stewie Griffin
źródło
5

MATL , 6 bajtów

XytP+f

Wypróbuj online!

Wyjaśnienie

Takie samo podejście jak moja odpowiedź Octave.

Rozważ dane wejściowe 3jako przykład.

Xy   % Implicit input. Identity matrix of that size
     % STACK: [1 0 0;
               0 1 0;
               0 0 1]
t    % Duplicate
     % STACK: [1 0 0
               0 1 0
               0 0 1],
              [1 0 0
               0 1 0
               0 0 1]
P    % Flip vertically
     % STACK: [1 0 0
               0 1 0
               0 0 1],
              [0 0 1
               0 1 0
               1 0 0]
+    % Add
     % STACK: [1 0 1
               0 2 0
               1 0 1]
f    % Linear indices of nonzero entries. Implicit display  
     % STACK:[1; 3; 5; 7; 9]

Indeksowanie liniowe jest główne , oparte na 1. Aby uzyskać więcej informacji, zobacz fragment długości 12 tutaj .

Luis Mendo
źródło
Co to znaczy „transponować”?
Erik the Outgolfer
@EriktheOutgolfer Przepraszam, mój zły. tjest duplikatem, a nie transpozycją. Dodałem również wypracowany przykład
Luis Mendo
Niesamowity! Zajmie mi to dwie pętle, jeśli chcę to osiągnąć.
mr5
@LuisMendo Tak podejrzewałem, ponieważ transpozycja macierzy tożsamości nie ma sensu ... hmm, udało mi się zapisać bajt z twoim algorytmem.
Erik the Outgolfer,
4

Oktawa, 68 54 bajtów

Dzięki @Stewie Griffin za uratowanie 14 bajtów!

@(x)unique([diag(m=reshape(1:x^2,x,x)),diag(flip(m))])

Wypróbuj online!

MATLAB, 68 bajtów

x=input('');m=reshape([1:x*x],x,x);unique([diag(m) diag(flipud(m))])

Wyjaśnienie:

@(x)                               % Anonymous function
m=reshape([1:x*x],x,x);            % Create a vector from 1 to x^2 and
                                   % reshape it into an x*x matrix.
diag(m)                            % Find the values on the diagonal.
diag(flip(m))                      % Flip the matrix upside down and
                                   % find the values on the diagonal.
unique([])                         % Place the values from both diagonals
                                   % into a vector and remove duplicates.
Steadybox
źródło
@LuisMendo Dzięki, Jimi jest moim ulubionym.
Steadybox
4

Mathematica, 42 bajty

Union@Flatten@Table[{i,#+1-i}+i#-#,{i,#}]&

Wypróbuj online!

@ KellyLowder grał w golfa do ...

Mathematica, 37 bajtów

##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&

a @alephalpha wyrzuciło stół!

Mathematica, 34 bajty

Union@@Range[{1,#},#^2,{#+1,#-1}]&
J42161217
źródło
##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&jest 5 bajtów krótszy
Kelly Lowder
Union@@Range[{1,#},#^2,{#+1,#-1}]&
alephalpha
2

MATL , 14 bajtów

U:GeGXytPY|*Xz

Wypróbuj online!

Cinaski
źródło
6 bajtów
Luis Mendo
Łał! Proszę o przesłanie, ostatecznie usunę moje
Cinaski
1
Prześlę go, jeśli nie zamierzasz włączyć go do swojej odpowiedzi; ale nie musisz usuwać swojego
Luis Mendo
2

C (gcc) , 65 58 bajtów

-7 bajtów dzięki Titusowi!

f(n,i){for(i=0;i<n*n;i++)i%-~n&&i%~-n||printf("%d ",i+1);}

Wypróbuj online!

szkocki
źródło
1
i%-~n&&i%~-n||printf("%d ",i+1)(-7 bajtów)
Tytus
2

C # (.NET Core) , 97 83 bajtów

f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}

Wypróbuj online!

Zmiana tutaj opiera się na przesunięciu między liczbami do znalezienia. Dwie zmiany zaczynające się od 0 są, n-1a n+1więc jeśli n=5liczby dla n-1byłyby 0,4,8,12,16,20i n+1byłyby 0,6,12,18,24. Łącząc je i dając 1-indeksowanie (zamiast 0-indeksowanie) daje 1,5,7,9,13,17,19,21,25. Przesunięcie od njest uzyskiwane za pomocą negacji bitowej (operacja bitowego uzupełnienia), gdzie ~-n==n-1i-~n==n+1 .

Stara wersja

f=>{var s="[";for(int i=0;i<n*n-1;i++)s+=(i/n!=i%n&&n-1-i/n!=i%n?"":i+1+",");return s+$"{n*n}]";}

Wypróbuj online!

Podejście to wykorzystuje indeksy kolumn i wierszy do ustalenia, czy liczby są na przekątnych. i/ndaje indeks wiersza i i%ndaje indeks kolumny.

Zwracanie tylko tablicy liczb

Jeśli uważa się, że konstruowanie tylko tablicy liczb liczy się do kosztu bajtu, wówczas można wykonać następujące czynności, w oparciu o sugestię Dennis.Verweij ( using System.Linq;dodaje dodatkowe 18 bajtów):

C # (.NET Core) , 66 + 18 = 84 bajtów

x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()

Wypróbuj online!

Ayb4btu
źródło
możesz zmniejszyć kod, pozbywając się dodatkowych &. Dodatek &służy tylko do przerwania porównania, jeśli pierwsze wejście jest fałszywe MSDN
Dennis.Verweij
w rzeczywistości możesz mieć 92 bajty za pomocą Linq Wypróbuj online!
Dennis.Verweij,
@ Dennis.Verweij Schludnie, nie byłem pewien, jak bardzo mogę przejść do nagłówka lub stopki w TIO. Będę się bawić z moim.
Ayb4btu,
musisz pamiętać o dołączeniu 18 bajtów dla odniesienia do linq (przy użyciu System.Linq;), co jest niefortunne, ale jak to działa: S
Dennis.Verweij
Ach, okej Ale to nie jest konieczne using System;? (Zakładam, że zawinięcie go w namespace System.Linqnie jest ważne?)
Ayb4btu
2

JavaScript, 73 63 bajty

stara wersja

n=>[...Array(y=n*n).keys(),y].filter(x=>(--x/n|0)==x%n||(x/n|0)==n-x%n-1)

Zaoszczędź 10 bajtów dzięki @Shaggy

n=>[...Array(n*n)].map((_,y)=>y+1).filter(x=>!(--x%-~n&&x%~-n))

Pierwszy raz w golfa! mam nadzieję, że nie zepsułem się tak bardzo.

Marco Lepore
źródło
Witamy w PPCG :) Podobne rozwiązanie do tego, nad którym pracowałem (tylko moje jest indeksowane na 0). Możesz być w stanie zapisać niektóre bajty, korzystając z następujących filterfunkcji: !(--x%(n+1)&&x%(n-1))i tworząc tablicę w ten sposób:[...Array(n*n+1).keys()]
Shaggy
@Shaggy Dziękujemy! Postaram się poprawić odpowiedź za twoją sugestią, jak tylko wrócę z pracy do domu!
Marco Lepore
Nie ma za co. Nawiasem mówiąc: „ jest nieco krótszy niż tworzenie [1...n*n]zakresu za pomocąArray(n*n).fill().map((x,i)=>i+1) ” - [...Array(n*n)].map((_,y)=>y+1)jest to krótszy sposób na zrobienie tego w przyszłości.
Kudłaty
Zrobiłem z tym trochę więcej i skończyło się to 56 bajtami:n=>[...Array(n*n+1).keys()].filter(x=>!(--x%-~n&&x%~-n))
Shaggy
@Shaggy Wypróbowałem twoją ostatnią wersję, ale wyświetli dodatkowe zero dla f (1) i f (2), ale działa z zakresem [1 ... n * n], więc użyłem sposobu, w jaki pokazałeś mi poprzedni komentarz. A może jakoś pomieszałem?
Marco Lepore
1

Perl 5 , 56 + 1 (-n) = 57 bajtów

!(($_+1+$_/$,)%$,&&$_%($,+1))&&say++$_ for 0..($,=$_)**2

Wypróbuj online!

Xcali
źródło
Czy `-n` nie powinno być +3?
sergiol
1
Nie. Zakładany wiersz poleceń to perl -e. Wiersz polecenia dla tego przykładu to perl -ne. To różnica +1.
Xcali
1

Japt , 16 bajtów

Wydaje się, że nie radzę sobie lepiej, ale jestem pewien, że to możliwe. Musiałem poświęcić 2 bajty z powodu niepotrzebnego wymagania, że ​​używamy 1-indeksowania.

²õ f@´XvUÉ ªXvUÄ

Sprawdź to

Kudłaty
źródło
0

PHP, 56 54 + 1 bajtów

+1 bajt dla -Rflagi

for(;$z**.5<$n=$argn;$z++)$z%-~$n&&$z%~-$n||print~+$z;

drukuje liczby poprzedzone myślnikami. Uruchom jako potok z -nRlub spróbuj online .

wymaga PHP w wersji 5.6 lub nowszej dla **operatora.
Dodaj jeden bajt dla starszych PHP: Wymienić ;$z**.5<$n=$argnz $z=$argn;$z<$n*$n.

Tytus
źródło
0

Rubinowy, 45 bajtów

->n{(n*n).times{|i|i%-~n>0&&i%~-n>0||p(i+1)}}

Działa wewnętrznie jako indeksowany zerem. sprawdza, czy imodulo n+1lub n-1ma wartość 0, jeśli tak drukuje i+1.

Level River St
źródło