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.


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:



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


Ł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

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,


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.


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 .


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.

@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}]&

##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&jest 5 bajtów krótszy
— Kelly Lowder

Union@@Range[{1,#},#^2,{#+1,#-1}]&
— alephalpha




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!


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.


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!


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



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.


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.

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.