Matrizen reduzieren

18

Verwandte: Lassen Sie uns Design eine Ziffer Mosaik , Print / Output der L-Phabet . Sandbox-Post hier

Bei 2 Eingaben C = columns and rows, S = starting pointwird eine Matrix wie folgt ausgegeben:

Input 4, 3

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

Erläuterung

Gegeben C = 4, S = 3

1) Erstellen Sie eine C x CMatrix gefüllt mit0

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

2) Füllen Sie die SZeilen und Spalten mit Werten S, subtrahieren Sie dann 1 von Sund wiederholen Sie den Vorgang bis S = 0. Dieser FallS = 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

Regeln

  • Annehmen C >= S >= 0
  • Die Ausgabe kann eine Matrix, eine Liste von Listen, ein Array (eindimensional oder zweidimensional) usw. sein.
  • Sie können Eingaben über jedes Standard-E / A-Format vornehmen
  • Ihr Programm, Ihre Funktion usw. können 1-indiziert oder 0-indiziert sein. Bitte geben Sie an, um welche es sich handelt.

Hinweis: Erläuterung ist 1-Indizierung


Gewinnkriterien

Luis Felipe De Jesus Munoz
quelle

Antworten:

6

Gelee , 8 Bytes

»>⁴¬×»µþ

Probieren Sie es online!

Wie es funktioniert

Jellys äußeres Produktatom ( þ)

Sie können sich Jellys äußeres Produktatom þals einen schnellen Operator vorstellen, der bei ganzzahligen Argumenten und Y (in diesem Fall X = Y = erstes Argument  ) die folgende Tupelmatrix erzeugt:XY.X=Y.=erstes 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.)]

Es wendet auch den Link direkt davor auf alle Paare an, nennen wir ihn , das sich wie eine Funktion verhält, die zwei Argumente annimmt und ungefähr so ​​aussieht: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.)]

Wie ist es für die anstehende Aufgabe relevant?

Dies funktioniert, indem festgestellt wird, dass jeder Wert in der erwarteten Ausgabe nur eine Tabelle der Maximalindizes ist , oder wenn dieses Maximum unser zweites Argument überschreitet. Daher können wir den folgenden Link erstellen, um diese Zuordnung durchzuführen: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
quelle
6

R , 47 41 Bytes

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

Probieren Sie es online!

1-indiziert. Erzeugt die Ausgaben für S==C(keine Nullen) und setzt dann Zellen mit einem Wert >Sdurch Matrixmultiplikation auf Null (danke Giuseppe für 4 Bytes!).

JayCe
quelle
Ordentlich! Die Multiplikation bringt Ihnen eine gute Laufleistung: 43 Bytes
Giuseppe
@ Giuseppe TX! Ich konnte zwei weitere retten :)
JayCe
5

Haskell , 47 45 Bytes

-2 Bytes durch Ändern des Ausgabeformats in eine eindimensionale Liste.

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

Probieren Sie es online!

Erläuterung

Der Begriff x >>= (<$> x) . maxist eine Golfversion von

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

die auswertet zu [1,2,3,4..c, 2,2,3,4..c, 3,3,3,4..c, ..., c,c,c,c..c]. Jetzt müssen wir die Werte nur zwingen, 0sobald sie die Werte überschreiten, mit sdenen wir sie erreichen sum [ j | j <= s].

ბიმო
quelle
3

APL (Dyalog) , 12 Bytes

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

Probieren Sie es online!

Uriel
quelle
Wäre so etwas o×⎕≥o←∘.⌈⍨⍳erlaubt oder müssten Sie es einer Funktion zuordnen, damit das zählt?
Zacharý
@ Zacharý Ich vermute, dass man es in eine Tradfn mit einem Argument oder einem DFNS setzen müsste
Uriel
3

JavaScript (ES6), 61 Byte

Übernimmt Eingaben in Currying-Syntax (c)(s), wobei s 1-indiziert ist. Gibt ein eindimensionales Array zurück.

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

Probieren Sie es online!

Arnauld
quelle
3

Gelee , 6 Bytes

⁴Ri»µþ

Ein vollständiges Programm *, das Ganzzahlen aufnimmt Cund Sdas die Jelly-Darstellung einer Liste von definierten Ganzzahlenlisten (1-indiziert) ausgibt.

Probieren Sie es online! (formatiert das Ergebnis der Dyade als Zahlenraster zum leichteren Ablesen)

Wie?

⁴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

* Der Grund dafür ist ein volles Programm ist auf die Verwendung des Programms Argument Zugang nach unten . Als dyadische Verknüpfung würde dieser Code davon abhängen, wie das Programm, das ihn verwendet, aufgerufen wird.
Wiederverwendbare dyadische Verknüpfung in 8 Bytes (mit S links und C rechts): Wiederverwendbare dyadische Verknüpfung in 8 Bytes (mit C links und S rechts):RiⱮⱮ»þ`}
RiⱮⱮ⁹»þ¤

Jonathan Allan
quelle
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;}

Probieren Sie es online aus.

Erläuterung:

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
quelle
2

PHP , 92 Bytes

Dies ist "1-Indizierung".

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

Um es auszuführen:

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

Beispiel:

php -n collapsing_matrice.php 8 6

Oder versuchen Sie es online!

Night2
quelle
2

Stax , 10 Bytes

▓╜.→,cΘ○╤æ

Führen Sie es aus und debuggen Sie es

Wie es funktioniert:

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
quelle
2

Excel VBA, 65 Bytes

Eine Sofortfensterfunktion, die Eingaben aus [A1:B1]dem Bereich und Ausgaben in den Bereich übernimmt [C1].Resize([A1],[A1]).

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

Input-Output

Die Eingabe ist in Reichweite [A1:B1]

I / O

Taylor Scott
quelle
2

MATLAB, 58 Bytes (Dank anonymer Benutzer)

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

Füllen Sie einfach die Elemente der Matrix mit der entsprechenden Nummer und führen Sie eine Schleife aus. Möglicherweise möglich, klüger mit zu seinarrayfun

aaaaa sagt wieder Monica
quelle
Sie brauchen die Funktion nicht zu benennen und können verwenden, zeros(c)was einige Bytes sichert. Haben Sie auch diese Antwort von Octave gesehen, ich denke, es würde auch in Matlab funktionieren?
20.
@ OMᗺ Octave Sie können in matlab keine Variablen in anonymen Funktionen benennen. Auch max()müssen gleichartige Argumente nehmen
aaaaa sagt wieder Monica
1
Ein anonymer Benutzer schlug vor function o=f(c,s);o=zeros(c);for j=s:-1:1;o(1:s,1:s)=j;end.
Jonathan Frech
@ JonathanFrech oh mein so viel einfacher :-( muss nur seino(1:j,1:j)=j
aaaaa sagt wieder 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)]

Probieren Sie es online!

Gibt eine 1D-Längenliste aus C*C.

Chas Brown
quelle
1

Holzkohle , 19 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. 3 Bytes zum Konvertieren der Ausgabe in eine Dezimalzahl und zum Formatieren. Erläuterung:

 θ                  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
quelle
1

Sauber , 67 Bytes

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

Probieren Sie es online!

Definiert das $ :: Int Int -> [[Int]]Geben einer Antwort mithilfe der 1-basierten Indizierung.

Οurous
quelle
0

Mathematica 44 Bytes

Table[If[i <= s && j <= s, Max[i, j], 0], {i, c}, {j, c}]
David G. Stork
quelle
Sind Sie sicher, dass das Leerzeichen erforderlich ist? Ich kann Mathematica nicht testen, aber ich glaube nicht, dass es das ist.
Weizen-Assistent