Ausgabediagonale Positionen von mir im Quadrat

18

Bei einer Zahl n, Output eine geordnete Liste von 1-basierten Indizes fallen entweder auf der Diagonalen einer n*nquadratischen Matrix.

Beispiel:

Für eine Eingabe von 3:

Das Quadrat soll sein:

1 2 3
4 5 6
7 8 9

Nun wählen wir alle die Indizes vertreten durch \, /oder X( #oder nicht-diagonalen Positionen abgelehnt werden)

\ # /
# X #
/ # \

Die Ausgabe muss sein:

[1,3,5,7,9]

Testfälle:

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]

Es wird keine akzeptierte Antwort geben. Ich möchte den kürzesten Code für jede Sprache wissen.

Sergiol
quelle
1
Die Frage fragt nach den (1-indizierten) Indizes der Zeichen \, / und X in den Bildern. Keine schlechte Frage an sich, aber keine Erklärung.
Arfie
Wenn Sie bereit sind, eine kurze und klare Erklärung für Ihre Wünsche abzugeben, werden wir diese wahrscheinlich wieder eröffnen, da dies keine schlechte Herausforderung ist. Bis jetzt ist es nur sehr unklar
Mr. Xcoder
Ich habe für die Wiedereröffnung gestimmt, obwohl Sie möglicherweise auch die ASCII-Bilder aus dem Beispielbereich verschieben möchten, um Verwirrung zu vermeiden. Zuerst war ich mir nicht sicher, ob ich diese auch produzieren musste (aber ich verstehe, dass die gewünschte Ausgabe nur die Liste der Indizes ist)
Arfie
7
Ist die Bestellung wichtig?
Mr. Xcoder
9
FWIW Ich denke, dass die Reihenfolge irrelevant sein könnte für interessantere Golfer ...
Jonathan Allan

Antworten:

10

Oktave , 28 Bytes

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

Anonyme Funktion, die eine Zahl eingibt und einen Spaltenvektor von Zahlen ausgibt.

Probieren Sie es online!

Luis Mendo
quelle
2
So einfach ... :)
Stewie Griffin
7

JavaScript (ES6), 48 Byte

Gibt eine durch Bindestriche getrennte Liste von Ganzzahlen als Zeichenfolge aus.

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

Formatiert und kommentiert

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

Testfälle

Arnauld
quelle
Problemumgehung: Verwenden Sie die Zeichen als Trennzeichen. Könnten Sie Bitwsie verwenden &, um ein Byte zu speichern?
Shaggy
@ Shaggy Nein, das würde nicht funktionieren. Zum Beispiel: 4%3und 4%5haben kein 1-Bit gemeinsam, aber beide sind ungleich Null.
Arnauld
Ja, ich habe es gerade getestet und festgestellt, n=5dass es nicht funktionieren würde.
Shaggy
k%~-n&&k%-~nsollte arbeiten. schöner trick mit dem separator!
Titus
@Titus Nicht, dass es wirklich wichtig wäre, wenn es ums Golfen geht, aber ... ja, das könnte etwas lesbarer sein. :-) (aktualisiert)
Arnauld
7

R , 38 35 34 38 Bytes

3 Byte gespeichert, als ich mich an die Existenz der whichFunktion erinnerte ..., 1 Byte dank @Rift gespeichert

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

+4 Byte für das Argument, ec=Twenn es von als vollständiges Programm aufgerufen wirdsource()

Probieren Sie es online!

Erläuterung:

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
user2390246
quelle
1
-1 Byted=diag(n<-scan());which(d|d[n:1,])
Rift
Wenn dies als vollständiges Programm ( source) ausgeführt wird, wird nichts gedruckt. Du musst anrufen cat. Siehe diesen Beitrag auf Meta .
JAD
@ JarkoDubbeldam Fair genug! Ich habe immer davon ausgegangen, dass es eine gültige Ausgabe auf TIO gibt, ohne die Anforderungen eines "vollständigen Programms" wirklich zu berücksichtigen.
user2390246
Obwohl ich nicht vorhabe, alle meine alten Antworten zu bearbeiten, um dies zu beheben!
user2390246
Es ist ein bisschen vage, da die Konsolenumgebung von R- und Code-Snippets die Hauptmethode für die Verwendung ist. Fühlen Sie sich frei, Einblicke in den Meta-Thread zu geben, den ich verlinkt habe. Es hat nicht allzu viel Input erhalten.
JAD
6

Gelee , 8 Bytes

⁼þ`+Ṛ$ẎT

Probieren Sie es online!

Verwendet Luis Mendos Algorithmus für seine MATL-Antwort.

Erik der Outgolfer
quelle
Mhm, ich bin ziemlich überrascht, dass du es nicht benutzt hast ŒD.
Mr. Xcoder
@ Mr.Xcoder ŒDmacht etwas ganz anderes als X einer bestimmten Größe.
Erik der Outgolfer
5

Oktave , 41 37 Bytes

Dies funktioniert übrigens auch in MATLAB. Keine hinterhältige Octave-spezifische Funktionalität :)

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

Probieren Sie es online!

Erläuterung:

Anstatt eine quadratische Matrix zu erstellen und die beiden Diagonalen zu finden, habe ich gedacht, ich berechne die Diagonalen stattdessen direkt. Dies war 17 Bytes kürzer! =)

@(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

So sieht es aus, ohne unique:

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

Ja, ich hätte wahrscheinlich die Reihenfolge der Diagonalen umkehren sollen, um sie menschenfreundlicher zu machen.

Stewie Griffin
quelle
5

MATL , 6 Bytes

XytP+f

Probieren Sie es online!

Erläuterung

Gleicher Ansatz wie meine Octave-Antwort.

Betrachten Sie die Eingabe 3als Beispiel.

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]

Die lineare Indizierung ist spaltenweise und basiert auf 1. Weitere Informationen finden Sie im Abschnitt zu Länge 12 hier .

Luis Mendo
quelle
Was soll "transponieren" bedeuten?
Erik der Outgolfer
@EriktheOutgolfer Sorry, meine schlechte. tist dupliziert, nicht transponiert. Außerdem habe ich ein ausgearbeitetes Beispiel hinzugefügt
Luis Mendo
Tolle! Es würde zwei Schleifen dauern, wenn ich dies erreichen möchte.
mr5
@ LuisMendo Ich habe das vermutet, weil das Transponieren einer Identitätsmatrix keinen Sinn macht ... hmm, ich habe es geschafft, ein Byte mit Ihrem Algorithmus zu speichern.
Erik der Outgolfer
4

Oktave, 68 54 Bytes

Vielen Dank an @Stewie Griffin für die Einsparung von 14 Bytes!

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

Probieren Sie es online!

MATLAB, 68 Bytes

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

Erläuterung:

@(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
quelle
@ LuisMendo Danke, Jimi ist mein Favorit.
Steadybox
4

Mathematica, 42 Bytes

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

Probieren Sie es online!

@ KellyLowder Golf es bis zu ..

Mathematica, 37 Bytes

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

und @alephalpha warf den Tisch weg!

Mathematica, 34 Bytes

Union@@Range[{1,#},#^2,{#+1,#-1}]&
J42161217
quelle
##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&ist 5 Bytes kürzer
Kelly Lowder
Union@@Range[{1,#},#^2,{#+1,#-1}]&
Alephalpha
2

MATL , 14 Bytes

U:GeGXytPY|*Xz

Probieren Sie es online!

Cinaski
quelle
6 Bytes
Luis Mendo
Wow! Bitte
poste
1
Ich werde es veröffentlichen, wenn Sie es nicht in Ihre Antwort aufnehmen werden. aber keine Notwendigkeit, Ihre zu löschen
Luis Mendo
2

C (GCC) , 65 58 Bytes

-7 Bytes dank Titus!

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

Probieren Sie es online!

scottinet
quelle
1
i%-~n&&i%~-n||printf("%d ",i+1)(-7 Bytes)
Titus
2

C # (.NET Core) , 97.83 Byte

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

Probieren Sie es online!

Die Änderung hier basiert auf der Verschiebung zwischen den zu findenden Zahlen. Die zwei Schichten, die bei 0 beginnen, sind n-1und n+1, wenn also n=5, die Zahlen für n-1wären 0,4,8,12,16,20und für n+1wären 0,6,12,18,24. Wenn Sie diese kombinieren und 1-Indizierung (anstelle von 0-Indizierung) geben, erhalten Sie 1,5,7,9,13,17,19,21,25. Der Offset von nwird durch bitweise Negation (bitweise Komplementoperation) erreicht, wobei ~-n==n-1und-~n==n+1 .

Alte Version

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}]";}

Probieren Sie es online!

Bei diesem Ansatz werden die Spalten- und Zeilenindizes verwendet, um zu bestimmen, ob sich die Zahlen auf den Diagonalen befinden. i/ngibt den Zeilenindex an undi%n den Spaltenindex an.

Nur das Zahlenarray zurückgeben

Wenn davon ausgegangen wird, dass die Erstellung nur des Zahlenfelds zu den Bytekosten beiträgt, könnte auf der Grundlage des Vorschlags von Dennis.Verweij (using System.Linq; zusätzliche 18 Byte) :

C # (.NET Core) , 66 + 18 = 84 Byte

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

Probieren Sie es online!

Ayb4btu
quelle
Sie können den Code reduzieren, indem Sie das Extra loswerden &. Das Extra &gibt es nur, um den Vergleich zu brechen, wenn die erste Eingabe falsch ist MSDN
Dennis.Verweij
Tatsächlich können Sie mit Linq 92 Bytes haben. Probieren Sie es online aus!
Dennis.Verweij
@ Dennis.Verweij Klar, ich war mir nicht sicher, wie viel ich in TIO in die Kopf- oder Fußzeile verschieben könnte. Ich werde mit meinen rumspielen.
Ayb4btu
Sie müssen daran denken, 18 Bytes für den Verweis auf linq (unter Verwendung von System.Linq;) einzugeben, was unglücklich ist, aber wie es funktioniert: S
Dennis.Verweij
Ach ja ok Aber das ist nicht nötig für using System;? (Ich nehme an, es namespace System.Linqist nicht gültig in ein
einzupacken
2

Javascript, 73 Bytes

alte Version

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

Dank @Shaggy 10 Bytes gespart

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

Zum ersten Mal Golf spielen! Ich hoffe, ich habe es nicht zu sehr vermasselt.

Marco Lepore
quelle
Willkommen bei PPCG :) Eine ähnliche Lösung wie die, an der ich gearbeitet habe (nur meine ist 0-indiziert). Sie können möglicherweise einige Bytes speichern, indem Sie Folgendes in Ihrer filterFunktion verwenden: !(--x%(n+1)&&x%(n-1))und indem Sie Ihr Array wie folgt erstellen:[...Array(n*n+1).keys()]
Shaggy
@ Shaggy Danke! Ich werde versuchen, die Antwort mit Ihrem Vorschlag zu verbessern, sobald ich von der Arbeit nach Hause komme!
Marco Lepore
Bitte. Übrigens: " Es ist ein bisschen kürzer als das Erstellen eines [1...n*n]Bereichs mitArray(n*n).fill().map((x,i)=>i+1) " [...Array(n*n)].map((_,y)=>y+1).
Shaggy
Hat ein bisschen mehr damit gemacht und ist am Ende für 56 Bytes hier n=>[...Array(n*n+1).keys()].filter(x=>!(--x%-~n&&x%~-n))
Shaggy
@ Shaggy Ich habe deine letzte Version ausprobiert, aber sie würde eine zusätzliche Null für f (1) und f (2) ausgeben. Sie funktioniert jedoch mit einem Bereich von [1 ... n * n] vorheriger Kommentar. Oder habe ich es irgendwie vermasselt?
Marco Lepore
1

Perl 5 , 56 + 1 (-n) = 57 Bytes

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

Probieren Sie es online!

Xcali
quelle
Sollte "-n" nicht +3 sein?
Sergiol
1
Nein. Die angenommene Befehlszeile lautet perl -e. Die Befehlszeile für dieses Beispiel wäre perl -ne. Das ist ein Unterschied von +1.
Xcali
1

Japt , 16 Bytes

Kann nicht besser aussehen, aber ich bin mir sicher, dass es möglich ist. Musste 2 Bytes für die unnötige Anforderung opfern, dass wir 1-Indexierung verwenden.

²õ f@´XvUÉ ªXvUÄ

Probier es aus

Zottelig
quelle
0

PHP, 56 54 + 1 Bytes

+1 Byte für -RFlag

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

druckt Zahlen, denen Bindestriche vorangestellt sind. Laufen Sie als Pipe mit -nRoder probieren Sie es online aus .

erfordert PHP 5.6 oder höher für den **Operator.
Fügen Sie ein Byte für älteres PHP hinzu: Ersetzen Sie ;$z**.5<$n=$argndurch $z=$argn;$z<$n*$n.

Titus
quelle
0

Ruby, 45 Bytes

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

Arbeitet intern als null indiziert. wenn Schecks iModulo n+1oder n-10, wenn dies der Fall druckt i+1.

Level River St
quelle