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.


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:



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


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

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


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.


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 .


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.

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

##&@@@Table[{i-#,1-i}+i#,{i,#}]⋃{}&ist 5 Bytes kürzer
Kelly Lowder

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




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!


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.


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!


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



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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.