Kroki ortodontyczne

26

Nawigacja w matrycy 2D jest powszechnym problemem. Widzieliśmy to wiele razy i zobaczymy ponownie. Pomóżmy więc nam w przyszłości i opracujmy najkrótsze rozwiązania w celu wygenerowania wszystkich ośmiu możliwych kroków w matrycy 2D.

Wyzwanie

Twój kod musi generować następujące 8 par -1,0,1 w dowolnej kolejności:

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

Zasady

  1. Brak danych wejściowych.
  2. Kolejność wyjściowa nie jest istotna
  3. Dane wyjściowe są elastyczne. Pary liczb po prostu muszą być rozróżnialne
  4. To jest , więc wygrywa najkrótsza odpowiedź w bajtach
Dead Possum
źródło
2
@MartinEnder Miałem 99% pewności, ale też nie znalazłem. Umieściłem to w piaskownicy na kilka dni, ale nikt nie skomentował duplikatu.
Dead Possum
4
Ze względu na elastyczność produkcji okazuje się, że jest interesujący smak złożoności Kołmogorowa. W przypadku niektórych języków jest to trudniejsze niż zrobienie czegoś lepszego niż zwykłe kodowanie danych wyjściowych. Czy ten tag należy dodać?
ngm
1
@ Adám Tak, używaj czegokolwiek, dopóki pary liczb są rozróżnialne
Dead Possum
1
@ Adám Ale co z (1 + 0i)?
Dead Possum
8
To dokładny duplikat 8 sąsiadujących ze sobą pól , jednego z pierwszych golfów z kodem, jaki kiedykolwiek zrobiłem.
isaacg

Odpowiedzi:

19

Oktawa , 24 bajty

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

Wypróbuj online!

Nie widziałem jeszcze takiego podejścia.

Tworzy listę liczb całkowitych [0, 1, 2, 3, 5, 6, 7, 8]i konwertuje ją na trójskładnikową, zwracając tablicę znaków:

00
01
02
10
12
20
21
22

Odejmowanie 49(wartość ASCII dla 1) od wszystkich znaków daje tablicę numeryczną:

-1  -1
-1   0
-1   1
 0  -1
 0   1
 1  -1
 1   0
 1   1
Stewie Griffin
źródło
9

T-SQL, 80 78 bajtów

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

Tworzy (trwałą) tabelę t zawierającą (-1,0,1)i wykonuje samozłączenie z WHEREklauzulą ​​wykluczającą 0,0wiersz. Tabela t nie jest czyszczona przez mój kod, musisz sam ją upuścić.

Niestety prawie dwa razy dłużej niż nudne rozwiązanie ( 44 bajty ), ponieważ SQL pozwala na zwroty w ciągach:

PRINT'0,1
0,-1
1,0
-1,0
1,1
1,-1
-1,1
-1,-1'
BradC
źródło
Nie znam tak dobrze T-SQL: czy możesz po prostu użyć WHERE t.n OR z.n? (Możesz w niektórych, ale nie we wszystkich dialektach SQL).
msh210
@ msh210 Dobry pomysł, próbowałem, ale wydaje się, że nie działa na MS SQL Server. An expression of non-boolean type specified in a context where a condition is expected
Pojawia się
1
Możesz usunąć spacje wokół *
Razvan Socol
7

Python 2 , 33 bajty

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

Wypróbuj online!

Dennis zapisał 3 5 bajtów, wow. Dzięki!

Lynn
źródło
7

Galaretka , 8 7 6 bajtów

3p_2ẸƇ

Wypróbuj online!

Moja pierwsza w historii odpowiedź na galaretkę! Ogromne podziękowania dla Dennisa za ostatni kawałek układanki.

Zobaczmy, czy mogę to wyjaśnić ... 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 bajt dzięki Erikowi; -1 bajt dzięki Mr Xcoder i Dennis

AdmBorkBork
źródło
1
Zmień odpowiedź w oparciu o to podejście:3p3_2ẸƇ
Pan Xcoder
@ Mr.Xcoder Możesz upuścić drugi 3.
Dennis
@Dennis Och, rzeczywiście. W takim przypadku AdM może aktualizować 6-bajtowy :)
Mr. Xcoder
7

R , 26 24 bajtów

Kredyty dla @JDoe za zapisanie dwóch kolejnych bajtów przy bezpośrednim podejściu:

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

Wypróbuj online!

Oryginalny asnwer:

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

Wypróbuj online!

Lub na 27 bajtów

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

Wypróbuj online!

Lub dla 34 bajtów z czynnikami:

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

Wypróbuj online!

To ostatnie rozwiązanie może być najbardziej golfowe, jeśli wyjście może wynosić od 1 do 3 zamiast od -1 do 1.

Zobacz drugą odpowiedź R dla alternatywnych rozwiązań z expand.gridlub z cbind.

JayCe
źródło
hmm, fajne użycie elastycznego formatu wyjściowego!
Giuseppe
2
Ten jest lepszy od mojego ze względu na to, jak ostatecznie jest bezużyteczny :)
ngm
@Giuseppe Początkowo próbowałem, cco nie miało sensu w matrycy, więc przełączyłem się pastena oryginalny format wyjściowy ...
JayCe
24 bajty zpaste
J.Doe
1
@ J.Doe you rock!
JayCe,
6

Japt , 13 12 11 bajtów

Zapisano bajt dzięki @Shaggy

9ó8_ìJõ é)Å

Wypróbuj online! Używa -Rflagi, aby umieścić każdy element we własnej linii.

Wyjaśnienie

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).
ETHprodukcje
źródło
6

Japt -Q , 15 13 bajtów

Jestem pewien, że jest krótsza droga, ale podobało mi się to podejście.

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

Ogolił dwa bajty dzięki Kudłatemu .

Wypróbuj online!

Gnida
źródło
6

Haskell , 22 bajty

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

Wypróbuj online!

Laikoni zapisał 1 bajt.

xnor
źródło
_:l=mapM(:[1,-1])[0,0]zapisuje bajt. ( Na podstawie odpowiedzi Isaacga na wcześniejsze wyzwanie).
Laikoni
@Laikoni Rozważyłem to i pomyślałem, że uczyni to krótkim fragmentem (tyle było odpowiedzi na stare wyzwanie). Ale łącząc ten meta post z regułą, że funkcje mogą być definiowane pośrednio, więc wydaje się to być w porządku. Dzieki za sugestie.
xnor
5

05AB1E , 8 7 bajtów

2Ý<ãʒĀZ

Wypróbuj online!

Wyjaśnienie

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 bajt dzięki Emignie!

Kaldo
źródło
Dang, pobiłeś mnie do tego. Miałem taki sam start ( 2Ý<ã), ale zastanawiałem się, jak usunąć środkowy element listy par. Nie myślałem o sortowaniu według wartości bezwzględnej i usunięciu pierwszego .. +1 ode mnie.
Kevin Cruijssen
2
Użyj, ʒĀZaby uratować 1
Emigna
@Emigna Dzięki za zrozumienie różnicy między zwykłą a wersją 05AB1IE legalnego polecenia :-)
Kaldo
5

MATL , 12 bajtów

9:q4X-3YA49-

Wypróbuj online!

Ponieważ jest to miesiąc MATL, oto port MATL odpowiedzi Octave @ Stewie. Sekwencja [0 1 2 3 5 6 7 8] jest generowana jako ustawiona różnica między [0 ... 8] a 4.

Sanchises
źródło
5

Java 8, 83 42 bajty

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

-41 bajtów dzięki @AdmBorkBork poprzez stałe kodowanie ..

Wypróbuj online.


Wersja niekodowana jako odniesienie ( 83 72 70 68 bajtów ):

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

-11 bajtów dzięki @ OlivierGrégoire .
-2 bajty tworzą port odpowiedzi JavaScript (ES6) @ETHproductions .

Wypróbuj online.

Kevin Cruijssen
źródło
Non-sztywno odpowiedź w ciągu 72 bajtów: v->{for(int i=9;i-->0;)if(i!=4)System.out.println((i/3-1)+","+(i%3-1));}.
Olivier Grégoire
@ OlivierGrégoire Dzięki, dodano (i grał w golfa o 2 kolejne bajty).
Kevin Cruijssen
4

R , 27 bajtów

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

Wypróbuj online!

30 i 35 bajtów:

cbind(-1:1,rep(-1:1,e=3))[-5,]
expand.grid(rep(list(-1:1),2))[-5,]
ngm
źródło
Niektóre funky wyglądające, podoba mi się: D Dobra robota
Dead Possum
expand.grid(-1:1,-1:1)[-5,]ma 27 bajtów.
Giuseppe
4

JavaScript (ES6)

Dwie alternatywne metody, obie dłuższe niż na stałe.

49 bajtów

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

Wypróbuj online!

51 bajtów

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

Wypróbuj online!

Arnauld
źródło
4

Haskell , 27 bajtów

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

Wypróbuj online!

Dane wyjściowe to [(0,1),(0,-1),(1,0),(1,1),(1,-1),(-1,0),(-1,1),(-1,-1)].

Laikoni
źródło
4

Łuska , 7 6 bajtów

Istnieje wiele różnych sposobów (pozbywanie się skomplikowanej / kosztownej części [0,0]), 7 bajtów to najkrótszy czas, jaki mogłem wymyślić, dzięki Leo za wskazanie zastosowania konwersji dziesiętnej ( d) jako filtra:

fdπ2ṡ1

Wypróbuj online!

Wyjaśnienie

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

Alternatywnie, 7 bajtów

tπ2ṙ1ṡ1

Wypróbuj online!

Wyjaśnienie

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]]
ბიმო
źródło
1
Kolejna 7 bajtowa alternatywa tπ2↑3İZ.
Laikoni
2
Możesz zapisać jeden bajt, filtrując listy na podstawie ich konwersji dziesiętnej Wypróbuj online!
Lew
3

PowerShell , 41 bajtów

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

Wypróbuj online!

Pętla podwójna w całym zakresie 1..-1, z końcówkami -not ena końcu, aby wyciągnąć zewnętrzne 0,0wejście. Każdy z nich jest osobno w przygotowaniu i domyślnie Write-outputpo zakończeniu programu daje nam nowe linie za darmo.


Niestety, wyjściowy ciąg znaków barebones jest o dwa bajty krótszy:

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

Ale to jest nudne.

AdmBorkBork
źródło
3

J , 18 16 bajtów

echo}.,{;~0 1 _1

Wypróbuj online!

FrownyFrog
źródło
Dlaczego minus jest wyświetlany jako podkreślenie w TIO?
Dead Possum
18 bajtów alternatywnych: echo }.>,{;~0 1 _1 TIO
Galen Iwanow
@Dead Possum Liczby ujemne są wyświetlane z podkreśleniem w J
Galen Iwanow
1
Tak, 17 :) echo}.>,{;~0 1 _1
Galen Iwanow
2
Jest echopotrzebny?
cole
3

CJam , 13 bajtów

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

Wypróbuj online!

Wyjaśnienie

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]]"
Esolanging Fruit
źródło
3

Befunge-93 , 24 bajty

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

Wypróbuj online!

Wydaje mi się, że w tym wyzwaniu brakuje odpowiedzi z języków 2D, nawet jeśli większość nie porusza się po przekątnej. Powoduje to wyprowadzenie liczb oddzielonych spacjami, każda para oddzielona tabulatorami.

Jo King
źródło
3

F # (mono) , 54 bajty

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

Wypróbuj online!

44 bajty - dzięki Laikoni:

let f=Seq.tail(Seq.allPairs[0;-1;1][0;-1;1])
Henrik Hansen
źródło
1
44 bajty, będąc (0,0)pierwszym elementem i wywołując Seq.tail: Wypróbuj online!
Laikoni
3

Brachylog , 8 bajtów

Ċ{ṡᵐ≜}ᶠb

Wypróbuj online!

Wyjaśnienie

Ċ           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]
Fatalizować
źródło
3

MATL , 12 bajtów

3:qq2Z^[]5Y(

Wypróbuj w MATL Online!

Moja pierwsza poważna odpowiedź MATL! Wielkie dzięki Luis Mendo , Sanchises i DJMcMayhem za pomoc.

Jak to działa

3: qq2Z ^ [] 5Y (- Pełny program. Wyjścia do STDOUT.
3: - Zasięg 3. Wciśnij [1 2 3] na stos.
  qq - Zmniejszenie o 2. Wydajności [-1 0 1].
    2Z ^ - potęga kartezjańska 2.
         5Y (- Zamień wiersz o indeksie 5 na ...
       [] - Pusty wektor.
Pan Xcoder
źródło
3

Perl 5 , 31 bajtów

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

Wypróbuj online!

Dom Hastings
źródło
Czy -1..1działałby w świecie?
msh210
@ msh210 Niestety nie ... Eksperymentowałem z nim i działa bashon w Perlu, ale nie w Perlu :(
Dom Hastings
3

Bash , 30 bajtów

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

Wypróbuj online!

Drukuje końcowe spacje w każdym wierszu, ale w ostatnim. (Dzięki @Neil - pierwotnie wydrukowano spację wiodącą, ale spacja końcowa jest lepsza zgodnie z ich komentarzem)

Dom Hastings
źródło
Wydaje mi się, że możesz wydrukować spację końcową na wszystkich wierszach oprócz ostatniej jako alternatywy.
Neil,
2

Partia, 77 bajtów

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

63 bajty, jeśli dozwolony jest niestandardowy separator:

@for %%x in (-1/-1 -1/0 -1/1 0/-1 0/1 1/-1 1/0 1/1)do @echo %%x
Neil
źródło
2

Pyth, 11 9 bajtów

t^+U2_1 2

Wypróbuj tutaj

Wyjaśnienie

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

Równie dobrze moglibyśmy użyć t*J+U2_1J, ale to nie jest krótsze.


źródło