[Question]
  [
I like pizza!
# Task
Given the radius of a pizza and a list of ingredients, create the corresponding ascii pizza!
Example size 4 pizza with mozzarella cheese, olives and ham:
```
  #####  
 #@@@@M# 
#H@O@@@@#
#M@@@H@@#
#@OO@@@@#
#@@H@@@@#
#M@M@@@@#
 #O@@@H# 
  #####  
```
# Input
A positive integer `r` for the size of the pizza and a (possibly empty) list of ingredients (non-empty strings). The list of ingredients can be given in a series of convenient formats, including but not limited to:
* a list of ingredients, such as `["tomato", "ham", "cheese"]`;
* a list of the initials, such as `["t", "h", "c"]`;
* a list of left- or right-padded ingredients, such as `["tomato", "ham ", "cheese"]` or `["tomato", " ham", "cheese"]`;
* a string with the initials, such as `"thc"`.
# Output specs
The pizza is built on a square of size `2r+1` characters, with the centre character having coordinates `(0,0)` for the purposes of this explanation. All characters in the square have integer coordinates. Then,
* a position is crust `#` if its coordinates `x,y` satisfy \$r+1 > \sqrt{x^2 + y^2} \geq r\$;
* a position is dough `@` if its coordinates `x,y` satisfy \$ r > \sqrt{x^2+y^2}\$.
Then, the ingredients must be put randomly on the pizza. Each ingredient will be represented by its initial and you must place `r` of each ingredient randomly in the dough characters. You can assume there will be enough space in the pizza. Ingredients cannot be placed on top of eachother, so in the final pizza there must be exactly `rl` non-dough symbols, in groups of `r`, if the ingredients list has size `l`.
For the randomness in the distributions of ingredients on top of the pizza, it suffices that for a fixed `r` and ingredient list, all ingredient distributions obeying the specs have non-zero probability of occurring.
# Examples
`r = 1`, no ingredients
```
###
#@#
###
```
---
`r = 2`, no ingredients
```
#####
#@@@#
#@@@#
#@@@#
#####
```
---
`r = 5`, no ingredients
```
  #######  
 ##@@@@@## 
##@@@@@@@##
#@@@@@@@@@#
#@@@@@@@@@#
#@@@@@@@@@#
#@@@@@@@@@#
#@@@@@@@@@#
##@@@@@@@##
 ##@@@@@## 
  ####### 
```
---
`r = 4`, `ingredients = ["bacon", "mozzarela", "tomato"]`
```
  #####  
 #@@b@m# 
#@@@@@b@#
#@@@btb@#
#@@@@@@t#
#@@@@@@@#
#@mt@@@@#
 #t@mm@# 
  #####  
```
[Reference implementation](https://tio.run/##hVLBUoMwEL3nK3biBQp0WvXkSMf/QMbBEiAMJHEJB/vzdZOArdUZL23Y997uy8uaT9tp9XA@N6hHwErV9CdHo9HC1M1NMwjmobGy3Qo0g9aYTh9oGTviPFnIgd9xVuu57dz5hTNWiwaMPJ2qCFOQqp3iJwZgCC5KOhz1rJxuR@dGI0jiuPmtiDJMMdl7OsAglVg1gdn/YO4TXJgA6Lo7W5HcbO6Tnn7iBZINUM@DoxxywFUR@m8rY4SqI3@XVSEGpzHwfM0OrpMc9n828AFcGkzi7zkceCCZteLQmFHN6rd58hemyIpdeZsNxqGiWldzsbpgyOkgVBTEMVn2PsPwpSN5Lry9chOFW2TXGj98efC1xv55mt@PccG8J1PIsuhLyHPwoy9pfCOLvSLznsqboLMQ9Lo3nG97LVVIy4/320EOjFOisDMq4K9q4Zn4bPKwg49pwd@ro1Y8BT5qKqEYKvdhNa225mXMDEplnegL)
Please include one or two of your favourite pizzas in your answer :)
---
This is [code-golf](/questions/tagged/code-golf "show questions tagged 'code-golf'") so shortest submission in bytes, wins! If you liked this challenge, consider upvoting it... And happy golfing!
  
[Answer]
# [APL (Dyalog Extended)](https://tio.run/##SyzI0U2pTMzJT9dNrShJzUtJTfn/vzrTQUPjUeeizEdtEx717tJ/1LtV0x7If9S7w9A2T9OhGkjWqjsoK6hH5wGVaBgAFekAsbahJlBJzaOOGXqPevY96l0BFHvUsEwXSMXW/k8Dm9b3qG@qp/@jruZD640ftU0E8oKDnIFkiIdn8H9DhTSFR71ruIygtAmIBipdoe6bX1WVWJSak5OorqDun5NZlloMZHgk5qpzmWIoTkpMzs8DSudCNYH0lOTnJpbkq3OZw1XllhZnFOXn54IMSspJTM5WyIeZW5SaolCQWlCQWgTiFWTmpSYWFOSkIoxRUM/PywTaAQA "APL (Dyalog Extended) – Try It Online"), ~~55~~ 53 [bytes](https://codegolf.meta.stackexchange.com/a/9429/43319 "When can APL characters be counted as 1 byte each?")[SBCS](https://github.com/abrudz/SBCS ".dyalog files using a single byte character set")
−2 thanks to rabbitgrowth.
Anonymous infix lambda. Takes `r` as left argument (`⍺`) and ingredient initials as right argument (`⍵`).
```
{i@((≢i←⍺/⍵)?≢⍸1=n)@{1=n}'@# '[n←(0⍺,⍺+1)⍸|∘.⌾⍨⍺…-⍺]}
```
[Try it online!][TIO-k6q7nk2n]
`{`…`}` "dfn"; left argument `⍺` (leftmost Greek letter), right argument `⍵` (rightmost Greek letter)
`'@# '[`…`]` index the string with:
  `-⍺` negate `r`
  `⍺…` generate integer range from `r` to `-r`
  `∘.⌾⍨` generate table of complex coordinates
  `|` magnitudes
  `(`…`)⍸` find the **ɩ**ndices of the [a,b) **ɩ**ntervals in which the magnitudes fall:
   `⍺+1` increment `r`
   `0⍺,` prepend `[0,r]`
   `n←` store in `n` (1: dough; 2: crust; 3: outside pizza)
 `i@(`…`)@{1=n}` place the characters of `i` (to be defined) **at** the following subset of positions **at** which `n` is 1 (i.e. we have dough):
  `1=n` mask where `n` is 1
  `⍸` **ɩ**ndices of trues
  `≢` count them
  `(`…`)?` pick the following number of random indices from 1 to that:
   `⍺/⍵` replicate each ingredient initial letter to `r` copies
   `i←` store in `i`
   `≢` tally that
[Answer]
# [MATL](https://github.com/lmendo/MATL), ~~44~~ ~~43~~ ~~40~~ 34 bytes
```
Q_Zvqt!YytGQ<Zc64bG<(i1GY"7MfynZr(
```
Inputs are: `r` and a string with the initials of ingredients.
Try it online with [ham, onion, pepper and mushroom](https://tio.run/##y00syfn/PzA@qqywRDGyssQ90CYq2cwkyd1GI9PQPVLJ3DetMi@qSOP/f1MudQ//AF91AA)! Or maybe try a [diet pizza](https://tio.run/##y00syfn/PzA@qqywRDGyssQ90CYq2cwkyd1GI9PQPVLJ3DetMi@qSOP/f1MudQUoUAcA).
### Explanation with example
Consider inputs `3` and `'AP'`.
```
Q     % Implicit input: r. Add 1
      % STACK: 4
_Zv   % Symmetric inverse range
      % STACK: [4 3 2 1 2 3 4]
q     % Subtract 1, element-wise
      % STACK: [3 2 1 0 1 2 3]
t!    % Duplicate, transpose
      % STACK: [3 2 1 0 1 2 3], [3; 2; 1; 0; 1; 2; 3] 
Yy    % Hypotenuse, element-wise with broadcast
      % STACK: [4.2426    3.6056    3.1623    3.0000    3.1623    3.6056    4.2426;
                3.6056    2.8284    2.2361    2.0000    2.2361    2.8284    3.6056;
                3.1623    2.2361    1.4142    1.0000    1.4142    2.2361    3.1623;
                3.0000    2.0000    1.0000         0    1.0000    2.0000    3.0000;
                3.1623    2.2361    1.4142    1.0000    1.4142    2.2361    3.1623;
                3.6056    2.8284    2.2361    2.0000    2.2361    2.8284    3.6056;
                4.2426    3.6056    3.1623    3.0000    3.1623    3.6056    4.2426]
t     % Duplicate.
      % STACK: [4.2426    3.6056    3.1623    3.0000    3.1623    3.6056    4.2426;
                3.6056    2.8284    2.2361    2.0000    2.2361    2.8284    3.6065;         
                                                ···
                4.2426    3.6056    3.1623    3.0000    3.1623    3.6056    4.2426],
               [4.2426    3.6056    3.1623    3.0000    3.1623    3.6056    4.2426;
                3.6056    2.8284    2.2361    2.0000    2.2361    2.8284    3.6065;         
                                                ···
                4.2426    3.6056    3.1623    3.0000    3.1623    3.6056    4.2426]
GQ<   % Less than r plus 1? Element-wise
      % STACK: [4.2426    3.6056    3.1623    3.0000    3.1623    3.6056    4.2426;
                3.6056    2.8284    2.2361    2.0000    2.2361    2.8284    3.6065;         
                                                ···
                4.2426    3.6056    3.1623    3.0000    3.1623    3.6056    4.2426],
               [0 1 1 1 1 1 0;
                1 1 1 1 1 1 1;
                1 1 1 1 1 1 1;
                1 1 1 1 1 1 1;
                1 1 1 1 1 1 1;
                1 1 1 1 1 1 1;
                0 1 1 1 1 1 0]
Zc    % Replace 0 by space and 1 by '#'
      % STACK: [4.2426    3.6056    3.1623    3.0000    3.1623    3.6056    4.2426;
                3.6056    2.8284    2.2361    2.0000    2.2361    2.8284    3.6065;         
                                                ···
                4.2426    3.6056    3.1623    3.0000    3.1623    3.6056    4.2426],
               [' ##### ';
                '#######';
                '#######';
                '#######';
                '#######';
                '#######';
                ' ##### ' ]
64    % Push 64 (ASCII for '@') 
      % STACK: [4.2426    3.6056    3.1623    3.0000    3.1623    3.6056    4.2426;
                3.6056    2.8284    2.2361    2.0000    2.2361    2.8284    3.6065;         
                                                ···
                4.2426    3.6056    3.1623    3.0000    3.1623    3.6056    4.2426],
               [' ##### ';
                '#######';
                '#######';
                '#######';
                '#######';
                '#######';
                ' ##### ' ],
               64
b     % Bubble up
      % STACK: [' ##### ';
                '#######';
                '#######';
                '#######';
                '#######';
                '#######';
                ' ##### ' ],
               64,
               [4.2426    3.6056    3.1623    3.0000    3.1623    3.6056    4.2426;
                3.6056    2.8284    2.2361    2.0000    2.2361    2.8284    3.6065;         
                                                ···
                4.2426    3.6056    3.1623    3.0000    3.1623    3.6056    4.2426]
G<    % Less than r? Element-wise
      % STACK: [' ##### ';
                '#######';
                '#######';
                '#######';
                '#######';
                '#######';
                ' ##### ' ],
               64,
               [0 0 0 0 0 0 0;
                0 1 1 1 1 1 0;
                0 1 1 1 1 1 0;
                0 1 1 1 1 1 0;
                0 1 1 1 1 1 0;
                0 1 1 1 1 1 0;
                0 0 0 0 0 0 0]
(     % Write value 64 (that is, '@') into char matrix at positions indexed by mask
      % STACK: [' ##### ';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                ' ##### ']
i     % Input: string
      % STACK: [' ##### ';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                ' ##### '],
               'AP'
1GY"  % Push first input (r) again. Repeat each letter that many times
      % STACK: [' ##### ';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                ' ##### '],
               'AAAPPP'
7Mf   % Push 0-1 mask again. Linear index (column-major order) of non-zero entries
      % STACK: [' ##### ';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                ' ##### '],
               'AP',
               [9; 10; 11; ...; 41]
yn    % Duplicate from below. Number of elements
      % STACK: [' ##### ';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                ' ##### '],
               'AAAPPP',
               [9; 10; 11; ...; 41]
               6
Zr    % Random sample without replacement (example result shown)
      % STACK: [' ##### ';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                '#@@@@@#';
                ' ##### '],
               'AAAPPP',
               [13; 18; 11; 24; 30; 25]      
(     % Write 'AAAPPP' into char matrix at positions given by the linear indices
      % STACK: [' ##### '
                '#@@@P@#';
                '#@@P@@#';
                '#AAP@@#';
                '#@@@@@#';
                '#A@@@@#';
                ' ##### ']
      % Implicit display
```
[Answer]
# [05AB1E](https://github.com/Adriandmen/05AB1E/wiki/Commands), ~~42~~ ~~41~~ ~~40~~ ~~38~~ 34 [bytes](https://github.com/Adriandmen/05AB1E/wiki/Codepage)
```
ÝRûãnOtï¹.S…# 1sèƶDþ.rI¹и'@Þ«‡¹·>ô
```
Output as a character-matrix.
-2 bytes because the specs changed (character-list input instead of ingredients-list).  
-4 bytes thanks to *@Grimmy*.
[Try it online](https://tio.run/##yy9OTMpM/f//8Nygw7sPL87zLzm8/tBOveBHDcuUFQyLD684ts3l8D69Is9DOy/sUHc4PO/Q6kcNCw/tPLTd7vCW/16Hdv834YpWylXSUVBKBhHFIKIARJRAxGIB) or [verify all test cases](https://tio.run/##yy9OTMpM/W/qpuSZV1BaUmylUGSrZO/pEmqvpJCYl6KQmZdelJqSmZpXUgwWD9PhUvIvLQEqtVJQ0on4f3hu0OHdhxfn@ZccXh@hF/yoYZmygmHx4RXHtrkc3qdXFBlxYYe6w@F5h1Y/algYcWi73eEt/70O7dY5tM3@vyFXdCyXEYgwBREmXNFKSUo6Ckq5IKJECSIC5iSDiGIQUQCRA4vFAgA). (The footer `J»` is to pretty-print the result. Feel free to remove it to see the actual character-matrix result.)
**Explanation:**
```
Ý              # Push a list in the range [0, (implicit) input-integer]
 R             # Reverse it to range [input, 0]
  û            # Palindromize this list (i.e. [3,2,1,0] → [3,2,1,0,1,2,3])
   ã           # Take the cartesian product with itself, to get a list of all coordinates
n              # Square both the x and y of each coordinate
 O             # Take the sum of each
  t            # And then the square-root of that
   ï           # Truncate it to an integer
    ¹.S        # And compare each to the first input
               # (-1 if larger than the input; 0 if equals; -1 if smaller)
       …# 1    # Push string "# 1"
           sè  # And index the list into this string, where the -1 is the trailing character
ƶ              # Multiply the 1s by their 1-based index
 Dþ            # Duplicate the list, and only leave the integers (the indices)
   .r          # And randomly shuffle those
     I         # Push the second input-list of ingredient-characters
      ¹и       # Repeat this list the first input amount of times
        '@Þ   '# Push an infinite list of "@"
           «   # Append it to the repeated ingredient-characters
            ‡  # Transliterate the shuffled indices to this list
¹·<            # Push the first input again; double it; and decrease it by 1
               # (alternative: `Dgt` - Duplicate; length; square-root)
   ô           # Split the list into parts of that size
               # (after which the resulting character-matrix is output implicitly)
```
[Answer]
# [Python 3.8 (pre-release)](https://docs.python.org/3.8/), ~~186~~ ~~177~~ 176 bytes
```
from random import*
def f(r,i=[],s=''):i=['@',*next(zip(*i),[])];t=range(-r,R:=r+1);print([s:=s+[' #'[(d:=x*x+y*y)<R*R],choice(i)][d<r*r]+'\n'*(x==r)for y in t for x in t][-1])
```
[Try it online!](https://tio.run/##JZBBT4QwEIXv@ysaPExbugfUjYbdJv4GvJjUHiq00GRpyVAN8Oex6OW9701m8pKZ1jTE8PQ64b47jCNBE7psfpwiJn7qrCOOovBSaTFLAFZnhDcQPNgl0c1PlHsmlGb6mmS@7i09o2hqiWXFrhP6kKiaazmXCsgDKNrVcuFLufKV3RreaNEO0beWeqZVd0OOuoTPAJwuUiJzEclKfCCJHLj8oVbnSrPd0YqdHH085HLIs1DFl2ljKAQpxrhtBu3dHCHF0aRY6GPrRSiYv3uDIOB9ytXZ7Y/F/AofehL@Jx@kHezoW3OHXPUL "Python 3.8 (pre-release) – Try It Online")
[Answer]
# JavaScript (ES7), ~~177 175~~ 172 bytes
Takes input as `(r)(list)`, where *list* is filled with initials. Returns an array of characters.
```
r=>a=>a.map(i=>(g=i=>(s[p=Math.random()*r**3|0]!='@'||(s[p]=i,--n))&&g(i))(i,n=R),s=[...(g=x=>y+r?` #@
`[x+r?((d=x*x--+y*y)<r*r)+(d<R*R):(--y,x=R,3)]+g(x):'')(y=R=r++)])&&s
```
[Try it online!](https://tio.run/##fY1Na4NAEIbv@RWphTizXzRNewkZmz/Qi1cRYqKxG6Iru1JW8L/bXXppL4HhYWCed95b9V25i9XDKHtTN8uVFktZFUZ11QCaMmgp0hUDfVbjl7JVX5sOkFnGdvNL@UTpMZ3nKJSkhZQ94mbTgkYELXrKUTgqlFLhkads4vbjtH4@rk6FDytATZ55KfnEJjxYZpFDfchZjnuQchKecrHDkrfgcZ@mCBPlZDnHMrS45WJ6Z@6NupsWrrBFKBKTlKhuRvcQdFz9N16j0SRinZwjXET3KPAWA@dfLWB85L4H9@95@QE "JavaScript (Node.js) – Try It Online")
### Commented
```
r => a =>                     // r = radius, a[] = list of ingredients
  a.map(i =>                  // for each ingredient i in a[]:
    ( g = i => (              //   g is a recursive function taking i
        s[                    //     test s at
          p = Math.random()   //     a random position p in [0 .. r**3 - 1]
              * r**3 | 0      //
        ] != '@' ||           //     abort if it doesn't contain '@'
        (s[p] = i, --n)       //     otherwise, put the ingredient there and decrement n
      ) && g(i)               //     do a recursive call if the above result is truthy
    )(i, n = R),              //   initial call to g with i and n = R
    s = [...                  //   build the base pizza s[]
      ( g = x =>              //   g is another recursive function taking x
        y + r ?               //     if y is not equal to -r:
          ` #@\n`[            //       pick the relevant character:
            x + r ?           //         if x is not equal to -r:
              (               //
                (d = x * x--  //           d = x² + y²; decrement x
                   + y * y)   //
                < r * r       //           add 1 if it's less than r² (-> '#')
              ) +             //
              (d < R * R)     //           add 1 if it's less than R² (-> '@')
            :                 //         else:
              (y--, x = R, 3) //           decrement y, set x = R, append a linefeed
          ] +                 //
          g(x)                //       recursive call
        :                     //     else:
          ''                  //       stop recursion
      )(y = R = r++)          //   initial call to g with x = y = R = r; increment r
    ]                         //   
  ) && s                      // end of map(); return s[]
```
[Answer]
# [Charcoal](https://github.com/somebody1234/Charcoal), ~~51~~ 48 bytes
```
Ｅ⊕θ⭆Ｅ⊕θ₂⁺×ιι×λλ⎇›θλ@§ #›⊕θλ‖Ｏ↑←ＦηＦθ§≔ＫＡ‽⌕ＡＫＡ@§ι⁰
```
[Try it online!](https://tio.run/##bY9BS8QwEIXv/oohXiYQwYuX9WIvLguKpepp2UNIp9tgmqRJdtFfXycrBRFzmbz5MvNezKiTCdotS5usL/isI@68STSRL9TjLBW8FkbHSv6l80kn6kIo2LpTxjc7UUarwDL8EU6Bk3xYU/I6feE2kS6UcK5EgXgQCpqy8z19ooBrVuuLv3aXRVLeX3U0ODLl5UzJcazNe1SweaKhMBtCAhwlXOosocnZHv1q0BJ9NM4hb@u078OEj9b3tfOLcKQaeJ3h/9yy67Ls7xTsRQmTLoFjCjMSZaq3UU@1ROtJx@hIHA7Lzdl9Aw "Charcoal – Try It Online") Link is to verbose version of code. Now supports full topping names by using a less convenient input format, but could save 2 bytes by switching back to initials. Explanation:
```
Ｅ⊕θ⭆Ｅ⊕θ₂⁺×ιι×λλ⎇›θλ@§ #›⊕θλ
```
Draw the bottom right hand quarter of the pizza base.
```
‖Ｏ↑←
```
Reflect to complete the pizza base.
```
ＦηＦθ
```
Loop through each topping repeatedly.
```
§≔ＫＡ‽⌕ＡＫＡ@§ι⁰
```
Find a random dough character and overwrite it with the first letter of the topping.
[Answer]
# [Perl 5](https://www.perl.org/) `-al`, 153 bytes
```
@;=map{//;join"",map{($d=sqrt($_**2+$'**2))<$r?++$n&&1:$d>$r+1?$":"#"}@c}@c=-($r=<>)..$r;@F=((@F)x$r,("@")x($n-@F*$r));say s/1/splice@F,rand@F,1/gre for@
```
[Try it online!](https://tio.run/##FYdLDoIwFAD3nqKpL9jyK9WwAYpdsfMMhgAqBgu@ssAYr27FZDKTmTocUud0rh719BYiv4@9oTT8H4NW2SfODM6@vw9gt5rzAvAYBGA8T2bQloCBPALN6JZ@dLOiIgaoipLHMWCuK8WYrvgCGDKqKV8YmEhXPiDnua1fxAop7DT0TaerEGvTrpHiih25jKidm8mNNJvDd5zmfjTWRWaoXXRK40QmPw "Perl 5 – Try It Online")
Takes the initials of the ingredients (space separated) on the first line of input and the radius on the second.
]