Друкуйте масиви зсередини


10

Це питання з кодовим гольфом.

З урахуванням цілих чисел s та n завдання полягає у виведенні всіх масивів довжиною n, які приймають значення від -s до s. Єдиний поворот полягає в тому, що ви повинні вивести їх у наступному порядку.

  • Усі нульові масиви довжиною n.
  • Усі масиви довжиною n з елементами від -1 до 1, виключаючи будь-який масив, який ви вивели раніше.
  • Усі масиви довжиною n з елементами від -2 до 2, виключаючи будь-який масив, який ви вивели раніше.
  • І так далі, поки ви не отримаєте всі масиви довжиною n з елементами від -s до s, виключаючи будь-який масив, який ви вивели раніше.

Ви повинні вивести один масив на рядок. Вони можуть бути розділені пробілом або комами.

Ось кілька невідповідних кодів python, який виводить масиви / списки / кортежі в потрібному порядку.

import itertools

s =  3
n = 2

oldsofar = set()
newsofar = set()
for i in xrange(s):
    for k in itertools.product(range(-i,i+1), repeat = n):
        newsofar.add(k)
    print newsofar - oldsofar
    oldsofar = newsofar.copy()
    print "***"

Додаткова слава (і відгук від мене) за відповіді, які не виконують заданих віднімань або еквівалентів.


1
Чи можемо ми записати функцію, яка друкує результат?
LegionMammal978

@ LegionMammal978 Я вважаю за краще повноцінну програму. Якщо це буде серйозно суперечливим, я, звичайно,

Чи є необхідне замовлення в кожному з пунктів кулі?
Мартін Ендер

@ MartinBüttner Ні, зовсім не.

Відповіді:


6

Желе, 9 байт

NRṗµAṀ€Ụị

Жодне віднімання списку не використовувалося при створенні цієї публікації. Спробуйте в Інтернеті!

Як це працює

NRṗµAṀ€Ụị  Main link. Arguments: s, n

N          Negate; yield -s.
 R         Range; yield [-s, ..., s].
  ṗ        Cartesian power; push all vectors of length n of those elements.
   µ       Begin a new, monadic link. Argument: L (list of vectors)
    A      Compute the absolute values of all vector components.
     Ṁ€    Get the maximum component of each vector.
       Ụ   Sort the indices of A according to the maximal absolute value of the
           corresponding vector's components.
        ị  Retrieve the vectors of A at those indices.

Тепер просто стає дурним!

2
"Жоден список не постраждав при створенні цієї посади"
Денніс ван Гілс

6

MATL , 18 байт

_G2$:iZ^t!|X>4#SY)

Перший вхід - sдругийn

Це працює в поточній версії (15.0.0) мови.

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

Пояснення

_      % take input s implicitly. Negate to obtain -s
G      % push input s again
2$:    % inclusive range from -s to s
i      % take input n
Z^     % Cartesian power. Gives 2D array, with each result on a row
t!     % duplicate and transpose
|      % absolute value
X>     % maximum of each column 
4#S    % sort and push the indices of the sorting
Y)     % apply as row indices into the 2D array. Display implicitly

1
18 байтів обурює :)

4

Haskell, 61 60 байт

n#s=[c|b<-[0..s],c<-mapM id$[-b..b]<$[1..n],any((b==).abs)c]

Приклад використання: 2#2-> [[0,0],[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1],[-2,-2],[-2,-1],[-2,0],[-2,1],[-2,2],[-1,-2],[-1,2],[0,-2],[0,2],[1,-2],[1,2],[2,-2],[2,-1],[2,0],[2,1],[2,2]].

Як це працює:

   b<-[0..s]                           -- loop b through 0 .. s
        c<-mapM id$[-b..b]<$[1..n]     -- loop c through all lists of length n
                                       -- made out of the numbers -b .. b
                                       -- ("[-b..b]<$[1..n]" is "replicate n [-b..b]";
                                       --  "mapM id" is "sequence")
[c|                 ,any((b==).abs)c]  -- keep c if it contains b or -b

Редагувати: @xnor вказав, що mapM idце sequence.


mapM idкоротше, ніж sequence.
xnor

@xnor: Правда. Дякую!
німі

2

Математика, 83 байти

Print/@Select[Range[-#,b=#]~Tuples~a,Abs@#~MemberQ~b&]&/@Range[0,a=Input[];Input[]]

Для використання введіть сценарій та введіть nпотім sокремі рядки. Друкує кожен масив у фігурному списку, обмеженому комами (наприклад, {-1, 0, 1}). Він працює, беручи кожен список довжини nз числами між ними [-cur..cur]та друкуючи ті, що включають -curабо cur. Потім це повторюється для всіх curв [0..s]. (Ця публікація містить 19 символів!)


1

JavaScript (SpiderMonkey 30+), 134 байти

(s,n)=>n?[for(a of f(s,n-1))for(i of Array(s*2+1).keys())[i-n,...a]].sort((a,b)=>g(a)-g(b),g=a=>Math.max(...a,-Math.min(...a))):[[]]

Використовує декартовий силовий і сортуючий підхід, про який я думав окремо, але в той час я перекомпонував SpiderMonkey, тому я не зміг відповісти на це перед @Dennis.

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