Langkah ortodiagonal

26

Ini masalah umum untuk bernavigasi dalam matriks 2D. Kami telah melihatnya berkali-kali dan akan melihatnya lagi. Jadi mari kita bantu masa depan kita dan kembangkan solusi terpendek untuk menghasilkan semua delapan langkah yang mungkin dalam matriks 2D.

Tantangan

Kode Anda harus menampilkan 8 pasang -1,0,1 berikut dalam urutan apa pun:

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

Aturan

  1. Tidak ada input.
  2. Urutan output tidak relevan
  3. Keluaran fleksibel. Pasangan angka hanya perlu dibedakan
  4. Ini adalah , jadi jawaban tersingkat dalam byte menang
Possum Mati
sumber
2
@ MartinEnder, saya juga 99% yakin tentang itu, tetapi tidak menemukan satupun. Jadi saya memasukkannya ke kotak pasir selama beberapa hari, tetapi tidak ada yang berkomentar tentang duplikat.
Dead Possum
4
Karena outputnya yang fleksibel, ternyata ada rasa kompleksitas Kolmogorov yang menarik untuk yang satu ini. Beberapa bahasa akan merasa lebih sulit daripada melakukan lebih baik daripada hanya keras mengkodekan output. Haruskah tag ini ditambahkan?
ngm
1
@ Adám Ya, gunakan apa saja sementara pasangan angka dapat dibedakan
Dead Possum
1
@ Adam Tapi bagaimana dengan (1 + 0i)?
Dead Possum
8
Ini adalah duplikat tepat dari 8 kotak yang berdekatan , salah satu kode golf pertama yang pernah saya lakukan.
isaacg

Jawaban:

19

Oktaf , 24 byte

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

Cobalah online!

Saya belum melihat pendekatan ini.

Membuat daftar bilangan bulat [0, 1, 2, 3, 5, 6, 7, 8], dan mengubahnya menjadi ternary, mengembalikan array karakter:

00
01
02
10
12
20
21
22

Mengurangkan 49(nilai ASCII untuk 1) dari semua karakter memberikan array numerik:

-1  -1
-1   0
-1   1
 0  -1
 0   1
 1  -1
 1   0
 1   1
Stewie Griffin
sumber
9

T-SQL, 80 78 byte

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

Menciptakan (permanen) tabel t yang berisi (-1,0,1), dan melakukan self-bergabung dengan WHEREklausul yang tidak termasuk dalam 0,0barisan. Tabel t tidak dibersihkan oleh kode saya, Anda harus menjatuhkannya sendiri.

Sayangnya hampir dua kali lipat solusi membosankan ( 44 byte ), karena SQL memungkinkan pengembalian dalam string:

PRINT'0,1
0,-1
1,0
-1,0
1,1
1,-1
-1,1
-1,-1'
BradC
sumber
Saya tidak begitu mengenal T-SQL: dapatkah Anda menggunakan saja WHERE t.n OR z.n? (Anda dapat menggunakan beberapa tetapi tidak semua dialek SQL.)
msh210
@ msh210 Ide bagus, saya mencobanya tetapi sepertinya tidak berfungsi pada MS SQL Server. Saya mendapatkan kesalahan:An expression of non-boolean type specified in a context where a condition is expected
BradC
1
Anda dapat menghapus spasi di sekitar *
Razvan Socol
7

Python 2 , 33 byte

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

Cobalah online!

Dennis menyimpan 3 5 byte, wow. Terima kasih!

Lynn
sumber
7

Jelly , 8 7 6 byte

3p_2ẸƇ

Cobalah online!

Jawaban Jelly pertama saya! Terima kasih banyak untuk Dennis untuk potongan terakhir dari teka-teki.

Sekarang, mari kita lihat apakah saya bisa menjelaskannya ... 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 terima kasih kepada Erik; -1 byte terima kasih kepada Tn Xcoder dan Dennis

AdmBorkBork
sumber
1
Ubah jawaban berdasarkan pendekatan ini:3p3_2ẸƇ
Tn. Xcoder
@ Mr.Xcoder Anda dapat menjatuhkan yang kedua 3.
Dennis
@ Dennis Oh, memang. Dalam hal ini, Adm dapat memperbarui dengan 6-byter :)
Tn. Xcoder
7

R , 26 24 byte

Kredit ke @JDoe untuk menyimpan dua byte lagi dengan pendekatan langsung:

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

Cobalah online!

Permintaan asli:

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

Cobalah online!

Atau selama 27 byte

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

Cobalah online!

Atau selama 34 byte dengan faktor:

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

Cobalah online!

Solusi terakhir ini mungkin yang paling golf jika outputnya bisa dari 1 hingga 3 daripada dari -1 ke 1.

Lihat jawaban R lainnya untuk solusi alternatif dengan expand.gridatau dengan cbind.

JayCe
sumber
ya, penggunaan format output yang fleksibel!
Giuseppe
2
Yang ini lebih baik daripada milik saya karena betapa tidak bergunanya itu :)
ngm
@ Giuseppe Awalnya saya mencoba cyang tidak masuk akal di dalam matriks jadi saya beralih ke pastedan format output asli ...
JayCe
24 byte denganpaste
J.Doe
1
@ J. Ya ampun!
JayCe
6

Japt , 13 12 11 byte

Menyimpan satu byte berkat @Shaggy

9ó8_ìJõ é)Å

Cobalah online! Menggunakan -Rbendera untuk meletakkan setiap item pada barisnya masing-masing.

Penjelasan

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).
Produksi ETH
sumber
6

Japt -Q , 15 13 byte

Saya yakin ada cara yang lebih pendek, tetapi saya menyukai pendekatan ini.

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

Dicukur dua byte berkat Shaggy .

Cobalah online!

Nit
sumber
6

Haskell , 22 byte

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

Cobalah online!

Laikoni menyimpan 1 byte.

Tidak
sumber
_:l=mapM(:[1,-1])[0,0]menghemat satu byte. (Diambil dari jawaban isaacg untuk tantangan sebelumnya).
Laikoni
@Laikoni Jadi saya telah mempertimbangkan hal itu dan berpikir itu akan membuatnya menjadi potongan (karena banyak jawaban untuk tantangan lama). Tetapi menggabungkan postingan ini dengan aturan bahwa fungsi dapat didefinisikan secara tidak langsung, jadi ini sepertinya OK. Terima kasih untuk sarannya.
xnor
5

05AB1E , 8 7 byte

2Ý<ãʒĀZ

Cobalah online!

Penjelasan

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 terima kasih kepada Emigna!

Kaldo
sumber
Dang, kau kalahkan aku. Punya awal yang sama ( 2Ý<ã), tetapi mencari tahu cara menghapus elemen tengah dari daftar pasangan .. Tidak berpikir tentang mengurutkan berdasarkan nilai absolut dan menghapus yang pertama .. +1 dari saya.
Kevin Cruijssen
2
Gunakan ʒĀZuntuk menyimpan 1
Emigna
@Emigna Terima kasih telah membuat saya memahami perbedaan antara versi biasa dan versi 05AB1IE dari perintah yang benar :-)
Kaldo
5

MATL , 12 byte

9:q4X-3YA49-

Cobalah online!

Karena ini bulan MATL, inilah port MATL jawaban @ Stewie Octave. Urutan [0 1 2 3 5 6 7 8] dihasilkan sebagai perbedaan set antara [0 ... 8] dan 4.

Sanchises
sumber
5

Java 8, 83 42 byte

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

-41 bytes terima kasih kepada @AdmBorkBork oleh hard-coding ..

Cobalah online.


Versi bukan hard-kode sebagai referensi ( 83 72 70 68 byte ):

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

-11 byte terima kasih kepada @ OlivierGrégoire .
-2 byte membuat port dari jawaban JavaScript (ES6) @ETHproductions .

Cobalah online.

Kevin Cruijssen
sumber
Non-hardcoded jawaban di 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 Terima kasih, ditambahkan (dan golf dengan 2 byte lebih banyak).
Kevin Cruijssen
4

R , 27 byte

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

Cobalah online!

30 dan 35 byte:

cbind(-1:1,rep(-1:1,e=3))[-5,]
expand.grid(rep(list(-1:1),2))[-5,]
ngm
sumber
Beberapa output yang terlihat funky, saya suka: D Kerja bagus
Dead Possum
expand.grid(-1:1,-1:1)[-5,]adalah 27 byte.
Giuseppe
4

JavaScript (ES6)

Dua metode alternatif, keduanya lebih panjang daripada hardcoding.

49 byte

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

Cobalah online!

51 byte

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

Cobalah online!

Arnauld
sumber
4

Haskell , 27 byte

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

Cobalah online!

Outputnya adalah [(0,1),(0,-1),(1,0),(1,1),(1,-1),(-1,0),(-1,1),(-1,-1)].

Laikoni
sumber
4

Sekam , 7 6 byte

Ada banyak cara yang berbeda (bagian yang sulit / mahal dihilangkan [0,0]), 7 byte adalah yang terpendek yang dapat saya lakukan berkat Leo karena telah menunjukkan penggunaan konversi desimal ( d) sebagai filter:

fdπ2ṡ1

Cobalah online!

Penjelasan

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

Alternatif, 7 byte

tπ2ṙ1ṡ1

Cobalah online!

Penjelasan

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]]
ბიმო
sumber
1
Alternatif 7 byte lainnya tπ2↑3İZ.
Laikoni
2
Anda dapat menyimpan satu byte dengan memfilter daftar berdasarkan konversi desimalnya. Coba online!
Leo
3

PowerShell , 41 byte

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

Cobalah online!

Double-untuk loop atas kisaran 1..-1, dengan -not equals pada akhir untuk mencabut asing 0,0masuk. Mereka masing-masing ditinggalkan di saluran dan tersirat Write-outputpada penyelesaian program memberi kami baris baru secara gratis.


Sayangnya, hanya output string barebones yang dua byte lebih pendek:

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

Tapi itu membosankan.

AdmBorkBork
sumber
3

J , 18 16 byte

echo}.,{;~0 1 _1

Cobalah online!

FrownyFrog
sumber
Mengapa minus ditampilkan sebagai garis bawah pada TIO?
Dead Possum
Alternatif 18 byte: echo }.>,{;~0 1 _1 TIO
Galen Ivanov
@Dead Possum Angka negatif ditampilkan dengan garis bawah pada J
Galen Ivanov
1
Ya, 17 :) echo}.>,{;~0 1 _1
Galen Ivanov
2
Apakah echodibutuhkan?
cole
3

CJam , 13 byte

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

Cobalah online!

Penjelasan

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]]"
Buah Esolanging
sumber
3

Befunge-93 , 24 byte

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

Cobalah online!

Saya merasa tantangan ini tidak memiliki jawaban dari bahasa 2D, bahkan jika sebagian besar tidak bergerak secara diagonal. Ini menghasilkan ruang angka yang dipisahkan, masing-masing pasangan dipisahkan oleh tab.

Jo King
sumber
3

F # (Mono) , 54 byte

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

Cobalah online!

44 byte - terima kasih kepada Laikoni:

let f=Seq.tail(Seq.allPairs[0;-1;1][0;-1;1])
Henrik Hansen
sumber
1
44 byte dengan (0,0)menjadi elemen pertama dan menelepon Seq.tail: Coba online!
Laikoni
3

Brachylog , 8 byte

Ċ{ṡᵐ≜}ᶠb

Cobalah online!

Penjelasan

Ċ           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]
Fatalisasi
sumber
3

MATL , 12 byte

3:qq2Z^[]5Y(

Cobalah di MATL Online!

Jawaban MATL serius pertamaku! Terima kasih banyak untuk Luis Mendo , Sanchises dan DJMcMayhem atas bantuannya.

Bagaimana itu bekerja

3: qq2Z ^ [] 5Y (- Program lengkap. Output ke STDOUT.
3: - Rentang 3. Dorong [1 2 3] ke tumpukan.
  qq - Penurunan oleh 2. Hasil [-1 0 1].
    2Z ^ - Kekuatan Kartesian 2.
         5Y (- Ganti baris di indeks 5 dengan ...
       [] - Vektor kosong.
Tuan Xcoder
sumber
3

Perl 5 , 31 byte

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

Cobalah online!

Dom Hastings
sumber
Akankah -1..1berhasil di glob?
msh210
@ msh210 Sayangnya tidak ... Saya melakukan percobaan dengan itu, dan itu berhasil bash, tetapi tidak di Perl :(
Dom Hastings
3

Bash , 30 byte

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

Cobalah online!

Mencetak spasi tambahan pada setiap baris tetapi yang terakhir. (Terima kasih kepada @Neil - ini awalnya mencetak ruang terdepan, tetapi ruang tambahan lebih baik sesuai komentar mereka)

Dom Hastings
sumber
Saya kira Anda bisa mencetak spasi tambahan di semua tapi baris terakhir sebagai alternatif.
Neil
2

Batch, 77 byte

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

63 byte jika pemisah tidak standar diizinkan:

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

Pyth, 11 9 byte

t^+U2_1 2

Coba di sini

Penjelasan

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

Setara, kita bisa menggunakan t*J+U2_1J, tapi itu tidak lebih pendek.


sumber