Marches orthodoxes

26

C'est un problème courant de naviguer dans une matrice 2D. Nous l'avons vu à plusieurs reprises et verrons à nouveau. Alors aidons-nous à l'avenir et développons les solutions les plus courtes pour générer les huit étapes possibles dans une matrice 2D.

Défi

Votre code doit générer les 8 paires suivantes de -1,0,1 dans n'importe quel ordre:

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

Règles

  1. Il n'y a aucune entrée.
  2. L'ordre de sortie n'est pas pertinent
  3. La sortie est flexible. Il suffit de distinguer les paires de nombres
  4. Il s'agit de , donc la réponse la plus courte en octets l'emporte
Possum mort
la source
2
@MartinEnder J'étais sûr à 99% de cela aussi, mais je n'en ai pas trouvé non plus. Je l'ai donc mis dans un bac à sable pendant quelques jours, mais personne n'a commenté le doublon.
Dead Possum
4
En raison de la sortie flexible, il se révèle être une saveur de complexité Kolmogorov intéressante à celui-ci. Certaines langues auront plus de mal à faire que de simplement coder en dur la sortie. Faut-il ajouter cette balise?
ngm
1
@ Adám Oui, utilisez n'importe quoi alors que les paires de chiffres sont reconnaissables
Dead Possum
1
@ Adám Mais qu'en est-il (1 + 0i)?
Dead Possum
8
Il s'agit d'un duplicata exact de 8 cases adjacentes , l'un des premiers golfs de code que j'ai jamais fait.
isaacg

Réponses:

19

Octave , 24 octets

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

Essayez-le en ligne!

Je n'ai pas encore vu cette approche.

Crée une liste d'entiers [0, 1, 2, 3, 5, 6, 7, 8]et la convertit en ternaire, renvoyant un tableau de caractères:

00
01
02
10
12
20
21
22

La soustraction 49(valeur ASCII pour 1) de tous les caractères donne un tableau numérique:

-1  -1
-1   0
-1   1
 0  -1
 0   1
 1  -1
 1   0
 1   1
Stewie Griffin
la source
9

T-SQL, 80 78 octets

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

Crée une table (permanente) t contenant (-1,0,1)et effectue une auto-jointure avec une WHEREclause qui exclut la 0,0ligne. Le tableau t n'est pas nettoyé par mon code, vous devez le déposer vous-même.

Malheureusement, presque deux fois plus longtemps que la solution ennuyeuse ( 44 octets ), car SQL permet les retours dans les chaînes:

PRINT'0,1
0,-1
1,0
-1,0
1,1
1,-1
-1,1
-1,-1'
BradC
la source
Je ne connais pas si bien T-SQL: pouvez-vous utiliser juste WHERE t.n OR z.n? (Vous pouvez le faire dans certains dialectes SQL, mais pas dans tous.)
msh210
@ msh210 Bonne idée, je l'ai essayé mais cela ne semble pas fonctionner sur MS SQL Server. Je reçois l'erreur:An expression of non-boolean type specified in a context where a condition is expected
BradC
1
Vous pouvez supprimer les espaces autour du *
Razvan Socol
7

Python 2 , 33 octets

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

Essayez-le en ligne!

Dennis a économisé 3 5 octets, wow. Merci!

Lynn
la source
7

Gelée , 8 7 6 octets

3p_2ẸƇ

Essayez-le en ligne!

Ma toute première réponse Jelly! Un grand merci à Dennis pour la dernière pièce du puzzle.

Maintenant, voyons si je peux l'expliquer ... 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 octet grâce à Erik; -1 octet merci à Mr Xcoder et Dennis

AdmBorkBork
la source
1
Modifier la réponse en fonction de cette approche:3p3_2ẸƇ
M. Xcoder
@ Mr.Xcoder Vous pouvez laisser tomber la seconde 3.
Dennis
@Dennis Oh, en effet. Dans ce cas, Adm peut mettre à jour avec le 6 octets :)
M. Xcoder
7

R , 26 24 octets

Crédits à @JDoe pour avoir économisé deux octets supplémentaires avec une approche directe:

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

Essayez-le en ligne!

La réponse d'origine:

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

Essayez-le en ligne!

Ou pour 27 octets

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

Essayez-le en ligne!

Ou pour 34 octets avec des facteurs:

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

Essayez-le en ligne!

Cette dernière solution pourrait être la plus golfique si la sortie pouvait être de 1 à 3 plutôt que de -1 à 1.

Voir l'autre réponse R pour des solutions alternatives avec expand.gridou avec cbind.

JayCe
la source
hein, belle utilisation du format de sortie flexible!
Giuseppe
2
Celui-ci est meilleur que le mien car il est finalement inutile :)
ngm
@Giuseppe À l'origine, j'ai essayé cce qui n'avait pas de sens à l'intérieur d'une matrice, donc je suis passé au pasteformat de sortie d'origine ...
JayCe
24 octets avecpaste
J.Doe
1
@ J.Doe vous basculez!
JayCe
6

Japt , 13 12 11 octets

Un octet enregistré grâce à @Shaggy

9ó8_ìJõ é)Å

Essayez-le en ligne! Utilise le -Rdrapeau pour mettre chaque élément sur sa propre ligne.

Explication

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).
ETHproductions
la source
6

Japt -Q , 15 13 octets

Je suis sûr qu'il y a un chemin plus court, mais j'ai aimé cette approche.

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

Rasé de deux octets grâce à Shaggy .

Essayez-le en ligne!

Lente
la source
6

Haskell , 22 octets

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

Essayez-le en ligne!

Laikoni a enregistré 1 octet.

xnor
la source
_:l=mapM(:[1,-1])[0,0]enregistre un octet. (Tiré de la réponse d' Isaacg au défi précédent).
Laikoni
@Laikoni J'avais donc considéré cela et pensé que cela en ferait un extrait (autant de réponses à l'ancien défi). Mais en combinant ce méta-post avec la règle selon laquelle les fonctions peuvent être définies indirectement, cela semble donc être OK. Merci pour la suggestion.
xnor
5

05AB1E , 8 7 octets

2Ý<ãʒĀZ

Essayez-le en ligne!

Explication

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 octet grâce à Emigna!

Kaldo
la source
Dang, tu m'as battu. A eu le même début ( 2Ý<ã), mais était en train de trouver comment supprimer l'élément central de la liste des paires .. Je n'avais pas pensé à trier par valeur absolue et à supprimer le premier .. +1 de moi.
Kevin Cruijssen
2
Utilisez ʒĀZpour enregistrer 1
Emigna
@Emigna Merci de m'avoir fait comprendre la différence entre la version régulière et la version 05AB1IE de la commande authentifiée :-)
Kaldo
5

MATL , 12 octets

9:q4X-3YA49-

Essayez-le en ligne!

Parce que c'est le mois MATL, voici un port MATL de la réponse Octave de @ Stewie. La séquence [0 1 2 3 5 6 7 8] est générée comme la différence définie entre [0 ... 8] et 4.

Sanchises
la source
5

Java 8, 83 42 octets

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

-41 octets grâce à @AdmBorkBork par codage en dur ..

Essayez-le en ligne.


Version non codée en dur comme référence ( 83 72 70 68 octets ):

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

-11 octets grâce à @ OlivierGrégoire .
-2 octets créant un port de réponse JavaScript (ES6) @ETHproductions .

Essayez-le en ligne.

Kevin Cruijssen
la source
Non-hardcoded réponse 72 octets: v->{for(int i=9;i-->0;)if(i!=4)System.out.println((i/3-1)+","+(i%3-1));}.
Olivier Grégoire
@ OlivierGrégoire Merci, ajouté (et joué 2 octets de plus).
Kevin Cruijssen
4

R , 27 octets

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

Essayez-le en ligne!

30 et 35 octets:

cbind(-1:1,rep(-1:1,e=3))[-5,]
expand.grid(rep(list(-1:1),2))[-5,]
ngm
la source
Quelques sorties funky, j'aime ça: D Bon travail
Dead Possum
expand.grid(-1:1,-1:1)[-5,]est de 27 octets.
Giuseppe
4

JavaScript (ES6)

Deux méthodes alternatives, toutes deux plus longues que le codage en dur.

49 octets

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

Essayez-le en ligne!

51 octets

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

Essayez-le en ligne!

Arnauld
la source
4

Haskell , 27 octets

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

Essayez-le en ligne!

La sortie est [(0,1),(0,-1),(1,0),(1,1),(1,-1),(-1,0),(-1,1),(-1,-1)].

Laikoni
la source
4

Husk , 7 6 octets

Il y a beaucoup de façons différentes (la partie délicate / coûteuse se débarrasse [0,0]), 7 octets est le plus court que j'ai pu trouver grâce à Leo pour avoir indiqué d'utiliser la conversion décimale ( d) comme filtre:

fdπ2ṡ1

Essayez-le en ligne!

Explication

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 octets

tπ2ṙ1ṡ1

Essayez-le en ligne!

Explication

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]]
ბიმო
la source
1
Une autre alternative de 7 octets tπ2↑3İZ.
Laikoni
2
Vous pouvez enregistrer un octet en filtrant les listes en fonction de leur conversion décimale Essayez-le en ligne!
Leo
3

PowerShell , 41 octets

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

Essayez-le en ligne!

Boucle double sur la plage 1..-1, avec une -not equals à la fin pour retirer l' 0,0entrée étrangère . Ils sont chacun individuellement laissés sur le pipeline et implicites Write-outputà la fin du programme nous donne gratuitement de nouvelles lignes.


Malheureusement, seule la sortie de la chaîne barebones est plus courte de deux octets:

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

Mais c'est ennuyeux.

AdmBorkBork
la source
3

J , 18 16 octets

echo}.,{;~0 1 _1

Essayez-le en ligne!

FrownyFrog
la source
Pourquoi le moins est affiché comme trait de soulignement dans TIO?
Dead Possum
Alternative de 18 octets: echo }.>,{;~0 1 _1 TIO
Galen Ivanov
@Dead Possum Les nombres négatifs sont affichés avec un trait de soulignement dans J
Galen Ivanov
1
Oui, 17 :) echo}.>,{;~0 1 _1
Galen Ivanov
2
Est echonécessaire?
cole
3

CJam , 13 octets

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

Essayez-le en ligne!

Explication

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
la source
3

Befunge-93 , 24 octets

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

Essayez-le en ligne!

J'ai l'impression que ce défi manque de réponses des langages 2D, même si la plupart ne bougent pas en diagonale. Cela génère des nombres séparés par des espaces, chaque paire séparée par des tabulations.

Jo King
la source
3

F # (Mono) , 54 octets

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

Essayez-le en ligne!

44 octets - merci à Laikoni:

let f=Seq.tail(Seq.allPairs[0;-1;1][0;-1;1])
Henrik Hansen
la source
1
44 octets en ayant (0,0)été le premier élément et en appelant Seq.tail: Essayez-le en ligne!
Laikoni
3

Brachylog , 8 octets

Ċ{ṡᵐ≜}ᶠb

Essayez-le en ligne!

Explication

Ċ           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]
Fatalize
la source
3

MATL , 12 octets

3:qq2Z^[]5Y(

Essayez-le sur MATL Online!

Ma toute première réponse MATL sérieuse! Merci beaucoup à Luis Mendo , Sanchises et DJMcMayhem pour l'aide.

Comment ça marche

3: qq2Z ^ [] 5Y (- Programme complet. Sorties vers STDOUT.
3: - Plage 3. Poussez [1 2 3] dans la pile.
  qq - Diminuer de 2. Rendements [-1 0 1].
    2Z ^ - Puissance cartésienne de 2.
         5Y (- Remplacer la ligne de l'index 5 par ...
       [] - Un vecteur vide.
M. Xcoder
la source
3

Bash , 30 octets

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

Essayez-le en ligne!

Imprime un espace de fin sur chaque ligne mais la dernière. (Merci à @Neil - cela imprimait à l'origine un espace de début, mais un espace de fin est meilleur selon leur commentaire)

Dom Hastings
la source
Je suppose que vous pouvez imprimer un espace de fin sur tout sauf la dernière ligne comme alternative.
Neil
2

Lot, 77 octets

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

63 octets si un séparateur non standard est autorisé:

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

Pyth, 11 9 octets

t^+U2_1 2

Essayez-le ici

Explication

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

De manière équivalente, nous pourrions utiliser t*J+U2_1J, mais ce n'est pas plus court.


la source