It's a common problem to navigate in a 2D matrix. We've seen it many times and will see again. So let's help future us and develop the shortest solutions to generate all eight possible steps in a 2D matrix.

Challenge

Your code must output the following 8 pairs of -1,0,1 in any order:

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

Rules

  1. There is no input.
  2. Output order is not relevant
  3. Output is flexible. Pairs of numbers just need to be distinguishable
  4. This is , so shortest answer in bytes wins
  • 2
    @MartinEnder I was 99% sure about that too, but didn't find any either. So I've put it in sandbox for a few days, but noone commented about duplicate. – Dead Possum May 14 at 14:28
  • 3
    Because of the flexible output, there turns out to be an interesting Kolmogorov complexity flavour to this one. Some languages will find it harder than to do better than just hard coding the output. Should this tag be added? – ngm May 14 at 15:08
  • 1
    @Adám Yes, use anything while pairs of numbers are distinguishable – Dead Possum May 14 at 15:59
  • 1
    @Adám But what about (1 + 0i) ? – Dead Possum May 14 at 17:48
  • 6
    This is an exact duplicate of 8 adjacent squares, one of the first code golfs I ever did. – isaacg May 15 at 18:17

50 Answers 50

Octave, 24 bytes

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

Try it online!

I haven't seen this approach yet.

Creates a list of integers [0, 1, 2, 3, 5, 6, 7, 8], and converts it to ternary, returning a character array:

00
01
02
10
12
20
21
22

Subtracting 49 (ASCII-value for 1) from all characters gives a numeric array:

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

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

Creates a (permanent) table t containing (-1,0,1), and performs a self-join with a WHERE clause that excludes the 0,0 row. The table t is not cleaned up by my code, you must drop it yourself.

Sadly nearly twice as long as the boring solution (44 bytes), since SQL allows returns in strings:

PRINT'0,1
0,-1
1,0
-1,0
1,1
1,-1
-1,1
-1,-1'
  • I don't know T-SQL so well: can you use just WHERE t.n OR z.n? (You can in some but not all SQL dialects.) – msh210 May 14 at 23:19
  • @msh210 Good idea, I tried it but it doesn't seem to work on MS SQL Server. I get the error: An expression of non-boolean type specified in a context where a condition is expected – BradC May 15 at 13:22
  • You can remove the spaces around the * – Razvan Socol Jul 11 at 4:26

Pure Bash (no external utilities), 36

a=({0,-1,1},{0,-1,1})
echo ${a[@]:1}

Try it online!


Bash with Sed, 35

printf %s\\n {-1..1},{-1..1}|sed 5d

Try it online!

Python 2, 33 bytes

i=9;exec"print-i%3-1,i/5;i-=2;"*8

Try it online!

Dennis saved 3 5 bytes, wow. Thanks!

Japt, 13 12 11 bytes

Saved a byte thanks to @Shaggy

9ó8_ìJõ é)Å

Try it online! Uses -R flag to put each item on its own line.

Explanation

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).

Japt -Q, 15 13 bytes

I'm sure there's a shorter way, but I liked this approach.

##ü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.

Shaved off two bytes thanks to Shaggy.

Try it online!

Jelly, 8 7 6 bytes

3p_2ẸƇ

Try it online!

My first ever Jelly answer! Much thanks to Dennis for the final piece of the puzzle.

Now, let's see if I can explain it ... 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 thanks to Erik; -1 byte thanks to Mr Xcoder and Dennis

  • 1
    Alterate answer based on this approach: 3p3_2ẸƇ – Mr. Xcoder May 14 at 20:19
  • @Mr.Xcoder You can drop the second 3. – Dennis May 15 at 1:52
  • @Dennis Oh, indeed. In this case, Adm can update with the 6-byter :) – Mr. Xcoder May 15 at 4:08

Haskell, 22 bytes

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

Try it online!

Laikoni saved 1 byte.

  • _:l=mapM(:[1,-1])[0,0] saves a byte. (Taken from isaacg's answer to the earlier challenge). – Laikoni May 16 at 9:05
  • @Laikoni So I had considered that and thought that would make it a snippet (as many answers to the old challenge were). But combining this meta post with the rule that functions can be defined indirectly, so this seems to be OK. Thanks for the suggestion. – xnor May 19 at 0:28

R, 26 bytes

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

Try it online!

Or for 27 bytes

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

Try it online!

Or for 34 bytes with factors:

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

Try it online!

This last solution might be the golfiest if the output could be from 1 to 3 rather than from -1 to 1.

See the other R answer for alternate solutions with expand.grid or with cbind.

  • huh, nice use of the flexible output format! – Giuseppe May 14 at 14:50
  • 2
    This one is better than mine because of how ultimately useless it is :) – ngm May 14 at 14:52
  • @Giuseppe Originally I tried c which did not make sense inside a matrix so I switched to paste and the original output format... – JayCe May 14 at 16:02

05AB1E, 8 7 bytes

2Ý<ãʒĀZ

Try it online!

Explanation

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 thanks to Emigna !

  • Dang, you beat me to it. Had the same start (2Ý<ã), but was figuring out how to remove the middle element of the list of pairs.. Hadn't thought about sort by absolute value and removing the first.. +1 from me. – Kevin Cruijssen May 14 at 15:33
  • 2
    Use ʒĀZ to save 1 – Emigna May 15 at 5:52
  • @Emigna Thanks for making me understand the difference between the regular and the 05AB1IE version of the truthified command :-) – Kaldo May 15 at 7:38

MATL, 12 bytes

9:q4X-3YA49-

Try it online!

Because it's MATL month, here's a MATL port of @Stewie's Octave answer. The sequence [0 1 2 3 5 6 7 8] is generated as the set difference between [0 ... 8] and 4.

JavaScript (ES6)

Two alternate methods, both longer than hardcoding.

49 bytes

_=>[...'11202200'].map((n,i,a)=>[~-n,~-a[i+3&7]])

Try it online!

51 bytes

f=(n=1679887e3)=>n?[n%4-1,~-(n/4%4)]+' '+f(n>>4):''

Try it online!

Haskell, 27 bytes

tail$(,)<$>t<*>t
t=[0,1,-1]

Try it online!

The output is [(0,1),(0,-1),(1,0),(1,1),(1,-1),(-1,0),(-1,1),(-1,-1)].

Husk, 7 6 bytes

There are a lot of different ways (the tricky/costly part is getting rid of [0,0]), 7 bytes is the shortest I could come up thanks to Leo for pointing out to use decimal conversion (d) as a filter:

fdπ2ṡ1

Try it online!

Explanation

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

Try it online!

Explanation

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
    Another 7 byte alternative tπ2↑3İZ. – Laikoni May 14 at 22:13
  • 2
    You can save one byte by filtering the lists based on their decimal conversion Try it online! – Leo May 15 at 4:13

Java 8, 83 42 bytes

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

-41 bytes thanks to @AdmBorkBork by hard-coding..

Try it online.


Non hard-coded version as reference (83 72 70 68 bytes):

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

-11 bytes thanks to @OlivierGrégoire.
-2 bytes creating a port of @ETHproductions's JavaScript (ES6) answer.

Try it online.

  • Non-hardcoded answer 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 May 17 at 12:40
  • @OlivierGrégoire Thanks, added (and golfed by 2 more bytes). – Kevin Cruijssen May 17 at 12:47

Perl 6, 23 bytes

{(1,-1,0 X 1,-1,0)[^8]}

Try it online!

PowerShell, 41 bytes

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

Try it online!

Double-for loop over the range 1..-1, with a -notequals at the end to pull out the extraneous 0,0 entry. They're each individually left on the pipeline and implicit Write-output at program completion gives us newlines for free.


Sadly, just the barebones string output is two bytes shorter:

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

But that's boring.

R, 27 bytes

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

Try it online!

30 and 35 bytes:

cbind(-1:1,rep(-1:1,e=3))[-5,]
expand.grid(rep(list(-1:1),2))[-5,]
  • Some funky looking output, I like it :D Good job – Dead Possum May 14 at 14:37
  • expand.grid(-1:1,-1:1)[-5,] is 27 bytes. – Giuseppe May 14 at 14:46

Python 2, 39 bytes

n=6;exec'n+=~(n==2);print n/3,n%3-1;'*8

Try it online!

Haskell, 28 27 bytes

tail.mapM id$[0,1,-1]<$"ao"

Try it online!

J, 18 16 bytes

echo}.,{;~0 1 _1

Try it online!

  • Why minus is displayed as underscore in TIO? – Dead Possum May 14 at 18:11
  • 18 bytes alternative: echo }.>,{;~0 1 _1 TIO – Galen Ivanov May 14 at 18:15
  • @Dead Possum Negative numbers are displayed with an underscore in J – Galen Ivanov May 14 at 18:20
  • 1
    Yes, 17 :) echo}.>,{;~0 1 _1 – Galen Ivanov May 14 at 18:21
  • 2
    Is echo needed? – cole May 14 at 20:20

CJam, 13 bytes

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

Try it online!

Explanation

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

Befunge-93, 24 bytes

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

Try it online!

I feel like this challenge is missing answers from 2D languages, even if most don't move diagonally. This outputs space separated numbers, each pair separated by tabs.

F# (Mono), 54 bytes

let f=Seq.where((<>)(0,0))(Seq.allPairs[-1..1][-1..1])

Try it online!

44 bytes - thanks to Laikoni:

let f=Seq.tail(Seq.allPairs[0;-1;1][0;-1;1])
  • 1
    44 bytes by having (0,0) be the first element and calling Seq.tail: Try it online! – Laikoni May 14 at 22:07

Brachylog, 8 bytes

Ċ{ṡᵐ≜}ᶠb

Try it online!

Explanation

Ċ           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]

MATL, 12 bytes

3:qq2Z^[]5Y(

Try it at MATL Online!

My first ever serious MATL answer! Thanks a lot to Luis Mendo, Sanchises and DJMcMayhem for the help.

How it works

3:qq2Z^[]5Y( – Full program. Outputs to STDOUT.
3:           – Range 3. Push [1 2 3] to the stack.
  qq         – Decrement by 2. Yields [-1 0 1].
    2Z^      – Cartesian power of 2.
         5Y( – Replace the row at index 5 with...
       []    – An empty vector.

Perl 5, 31 bytes

map/1/&&say,<{-1,0,1},{-1,0,1}>

Try it online!

Bash, 30 bytes

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

Try it online!

Prints a trailing space on each line but the last. (Thanks to @Neil - this originally printed a leading space, but a trailing space is better as per their comment)

  • I guess you could print a trailing space on all but the last line as an alternative. – Neil May 20 at 10:35

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 bytes if a nonstandard separator is allowed:

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

Pyth, 11 9 bytes

t^+U2_1 2

Try it here

Explanation

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

Equivalently, we could use t*J+U2_1J, but that's not any shorter.

Your Answer

 

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.