Imprimir matrizes do meio para fora


10

Esta é uma questão de código-golfe.

Dados inteiros s e n, a tarefa é gerar todas as matrizes de comprimento n que levam valores de -s a s. O único problema é que você deve produzi-los na seguinte ordem.

  • A matriz com todos os zeros de comprimento n.
  • Todas as matrizes de comprimento n com elementos de -1 a 1, excluindo qualquer matriz que você tenha gerado anteriormente.
  • Todas as matrizes de comprimento n com elementos de -2 a 2, excluindo qualquer matriz que você tenha gerado anteriormente.
  • E assim por diante até chegar a todas as matrizes de comprimento n com elementos de -s a s, excluindo qualquer matriz que você tenha gerado anteriormente.

Você deve gerar uma matriz por linha. Eles podem ser separados por espaço ou vírgula.

Aqui está um código python não compatível que gera as matrizes / listas / tuplas na ordem correta.

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 "***"

Glória extra (e um voto positivo de mim) por respostas que não executam nenhuma subtração definida ou equivalente.


11
Podemos escrever uma função que imprima o resultado?
LegionMammal978

@ LegionMammal978 Eu preferiria um programa completo. Se isso for considerado seriamente polêmico, vou ceder, é claro :) #

Existe algum pedido necessário em cada um dos seus pontos de bala?
Martin Ender

@ MartinBüttner Não, de jeito nenhum.

Respostas:


6

Geléia, 9 bytes

NRṗµAṀ€Ụị

Nenhuma subtração de lista foi usada na criação deste post. Experimente online!

Como funciona

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.

Agora está ficando bobo!

2
"Nenhuma lista foi prejudicada na criação deste post"
Dennis van Gils

6

MATL , 18 bytes

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

A primeira entrada é s, a segunda én

Isso funciona na versão atual (15.0.0) do idioma.

Experimente online!

Explicação

_      % 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

11
18 bytes é :) exorbitante

4

Haskell, 61 60 bytes

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

Exemplo de uso: 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]].

Como funciona:

   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

Edit: @xnor apontou que mapM idé sequence.


mapM idé mais curto que sequence.
Xnor

@xnor: Verdadeiro. Obrigado!
nimi

2

Mathematica, 83 bytes

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

Para usar, coloque em um roteiro e de entrada n, em seguida, sem linhas separadas. Imprime cada matriz como uma lista entre colchetes e delimitada por vírgulas (por exemplo, {-1, 0, 1}). Ele funciona tomando todas as listas de tamanhos ncom números entre ee [-cur..cur]imprimindo aqueles que incluem um -curou outro cur. Em seguida, ele repete este para todos curem [0..s]. (Este post contém 19 `caracteres!)


1

JavaScript (SpiderMonkey 30+), 134 bytes

(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))):[[]]

Usa a abordagem cartesiana de poder e classificação, que pensei separadamente, mas estava recompilando o SpiderMonkey na época, então não consegui responder antes do @Dennis.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.