Asterisk spiral
MATL, 17 16 bytes
UGlYLGoQ&P->42*c
Try it online!
Explanation (with example)
Consider inputs 4
and 11
as an example.
U % Implicit input: S. Push S^2
% STACK: 16
G % Push S again
% STACK: 16, 4
lYL % Outward, clockwise, east-first spiral of that size
% STACK: 16,
[ 7 8 9 10;
6 1 2 11;
5 4 3 12;
16 15 14 13]
GoQ % Push S, compute parity, add 1. Gives 1 for even S, 2 for odd
% STACK: 16,
[ 7 8 9 10;
6 1 2 11;
5 4 3 12;
16 15 14 13],
1
&P % Flip along that dimension (1 is vertical, 2 is horizontal).
% This corrects for the orientation of the spiral
% STACK: 16,
[16 15 14 13;
5 4 3 12;
6 1 2 11;
7 8 9 10]
- % Subtract, element-wise. The upper-left corner becomes 0
% STACK: [ 0 1 2 3
11 12 13 4
10 15 14 5
9 8 7 6]
> % Implicit input (below): N. Greater than?, element-wise.
% This transforms the first N entries, starting from
% upper-left, inward, east-first, into 1, and the rest
% into 0
% STACK: [1 1 1 1;
0 0 0 1;
1 0 0 1;
1 1 1 1]
42* % Multiply each entry by 42
% STACK: [42 42 42 42;
0 0 0 42;
42 0 0 42;
42 42 42 42]
c % Convert to char. Char 0 will be displayed as space.
% Implicit display
% STACK: ['****';
' *';
'* *';
'****']
Stax, 19 bytes
±♪☺ÿzMæ¡♠à╣♂7☼V♀§9↓
Run and debug it
It starts by building a string that has all the characters in the result with all the asterisks left-aligned. Then it it takes increasingly large slices off the end of the string, and "wraps" them around a grid as it rotates the grid.
Here's the same program, unpacked, ungolfed, and commented.
'** repeat "*" specified number of times
,J( square the top of the input stack, and right-pad string to that length
z push an empty array - this is the result grid built up in the loop
{ begin a block to loop
~ push grid to the input stack
ihNv push -(i / 2) - 1 where i is the 0-based iteration index using integer division
:/] split the string at that index and wrap the second half in a singleton array
, pop the grid from the input stack
rM+ rotate the grid clockwise, then prepend the split string as the new first row
n copy what's left of the original string to top of stack for the loop condition
w while; execute block until condition is truthy
m display resulting grid
Run and debug it
APL (Dyalog), 65 bytes
' *'[1+⎕>⊖∘⌽⍣o(⊖×⍨-,⍨⍴∘(⍋+\)×⍨↑(⌈2÷⍨×⍨),(+⍨⍴1,⊢,¯1,-)(/⍨)2/⍳)o←⎕]
Try it online!
The code for the spiral matrix is taken from another answer of mine.