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.