Ortodiagonal adımlar


26

2B matris içinde gezinmek yaygın bir sorundur. Bunu birçok kez gördük ve tekrar göreceğiz. Öyleyse bize gelecekteki yardımcı olalım ve 2D matristeki sekiz adımın tümünü oluşturmak için en kısa çözümleri geliştirelim.

Meydan okuma

Kodunuz, herhangi bir sırada aşağıdaki -1,0,1 çiftini çıkarmalıdır:

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

kurallar

  1. Giriş yok.
  2. Çıktı siparişi alakalı değil
  3. Çıktı esnektir. Sayı çiftlerinin sadece ayırt edilebilir olmaları gerekir
  4. Bu , bayt cinsinden çok kısa cevap

2
@MartinEnder Ben de bu konuda% 99 emin oldu, ama hiçbirini bulamadım. Bu yüzden birkaç gündür kum havuzuna koydum, fakat hiç kimse yinelenen hakkında yorum yapmadı.
Ölü Fırsat

4
Esnek çıktı nedeniyle, bunun için ilginç bir Kolmogorov karmaşıklığı tadı var. Bazı diller, çıktıyı zor kodlamaktan daha iyisini yapmaktan daha zor bulur. Bu etiket eklenmeli mi?
NGM

1
@ Adám Evet, sayı çiftleri ayırt edilirken her şeyi kullanın
Dead Possum

1
@ Adám Ama ne hakkında (1 + 0i)?
Ölü Fırsat

8
Bu, şimdiye kadar yaptığım ilk golf kodlarından biri olan bitişik 8 karenin tam bir kopyası .
isaacg

Yanıtlar:


19

Oktav , 24 bayt

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

Çevrimiçi deneyin!

Bu yaklaşımı henüz görmedim.

Bir tamsayı listesi oluşturur [0, 1, 2, 3, 5, 6, 7, 8]ve bir karakter dizisini döndürerek üçlüye dönüştürür:

00
01
02
10
12
20
21
22

Tüm karakterlerden çıkarma 49(ASCII-değeri 1), sayısal bir dizi verir:

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

9

T-SQL, 80 78 bayt

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

T içeren (kalıcı) bir tablo oluşturur ve satırı hariç tutan (-1,0,1)bir WHEREcümle ile birleştirme işlemini gerçekleştirir 0,0. Tablo t kodumla temizlenmedi, kendin bırakmalısın.

Ne yazık ki, sıkıcı çözümden ( 44 bayt ) neredeyse iki kat daha fazla , çünkü SQL dizgelerde geri dönüyor:

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

T-SQL'i o kadar iyi tanımıyorum: sadece kullanabilir misiniz WHERE t.n OR z.n? (Bazı SQL lehçelerinde bazıları olabilir, ancak olmayabilir.)
msh210

@ msh210 İyi fikir, denedim ama MS SQL Server'da çalışmıyor gibi görünüyor. Hatayı alıyorum:An expression of non-boolean type specified in a context where a condition is expected
BradC

1
Çevresindeki boşlukları kaldırabilirsiniz *
Razvan Socol



7

Jöle , 8 7 6 bayt

3p_2ẸƇ

Çevrimiçi deneyin!

Benim ilk Jelly cevabım! Bulmacanın son parçası için Dennis'e çok teşekkür ederim.

Şimdi, açıklayabilir miyim bir bakalım ... 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

Erik sayesinde -1 bayt; Bay Xcoder ve Dennis sayesinde -1 bayt


1
Bu yaklaşıma göre cevabı değiştir:3p3_2ẸƇ
Bay Xcoder

@ Mr.Xcoder İkinciyi düşürebilirsiniz 3.
Dennis,

@Dennis Ah, gerçekten. Bu durumda, Adm 6 bayt ile güncelleme yapabilir :)
Bay

7

R , 26 24 bayt

Doğrudan bir yaklaşımla iki bayttan daha fazla tasarruf etmek için @JDoe’ya verilen krediler:

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

Çevrimiçi deneyin!

Orijinal cevap:

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

Çevrimiçi deneyin!

Veya 27 bayt için

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

Çevrimiçi deneyin!

Veya faktörlere sahip 34 bayt için:

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

Çevrimiçi deneyin!

Bu son çözüm, çıktı -1 ile 1 yerine 1 - 3 olabilirse en hızlı çözüm olabilir.

İle veya arasında alternatif çözümler için diğer R cevabına bakınız .expand.gridcbind


ha, esnek çıktı formatının güzel kullanımı!
Giuseppe

2
Bu seferki çünkü daha iyi benim daha ne kadar sonuçta yararsız olduğunu :)
NGM

@Giuseppe Aslen cbir matrisin içinde anlam ifade etmeyen bir deneme yaptım, böylece ben de açtım pasteve orjinal çıktı formatı ...
JayCe

24 byte ilepaste
J.Doe

1
@ J. Sen salla!
JayCe

6

Japt , 13 12 11 bayt

@Shaggy sayesinde bir bayt kaydedildi

9ó8_ìJõ é)Å

Çevrimiçi deneyin! -RHer öğeyi kendi satırına koymak için bayrak kullanır .

açıklama

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 bayt

Eminim daha kısa bir yol var, ama bu yaklaşımı sevdim

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

Shaggy sayesinde iki byte tıraş edildi .

Çevrimiçi deneyin!


6

Haskell , 22 bayt

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

Çevrimiçi deneyin!

Laikoni 1 byte tasarruf etti.


_:l=mapM(:[1,-1])[0,0]bir bayt kaydeder. ( İsaacg'ın önceki mücadeleye verdiği cevaptan alınmıştır ).
Laikoni

@Likonik Bu yüzden bunu düşünmüştüm ve bunun bir pasajı yapacağını düşündüm (eski mücadeleye verilen cevapların çoğu gibi). Ancak bu meta postayı , işlevlerin dolaylı olarak tanımlanabileceği kuralı ile birleştirerek , bu doğru görünüyor. Önerin için teşekkürler.
xnor


5

05AB1E , 8 7 bayt

2Ý<ãʒĀZ

Çevrimiçi deneyin!

açıklama

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.

Emigna sayesinde -1 bayt!


Dang, beni yendin. Aynı başlangıçta ( 2Ý<ã) vardı, ancak çiftler listesinin orta elemanının nasıl çıkarılacağını çözüyordum .. Mutlak değere göre sıralama yapmayı ve ilkini çıkarmayı düşünmemiştim .. +1 benden.
Kevin Cruijssen

2
ʒĀZ1'i kurtarmak için kullanın
Emigna

@Emigna Düzenli ve doğrulanmış komutun 05AB1IE versiyonu arasındaki farkı anlamamı sağladığın için teşekkürler :-)
Kaldo

5

MATL , 12 bayt

9:q4X-3YA49-

Çevrimiçi deneyin!

Çünkü bu MATL ay, işte @ Stewie'nin Octave cevabının MATL limanı. [0 1 2 3 5 6 7 8] sekansı [0 ... 8] ve 4 arasındaki set farkı olarak üretilir.


5

Java 8, 83 42 bayt

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

-41 byte, @AdmBorkBork ile kodlama sayesinde .

Çevrimiçi deneyin.


Referans olarak kodlanmış olmayan versiyon ( 83 72 70 68 bayt ):

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

@ OlivierGrégoire sayesinde -11 bayt .
-2 byte @ETHproductions'un JavaScript (ES6) cevabını içeren bir bağlantı noktası oluşturuyor .

Çevrimiçi deneyin.


72 bayt cevabı olmayan kodlanmış: v->{for(int i=9;i-->0;)if(i!=4)System.out.println((i/3-1)+","+(i%3-1));}.
Olivier Grégoire

@ OlivierGrégoire Teşekkürler, ekledi (ve 2 bayt daha golf oynadı).
Kevin Cruijssen

4

R , 27 bayt

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

Çevrimiçi deneyin!

30 ve 35 bayt:

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

Bazı korkak görünümlü çıktılar, hoşuma gitti: D İyi iş
Dead Possum

expand.grid(-1:1,-1:1)[-5,]27 bayttır.
Giuseppe




4

Kabuğu , 7 6 bayt

Bir sürü farklı yol var (zorlu / pahalı olan kısım kurtuluyor [0,0]), 7 bayt, filtre olarak ondalık dönüştürmeyi ( ) kullanmak için işaret ettiği için Leo sayesinde en kısa sürede bulabildiğimd :

fdπ2ṡ1

Çevrimiçi deneyin!

açıklama

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 bayt

tπ2ṙ1ṡ1

Çevrimiçi deneyin!

açıklama

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
Başka bir 7 byte alternatif tπ2↑3İZ.
Laikoni

2
Bir bayt'ı, ondalık dönüşümlerini esas alarak listeleri filtreleyerek kaydedebilirsiniz. Çevrimiçi deneyin!
Leo,

3

PowerShell , 41 bayt

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

Çevrimiçi deneyin!

Çift için aralığında döngü 1..-1, bir ile -not esonunda quals yabancı dışarı çekmek için 0,0girdiyi. Her biri boru hattında ayrı ayrı bırakılmıştır ve Write-outputprogram bitiminde örtük olan bize ücretsiz yeni çizgiler verir.


Ne yazık ki, yalnızca barebones dize çıkışı iki bayt daha kısadır:

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

Ama bu çok sıkıcı.




3

CJam , 13 bayt

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

Çevrimiçi deneyin!

açıklama

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 bayt

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

Çevrimiçi deneyin!

Birçoğunun çapraz hareket etmemesine rağmen, bu zorluğun 2B dillerden gelen cevapların eksik olduğunu hissediyorum. Bu, her bir çift sekmelerle ayrılmış, aralıkla ayrılmış sayılar verir.



3

Brachylog , 8 bayt

Ċ{ṡᵐ≜}ᶠb

Çevrimiçi deneyin!

açıklama

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

3:qq2Z^[]5Y(

MATL Online'da deneyin!

Benim ilk ciddi MATL cevabım! Yardım için Luis Mendo , Sanchises ve DJMcMayhem'e çok teşekkürler .

Nasıl çalışır

3: qq2Z ^ [] 5Y (- Tam program. STDOUT çıkışına gönderir.
3: - Aralık 3. [1 2 3] yığına itin.
  qq - 2 ile azaltma. Verim [-1 0 1].
    2Z ^ - 2'nin kartezyen gücü.
         5Y (- Dizin 5'teki satırı değiştirin ...
       [] - Boş bir vektör.


3

Bash , 30 bayt

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

Çevrimiçi deneyin!

Her satıra ancak sonuncusuna bitişik bir boşluk yazdırır. ( @Neil'e teşekkürler - bu başlangıçta öncülük eden bir alan yazdırdı, ancak takip eden bir alan yorumlarına göre daha iyi)


Sanırım alternatif olarak son satırdan başka bir yere boşluk koyabilirsiniz.
Neil

2

Toplu, 77 bayt

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

Standart olmayan bir ayraca izin verilirse 63 bayt:

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

t^+U2_1 2

Burada dene

açıklama

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

Eşdeğerde kullanabiliriz t*J+U2_1J, ama bu daha kısa değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.