Ортодіагональні кроки


26

Поширена проблема орієнтуватися в 2D матриці. Ми бачили це багато разів і знову побачимо. Тож давайте допоможемо майбутнім нам і розробимо найкоротші рішення для створення всіх восьми можливих кроків у 2D матриці.

Виклик

Ваш код повинен виводити наступні 8 пар -1,0,1 у будь-якому порядку:

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

Правила

  1. Введення немає.
  2. Порядок виводу не має значення
  3. Вихід є гнучким. Пари чисел просто потрібно відрізняти
  4. Це , тому найкоротша відповідь у байтах виграє

2
@MartinEnder Я також був 99% впевнений у цьому, але не знайшов жодного. Тому я поклав її в пісочницю на кілька днів, але ніхто не коментував дублікат.
Мертвий Поссум

4
Завдяки гнучкому виходу, як виявляється, цікавий цей складний смак Колмогорова. Деяким мовам буде складніше, ніж зробити це краще, ніж просто жорстке кодування результатів. Чи слід додати цей тег?
ngm

1
@ Adám Так, використовуйте що-небудь, коли пари чисел відрізняються
Dead Possum

1
@ Adám Але про що (1 + 0i)?
Мертвий Поссум

8
Це точний дублікат 8 сусідніх квадратів , один з перших кодів-гольфів, які я коли-небудь робив.
isaacg

Відповіді:


19

Октава , 24 байти

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

Спробуйте в Інтернеті!

Я ще не бачив такого підходу.

Створює список цілих чисел [0, 1, 2, 3, 5, 6, 7, 8]і перетворює його на потрійні, повертаючи масив символів:

00
01
02
10
12
20
21
22

Віднімання 49(значення ASCII для 1) з усіх символів дає числовий масив:

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

9

T-SQL, 80 78 байт

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

Створює (постійну) таблицю t, що містить (-1,0,1), і виконує самостійне з'єднання з WHEREпропозицією, яка виключає 0,0рядок. Таблиця t не очищена моїм кодом, ви повинні залишити її самостійно.

На жаль майже вдвічі довше, ніж нудне рішення ( 44 байти ), оскільки SQL дозволяє повертати в рядках:

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

Я не знаю T-SQL так добре: ти можеш просто використовувати WHERE t.n OR z.n? (Ви можете в деяких, але не у всіх діалектах SQL.)
msh210

@ msh210 Хороша ідея, я спробував це, але це, здається, не працює на MS SQL Server. Я отримую помилку:An expression of non-boolean type specified in a context where a condition is expected
BradC

1
Ви можете видалити пробіли навколо *
Razvan Socol

8

Pure Bash (без зовнішніх утиліт), 36

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

Спробуйте в Інтернеті!


Баш з Седом, 35

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

Спробуйте в Інтернеті!


Також можна використовувати cut36 байт.
ბიმო

33 байти для bash + sed (незважаючи на те, наскільки це нудно),echo {-1..1},{-1..1}|sed s/0,0.//
Kritixi Lithos

printf %s\\n {-1..1},{-1..1}|grep 1також 35.
Ніл


7

Желе , 8 7 6 байт

3p_2ẸƇ

Спробуйте в Інтернеті!

Моя перша в історії відповідь Желе! Велика подяка Деннісу за фінальну частину головоломки.

Тепер давайте подивимось, чи можу я пояснити це ... хаха.

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 байт завдяки Еріку; -1 байт завдяки панові Xcoder та Деннісу


1
Змініть відповідь, виходячи з такого підходу:3p3_2ẸƇ
Містер Xcoder

@ Mr.Xcoder Ви можете кинути другу 3.
Денніс

@Dennis О, справді. У цьому випадку Adm може оновити 6-байтний :)
Містер Xcoder

7

R , 26 24 байти

Кредити @JDoe за збереження ще двох байтів при прямому підході:

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

Спробуйте в Інтернеті!

Початковий відповідь:

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

Спробуйте в Інтернеті!

Або на 27 байт

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

Спробуйте в Інтернеті!

Або на 34 байти з коефіцієнтами:

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

Спробуйте в Інтернеті!

Останнє рішення може бути найкращим, якщо вихід може бути від 1 до 3, а не від -1 до 1.

Дивіться іншу відповідь R щодо альтернативних рішень із expand.gridабо з cbind.


так, приємне використання гнучкого вихідного формату!
Джузеппе

2
Цей кращий, ніж мій, через те, наскільки він, зрештою, марний :)
ngm

@Giuseppe Спочатку я спробував, cщо не мав сенсу всередині матриці, тому я перейшов на pasteвихідний формат виходу ...
JayCe


1
@ J.До тебе рок!
JayCe

6

Japt , 13 12 11 байт

Збережено байт завдяки @Shaggy

9ó8_ìJõ é)Å

Спробуйте в Інтернеті! Використовує -Rпрапор, щоб розмістити кожен елемент у своєму рядку.

Пояснення

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 байт

Я впевнений, що існує коротший шлях, але мені сподобався такий підхід.

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

Поголив два байти завдяки Шаггі .

Спробуйте в Інтернеті!


6

Хаскелл , 22 байти

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

Спробуйте в Інтернеті!

Лайконі врятував 1 байт.


_:l=mapM(:[1,-1])[0,0]зберігає байт. (Взято з відповіді isaacg на попередній виклик).
Лайконі

@Laikoni Тому я вважав це і думав, що це зробить фрагмент (стільки ж відповідей на старий виклик). Але поєднуючи цей метапост з правилом, що функції можна визначати опосередковано, тому це здається нормальним. Дякую за пропозицію.
xnor


5

05AB1E , 8 7 байт

2Ý<ãʒĀZ

Спробуйте в Інтернеті!

Пояснення

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 байт дякую Еміньї!


Данг, ти мене до цього побив. Був такий самий старт ( 2Ý<ã), але з'ясовував, як видалити середній елемент списку пар. Не думав про сортування за абсолютним значенням та видалення першого .. +1.
Кевін Круїссен

2
Використовуйте ʒĀZдля збереження 1
Емінья

@Emigna Дякую за те, що я зрозумів різницю між регулярною та 05AB1IE версією обробленої команди :-)
Калдо,


5

Java 8, 83 42 байти

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

-41 байт завдяки @AdmBorkBork жорстким кодуванням ..

Спробуйте в Інтернеті.


Версія, що не є твердим кодом ( 83 72 70 68 байт ):

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

-11 байт завдяки @ OlivierGrégoire .
-2 байт створення порту @ETHproductions JavaScript (ES6) відповідь «и .

Спробуйте в Інтернеті.


Non-зашиті відповідь в 72 байт: v->{for(int i=9;i-->0;)if(i!=4)System.out.println((i/3-1)+","+(i%3-1));}.
Олів'є Грегоар

@ OlivierGrégoire Спасибі, додано (і переграв ще 2 байти).
Кевін Кройсейсен





4

Лушпиння , 7 6 байт

Існує багато різних способів (хитра / затратна частина позбавляється [0,0]), 7 байт - найкоротший, який я міг придумати, завдяки Леву за те, що вказав на використання десяткового перетворення ( d) як фільтр:

fdπ2ṡ1

Спробуйте в Інтернеті!

Пояснення

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

Альтернативно, 7 байт

tπ2ṙ1ṡ1

Спробуйте в Інтернеті!

Пояснення

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
Ще 7 байт альтернативи tπ2↑3İZ.
Лайконі

2
Ви можете зберегти один байт, фільтруючи списки на основі їх десяткового перетворення. Спробуйте в Інтернеті!
Лев

3

PowerShell , 41 байт

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

Спробуйте в Інтернеті!

Двічі цикл за діапазоном 1..-1, з -nOt eQuals в кінці кінців , щоб витягнути сторонній 0,0елемент. Їх поодинці залишають на конвеєрі, і неявна Write-outputпри завершенні програми надає нам нові лінії безкоштовно.


На жаль, тільки вихідний рядок баребонів на два байти коротший:

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

Але це нудно.



3

J , 18 16 байт

echo}.,{;~0 1 _1

Спробуйте в Інтернеті!


Чому мінус відображається як підкреслення в TIO?
Мертвий Поссум

18 байт альтернатива: echo }.>,{;~0 1 _1 TIO
Гален Іванов

@Dead Possum Негативні цифри відображаються підкресленням у J
Гален Іванов,

1
Так, 17 :) echo}.>,{;~0 1 _1
Гален Іванов

2
Це echoпотрібно?
Коул

3

CJam , 13 байт

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

Спробуйте в Інтернеті!

Пояснення

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 байти

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

Спробуйте в Інтернеті!

Я відчуваю, що в цьому виклику відсутні відповіді з 2D мов, навіть якщо більшість не рухається по діагоналі. Це виводить пробіли, розділені числами, кожна пара розділена вкладками.




3

MATL , 12 байт

3:qq2Z^[]5Y(

Спробуйте в MATL Online!

Моя перша в історії серйозна відповідь MATL! Велике спасибі Луїсу Мендо , Санчісе і DJMcMayhem за допомогу.

Як це працює

3: qq2Z ^ [] 5Y (- Повна програма. Виводи в STDOUT.
3: - Діапазон 3. Натисніть [1 2 3] до стеку.
  qq - зменшення на 2. Врожайність [-1 0 1].
    2Z ^ - декартова сила 2.
         5Y (- Замініть рядок в індексі 5 на ...
       [] - порожній вектор.


3

Баш , 30 байт

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

Спробуйте в Інтернеті!

Друкує пробіл у кожному рядку, але останній. (Завдяки @Neil - це оригінально надруковано провідний простір, але кращий простір кращий відповідно до їх коментаря)


Я думаю, ви могли б надрукувати пробіл на всіх, окрім останнього рядка, як альтернативу.
Ніл

2

Пакет, 77 байт

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

63 байти, якщо нестандартний роздільник дозволений:

@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 байт

t^+U2_1 2

Спробуйте тут

Пояснення

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

Еквівалентно ми могли б скористатися t*J+U2_1J, але це не короткіше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.