Orthodiagonale Schritte


26

Das Navigieren in einer 2D-Matrix ist ein häufiges Problem. Wir haben es schon oft gesehen und werden es wieder sehen. Helfen Sie uns also bei der Zukunft und entwickeln Sie die kürzesten Lösungen, um alle acht möglichen Schritte in einer 2D-Matrix zu generieren.

Herausforderung

Ihr Code muss die folgenden 8 Paare von -1,0,1 in beliebiger Reihenfolge ausgeben:

(0,1)
(0,-1)
(1,0)
(-1,0)
(1,1)
(1,-1)
(-1,1)
(-1,-1)

Regeln

  1. Es erfolgt keine Eingabe.
  2. Ausgabereihenfolge ist nicht relevant
  3. Die Ausgabe ist flexibel. Zahlenpaare müssen nur unterscheidbar sein
  4. Das ist , also gewinnt die kürzeste Antwort in Bytes

2
@MartinEnder Da war ich mir zu 99% sicher, fand aber auch keine. Also habe ich es für ein paar Tage in die Sandbox gelegt, aber niemand hat etwas über Duplikate gesagt.
Dead Possum

4
Aufgrund der flexiblen Ausgabe stellt sich heraus, dass diese ein interessantes Kolmogorov-Komplexitätsaroma aufweist. Für einige Sprachen ist es schwieriger, bessere Ergebnisse zu erzielen, als die Ausgabe nur hart zu codieren. Sollte dieser Tag hinzugefügt werden?
ngm

1
@ Adám Ja, verwenden Sie alles, während Paare von Zahlen unterscheidbar sind
Dead Possum

1
@Adam Aber was ist mit (1 + 0i)?
Dead Possum

8
Dies ist ein genaues Duplikat von 8 benachbarten Feldern , eines der ersten Code-Golfs, die ich je gemacht habe.
isaacg

Antworten:


19

Oktave , 24 Bytes

dec2base([0:3,5:8],3)-49

Probieren Sie es online!

Ich habe diesen Ansatz noch nicht gesehen.

Erstellt eine Liste mit ganzen Zahlen [0, 1, 2, 3, 5, 6, 7, 8]und konvertiert sie in ternäre Zahlen , wobei ein Zeichenarray zurückgegeben wird:

00
01
02
10
12
20
21
22

Das Subtrahieren 49(ASCII-Wert für 1) von allen Zeichen ergibt ein numerisches Array:

-1  -1
-1   0
-1   1
 0  -1
 0   1
 1  -1
 1   0
 1   1

9

T-SQL, 80 78 Bytes

SELECT-1n INTO t;INSERT t VALUES(0),(1)SELECT*FROM t,t z WHERE t.n<>0OR z.n<>0

Eine (permanent) Tabelle erstellt t enthält (-1,0,1), und führt eine Selbstverknüpfung mit einer WHEREKlausel, schließt die 0,0Reihe. Die Tabelle t wird von meinem Code nicht aufgeräumt, Sie müssen sie selbst fallen lassen.

Leider fast doppelt so lang wie die langweilige Lösung ( 44 Byte ), da SQL Rückgaben in Strings zulässt:

PRINT'0,1
0,-1
1,0
-1,0
1,1
1,-1
-1,1
-1,-1'

Ich kenne T-SQL nicht so gut: Kannst du es nur benutzen WHERE t.n OR z.n? (Sie können in einigen, aber nicht allen SQL-Dialekten.)
msh210

@ msh210 Gute Idee, ich habe es versucht, aber es scheint nicht auf MS SQL Server zu funktionieren. Ich erhalte die Fehlermeldung:An expression of non-boolean type specified in a context where a condition is expected
BradC

1
Sie können die Leerzeichen um den *
Razvan Socol



7

Jelly , 8 7 6 Bytes

3p_2ẸƇ

Probieren Sie es online!

Meine allererste Gelee-Antwort! Vielen Dank an Dennis für das letzte Puzzleteil.

Mal sehen, ob ich es erklären kann ... lol.

3p_2ẸƇ   Main program, takes no input.
3p       Product with Range 3, yields [[1,1], [1,2], [1,3], [2,1], [2,2], ...]
  _2     Decrement twice, vectorizes, yields [[-1,-1], [-1,0], [-1,1], [0,-1], ...]
    ẸƇ   Comb, removes those that contain only falsey values, the [0,0]
         Implicit output

-1 Byte danke an Erik; -1 Byte danke an Mr Xcoder und Dennis


1
Die Antwort ist wie folgt zu ändern:3p3_2ẸƇ
Mr. Xcoder

@ Mr.Xcoder Du kannst die Sekunde fallen lassen 3.
Dennis

@ Tennis Oh, in der Tat. In diesem Fall kann Adm mit dem 6-Byte-Update :)
Mr. Xcoder

7

R , 26 24 Bytes

Dank an @JDoe für das Speichern von zwei weiteren Bytes mit einem direkten Ansatz:

paste(-1:1,-3:5%/%3)[-5]

Probieren Sie es online!

Die ursprüngliche Antwort:

outer(-1:1,-1:1,paste)[-5]

Probieren Sie es online!

Oder für 27 Bytes

sapply(-1:1,paste,-1:1)[-5]

Probieren Sie es online!

Oder für 34 Bytes mit Faktoren:

(gl(3,3,,-1:1):gl(3,1,9,-1:1))[-5]

Probieren Sie es online!

Diese letzte Lösung ist möglicherweise die beste, wenn die Ausgabe zwischen 1 und 3 und nicht zwischen -1 und 1 liegt.

In der anderen Antwort finden Sie alternative Lösungen mit expand.gridoder mit cbind.


huh, schöne nutzung des flexiblen ausgabeformats!
Giuseppe

2
Dieser ist besser als meiner, weil er letztendlich nutzlos ist :)
ngm

@ Giuseppe Ursprünglich habe ich versucht, cwas in einer Matrix keinen Sinn machte, also habe ich auf pastedas ursprüngliche Ausgabeformat umgestellt ...
JayCe

24 Bytes mitpaste
J.Doe

1
@ J.Doe du rockst!
JayCe

6

Japt , 13 12 11 Bytes

Dank @Shaggy ein Byte gespeichert

9ó8_ìJõ é)Å

Probieren Sie es online! Verwendet -Rflag, um jedes Element in eine eigene Zeile zu setzen.

Erläuterung

9ó8_ìJõ é)Å
9ó8             Create the range [9, 9+8). [9, 10, ..., 16]
   _            Map each item in this range through this function:
     Jõ é)        Generate the range [-1...1] and rotate to get [1, -1, 0].
    ì             Convert the item to an array of base-3 digits,
                  mapping [0,1,2] to [1,-1,0]. [[-1, 1, 1], [-1, 1,-1], [-1, 1, 0],
                                                [-1,-1, 1], [-1,-1,-1], [-1,-1, 0],
                                                [-1, 0, 1], [-1, 0,-1]]
          Å       Remove the first item (gets rid of the leading -1).

6

Japt -Q , 15 13 Bytes

Ich bin sicher, dass es einen kürzeren Weg gibt, aber ich mochte diesen Ansatz.

##ü80ì3 mÉ ò
##ü80        // Take 14425280
     ì3      // and turn it into an array of base-3 numbers.
        mÉ   // Subtract one from each digit
           ò // and then split them pairwise.

Zwei Bytes weniger dank Shaggy .

Probieren Sie es online!


6

Haskell , 22 Bytes

_:l=mapM(:[1,-1])[0,0]

Probieren Sie es online!

Laikoni hat 1 Byte gespeichert.


_:l=mapM(:[1,-1])[0,0]Speichert ein Byte. (Entnommen aus isaacgs antwort auf die frühere herausforderung).
Laikoni,

@Laikoni Also hatte ich mir das überlegt und gedacht, dass es ein Schnipsel werden würde (so viele Antworten auf die alte Herausforderung waren). Wenn Sie diesen Metapost jedoch mit der Regel kombinieren, dass Funktionen indirekt definiert werden können, scheint dies in Ordnung zu sein. Danke für den Vorschlag.
xnor


5

05AB1E , 8 7 Bytes

2Ý<ãʒĀZ

Probieren Sie es online!

Erläuterung

2Ý<     # Range of 2 decremented, yields [-1, 0, 1]
   ã    # Cartesian product of the list with itself
    ʒ   # Filter by ...
     ĀZ # Maximum of the truthified values, yields 0 only if both values are 0.

-1 Byte danke an Emigna!


Verdammt, du hast mich geschlagen. Hatte den gleichen Start ( 2Ý<ã), aber fand heraus, wie man das mittlere Element der Paarliste entfernt. Hatte nicht darüber nachgedacht, nach absoluten Werten zu sortieren und das erste zu entfernen. +1 von mir.
Kevin Cruijssen

2
Verwenden Sie ʒĀZ, um 1 zu speichern
Emigna

@Emigna Danke, dass ich den Unterschied zwischen der regulären und der 05AB1IE-Version des wahrheitsgemäßen Befehls verstanden habe :-)
Kaldo

5

MATL , 12 Bytes

9:q4X-3YA49-

Probieren Sie es online!

Da es MATL-Monat ist, ist hier eine MATL-Portierung von @ Stewies Octave-Antwort. Die Sequenz [0 1 2 3 5 6 7 8] wird als die eingestellte Differenz zwischen [0 ... 8] und 4 erzeugt.


5

Java 8, 83 42 Bytes

v->"1,1 1,0 1,-1 0,1 0,-1 -1,1 -1,0 -1,-1"

-41 Bytes dank @AdmBorkBork durch .

Probieren Sie es online aus.


Nicht fest codierte Version als Referenz ( 83 72 70 68 Bytes ):

v->{for(int i=9;i-->1;)System.out.println(~i%3+1+","+(~(i/3)%3+1));}

-11 Bytes dank @ OlivierGrégoire .
-2 Bytes, die einen Port für die Antwort von @ETHproductions auf JavaScript (ES6) erstellen .

Probieren Sie es online aus.


Nicht fest einprogrammierte Antwort in 72 Bytes: v->{for(int i=9;i-->0;)if(i!=4)System.out.println((i/3-1)+","+(i%3-1));}.
Olivier Grégoire

@ OlivierGrégoire Danke, hinzugefügt (und um 2 weitere Bytes golfen).
Kevin Cruijssen

4

R , 27 Bytes

expand.grid(-1:1,-1:1)[-5,]

Probieren Sie es online!

30 und 35 Bytes:

cbind(-1:1,rep(-1:1,e=3))[-5,]
expand.grid(rep(list(-1:1),2))[-5,]

Einige funky aussehende Ausgabe, ich mag es: D Gute Arbeit
Dead Possum

expand.grid(-1:1,-1:1)[-5,]ist 27 Bytes.
Giuseppe




4

Schale , 7 6 Bytes

Es gibt viele verschiedene Möglichkeiten (der knifflige / kostspielige Teil wird beseitigt [0,0]), 7 Bytes sind die kürzesten, die ich dank Leo finden konnte, weil er darauf hingewiesen hat, die Dezimalumwandlung ( d) als Filter zu verwenden:

fdπ2ṡ1

Probieren Sie es online!

Erläuterung

fdπ2ṡ1  -- constant function (expects no arguments)
    ṡ1  -- symmetric range [-n..n]: [-1,0,1]
  π2    -- cartesian power of 2: [[-1,-1],[-1,0],[0,-1],[-1,1],[0,0],[1,-1],[0,1],[1,0],[1,1]]
f       -- filter only elements that are truthy when
 d      -- | decimal conversion (interpret as polynomial and evaluate at x=10)
        -- : [[-1,-1],[-1,0],[0,-1],[-1,1],[1,-1],[0,1],[1,0],[1,1]]

Alternative, 7 Bytes

tπ2ṙ1ṡ1

Probieren Sie es online!

Erläuterung

tπ2ṙ1ṡ1  -- constant function (expects no arguments)
     ṡ1  -- symmetric range [-n..n]: [-1,0,1]
   ṙ1    -- rotate by 1: [0,1,-1]
 π2      -- cartesian power of 2: [[0,0],[0,1],[1,0],[0,-1],[1,1],[-1,0],[1,-1],[-1,1],[-1,-1]]
t        -- tail: [[0,1],[1,0],[0,-1],[1,1],[-1,0],[1,-1],[-1,1],[-1,-1]]

1
Eine weitere 7-Byte-Alternative tπ2↑3İZ.
Laikoni

2
Sie können ein Byte sparen, indem Sie die Listen nach ihrer Dezimalumwandlung filtern. Probieren Sie es online aus!
Leo

3

PowerShell , 41 Byte

(1..-1|%{$i=$_;1..-1|%{"$i,$_"}})-ne'0,0'

Probieren Sie es online!

Double-for-Schleife über den Bereich 1..-1, mit einem -not eQuals am Ende, um den überflüssigen 0,0Eintrag herauszuziehen . Sie werden jeweils einzeln in der Pipeline belassen und implizieren Write-outputbeim Abschluss des Programms, dass uns neue Zeilen kostenlos zur Verfügung gestellt werden.


Leider ist nur die Ausgabe der Barebones-Zeichenfolge um zwei Bytes kürzer:

'1,1
1,0
1,-1
0,1
0,-1
-1,1
-1,0
-1,-1'

Aber das ist langweilig.




3

CJam , 13 Bytes

3,:(2m*{2b},`

Probieren Sie es online!

Erläuterung

3,    e# Range [0,3):       [0 1 2]
:(    e# Decrement each:    [-1 0 1]
2m*   e# Cartesian square:  [[-1 -1] [-1 0] [-1 1] [0 -1] [0 0] [0 1] [1 -1] [1 0] [1 1]]
{     e# Filter by
 2b   e#   conversion to binary:
},    e#                    [[-1 -1] [-1 0] [-1 1] [0 -1] [0 1] [1 -1] [1 0] [1 1]]
`     e# Stringify:         "[[-1 -1] [-1 0] [-1 1] [0 -1] [0 1] [1 -1] [1 0] [1 1]]"

3

Befunge-93 , 24 Bytes

11#v91090~9~19~<
9.._@#,

Probieren Sie es online!

Ich denke, bei dieser Herausforderung fehlen Antworten in 2D-Sprachen, auch wenn sich die meisten nicht diagonal bewegen. Dies gibt durch Leerzeichen getrennte Zahlen aus, wobei jedes Paar durch Tabulatoren getrennt ist.



3

Brachylog , 8 Bytes

Ċ{ṡᵐ≜}ᶠb

Probieren Sie es online!

Erläuterung

Ċ           Couple: take a list of two elements [A,B]
 {   }ᶠ     Find all…
    ≜         …possible values of…
  ṡᵐ          …signs of A and B
       b    Behead: remove the first one which is [0,0]

3

MATL , 12 Bytes

3:qq2Z^[]5Y(

Probieren Sie es bei MATL Online!

Meine allererste ernsthafte MATL-Antwort! Vielen Dank an Luis Mendo , Sanchises und DJMcMayhem für die Hilfe.

Wie es funktioniert

3: qq2Z ^ [] 5Y (- Volles Programm. Ausgabe auf STDOUT.
3: - Bereich 3. Drücken Sie [1 2 3] auf den Stapel.
  qq - Verringerung um 2. Ausbeuten [-1 0 1].
    2Z ^ - Kartesische Potenz von 2.
         5Y (- Ersetzen Sie die Zeile bei Index 5 durch ...
       [] - Ein leerer Vektor.


3

Bash , 30 Bytes

echo "
"{-1..1},{-1..1}|grep 1

Probieren Sie es online!

Gibt in jeder bis auf die letzte Zeile ein Leerzeichen aus. (Dank an @Neil - dies hat ursprünglich ein führendes Leerzeichen gedruckt, aber ein nachfolgendes Leerzeichen ist besser, wie in ihrem Kommentar angegeben)


Ich schätze, Sie könnten alternativ ein Leerzeichen in alle Zeilen mit Ausnahme der letzten Zeile schreiben.
Neil

2

Batch, 77 Bytes

@for %%x in (-1 0 1)do @for %%y in (-1 0 1)do @if not %%x%%y==00 echo %%x %%y

63 Byte, wenn ein nicht standardmäßiges Trennzeichen zulässig ist:

@for %%x in (-1/-1 -1/0 -1/1 0/-1 0/1 1/-1 1/0 1/1)do @echo %%x

2

Pyth, 11 9 Bytes

t^+U2_1 2

Probieren Sie es hier aus

Erläuterung

t^+U2_1 2
  +U2_1     [0, 1, -1]
 ^      2   Product with itself.
t           Exclude the first.

Genauso könnten wir es gebrauchen t*J+U2_1J, aber das ist nicht kürzer.

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.