Matrices Colapsadas


18

Relacionado: Diseñemos un mosaico de dígitos , Imprima / Imprima el L-phabet . Sandbox publica aquí

Dadas 2 entradas C = columns and rows, S = starting pointsalen una matriz de la siguiente manera:

Input 4, 3

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

Explicación

Dado C = 4, S = 3

1) Crear una C x Cmatriz llena de0

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

2) Rellene con Svalores dentro de la fila y columna S, luego reste 1 Sy repita hasta 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

Reglas

  • Asumir C >= S >= 0
  • La salida puede ser una matriz, una lista de listas, una matriz (unidimensional o bidimensional), etc.
  • Puede tomar entradas a través de cualquier formato de E / S predeterminado
  • Su programa, función, etc ... puede ser indexación 1 o indexación 0. Por favor especifique cuál es.

Nota La explicación es indexación 1


Criterio ganador

Respuestas:


6

Jalea , 8 bytes

»>⁴¬×»µþ

Pruébalo en línea!

Cómo funciona

Átomo de producto externo de gelatina ( þ)

Puede pensar en el átomo de producto externo de Jelly þ, como un rápido (operador) que, dados los argumentos enteros e Y (en este caso X = Y = primer argumento  ), produce la siguiente 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)]

También aplica el enlace justo antes de él a todos los pares, llamémoslo , que se comporta como una función que toma dos argumentos, produciendo algo como esto: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)]

¿Cómo es relevante para la tarea en cuestión?

Esto funciona al notar que cada valor en la salida esperada es solo una tabla de índices máximos, o si este máximo excede nuestro segundo argumento. Por lo tanto, podemos crear el siguiente enlace para realizar esta asignación:0 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.

6

R , 47 41 bytes

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

Pruébalo en línea!

1 indexado. Genera las salidas para S==C(sin ceros) y luego pone a cero las celdas que tienen un valor >Susando la multiplicación de matrices (¡gracias Giuseppe por 4 bytes!).


¡Ordenado! la multiplicación te dará un buen kilometraje: 43 bytes
Giuseppe

@Giuseppe tx! Pude guardar dos más :)
JayCe


5

Haskell , 47 45 bytes

-2 bytes cambiando el formato de salida a una lista unidimensional.

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

Pruébalo en línea!

Explicación

El término x >>= (<$> x) . maxes una versión de golf de

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

que será evaluado [1,2,3,4..c, 2,2,3,4..c, 3,3,3,4..c, ..., c,c,c,c..c]. Ahora solo necesitamos forzar los valores 0una vez que exceden los valores sque alcanzamos sum [ j | j <= s].



3

APL (Dyalog) , 12 bytes

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

Pruébalo en línea!


¿ o×⎕≥o←∘.⌈⍨⍳Se permitiría algo , o tendría que asignarlo a una función para que eso cuente?
Zacharý

@ Zacharý, supongo que habría que ponerlo dentro de un tradfn con una discusión o un dfns
Uriel

3

JavaScript (ES6), 61 bytes

Toma entrada en la sintaxis de curry (c)(s), donde s está indexado en 1. Devuelve una matriz unidimensional.

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

Pruébalo en línea!


3

Jalea , 6 bytes

⁴Ri»µþ

Un programa completo * que toma enteros Cy Sque imprime la representación Jelly de una lista de listas de enteros como se define (1 indexado).

Pruébalo en línea! (Formatea el resultado de la díada como una cuadrícula de números para facilitar la lectura)

¿Cómo?

⁴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

* La razón de que esto es un programa completo se debe al uso de la conexión argumento programa, . Como enlace diádico, este código dependería de cómo se llame al programa que lo está utilizando.
Enlace diádico reutilizable en 8 bytes (tomando S a la izquierda y C a la derecha): Enlace diádico reutilizable en 8 bytes (tomando C a la izquierda y S a la derecha):RiⱮⱮ»þ`}
RiⱮⱮ⁹»þ¤


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;}

Pruébalo en línea.

Explicación:

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

2

PHP , 92 bytes

Esto es "1 indexación".

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

Para ejecutarlo:

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

Ejemplo:

php -n collapsing_matrice.php 8 6

O Pruébelo en línea!


2

Stax , 10 bytes

▓╜.→,cΘ○╤æ

Ejecutar y depurarlo

Cómo 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


2

Excel VBA, 65 bytes

Una función de ventana inmediata que toma entradas [A1:B1]y salidas al rango [C1].Resize([A1],[A1]).

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

De entrada y salida

La entrada está en el rango [A1:B1]

I / O



2

MATLAB, 58 bytes (Gracias al usuario anónimo)

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

Simplemente llenando los elementos de la matriz con el número apropiado, ejecutando un bucle. Tal vez sea posible ser más inteligente conarrayfun


No necesita nombrar la función y puede usar la zeros(c)que guarda algunos bytes. ¿También viste esta respuesta de Octave, supongo que también funcionaría en Matlab?
ბიმო

@ OMᗺ Octave no puede nombrar variables dentro de funciones anónimas en matlab. Además, max()tengo que tomar argumentos de la misma forma
aaaaa dice que reinstalar a Monica el

1
Un usuario anónimo sugirió function o=f(c,s);o=zeros(c);for j=s:-1:1;o(1:s,1:s)=j;end.
Jonathan Frech

@JonathanFrech oh, mi mucho más simple :-( solo tiene que serloo(1:j,1:j)=j
aaaaa dice que reinstale a Mónica el



1

Carbón de leña , 19 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. 3 bytes utilizados para convertir la salida a decimal y formatearla bien. Explicación:

 θ                  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

1

Limpio , 67 bytes

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

Pruébalo en línea!

Define $ :: Int Int -> [[Int]]dar una respuesta usando indexación basada en 1.



0

Mathematica 44 bytes

Table[If[i <= s && j <= s, Max[i, j], 0], {i, c}, {j, c}]

¿Estás seguro de que el espacio en blanco es necesario? No puedo probar Mathematica pero no creo que lo sea.
Wheat Wizard
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.