Matrix with two diagonals
- Task
Draw a square matrix which has 1's on both diagonals but 0's elsewhere.
If you can please use GUI
Ada
<lang Ada>with Ada.Text_Io; use Ada.Text_Io; with Ada.Command_Line;
procedure Matrix_With_Diagonals is
type Matrix_Type is array (Positive range <>, Positive range <>) of Character;
function Matrix_X (Length : Natural) return Matrix_Type is begin return M : Matrix_Type (1 .. Length, 1 .. Length) do for Row in M'Range (1) loop for Col in M'Range (2) loop M (Row, Col) := (if Row = Col or else Row = M'Last (2) - (Col - M'First (1)) then '1' else '0'); end loop; end loop; end return; end Matrix_X;
procedure Put (M : Matrix_Type) is begin for Row in M'Range (1) loop for Col in M'Range (2) loop Put (' '); Put (M (Row, Col)); end loop; New_Line; end loop; end Put;
begin
Put (Matrix_X (Length => Natural'Value (Ada.Command_Line.Argument (1))));
exception
when others => Put_Line ("Usage: ./matrix_with_diagonals <side-length>");
end Matrix_With_Diagonals;</lang>
ALGOL 68
<lang algol68>BEGIN # draw a matrix with 1s on the diagonals and 0s elsewhere #
# draws a matrix with height and width = n with 1s on the diagonals # PROC draw 2 diagonals = ( INT n )VOID: BEGIN INT l pos := 1; INT r pos := n; FOR i TO n DO FOR j TO n DO print( ( " ", whole( ABS ( j = l pos OR j = rpos ), 0 ) ) ) OD; print( ( newline ) ); l pos +:= 1; r pos -:= 1 OD END # draw 2 diagonals # ; # test the draw 2 diagonals procedure # draw 2 diagonals( 10 ); print( ( newline ) ); draw 2 diagonals( 11 )
END</lang>
- Output:
1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1
AppleScript
Procedural
<lang applescript>on twoDiagonalMatrix(n)
if (n < 2) then error "twoDiagonalMatrix() handler: parameter must be > 1." set digits to {} set oddness to n mod 2 repeat (n - 1 + oddness) times set end of digits to 0 end repeat set m to n div 2 + oddness -- Middle index of digit source list. set item m of digits to 1 set matrix to {} set leftLen to m - 1 -- Length of left end of each row - 1. set rightLen to leftLen - oddness -- Length of right end ditto. -- Assemble the first m rows from the relevant sections of 'digits'. repeat with i from m to 1 by -1 set end of matrix to items i thru (i + leftLen) of digits & items -(i + rightLen) thru -i of digits end repeat -- The remaining rows are the reverse of these, not repeating the mth where n is odd. return matrix & reverse of items 1 thru (m - oddness) of matrix
end twoDiagonalMatrix
-- Task code. on matrixToText(matrix, separator)
copy matrix to matrix set astid to AppleScript's text item delimiters set AppleScript's text item delimiters to separator repeat with thisLine in matrix set thisLine's contents to thisLine as text end repeat set AppleScript's text item delimiters to linefeed set matrix to matrix as text set AppleScript's text item delimiters to astid return matrix
end matrixToText
return linefeed & matrixToText(twoDiagonalMatrix(7), space) & ¬
(linefeed & linefeed & matrixToText(twoDiagonalMatrix(8), space))</lang>
- Output:
<lang applescript>" 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1
1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1"</lang>
Functional
<lang applescript>---------------- MATRIX WITH TWO DIAGONALS ---------------
-- bothDiagonals :: Int -> Int on bothDiagonals(n)
-- A square matrix of dimension n with ones -- along both diagonals, and zeros elsewhere. script idOrReflection on |λ|(x, y) ({y, 1 + n - y} contains x) as integer end |λ| end script matrix(n, n, idOrReflection)
end bothDiagonals
TEST -------------------------
on run
-- Two diagonal matrices of dimensions 7 and 8 unlines(map(compose(showMatrix, bothDiagonals), ¬ {7, 8}))
end run
GENERIC ------------------------
-- compose (<<<) :: (b -> c) -> (a -> b) -> a -> c on compose(f, g)
script property mf : mReturn(f) property mg : mReturn(g) on |λ|(x) mf's |λ|(mg's |λ|(x)) end |λ| end script
end compose
-- enumFromTo :: Int -> Int -> [Int]
on enumFromTo(m, n)
if m ≤ n then set xs to {} repeat with i from m to n set end of xs to i end repeat xs else {} end if
end enumFromTo
-- matrix :: Int -> Int -> ((Int, Int) -> a) -> a
on matrix(nRows, nCols, f)
-- A matrix of a given number of columns and rows, -- in which each value is a given function of its -- (zero-based) column and row indices. script go property g : mReturn(f)'s |λ| on |λ|(iRow) set xs to {} repeat with iCol from 1 to nCols set end of xs to g(iRow, iCol) end repeat xs end |λ| end script map(go, enumFromTo(1, nRows))
end matrix
-- map :: (a -> b) -> [a] -> [b]
on map(f, xs)
-- The list obtained by applying f -- to each element of xs. tell mReturn(f) set lng to length of xs set lst to {} repeat with i from 1 to lng set end of lst to |λ|(item i of xs, i, xs) end repeat return lst end tell
end map
-- mReturn :: First-class m => (a -> b) -> m (a -> b)
on mReturn(f)
-- 2nd class handler function lifted into 1st class script wrapper. if script is class of f then f else script property |λ| : f end script end if
end mReturn
-- showMatrix :: a -> String
on showMatrix(rows)
-- String representation of a matrix. script on |λ|(cells) unwords(map(my str, cells)) end |λ| end script unlines(map(result, rows)) & linefeed
end showMatrix
-- str :: a -> String
on str(x)
x as string
end str
-- unlines :: [String] -> String
on unlines(xs)
-- A single string formed by the intercalation -- of a list of strings with the newline character. set {dlm, my text item delimiters} to ¬ {my text item delimiters, linefeed} set s to xs as text set my text item delimiters to dlm s
end unlines
-- unwords :: [String] -> String
on unwords(xs)
set {dlm, my text item delimiters} to ¬ {my text item delimiters, space} set s to xs as text set my text item delimiters to dlm return s
end unwords</lang>
- Output:
1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1
AWK
<lang AWK>
- syntax: GAWK -f MATRIX_WITH_TWO_DIAGONALS.AWK
BEGIN {
for (n=6; n<=7; n++) { for (i=1; i<=n; i++) { for (j=1; j<=n; j++) { tmp = (i==j || i+j==n+1) ? 1 : 0 printf("%2d",tmp) } printf("\n") } print("") } exit(0)
} </lang>
- Output:
1 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1
Basic
<lang qbasic>100 REM 110 REM BI-DIAGONAL MATRIX 120 REM 130 LET N = 7 140 DIM A(N,N) 150 FOR I=1 TO N 150 FOR J=1 TO N 160 LET A(I,J) = 0 170 NEXT J 180 LET J1 = I 190 LET J2 = N - I + 1 200 LET A(I,J1) = 1 210 LET A(I,J2) = 1 220 NEXT I 230 REM 240 FOR I=1 TO N 250 FOR J=1 TO N 260 PRINT " ";A(I,J); 270 NEXT J 280 PRINT 290 NEXT I 300 END </lang>
- Output:
1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1
C
<lang c>#include <stdio.h>
void specialMatrix(unsigned int n) {
int i, j; for (i = 0; i < n; ++i) { for (j = 0; j < n; ++j) { if (i == j || i + j == n - 1) { printf("%d ", 1); } else { printf("%d ", 0); } } printf("\n"); }
}
int main() {
specialMatrix(10); // even n printf("\n"); specialMatrix(11); // odd n return 0;
}</lang>
- Output:
1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1
C++
<lang cpp>#include <concepts>
- include <iostream>
// Print each element of a matrix according to a predicate. It // will print a '1' if the predicate function is true, otherwise '0'. void PrintMatrix(std::predicate<int, int, int> auto f, int size) {
for(int y = 0; y < size; y++) { for(int x = 0; x < size; x++) { std::cout << " " << f(x, y, size); } std::cout << "\n"; } std::cout << "\n";
}
int main() {
// a lambda to create diagonals auto diagonals = [](int x, int y, int size) { return x == y || ((size - x - 1) == y); }; PrintMatrix(diagonals, 8); PrintMatrix(diagonals, 9);
}
</lang>
- Output:
1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1
Excel
LAMBDA
Excel can lift functions over scalar values to functions over two-dimensional arrays.
Here we bind the name TwoDiagonalMatrix to a lambda expression in the Name Manager of the Excel WorkBook:
(See LAMBDA: The ultimate Excel worksheet function)
<lang lisp>TwoDiagonalMatrix =LAMBDA(n,
LET( ixs, SEQUENCE(n, n, 0, 1), x, MOD(ixs, n), y, QUOTIENT(ixs, n), IF(x = y, 1, IF(x = (n - y) - 1, 1, 0) ) )
)</lang>
- Output:
The formulae in cells A2 and B2 populate the whole of each adjacent matrix.
fx | =TwoDiagonalMatrix(A2) | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
A | B | C | D | E | F | G | H | I | ||
1 | N | Matrix | ||||||||
2 | 7 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | ||
3 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | |||
4 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | |||
5 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | |||
6 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | |||
7 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | |||
8 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | |||
9 | ||||||||||
10 | 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | |
11 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | ||
12 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | ||
13 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | ||
14 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | ||
15 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | ||
16 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | ||
17 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
Recent builds of Excel have also introduced a MAKEARRAY function, which takes a lambda expression as an argument.
Binding the name bothDiagonalMatrix in the Excel Name Manager: <lang lisp>bothDiagonalMatrix =LAMBDA(n,
MAKEARRAY( n, n, LAMBDA( x, y, INT(OR( x = y, x = (1 + n - y) )) ) )
)</lang>
- Output:
fx | =bothDiagonalMatrix(A2) | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
A | B | C | D | E | F | G | H | I | ||
1 | N | Matrix | ||||||||
2 | 7 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | ||
3 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | |||
4 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | |||
5 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | |||
6 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | |||
7 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | |||
8 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | |||
9 | ||||||||||
10 | 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | |
11 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | ||
12 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | ||
13 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | ||
14 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | ||
15 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | ||
16 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | ||
17 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
F#
<lang fsharp> // Matrix with two diagonals. Nigel Galloway: February 17th., 2022 let m11 m=Array2D.init m m (fun n g->if n=g || n+g=m-1 then 1 else 0) printfn "%A\n\n%A" (m11 5) (m11 6) </lang>
- Output:
[[1; 0; 0; 0; 1] [0; 1; 0; 1; 0] [0; 0; 1; 0; 0] [0; 1; 0; 1; 0] [1; 0; 0; 0; 1]] [[1; 0; 0; 0; 0; 1] [0; 1; 0; 0; 1; 0] [0; 0; 1; 1; 0; 0] [0; 0; 1; 1; 0; 0] [0; 1; 0; 0; 1; 0] [1; 0; 0; 0; 0; 1]]
Factor
<lang factor>USING: io kernel math math.matrices prettyprint ;
- <x-matrix> ( n -- matrix )
dup dup 1 - '[ 2dup = -rot + _ = or 1 0 ? ] <matrix-by-indices> ;
6 <x-matrix> simple-table. nl 7 <x-matrix> simple-table.</lang>
- Output:
1 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1
FreeBASIC
Text based
<lang freebasic>Sub twoDiagonalMatrix(n As Integer)
For i As Integer = 1 To n For j As Integer = 1 To n Print Iif((i = j) Or (i + j = n + 1), "1 ", "0 "); Next j Print Next i
End Sub
twoDiagonalMatrix(6) Print twoDiagonalMatrix(7) Sleep</lang>
- Output:
1 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1
Graphical
<lang freebasic>Dim As Integer n = 8, size = 60 * n + 70 Screenres size, size, 24 Cls Windowtitle "Matrix with two diagonals"
Dim As Integer beige = Rgb(245, 245, 220), brown = Rgb(171, 82, 54)
For x As Integer = 0 To n
For y As Integer = 0 To n Dim As Integer cx = x*60 + 10 Dim As Integer cy = y*60 + 10 'If (x + y) Mod 2 = 0 Then If (x = y) Or (x + y = n) Then Line (cx,cy) - (cx+50, cy+50), brown, BF Draw String (cx + 20, cy + 20), "1", beige Else Line (cx,cy) - (cx+50, cy+50), beige, BF End If Next y
Next x Bsave "twoDiagonalMatrix.bmp",0 Sleep</lang>
- Output:
https://www.dropbox.com/s/ph9r28gpkp8ao8n/twoDiagonalMatrix.bmp?dl=0
Fortran
Fortran stores data in columns. Therefore, it should be checked whether instead of filling the matrix row by row (as below) it would be better to do it column by column. The profit would be cache hit optimization, better communication between CPU and RAM. Fortran allows you to zero the entire array, such as the a array below, simply by substituting a = 0. Unfortunately, an array 100x100 (that is, the choosen maximum size) would be filled with zeros even if, as in the example, we would need a much smaller array. You can also eliminate the variables j1 and j2 by replacing them with i and n - i + 1 respectively, but the source code would be slightly less readable. <lang Fortran>program prog
dimension a(100, 100)
n = 7
j1 = 1 j2 = n do i = 1, n do j = 1, n a(i, j) = 0. end do a(i, j1) = 1 a(i, j2) = 1 j1 = j1 + 1 j2 = j2 - 1 end do
do i = 1, n print *, (a(i, j), j=1,n) end do
end </lang>
- Output:
1.00000000 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.00000000 0.00000000E+00 1.00000000 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.00000000 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.00000000 0.00000000E+00 1.00000000 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.00000000 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.00000000 0.00000000E+00 1.00000000 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.00000000 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.00000000 0.00000000E+00 1.00000000 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 1.00000000
Go
<lang go>package main
import "fmt"
func specialMatrix(n uint) {
for i := uint(0); i < n; i++ { for j := uint(0); j < n; j++ { if i == j || i+j == n-1 { fmt.Printf("%d ", 1) } else { fmt.Printf("%d ", 0) } } fmt.Println() }
}
func main() {
specialMatrix(8) // even n fmt.Println() specialMatrix(9) // odd n
}</lang>
- Output:
1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1
Haskell
<lang haskell>---------------- MATRIX WITH TWO DIAGONALS ---------------
twoDiagonalMatrix :: Int -> Int twoDiagonalMatrix n = flip (fmap . go) xs <$> xs
where xs = [1 .. n] go x y | y == x = 1 | y == succ (subtract x n) = 1 | otherwise = 0
TEST -------------------------
main :: IO () main =
mapM_ putStrLn $ unlines . fmap (((' ' :) . show) =<<) . twoDiagonalMatrix <$> [7, 8]</lang>
Or, in the form of a list comprehension:
<lang haskell>-------------- MATRIX WITH TWO DIAGONALS ---------------
twoDiagonalMatrix :: Int -> Int twoDiagonalMatrix n =
let xs = [1 .. n] in [ [ fromEnum $ x `elem` [y, succ (n - y)] | x <- xs ] | y <- xs ]
TEST -------------------------
main :: IO () main =
mapM_ putStrLn $ unlines . fmap (((' ' :) . show) =<<) . twoDiagonalMatrix <$> [7, 8]</lang>
- Output:
1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1
and in terms of the Data.Matrix library:
<lang haskell>import Data.Matrix
twoDiagonals :: Int -> Matrix Int twoDiagonals n =
matrix n n (\(a, b) -> fromEnum $ a `elem` [b, succ (n - b)])
main :: IO () main =
mapM_ print $ twoDiagonals <$> [7, 8]</lang>
- Output:
┌ ┐ │ 1 0 0 0 0 0 1 │ │ 0 1 0 0 0 1 0 │ │ 0 0 1 0 1 0 0 │ │ 0 0 0 1 0 0 0 │ │ 0 0 1 0 1 0 0 │ │ 0 1 0 0 0 1 0 │ │ 1 0 0 0 0 0 1 │ └ ┘ ┌ ┐ │ 1 0 0 0 0 0 0 1 │ │ 0 1 0 0 0 0 1 0 │ │ 0 0 1 0 0 1 0 0 │ │ 0 0 0 1 1 0 0 0 │ │ 0 0 0 1 1 0 0 0 │ │ 0 0 1 0 0 1 0 0 │ │ 0 1 0 0 0 0 1 0 │ │ 1 0 0 0 0 0 0 1 │ └ ┘
J
Implementation:
<lang J>task=: Template:(+.</lang>
In other words, generate an order n identity matrix, flip it and (treating it as a bit matrix) OR the two matrices.
Some examples:
<lang J> task 2 1 1 1 1
task 3
1 0 1 0 1 0 1 0 1
task 4
1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1
task 5
1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1
task 6
1 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1</lang>
Java
<lang java>package example.diagdiag;
public class Diagdiag {
public static void main(String[] args) { Matrix A = new Matrix(7); System.out.println(A); }
}
class Matrix {
final int n; private double[][] a = null;
public Matrix(int n) { this.n = n; }
public double get(int i, int j) { if (a == null) { return (i == j || i == n - j + 1) ? 1.0 : 0.0; } else { return a[i - 1][j - 1]; } }
// Not necessary for the task: a lazy creation of the dense matrix. // // public void put(int i, int j, double value) { // if (a == null) { // a = new double[n][n]; // for (int p = 1; p <= n; i++) { // for (int q = 1; q <= n; j++) { // a[p - 1][q - 1] = get(p, q); // } // } // } // a[i - 1][j - 1] = value; // }
@Override public String toString() { StringBuilder sb = new StringBuilder(); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { sb.append('\t'); sb.append(get(i, j)); } sb.append('\n'); } return sb.toString(); }
}</lang>
- Output:
1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 1.0
JavaScript
<lang javascript>(() => {
"use strict";
// ------------ MATRIX WITH TWO DIAGONALS ------------
// doubleDiagonal :: Int -> Int const doubleDiagonal = n => { // A square matrix of dimension n with ones // along both diagonals, and zeros elsewhere. const xs = enumFromTo(1)(n);
return xs.map( y => xs.map( x => Number( [y, 1 + n - y].includes(x) ) ) ); };
// ---------------------- TEST ----------------------- const main = () => [7, 8].map( n => showMatrix( doubleDiagonal(n) ) ).join("\n\n");
// --------------------- GENERIC ---------------------
// enumFromTo :: Int -> Int -> [Int] const enumFromTo = m => n => Array.from({ length: 1 + n - m }, (_, i) => m + i);
// showMatrix :: a -> String const showMatrix = rows => // String representation of a matrix. rows.map( row => row.map(String).join(" ") ).join("\n");
// MAIN -- return main();
})();</lang>
Or, in terms of a more general matrix function:
<lang javascript>(() => {
"use strict";
// ------------ MATRIX WITH TWO DIAGONALS ------------
// bothDiagonals :: Int -> Int const bothDiagonals = n => matrix(n)(n)( y => x => Number( [y, (n - y) - 1].includes(x) ) );
// ---------------------- TEST ----------------------- const main = () => [7, 8].map( compose( showMatrix, bothDiagonals ) ).join("\n\n");
// --------------------- GENERIC ---------------------
// compose (<<<) :: (b -> c) -> (a -> b) -> a -> c const compose = (...fs) => // A function defined by the right-to-left // composition of all the functions in fs. fs.reduce( (f, g) => x => f(g(x)), x => x );
// matrix Int -> Int -> (Int -> Int -> a) -> a const matrix = nRows => nCols => // A matrix of a given number of columns and rows, // in which each value is a given function of its // (zero-based) column and row indices. f => Array.from({ length: nRows }, (_, iRow) => Array.from({ length: nCols }, (__, iCol) => f(iRow)(iCol)));
// showMatrix :: a -> String const showMatrix = rows => // String representation of a matrix. rows.map( row => row.map(String).join(" ") ).join("\n");
// MAIN --- return main();
})();</lang>
- Output:
1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1
jq
Works with gojq, the Go implementation of jq <lang jq>def bidiagonal_matrix:
. as $n | [range(0; $n) | 0] as $z | reduce range(0; $n) as $i ([]; . + [$z | .[$i] = 1 | .[$n-$i-1] = 1] );
def display:
map(join(" ")) | join("\n");</lang>
Example <lang jq>9|bidiagonal_matrix|display</lang>
- Output:
1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1
Julia
<lang julia> julia> twodiagonalmat(n) = [Int(i == j || i == n - j + 1) for j in 1:n, i in 1:n] twodiagonalmat (generic function with 1 method)
julia> twodiagonalmat(1) 1×1 Matrix{Int64}:
1
julia> twodiagonalmat(2) 2×2 Matrix{Int64}:
1 1 1 1
julia> twodiagonalmat(3) 3×3 Matrix{Int64}:
1 0 1 0 1 0 1 0 1
julia> twodiagonalmat(4) 4×4 Matrix{Int64}:
1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1
julia> twodiagonalmat(5) 5×5 Matrix{Int64}:
1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1
</lang>
Matlab
<lang Matlab>function A = diagdiag(N, sparse) % Create an double-diagonal square matrix % % Parameters: % % N -- number of rows (columns) % sparse -- should be true to create a sparse matrix % % Return: % % A matrix where all elements A(i, j) are zero except % elements on the diagonal or on the back-diagonal. % The diagonal (back-diagonal) elements are equal 1.
if nargin < 2 sparse = false; end if sparse A = speye(N); else A = eye(N); end A = fliplr(A); A(1:N+1:end) = 1;
end</lang>
- Output:
>> diagdiag(7) ans = Columns 1 through 7 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 >> diagdiag(7, true) ans = (1,1) 1 (7,1) 1 (2,2) 1 (6,2) 1 (3,3) 1 (5,3) 1 (4,4) 1 (3,5) 1 (5,5) 1 (2,6) 1 (6,6) 1 (1,7) 1 (7,7) 1
Pascal
<lang pascal>program bidiagonal; const N = 7; type
index = 1..N;
var
a : array[index, index] of real; i, j, j1, j2 : index;
begin
for i := 1 to N do begin for j := 1 to N do a[i, j] := 0.0; j1 := i; j2 := N - i + 1; a[i, j1] := 1.0; a[i, j2] := 1.0; end; for i := 1 to N do begin for j := 1 to N do write(a[i, j]:2:0); writeln(); end
end. </lang>
- Output:
1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1
Perl
Strings
<lang perl>#!/usr/bin/perl
use strict; #https://rosettacode.org/wiki/Matrix_with_two_diagonals use warnings;
print diagonal($_), "\n" for 10, 11;
sub diagonal
{ my $n = shift() - 1; local $_ = 1 . 0 x ($n - 1) . 2 . "\n" . (0 . 0 x $n . "\n") x $n; 1 while s/(?<=1...{$n})0/1/s or s/(?<=2.{$n})[01]/2/s; return tr/2/1/r =~ s/\B/ /gr; }</lang>
- Output:
1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1
Numbers
<lang perl>use strict; use warnings; use feature 'say';
sub dual_diagonal {
my($n) = shift() - 1; my @m; for (0..$n) { my @rr = reverse my @r = ( (0) x $_, 1, (0) x ($n-$_) ); push @m, [ map { $r[$_] or $rr[$_] } 0..$n ] } @m
}
say join ' ', @$_ for dual_diagonal(4); say ; say join ' ', @$_ for dual_diagonal(5); </lang>
- Output:
1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1
Phix
numbers
Tee hee, pick the bones out of this one. Lovely.
with javascript_semantics for n=6 to 7 do pp(apply(true,reinstate,{repeat(repeat(0,n),n),apply(true,sq_mul,{tagset(n),{{1,-1}}}),{{1,1}}}),{pp_Nest,1}) end for
- Output:
{{1,0,0,0,0,1}, {0,1,0,0,1,0}, {0,0,1,1,0,0}, {0,0,1,1,0,0}, {0,1,0,0,1,0}, {1,0,0,0,0,1}} {{1,0,0,0,0,0,1}, {0,1,0,0,0,1,0}, {0,0,1,0,1,0,0}, {0,0,0,1,0,0,0}, {0,0,1,0,1,0,0}, {0,1,0,0,0,1,0}, {1,0,0,0,0,0,1}}
Slightly saner, shows sackly same stuff:
with javascript_semantics for n=6 to 7 do sequence s = repeat(repeat(0,n),n) for i=1 to n do s[i][i] = 1 s[i][-i] = 1 end for pp(s,{pp_Nest,1}) end for
strings
with javascript_semantics for n=6 to 7 do sequence s = repeat(join(repeat('0',n),' '),n) for i=1 to n do integer j = 2*i-1 s[i][j] = '1' s[i][-j] = '1' end for printf(1,"%s\n\n",{join(s,"\n")}) end for
- Output:
1 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1
GUI/online
Based on 2048#Phix, and uses the same colour and font choices. You can run this online here.
with javascript_semantics include pGUI.e constant TITLE = "Strange Identity Matrices", HELPTXT = """ Press F1 to see this help text. Press +/- to increase or decrease the matrix size Press 'M' for a mosaic pattern Press 'O' for outer or four sides of a square Press 'X' for two diagonals The window can be fully resized (MINSIZE does not yet work in a browser) """ function help() IupMessage(TITLE,HELPTXT,bWrap:=false) return IUP_DEFAULT end function Ihandle canvas, dlg cdCanvas cddbuffer, cdcanvas sequence board integer n = 5, mtype = 'X' -- (two diags) or 'O'uter or 'M'osaic function mosaic() for y=1 to n do for x=1+odd(n+y) to n by 2 do board[y][x] = "1" end for end for return "mosaic" end function function outer() for y=1 to n do integer step = iff(y=1 or y=n?1:n-1) for x=1 to n by step do board[y][x] = "1" end for end for return "four sides" end function function diag() for i=1 to n do board[i][i] = "1" board[i][-i] = "1" end for return "two diagonals" end function function redraw_cb(Ihandle /*ih*/) integer {dw,dh} = IupGetIntInt(canvas, "DRAWSIZE"), ms = n*5+5, -- margin space mx = min(dw,dh)-ms, -- max size ts = floor(mx/n), -- max tile size th = floor(ts/2), -- for text posn os = ts*n+ms, -- overall size ox = floor((dw-os)/2), -- top right x oy = floor((dh-os)/2), -- top right y font_size = floor((ts+10)/2) board = repeat(repeat("0",n),n) string title switch mtype do case 'M': title = mosaic() case 'O': title = outer() case 'X': title = diag() end switch IupSetStrAttribute(dlg,"TITLE","%s (%dx%d, %s)",{TITLE,n,n,title}) cdCanvasActivate(cddbuffer) cdCanvasSetBackground(cddbuffer, #FAF8EF) cdCanvasClear(cddbuffer) cdCanvasSetForeground(cddbuffer, #BBADA0) cdCanvasRoundedBox(cddbuffer, ox, ox+os, oy, oy+os, 10, 10) cdCanvasFont(cddbuffer, "Calibri", CD_BOLD, font_size) integer tx = ox+5 for y=1 to n do integer ty = oy+5 for x=1 to n do string bxy = board[x][y] cdCanvasSetForeground(cddbuffer, #EEE4DA) cdCanvasRoundedBox(cddbuffer, tx, tx+ts-2, ty, ty+ts-2, 5, 5) cdCanvasSetForeground(cddbuffer, #776E65) cdCanvasText(cddbuffer, tx+th, ty+th, bxy) ty += ts+5 end for tx += ts+5 end for cdCanvasFlush(cddbuffer) return IUP_DEFAULT end function function map_cb(Ihandle ih) cdcanvas = cdCreateCanvas(CD_IUP, ih) cddbuffer = cdCreateCanvas(CD_DBUFFER, cdcanvas) cdCanvasSetTextAlignment(cddbuffer, CD_CENTER) return IUP_DEFAULT end function function key_cb(Ihandle /*ih*/, atom c) if c=K_ESC then return IUP_CLOSE end if if c=K_F1 then return help() end if if c='+' then n += 1 end if if c='-' then n -= (n>1) end if c = upper(c) if find(c,"MOX") then mtype = c end if IupUpdate(canvas) return IUP_CONTINUE end function IupOpen() canvas = IupCanvas("RASTERSIZE=532x532") IupSetCallback(canvas, "MAP_CB", Icallback("map_cb")) IupSetCallback(canvas, "ACTION", Icallback("redraw_cb")) dlg = IupDialog(canvas,"MINSIZE=440x450") IupSetCallback(dlg, "K_ANY", Icallback("key_cb")) IupSetAttributeHandle(NULL,"PARENTDIALOG",dlg) IupShow(dlg) IupSetAttribute(canvas, "RASTERSIZE", NULL) if platform()!=JS then IupMainLoop() IupClose() end if
PHP
Python
Pure Python
<lang python>Matrix with two diagonals
- twoDiagonalMatrix :: Int -> Int
def twoDiagonalMatrix(n):
A square matrix of dimension n with ones along both diagonals, and zeros elsewhere. return matrix( n, n, lambda row, col: int( row in (col, 1 + (n - col)) ) )
- ------------------------- TEST -------------------------
- main :: IO ()
def main():
Matrices of dimension 7 and 8 for n in [7, 8]: print( showMatrix( twoDiagonalMatrix(n) ) + '\n' )
- ----------------------- GENERIC ------------------------
- matrix :: Int -> Int -> ((Int, Int) -> a) -> a
def matrix(nRows, nCols, f):
A matrix of a given number of columns and rows, in which each value is a given function over the tuple of its (one-based) row and column indices. return [ [f(y, x) for x in range(1, 1 + nCols)] for y in range(1, 1 + nRows) ]
- showMatrix :: Int -> String
def showMatrix(rows):
String representation of a matrix return '\n'.join([ ' '.join([str(x) for x in y]) for y in rows ])
- MAIN ---
if __name__ == '__main__':
main()</lang>
- Output:
1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1
NumPy
<lang Python>import numpy as np
def diagdiag(n):
""" Create double a diagonal matrix
Args: n (int): number of rows.
Returns: a (numpy matrix): double diagonal matrix.
""" d = np.eye(n) a = d + np.fliplr(d) if n % 2: k = (n - 1) // 2 a[k, k] = 1 return a
print(diagdiag(7))</lang>
- Output:
[[1. 0. 0. 0. 0. 0. 1.] [0. 1. 0. 0. 0. 1. 0.] [0. 0. 1. 0. 1. 0. 0.] [0. 0. 0. 1. 0. 0. 0.] [0. 0. 1. 0. 1. 0. 0.] [0. 1. 0. 0. 0. 1. 0.] [1. 0. 0. 0. 0. 0. 1.]]
Raku
<lang perl6>sub dual-diagonal($n) { ([1, |(0 xx $n-1)], *.rotate(-1) … *[*-1]).map: { [$_ Z|| .reverse] } }
.say for dual-diagonal(6); say ; .say for dual-diagonal(7);</lang>
- Output:
[1 0 0 0 0 1] [0 1 0 0 1 0] [0 0 1 1 0 0] [0 0 1 1 0 0] [0 1 0 0 1 0] [1 0 0 0 0 1] [1 0 0 0 0 0 1] [0 1 0 0 0 1 0] [0 0 1 0 1 0 0] [0 0 0 1 0 0 0] [0 0 1 0 1 0 0] [0 1 0 0 0 1 0] [1 0 0 0 0 0 1]
Red
<lang rebol>Red[]
x-matrix: function [size][
repeat i size [ repeat j size [ prin either any [i = j i + j = (size + 1)] [1] [0] prin sp ] prin newline ]
]
x-matrix 6 prin newline x-matrix 7</lang>
- Output:
1 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1
Ring
<lang ring>
- Project : Identity Matrix
- Date : 2022/16/02
- Author : Gal Zsolt (~ CalmoSoft ~)
- Email : <calmosoft@gmail.com>
load "stdlib.ring" load "guilib.ring"
size = 8 C_Spacing = 1
C_ButtonBlueStyle = 'border-radius:6px;color:black; background-color: blue' C_ButtonOrangeStyle = 'border-radius:6px;color:black; background-color: orange'
Button = newlist(size,size) LayoutButtonRow = list(size)
app = new qApp {
win = new qWidget() {
setWindowTitle('Identity Matrix') move(500,100) reSize(600,600) winheight = win.height() fontSize = 18 + (winheight / 100)
LayoutButtonMain = new QVBoxLayout()
LayoutButtonMain.setSpacing(C_Spacing) LayoutButtonMain.setContentsmargins(0,0,0,0)
for Row = 1 to size LayoutButtonRow[Row] = new QHBoxLayout() { setSpacing(C_Spacing) setContentsmargins(0,0,0,0) }
for Col = 1 to size
Button[Row][Col] = new QPushButton(win) {
setSizePolicy(1,1)
}
LayoutButtonRow[Row].AddWidget(Button[Row][Col]) next LayoutButtonMain.AddLayout(LayoutButtonRow[Row]) next
LayoutDataRow1 = new QHBoxLayout() { setSpacing(C_Spacing) setContentsMargins(0,0,0,0) } LayoutButtonMain.AddLayout(LayoutDataRow1) setLayout(LayoutButtonMain) show() } pBegin() exec() }
func pBegin()
for Row = 1 to size for Col = 1 to size if Row = Col or Row + Col = 9 Button[Row][Col].setStyleSheet(C_ButtonOrangeStyle) Button[Row][Col].settext("1") else Button[Row][Col].setStyleSheet(C_ButtonBlueStyle) Button[Row][Col].settext("0") ok
next
next score = 0
</lang>
Outpu image:
Special identity matrix with two diagonals
Wren
A terminal based solution as I don't like asking people to view external images. <lang ecmascript>var specialMatrix = Fn.new { |n|
for (i in 0...n) { for (j in 0...n) { System.write((i == j || i + j == n - 1) ? "1 " : "0 ") } System.print() }
}
specialMatrix.call(6) // even n System.print() specialMatrix.call(7) // odd n</lang>
- Output:
1 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1
XPL0
<lang XPL0>proc DrawMat(S); int S, I, J; [for I:= 0 to S-1 do
[for J:= 0 to S-1 do Text(0, if J=I or J=S-1-I then "1 " else "0 "); CrLf(0); ];
]; [DrawMat(6); CrLf(0);
DrawMat(7); CrLf(0);
]</lang>
- Output:
1 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 1