Matrizes em colapso

18

Relacionados: Vamos design um dígito mosaico , Impressão / Output da L-Phabet . Sandbox postar aqui

Dadas 2 entradas C = columns and rows, S = starting pointproduzem uma matriz da seguinte maneira:

Input 4, 3

1   2   3   0
2   2   3   0
3   3   3   0
0   0   0   0

Explicação

Dado C = 4, S = 3

1) Crie uma C x Cmatriz preenchida com0

         4 columns
4     _____|____
     |          |
r  --0  0   0   0
o |  0  0   0   0
w |  0  0   0   0
s  --0  0   0   0

2) Preencha com os Svalores na linha e na coluna S, subtraia 1 de Se repita até S = 0. Este casoS = 3

             Column 3 
S = 3           |
                v
        0   0   3   0
        0   0   3   0
Row 3-->3   3   3   0
        0   0   0   0


         Column 2
S = 2       |
            v
        0   2   3   0
Row 2-->2   2   3   0
        3   3   3   0
        0   0   0   0


     Column 1
S=1     |
        v
Row 1-->1   2   3   0
        2   2   3   0
        3   3   3   0
        0   0   0   0



Final Result

1   2   3   0
2   2   3   0
3   3   3   0
0   0   0   0

Regras

  • Presumir C >= S >= 0
  • A saída pode ser uma matriz, lista de listas, matriz (unidimensional ou bidimensional) etc.
  • Você pode receber entradas através de qualquer formato de E / S padrão
  • Seu programa, função, etc ... pode ser indexação 1 ou 0. Especifique qual é.

Nota A explicação é de 1 indexação


Critérios de vencimento

Luis felipe De jesus Munoz
fonte

Respostas:

6

Gelatina , 8 bytes

»>⁴¬×»µþ

Experimente online!

Como funciona

Produto externo Jelly's Atom ( þ)

Você pode pensar no átomo do produto externo de Jelly þ, como um operador rápido que, dados os argumentos inteiros e Y (neste caso, X = Y = primeiro argumento  ), produz a seguinte matriz de tuplas:XYX=Y=first argument 

[(1,1)(2,1)(3,1)(X,1)(1,2)(2,2)(3,2)(X,2)(1,Y)(2,Y)(3,Y)(X,Y)]

Ele também aplica o link antes de todos os pares, vamos chamá-lo , que se comporta como uma função que recebe dois argumentos, produzindo algo como isto:f

[f(1,1)f(2,1)f(3,1)f(X,1)f(1,2)f(2,2)f(3,2)f(X,2)f(1,Y)f(2,Y)f(3,Y)f(X,Y)]

Como isso é relevante para a tarefa em questão?

Isso funciona ao observar que todo valor na saída esperada é apenas uma tabela de índices máximos ou se esse máximo exceder nosso segundo argumento. Portanto, podemos criar o seguinte link para executar esse mapeamento:0

»>⁴¬×» – Dyadic (2-argument) link.
»      – Maximum of the X, Y coordinates.
 >⁴    – Check if this exceeds the second argument of the program.
   ¬   – Negate this boolean.
    ×» – And multiply by the maximum, computed again.
Mr. Xcoder
fonte
6

R , 47 41 bytes

function(C,S,m=outer(1:C,1:C,pmax))m*!m>S

Experimente online!

1 indexado. Gera as saídas para S==C(sem zeros) e zera as células que têm um valor >Susando a multiplicação de matrizes (obrigado Giuseppe por 4 bytes!).

JayCe
fonte
Arrumado! multiplicação vai te alguma boa quilometragem: 43 bytes
Giuseppe
@Giuseppe tx! Eu era capaz de economizar mais dois :)
Jayce
5

Oitava , 31 bytes

@(C,S)(u=max(t=1:C,t')).*(u<=S)

Função anônima que retorna uma matriz. Usa indexação baseada em 1.

Experimente online!

Luis Mendo
fonte
5

Haskell , 47 45 bytes

-2 bytes, alterando o formato de saída para lista unidimensional.

c&s|x<-[1..c]=[sum[j|j<=s]|j<-x>>=(<$>x).max]

Experimente online!

Explicação

O termo x >>= (<$> x) . maxé uma versão em golfe de

concat [ max i <$> x | i <- x ]

que avalia como [1,2,3,4..c, 2,2,3,4..c, 3,3,3,4..c, ..., c,c,c,c..c]. Agora, precisamos forçar os valores apenas 0quando eles excederem o sque alcançamos sum [ j | j <= s].

ბიმო
fonte
3

APL (Dyalog) , 12 bytes

o×⎕≥o←∘.⌈⍨⍳⎕

Experimente online!

Uriel
fonte
Algo como isso o×⎕≥o←∘.⌈⍨⍳seria permitido ou você teria que atribuí-lo a uma função para que isso conte?
Zacharý
@ Zachary meu palpite é que seria preciso ser colocá-lo dentro de um tradfn com um argumento ou um NDR
Uriel
3

JavaScript (ES6), 61 bytes

Recebe entrada na sintaxe de curry (c)(s), onde s é indexado em 1. Retorna uma matriz unidimensional.

c=>s=>[...Array(c*c)].map((_,k)=>(k=k%c>k/c?k%c:k/c)<s?-~k:0)

Experimente online!

Arnauld
fonte
3

Gelatina , 6 bytes

⁴Ri»µþ

Um programa completo * que recebe números inteiros Ce Sque imprime a representação do Jelly de uma lista de listas de números inteiros, conforme definido (1-indexado).

Experimente online! (formata o resultado da díade como uma grade de números para facilitar a leitura)

Quão?

⁴Ri»µþ - Main Link: C, S
     þ - outer product with:
    µ  -   the monadic function (i.e. f(x,y) for x in [1..C] for y in [1..C]):
   »   -     maximum (of x and y)
⁴      -     program's 4th argument = 2nd input = S
 R     -     range = [1,2,3,...S]
  i    -     first index of (the maximum) in (the range) or 0 if not found
       - as a full program: implicit print

* A razão pela qual este é um programa completo é o uso do acesso ao argumento do programa ,. Como um link diádico, esse código dependeria de como o programa que o está usando é chamado.
Link diádico reutilizável em 8 bytes (com S à esquerda e C à direita): Link diádico reutilizável em 8 bytes (com C à esquerda e S à direita):RiⱮⱮ»þ`}
RiⱮⱮ⁹»þ¤

Jonathan Allan
fonte
2

Java 10, 88 bytes

C->S->{var r=new int[C][C];for(;S>0;)for(int s=S--;s-->0;)r[S][s]=r[s][S]=S+1;return r;}

Experimente online.

Explicação:

C->S->{                     // Method with two int parameters and int-matrix return-type
  var r=new int[C][C];      //  Result-matrix of size `C` by `C`
  for(;S>0;)                //  Loop as long as `S` is not 0 yet:
    for(int s=S--;s-->0;)   //   Inner loop `s` in the range (`S`, 0]
                            //   (and decrease `S` by 1 in the process with `S--`)
      r[S][s]=r[s][S]=S+1;  //    Set the values at both {`S`,`s`} and {`s`,`S`} to `S+1`
  return r;}                //  Return the result
Kevin Cruijssen
fonte
2

PHP , 92 bytes

Isso é "indexação 1".

<?list(,$c,$s)=$argv;for(;$i++<$c;print"\n")for($j=0;$j++<$c;)echo$s<$i||$s<$j?0:max($i,$j);

Para executá-lo:

php -n <filename> <c> <s>

Exemplo:

php -n collapsing_matrice.php 8 6

Ou Experimente online!

Night2
fonte
2

Stax , 10 bytes

▓╜.→,cΘ○╤æ

Execute e depure

Como funciona:

R(Xm]i*xit+J Full program, implicit input.
R            1-based range of S
 (           Right-pad with zeroes to length C
  X          Save to X register
   m         Map (same as here):
    ]          Wrap in list
     i*        repeat by iteration index
       xit     Remove first  elements from X register
          +    Append
           J   Stringify each element, and join by space

wastl
fonte
2

Excel VBA, 65 bytes

Uma função de janela imediata que recebe as entradas [A1:B1]e saídas no intervalo [C1].Resize([A1],[A1]).

[C1].Resize([A1],[A1])=0:For s=-[B1]To-1:[C1].Resize(-s,-s)=-s:Next

Entrada / Saída

A entrada está dentro do intervalo [A1:B1]

I / O

Taylor Scott
fonte
2

MATLAB, 58 bytes (Graças a usuário anônimo)

function o=f(c,s);o=zeros(c);for j=s:-1:1;o(1:j,1:j)=j;end

Basta preencher os elementos da matriz com o número apropriado, executando um loop. Talvez seja possível ser mais inteligente comarrayfun

aaaaa diz restabelecer Monica
fonte
Você não precisa nomear a função e pode usar zeros(c)quais cofres em alguns bytes. Você também viu essa resposta do Oitava, acho que também funcionaria no Matlab?
ბიმო
@ OMᗺ Octave, você não pode nomear variáveis ​​dentro de funções anônimas no matlab. Além disso, é max()preciso ter argumentos da mesma forma
aaaaa diz restabelecer Monica
1
Um usuário anônimo sugeriu function o=f(c,s);o=zeros(c);for j=s:-1:1;o(1:s,1:s)=j;end.
22618 Jonathan Frech
@JonathanFrech oh meu muito mais simples :-( só precisa sero(1:j,1:j)=j
aaaaa diz restabelecer Monica
1

Python 2 , 58 bytes

lambda C,S:[-~max(i%C,i/C)*(i%C<S>i/C)for i in range(C*C)]

Experimente online!

Produz uma lista 1D de comprimento C*C.

Chas Brown
fonte
1

Carvão , 19 bytes

Eθ⪫IEEθ⌈⟦ιλ⟧∧‹λη⊕λ 

Experimente online! Link é a versão detalhada do código. 3 bytes usados ​​para converter a saída em decimal e formatá-la bem. Explicação:

 θ                  Input `C`
E                   Map over implicit range
      θ             Input `C`
     E              Map over implicit range
          λ         Inner index
         ι          Outer index
       ⌈⟦  ⟧        Maximium
    E               Map over results
              λ     Current value
               η    Input `S`
             ‹      Less than
                 λ  Current value
                ⊕   Incremented
            ∧       Logical AND
   I                Cast to string
  ⪫                 Join with spaces
                    Implicitly print on separate lines
Neil
fonte
1

Limpo , 67 bytes

import StdEnv
$n s=[[if(i>s||j>s)0(max i j)\\i<-[1..n]]\\j<-[1..n]]

Experimente online!

Define $ :: Int Int -> [[Int]]a resposta usando a indexação baseada em 1.

Furioso
fonte
0

Mathematica 44 bytes

Table[If[i <= s && j <= s, Max[i, j], 0], {i, c}, {j, c}]
David G. Stork
fonte
Tem certeza de que o espaço em branco é necessário? Não posso testar o Mathematica, mas acho que não.
Assistente de trigo