text:
Scoop me an icecream please
Make me an icecream cone please
We have a ton of great ice cream places here in New England.  Most of them are closed for the winter now, so...
   .-@@-.
  (======)
 (--------)
(==========)
(__________)
 \/\/\/\/\/
  \/\/\/\/
   \/\/\/
    \/\/
     \/

GOAL
  Output the above icecream cone exactly. (or return it from a function)
This is code golf so shortest answer wins

This seems like a strange challenge, wouldn't simply executing that as a string literal technically be a solution for some interpreted languages like JS/Python?

@JacobPersi This is a classic [tag:kolmogorov-complexity] challenge, where the aim is to compress the given string as much as possible, hardcoding is probably not too golfy

Lol - my preferred 'C' family languages again have 0 chance at this.

@dzaima yes trailing spaces and trailing new lines are fine.

@MichaelDorgan 146 bytes f(){puts("   .-@@-.\n  (======)\n (--------)\n(==========)\n(__________)\n \\/\\/\\/\\/\\/\n  \\/\\/\\/\\/\n   \\/\\/\\/\n    \\/\\/\n     \\/");}

Sure - could printf() or whatever.  But, strings and C won't ever compete :)  Should have stated "chance at winning this."  My bad

@MichaelDorgan  I'm curious if there's a golfing language with an icecream-cone build-in

@cleblanc Which prints this exact text? Really, really unlikely.

I'd say that some of these languages feel like they were invented for code golf.  I could probably create iCeCrEaMCoNe that one character prints a cone and win.

@MichaelDorgan many of the languages were invented for code golf, but that shouldn't discourage you from answering in production languages - here it's suggested to upvote interesting answers, and an answer in iCeCrEaMCoNe would not be one of those. This site even used to have a rule that you can't answer in a language( / use a feature) newer than the challenge, but that got replaced by "don't upvote trivial answers". After all, these golfing languages exist just for fun :)

Understood.  I answered one recently in Arm Assembler.  Obviously not going to win, but fun none the less :)

@dzaima I missed some memos while I was gone, apparently. That rule got replaced?  Do you have a link to the meta post?  I'd love to read through it.

@StevenH. Here's the meta post - it's somewhat old, but many still haven't seen it

@dzaima Isn't using a language/feature that was created specifically for the challenge still considered a standard loophole?

@KSmarts I don't think it is (or should be), it's more like an implicit loophole. I have once made (a version of) one of my answers non-competing because I felt like a thing I added (that was mostly documentated) was too built-in-y for the challenge, though that built-in could very well be useful on other challenges.

SOGL V0.12, 24 bytes
u%⅝⁾⁷‰┘Η:⅛6s⁹№K⌠RΝīL°‘§╬

Try it Here!
A simple compression solution:
....‘    push "@-.¶===(¶----(¶=====(¶_____(¶\/\/\¶/\/\¶\/\¶/\¶\"
     §   pad with spaces and reverse horizontally
      ╬  palindromize with 0 overlap and mirroring the characters

No compression version - way longer as SOGLs compression works nice for this

Python 2, 95 bytes
i=9;print'   .-@@-.'
while i:print['('+~i*3/4*2%22*'-=_='[i%4]+')','\/'*i][i<6].center(12);i-=1

Try it online!

PowerShell, 85 bytes
"   .-@@-.
  (======)
 (--------)
($('='*10))
($('_'*10))"
1..5|%{" "*$_+'\/'*(6-$_)}

Try it online!
OR
PowerShell, 85 bytes
"   .-@@-.
  (======)
 (--------)"
'=','_'|%{"($($_*10))"}
1..5|%{" "*$_+'\/'*(6-$_)}

Try it online!
Take your pick. In both cases, the first three lines don't have enough bytes to do any sort of compression in PowerShell.
The first case uses string multiplication to produce each of the 10-length = and _ lines, while the second uses a loop and string multiplication. In either case, the last line forms the cone, looping from 1 to 5 and each iteration outputting the appropriate number of spaces followed by the appropriate number of cone pieces.
All of those strings are left on the pipeline, and the implicit Write-Output at program completion gives us a newline between elements for free.

V, 48 46 bytes
i\/5ñ>GÄXa/\ñS³ .-@@-.
  (¶=)
 (¸-)
(±=)
(±_)

Try it online!
Hexdump:
00000000: 695c 2f1b 35f1 3e47 c458 612f 5cf1 53b3  i\/.5.>G.Xa/\.S.
00000010: 202e 2d40 402d 2e0a 2020 28b6 3d29 0a20   .-@@-..  (.=).
00000020: 28b8 2d29 0a28 b13d 290a 28b1 5f29       (.-).(.=).(._)

Charcoal, 29 bytes
@-.⸿Ｅ=-=⁺×ι⁺³κ)×_⁵Ｐ↙⁶)⸿‖Ｍ←¤/\

Try it online! Link is to verbose version of code. Explanation:
@-.⸿

Print the right half of the first line.
Ｅ=-=⁺×ι⁺³κ)

For each of the characters =-=, repeat 3 times for the first and an additional time for each subsequent character, then append a ), printing each result on its own line.
×_⁵

Print 5 _s.
Ｐ↙⁶

Print the edge of the cone.
)⸿

Print the final ) and position the cursor inside the cone.
‖Ｍ←

Mirror the half cone.
¤/\

Fill the body of the cone.

Python 2, 86 bytes
n=10
while n:print['\/'*n,'('+35/n*2*'-=_='[n%4]+')','.-@@-.'][-2%n/4].center(12);n-=1

Try it online!
Working off Lynn's solution.

-2%n/4 is so cool :) Do you search for expressions like that manually, or do run some sort of brute force search?

@Lynn I ran a brute-forcer. I also did that for 35/n*2, which it found as 5*7/n*2 since it doesn't know of multidigit numbers.

Ohh, that’s neat. I would love to see the source code!

Perl 6, 115 95 94 92 90 bytes
3 bytes saved by AlexDaniel in #perl6 on irc.freenode.net

say "   .-@@-.
  (======)
 (--------)
({"="x 10})
({"_"x 10})";say(' 'x++$,'\/'x$--+5)xx 5

Try it online!

05AB1E, 42 bytes
•3[ÜAʒg‰ŽÎ<\¦•6¡εS"-.@(=_"sèJ∞}'\∞5LR×‚˜.C

Try it online!

1026344463000063444446355555 is now the Icecream Number b/c nobody else has used it.

Full program: •3[ÜAʒg‰ŽÎ<\¦•6¡εS"-.@(=_"sèJ∞}'\∞5LR×‚˜.C
current >> •  ||  stack: []
current >> 6  ||  stack: [1026344463000063444446355555]
current >> ¡  ||  stack: [1026344463000063444446355555, '6']
current >> ε  ||  stack: [['102', '3444', '30000', '344444', '355555']]
For each: S"-.@(=_"sèJ∞
Full program: S"-.@(=_"sèJ∞
current >> S  ||  stack: ['102']
current >> "  ||  stack: [['1', '0', '2']]
current >> s  ||  stack: [['1', '0', '2'], '-.@(=_']
current >> è  ||  stack: ['-.@(=_', ['1', '0', '2']]
current >> J  ||  stack: [['.', '-', '@']]
current >> ∞  ||  stack: ['.-@']
stack > ['.-@@-.']
Full program: S"-.@(=_"sèJ∞
current >> S  ||  stack: ['3444']
current >> "  ||  stack: [['3', '4', '4', '4']]
current >> s  ||  stack: [['3', '4', '4', '4'], '-.@(=_']
current >> è  ||  stack: ['-.@(=_', ['3', '4', '4', '4']]
current >> J  ||  stack: [['(', '=', '=', '=']]
current >> ∞  ||  stack: ['(===']
stack > ['(======)']
Full program: S"-.@(=_"sèJ∞
current >> S  ||  stack: ['30000']
current >> "  ||  stack: [['3', '0', '0', '0', '0']]
current >> s  ||  stack: [['3', '0', '0', '0', '0'], '-.@(=_']
current >> è  ||  stack: ['-.@(=_', ['3', '0', '0', '0', '0']]
current >> J  ||  stack: [['(', '-', '-', '-', '-']]
current >> ∞  ||  stack: ['(----']
stack > ['(--------)']
Full program: S"-.@(=_"sèJ∞
current >> S  ||  stack: ['344444']
current >> "  ||  stack: [['3', '4', '4', '4', '4', '4']]
current >> s  ||  stack: [['3', '4', '4', '4', '4', '4'], '-.@(=_']
current >> è  ||  stack: ['-.@(=_', ['3', '4', '4', '4', '4', '4']]
current >> J  ||  stack: [['(', '=', '=', '=', '=', '=']]
current >> ∞  ||  stack: ['(=====']
stack > ['(==========)']
Full program: S"-.@(=_"sèJ∞
current >> S  ||  stack: ['355555']
current >> "  ||  stack: [['3', '5', '5', '5', '5', '5']]
current >> s  ||  stack: [['3', '5', '5', '5', '5', '5'], '-.@(=_']
current >> è  ||  stack: ['-.@(=_', ['3', '5', '5', '5', '5', '5']]
current >> J  ||  stack: [['(', '_', '_', '_', '_', '_']]
current >> ∞  ||  stack: ['(_____']
stack > ['(__________)']
current >> '  ||  stack: [['.-@@-.', '(======)', '(--------)', '(==========)', '(__________)']]
current >> ∞  ||  stack: [['.-@@-.', '(======)', '(--------)', '(==========)', '(__________)'], '\\']
current >> 5  ||  stack: [['.-@@-.', '(======)', '(--------)', '(==========)', '(__________)'], '\\/']
current >> L  ||  stack: [['.-@@-.', '(======)', '(--------)', '(==========)', '(__________)'], '\\/', '5']
current >> R  ||  stack: [['.-@@-.', '(======)', '(--------)', '(==========)', '(__________)'], '\\/', [1, 2, 3, 4, 5]]
current >> ×  ||  stack: [['.-@@-.', '(======)', '(--------)', '(==========)', '(__________)'], '\\/', [5, 4, 3, 2, 1]]
current >> ‚  ||  stack: [['.-@@-.', '(======)', '(--------)', '(==========)', '(__________)'], ['\\/\\/\\/\\/\\/', '\\/\\/\\/\\/', '\\/\\/\\/', '\\/\\/', '\\/']]
current >> ˜  ||  stack: [[['.-@@-.', '(======)', '(--------)', '(==========)', '(__________)'], ['\\/\\/\\/\\/\\/', '\\/\\/\\/\\/', '\\/\\/\\/', '\\/\\/', '\\/']]]
current >> .  ||  stack: [['.-@@-.', '(======)', '(--------)', '(==========)', '(__________)', '\\/\\/\\/\\/\\/', '\\/\\/\\/\\/', '\\/\\/\\/', '\\/\\/', '\\/']]
   .-@@-.
  (======)
 (--------)
(==========)
(__________)
 \/\/\/\/\/
  \/\/\/\/
   \/\/\/
    \/\/
     \/
stack > ['   .-@@-.\n  (======)\n (--------)\n(==========)\n(__________)\n \\/\\/\\/\\/\\/\n  \\/\\/\\/\\/\n   \\/\\/\\/\n    \\/\\/\n     \\/']

•3[ÜAʒg‰ŽÎ<\¦•               | Pushes 1026344463000063444446355555 to the stack.
-----------------------------+-------------------------------------------------
6¡                           | Split on 6's.
-----------------------------+-------------------------------------------------
  ε             }            | Loop on each piece to create the top of the icecream...
   S                         | Split into single chars.
    "-.@(=_"sè               | Substitute in the correct symbol for each number.
              J∞             | Join, then mirror.
-----------------------------+-------------------------------------------------
                 '\∞         | Push \/.
                    5LR      | Push [5,4,3,2,1]
                       ×     | Multiply '\/' by each 5,4,3,2 and 1.
                        ‚˜   | Join top to bottom.
                          .C | Center w/ newlines.

Bubblegum, 50 bytes
00000000: 5350 50d0 d375 70d0 d5e3 5250 d0b0 0503  SPP..up...RP....
00000010: 4d2e 050d 5d28 d0e4 020b c224 34e2 e100  M...](.....$4...
00000020: a82a 461f 0681 9a91 980a 0896 0284 0161  .*F............a
00000030: 0100                                     ..

Try it online!

C, 171 bytes
i;p(c,n,o){for(printf("%*c",o,i?32:40);n--;)printf(c);puts(i?"":")");}f(){p(".-@@-.",i=1,3);--i;p("=",6,3);p("-",8,2);p("=",10,1);p("_",10,1);for(i=6;--i;)p("\\/",i,6-i);}

Try it online!
C, 146 bytes
f(){puts("   .-@@-.\n  (======)\n (--------)\n(==========)\n(__________)\n \\/\\/\\/\\/\\/\n  \\/\\/\\/\\/\n   \\/\\/\\/\n    \\/\\/\n     \\/");}

Just prints the hardcoded string.
Try it online!

You can do better than this I thinks...

Python 2, 125 120 119 116 106 bytes

Saved three bytes thanks to AdmBorkBork; golfed in range(5,0,~0) to in[5,4,3,2,1].

print"   .-@@-.\n  (======)\n "+"(%s)\n"*3%("-"*8,"="*10,"_"*10),
for _ in 5,4,3,2,1:print" "*(6-_)+_*"\/"

Try it online!

Python 2, 104 bytes
Borrowed a trick from Jonathan Frech's answer, and thanks to him for saving me some bytes too.
print"   .-@@-.\n  (======)\n "+"(%s)\n"*3%("-"*8,"="*10,"_"*10),
i=5
while i:print(6-i)*" "+"\/"*i;i-=1

Try it online!

Python 2, 108 bytes
print"""   .-@@-.
  (======)
 (--------)
(==========)
(__________)"""
i=5
while i:print(6-i)*" "+"\/"*i;i-=1

Try it online!

Japt, 50 bytes
5õ_ç"\\/"
c[AA8,6]£"({Xç"_=-="gY})"Ãp".-@"ê1¹w û ·

Try it online!

Perl 5, 92 bytes
say'   .-@@-.
  (======)
 (--------)
(==========)
(__________)';$_='\/'x6;say while s%\\/% %

Try it online!

Don't you need to count the input towards the byte count?  Otherwise just input the entire string...

There is no input.  That was just a TIO leftover from something else I was doing.

cool, got it thanks.

+1. You can save a couple using RLE decoding, but I couldn't get using ; as a delimiter for s/// working for some reason. On mobile so can't do anything too much! Try it online!

Ruby, 97 bytes
i=-1
puts ['   .-@@-.']+123455543.digits.map{|n|(i+=1;i<4?"(#{'=-=_'[i]*n*2})":'\/'*n).center 12}

Try it online!
First time ever using Ruby, so tips are very welcome.

Python 3, 202 bytes
This is pretty terrible, its more bytes than just defining the string and printing that even.
print("   .-@@-.")
print("  ("+"="*6+")")
print(" ("+"-"*8+")")
print("("+"="*10+")")
print("("+"_"*10+")")
print(" "+"\/"*5)
print("  "+"\/"*4)
print("   "+"\/"*3)
print("    "+"\/"*2)
print("     \/")

Try It Online

You can use \n instead of separate print statements

148 bytes using this approach

Welcome to PPCG!

Jelly, 74 72 bytes
5RU⁾\/ẋ
5R×⁶ż¢Y
3,6,8,10,10j1ż“ “.-@@-.¶  (“=“)¶ (“-“)¶(“=“)¶(“_“)¶”P€;¢

Try it online!
Explanation:
5RU⁾\/ẋ    Link 1. Generate list of "\/"s for cone.
5RU        Range 5, reverse. Gets [5,4,3,2,1].
   ⁾\/     Literal string "\/".
      ẋ    Repeat. Gets ["\/\/\/\/\/","\/\/\/\/","\/\/\/","\/\/","\/"].

5R×⁶ż¢Y    Link 2. Generate rest of cone.
5R         Range 5. Gets [1,2,3,4,5].
  ×⁶       Repeat " " that many times. Gets [" ","  ","   ","    ","     "]
    ż¢     Zip that with the ¢ones. Gets a list of alternating space and cones.
      Y    Join with newlines. This puts it all together for the big cone.

3,6,8,10,10j1ż“ “.-@@-.¶  (“=“)¶ (“-“)¶(“=“)¶(“_“)¶”P€;¢    Link 3. Generate the top and put it on the cone.
10,10,8,6j1;1U                                                Generate list 3,1,6,1,8,1,10,1,10. Does this by joining [10,10,8,6] with ones, appending a one, and reversing.
               “   .-@@-.¶  (“=“)¶ (“-“)¶(“=“)¶(“_“)¶”        List of strings. This separates the completed parts from the non completed parts.
              ż                                               Zip 'em together. Gets [number, string, number, string, ...]
                                                      P€      Get the product of €ach. This completes the non completed strings by repeating them.
                                                        ;¢    Attach the ¢one to the end.

Mathematica, 117 bytes
Column[Join[{".-@@-."},"("<>#<>")"&/@{"="~(T=Table)~6,"-"~T~8,"="~T~10,"_"~T~10},T[""<>T["\/",i],{i,5,1,-1}]],Center]

Outputs

you can test it on wolfram sandbox (although the fonts they use may destort the result a little)

Interestingly \/ is a special character. I couldn't find what it's used for so I asked on Mma.SE: https://mathematica.stackexchange.com/q/200673/61597

Pyth, 58 bytes
jm.[12@,*d"\/"@,".-@@-."j@*Vj11494 11"-=_="d"()"ndTgd6;_ST

Watch it in action!

C, 138 bytes
f(i,j){puts("   .-@@-.\n  (======)\n (--------)\n(==========)\n(__________)");for(j=1;++j<7;i=puts(""))for(;i<7;)printf(i++<j?" ":"\\/");}

Try it online!

Suggest j=6;--j;puts(""))for(i=7;--i;)printf(&L"⽜ "[i>j] instead of j=1;++j<7;i=puts(""))for(;i<7;)printf(i++<j?" ":"\\/"

VimL, 76 bytes
a   .-@@-.␤  ␤ ␛k6A=␛j8A-␛o␛10A=␛o␛10A_␛qaI(␛A)␛kq3@aGo ␛5A\/␛qayypxxI ␛q3@a

Animated with vimanim.py.

C (gcc), 137 136 bytes
-1 bytes thanks to ceilingcat
main(i){for(puts("   .-@@-.\n  (======)\n (--------)\n(==========)\n(__________)");8<printf("%*c%s\n",++i,92,"/\\/\\/\\/\\/\\/"+i*2););}

Try it online!

C 165 bytes
y,x,z;f(){for(puts("   .-@@-.");y++<9;)for(;x=++x%14;)z=y+3-y/4,putchar(x<13?y<5?x-7^z-1?7-x^z?abs(x-7)<z?y<4?y&1?61:45:95:32:40:41:x+y>16|y-x>3?32:x+y&1?92:47:10);}

Cubically, 345 336 bytes
⇒@@@
RU+30f1+3-00@-2+3@+4@@-4@+2-3@-110@+31-4@@+2-4@+10f1f1-3+0@-400@+31-4@+2-4@+3-10f1f1@@-4+1@-400@+11@+10f1f1f1@-3+0@-400@+11@+4110@f1f1f1-22@-400@+31-4@+220@-43@+43@-43@+43@-43@+43@-43@+43@-43@-4000@+31-4@@+220@-43@+43@-43@+43@-43@+43@-43@-4000@+31-4f1+220@-43@+43@-43@+43@-43@-4000@+31-4f1@+220@-43@+43@-43@-4000@+31-4f1@@+220@-43@

Found via this tool and golfed via search-and-replace, with a couple custom optimizations.
Try it online!

Alternate method:
391 bytes (doesn't modify cube)
+5/1+3@@@:1/1+5@5.0+2@@5.0-2@-4@:5/1+3@@:4/1+4@:5+2/1+51@@@@@@:5/1+4@:1/1+1@:5/1+3@:4/1+4@5.05.05.05.05.05.05.05.0:5/1+4@:1/1+1@:4/1+4@:5+2/1+51@@@@@@@@@@:5/1+4@:1/1+1@:4/1+4@:5/1+55@@@@@@@@@@-51@:1/1+1@:5/1+3@:2/1+55@-5@+5@-5@+5@-5@+5@-5@+5@-5@:1/1+1@:5/1+3@@:2/1+55@-5@+5@-5@+5@-5@+5@-5@:1/1+1@:5/1+3@@@:2/1+55@-5@+5@-5@+5@-5@:1/1+1@:5/1+3@@@@:2/1+55@-5@+5@-5@:1/1+1@:5/1+3@@@@@:2/1+55@-5@


text:
Is it a whole number?
A number is whole if it is a non-negative integer with no decimal part. So 0 and 8 and 233494.0 are whole, while 1.1 and 0.001 and 233494.999 are not.

Input
A floating-point number in the default base/encoding of your language.
For example, the default integer representation for Binary Lambda Calculus would be Church numerals. But the default integer representation for Python is base 10 decimal, not Unary.
Output
A truthy value if the input is whole, a falsy value if it is not.
Note that if your language only supports decimal precision to, say, 8 places, 1.000000002 can be considered whole.
Input and output may be done via any standard I/O methods.

Test cases
Input        -> Output
332          -> true
33.2         -> false
128239847    -> true
0.128239847  -> false
0            -> true
0.000000000  -> true
1.111111111  -> false
-3.1415926   -> false
-3           -> false

Scoring
As with code-golf, the shortest submission wins. Good luck!

@StephenLeppik It's no easier than the vanilla parity challenge, or the Hello World, or the Truth Machine. (In fact, it's harder than most of those.)

May we take input as two numbers, representing a fraction?

@LyricLy No, that would either be much easier for some languages or unnecessary for others.

Note that whole numbers are non-negative integers.  Please update your first sentence to reflect this.  And you can add in negative numbers test cases if you wish to show how whole numbers are not negative and falsy outputs for negative numbers are valid.

"Output may be deterministic"? I suppose you meant "Output must be deterministic"

"Non-negative integers" implies no decimal part, by the nature of what an integer is.  Do you mean to specify "Non-negative numbers with no decimal part", or no?  Yes I'm splitting hairs over grammar.

@ThomasWard I'm just making sure it's perfectly clear.

@MDXF web browser caching, sorry.

Should -0 returns truthy? At least by now the Retina answer get it wrong. What about 1.0?

@user202729 Unless you're doing assembly, -0 evaluates to its simplest form 0, and that's what should be inputted. 1.0 evaluates to its simplest form 1, and that's what should be inputted.

Must we return a truthy value or can we have true/false inverted in our output?

Now the Ly answer cannot handle 1 but can handle 1.0. Is that valid?

How do you represent non-integer numbers with church numerals?

Can we define what we consider truthy? (e.g. can 0 be true, and 1 be false).

There are missing test cases like -1.0  ;  1.0  ;  500.000  ;  -500.000

@TomCarpenter No, that's not allowed by concensus

@ThomasWard, that wikipedia article seems to not fully agree with you: "Texts that exclude zero from the natural numbers sometimes refer to the natural numbers together with zero as the whole numbers, but in other writings, that term is used instead for the integers (including negative integers)". I read the title as asking about integers.

@ilkkachu Whole Number != Natural Number if I recall my math right.  they are separate concepts.

In a language like Befunge, where there aren't really different data types, can we take in numbers like so: 123.0000617?

Sinclair ZX80 (4K ROM) has integer-only BASIC, so on that basis am I allowed an entry for this technology? i.e., any floating point number will produce an error (false), so I only need to check for numbers of zero or more.

APL (Dyalog), 3 bytes
⌊≡|

Try it online!
Note that f← has been prepended in the TIO link due to technical limitations, but it's not normally needed.

That's elegant! I don't know why I added unnecessary ceiling to my answer....

@GalenIvanov This is just floor(n) == abs(n).

Haskell, 27 16 bytes
This function checks whether x is contained in the list of nonnegative integers that are not greater than x.
f x=elem x[0..x]

Try it online!

Wolfram Language (Mathematica), 17 15 14 bytes
Saved 1 byte thanks to Not a tree!
#>=0==#~Mod~1&

Try it online!
First Mathematica answer \o/
Mathematica, 15 bytes
Saved 2 bytes thanks to @user202729!
#==⌊Abs@#⌋&

Pyth, 4 bytes
qs.a

Test suite
Is the number equal (q) to the floor (s) of its absolute value (.a)?

Husk, 3 bytes
£ΘN

Try it online!
The third test case times out in TIO, so I chopped off a couple of digits.
I tried to run it locally, but killed it after a couple of minutes since it was using over 6GB of memory and my computer started to stutter.
It should theoretically finish at some point...
Explanation
This corresponds to the challenge description pretty directly.
£ΘN  Implicit input: a number.
  N  The infinite list [1,2,3,4...
 Θ   Prepend 0: [0,1,2,3,4...
£    Is the input an element of this list?

What would λx → floor(x) == abs(x) look like in Husk?

@Lynn That would be §=⌊a, so one byte longer.

Python 2, 18 bytes
lambda n:n%1==0<=n

Try it online!

Python 2 and Python 3, 21 18 bytes
lambda n:n>=0==n%1

Try it online! (Py2)
Try it online! (Py3)
3 bytes saved thanks to Mr. XCoder.

///, 94 bytes, input hard-coded
/=/\/x://:/\/\///-0/-:.0/.:.|/|:-|/|:0=1=2=3=4=5=6=7=8=9=|x/|:||/true:x:/-:/.:/|/+:++/false/||

Try it online!
Input between the two terminating vertical lines (||)
Strips -00...0 and .00...0, converts all remaining digits to xs, then tests whether the remaining number still has xs after . or a - not followed by ..
Could save up to 7 bytes depending on what's counted as truthy and falsey since this language doesn't have native truthy/falsey values, currently is outputting true and false but could change to, for example, T and F for 87 bytes if that's allowed.

Octave, 15 bytes
@(x)any(x==0:x)

Try it online!
This one is based on the approach used in @flawr's Haskell answer.
While it brings the byte count down to 15, it is shamefully inefficient (no offence intended), creating a list of every integer from 0 to x and seeing if x is contained within.

Octave, 18 bytes
@(x)fix(x)==abs(x)

Try it online!
Takes input as a double precision number. Returns true if whole.
Checks if the input when rounded is equal to the magnitude of the input. This will only be the case when the number is positive and whole.

Octave, 18 bytes
@(x)~mod(x,+(x>0))

Try it online!
An alternate solution for 18 bytes. Sadly the mod function in Octave won't implicitly convert a bool to a double, so the +( ) is needed around the greater than comparison. Otherwise this solution would have been shorter.

Octave, 18 bytes
@(x)x>=0&~mod(x,1)

Try it online!
And another one... I can't seem to get lower than 18 bytes. All because of having to allow for 0 to be true with the >= instead of just >.

C++ (gcc), 33 bytes
int f(float x){return(uint)x==x;}

Try it online!

Welcome to PPCG!

Pyth, 6 bytes
&gQZsI

Try it online!

Aceto, 6 bytes
rfdi±=p

r grabs input
f converts it to a float
d and i duplicates it and converts it to an integer
± pushes the absolute value of it (b/c can't be negative)
= checks if they are equal
p prints out the result
Try it online!

C (gcc), 27 28 27 25 bytes
-2 thanks to PrincePolka
#define g(f)!fmod(f,f>=0)

Try it online!
Defines a macro "function" g that takes a parameter f (of any type). Then checks if casting f mod 1 is zero, and if f is non-negative.

I think you are required to include the size of the include directive in your byte count, since fmod is defined in math.h : see there

@HatsuPointerKun It works without it too

I don't think you need -lm on windows-based C distributions (works on my machine)

25 ,  #define g(f)!fmod(f,f>=0)

QBIC, 17 bytes
?(:=int(a))*(a>0)

Explanation
?             PRINT
 (:=int(a))     if the input (: assigns the cmd line param to 'a') equals itself
                cast to int, -1 else 0
 *              times
 (a>0)          if the input > 0, -1 else 0

If either check fails, this returns 0. If both are true, it returns -1 x -1 = 1

C#, Java : 43 bytes
-1 byte thanks to Zacharý
-1 byte thanks to TheLetalCoder
int w(float n){return(n==(int)n&&n>=0)?1:0;}

C# has a special 33 bytes optimization that you can not do in java :
bool w(float n){return(int)n==n;}

For testing
C# code :
class Program {
    int w(float n){return(n==(int)n&&n>=0)?1:0;}

    static void Main(string[] args)
    {
        var p = new Program();
        float[] fTab = new float[]{
            332,33.2f,128239847,0.128239847f,0,0.0000f,1.1111111111f,-3.1415926f,-3
        };
        foreach (float f in fTab) {
            Console.WriteLine(string.Format("{0} = {1}", f, (p.w(f) != 0).ToString()));
        }
        Console.ReadKey();
    }
}

Java Code :
public class MainApp {
    int w(float n){return(n==(int)n&&n>=0)?1:0;}

    public static void main(String[]a) {
        MainApp m = new MainApp();
        float testArr[] = new float[]{
                332,33.2f,128239847,0.128239847f,0,0.0000f,1.1111111111f,-3.1415926f,-3
        };

        for (float v : testArr) {
            System.out.println(v + " = " + String.valueOf(m.w(v)!=0));
        }
    }
}

I think you can remove a space between return and (.

return a bool and there's no need for the ternary.

@TheLethalCoder bool does not exist in Java

I don't know Java/C# that well, but can you make it return(int)n==n? Or would that cast n==n to an int rather than just n?

@Zacharý It works in C#, because i can use the bool data type. In java, if i want to use a boolean data type, i have to type boolean.

You can lower the Java 7 answer by 3 bytes by reversing the check and changing the boolean operator to a bitwise one: int w(float n){return(int)n!=n|n<0?0:1;} (40 bytes). As Java 8 lambda it's even shorter: n->(int)n==n&n>=0 (17 bytes), and same applies to the C# answer as lambda: n=>(int)n==n&n>=0 (also 17 bytes).

Google Sheets, 10 Bytes
Anonymous worksheet function that tales input from cell A1 and outputs to the calling cell.
=A1=Int(A1

Prolog (SWI), 24 bytes
f(X):-X>=0,round(X)=:=X.

Try it online!

Ly, 35 47 bytes
ir"-"=[0u;]pr[["0"=![psp>l"."=[ppr!u;]p<2$]pp]]

Try it online!
Ly has float support, but the only way to create a float currently is by performing division. There is no way to take a float as input, so I had to manually check the string instead.
Lost 13 bytes adding support for negative numbers.

JavaScript, 17 15 bytes
_=>_<0?0:_==~~_

_=>_<0?0:_==(_|0)

Thanks to edc65 for catching my mistakes.

JavaScript, 14
n=>!(n<0||n%1)

13 bytes: n=>!(n-(n|0))

@IsmaelMiguel. It doesn't work for negative numbers.

@ThePirateBay Which exact number? I tried with 5, 5.1, -5, -5.1, 0, 0.1 and -0.1.

@IsmaelMiguel. (n=>!(n-(n|0)))(-3) returns true, but should return false. See the last test case.

Oh, you're right on that :/ I mis-read the question :/

Perl 5, 11 +1(-p) bytes
$_=abs==int

The -l switch not counted because for tests display
try it online

C, C++ : 38 37 bytes
-1 byte thanks to Zacharý
-1 byte thanks to ceilingcat
int w(float n){return(int)n==n&n>=0;}

For Testing
C : Try it online
C Code :
#include <stdio.h>
int main() {
    float f[] = { 332,33.2f,128239847,0.128239847f,0,0.0000f,1.1111111111f,-3.1415926f,-3 };
    int t;
    for ( t = 0; t < 9; ++t) {
        printf("%f = %s\n", f[t], w(f[t])?"true":"false");
    }
    return 0;
}

C++ Code :
#include <iostream>
int main() {
    std::initializer_list <std::pair<float,bool>> test{
        {332.f,true}, {33.2f,false}, {128239847.f,true}, {0.128239847f,false}, {0.f,true}, {0.000000f,true}, {1.111111f,false}, {-3.1415926f,false}, {-3.f,false}
    };

    for (const auto& a : test) {
        if (w(a.first) != a.second) {
            std::cout << "Error with " << a.first << '\n';
        }
    }
    return 0;
}

This will only work up to INT_MAX. (I don't really care but some people do.)

Would changing it to return(int)n==n... work?

You can shave one byte by using unsigned int instead of a signed one (as you then don't need the >=0 test): return(unsigned)n==n;  And in C, you can omit the return type for a further 4 bytes.

You can save 8 more bytes: w(float n){n=n==(int)n&&n>=0;}

C#, 40 37 29 bytes
bool z(float x)=>x%1==0&x>=0;

Saved 8 bytes thanks to @Dennis_E!
Old Answer (37 bytes)
bool z(float x){return x%1==0&&x>=0;}

Old old answer (40 bytes):
bool z(float x){return (int)x==x&&x>=0;}

30 bytes: bool z(float x)=>x%1==0&&x>=0; and you can use a single & for 29 bytes

x=>x%1==0&x>=0 is shorter and compile to Func<float, bool>

Perl 6,  15  13 bytes
{.narrow~~UInt}

Test it
{.Int==$_>=0}

Test it

Java (OpenJDK 8), 14 bytes
n->n%1==0&n>=0

Try it online!

Unexpanded Sinclair ZX81, 20 bytes
 1 INPUT A
 2 PRINT ABS A=INT A

20 bytes because BASIC is tokenized.
Simply will output 1 (true) if number is positive and the value of the number entered equals its integer value. Outputs 0 either of those conditions are not met.

Is this a tokenized language? If it is you should indicate that in your answer.

Sorry, yes it to tokenized, i.e., INPUT is 1 byte of RAMs, as is PRINT and even >= due to a ~quirk~ intended feature of Sinclair BASIC

Specifically, each line number is 5 bytes + 1 newline (\r\n equivalent in ZX81 speak), white spaces don't count as bytes as those are already included in the keywords usually due to the Sinclair 'one-key-press' entry system. On running, it will take more bytes as it will put the value of A onto the var stack; I think each numeric value is always 5 bytes of memory.

and ZX Spectrum too

I'm not sure how the tokenizer works on the Sinclair ZX Spectrum; I do know that I can save bytes by more typing on both machines, but then that confuses the CodeGolf issue somewhat. So if I used NOT PI instead of 0 then I save some bytes because NOT PI is 2 bytes whereas 0 is 5 bytes or something.

As far as I know the tokenization mode is exactly the same (Spectrum has more codes). And any literal number is 6 bytes: a 'numeric tag' byte followed by the value encoded in a 5 bytes proprietary floating point format)

@edc65 very good there - are you making some ZX softwares?

JavaScript (Node.js), 11 bytes
n=>n<0==n%1

Try it online!

Jelly, 3 bytes
ḞA=

Try it online!
The algorithm is the same as the one used in the Mathematica answer above.

No, it's not a bug that you can't explicitly state a 0 integer part, it's a feature, and specifically a syntax rule that dictates that a leading 0 is a 0 on its own, so for example 053 is the same as 0 53 and 0.5 is the same as 0 .5.

@EriktheOutgolfer Nice. But when will you need 2 consecutive nilad?

A couple of cases would be a dyad-nilad pair followed by a nilad-dyad pair and a quick which takes multiple nilads in a row (specifically ƭ = tie), and a third case would be something like a trailing (dyad)(nilad)(nilad) or (monad)(nilad) or (dyad)(nilad)(nilad)(monad) or even (monad)(nilad)(monad) etc.

@EriktheOutgolfer Apparently ƭ is one of the quicks that does not have syntax specification... / What does those trailing do?

All the detail about how Jelly interprets the "input" (the code in your footer) is only necessary because of your test-suite implementation (using Jelly code to give the numbers) if you use an argument it is evaluated as Python code - see this for example.

Retina, 12 10 bytes
Match the format of a non-negative whole number
^\d+\.?0*$

Try it online
-2 thanks to FryAmTheEggman

J, 7 4 bytes
Removed the unnecessary celing check after the solution of Erik The Outgolfer
<.=|

Try it online!

Ruby, 17 bytes
->n{n>=0&&n%1==0}

Try it online!
It's not great, but I don't think it can get smaller.

R, 30  22 bytes
a=scan();`if`(a%%1==0&a>0,T,F)

It's a pity that we can't take strings as input, because grepl("^\\d+.?0*$",scan(,"")) is 29 bytes. Ah well, +1.

You don't need the if: a=scan();a>0&!a%%1 works for 18 bytes.

Common Lisp, 36 32 bytes
(lambda(n)(=(max n 0)(floor n)))

Try it online!
Transposition of marmeladze’s answer.

Symbolic Python, 21 bytes
_=_%(_==_)==(_!=_)<=_

Try it online!
Uses a chained comparison:

_%(_==_) == (_!=_) checks if n%1 == 0, only true if n has no decimal part.
(_!=_) <= _ checks if 0 <= n, only true if the integer is non-negative.

Implicit (version predating challenge), 10 bytes
÷±1>?{;;ö}

Try it online! (Will only work after Dennis pulls TIO for the eighteenth time, bugs are stupid)
÷±1>?{;;ö}   no implicit input :(
÷            read float
 ±1          push -1
   >         push (input > -1)
    ?{...}   if truthy
      ;      pop (input > -1)
       ;     pop -1
        ö    push iswhole(input)
             implicit integer output.
                if (input > -1) was false, it prints (input > -1).
                otherwise, it prints iswhole(input).

Posting this as an alternate solution since I had to update the builtin after realizing that whole numbers are >= 0, which feels cheaty.
Implicit, 1 byte
ö

Do no other languages have this builtin?!
   implicit float input
ö  push truthy if whole, falsy otherwise
   implicit int output

Brachylog, 7 bytes
⌋₁ℕ.&⌉₁

Try it online!
At first, I expected to submit a one-byte answer ℕ, which is a predicate meant to be equivalent to an assertion that the input (which is the output variable as well) is a whole number. Turns out, it doesn't consider integer-valued floats to be integers (throwing a false negative on the 0.00000000 test case, as well as the 1.0 non-test-case), so I had to do this instead:
           The input
⌋₁         rounded down
  ℕ        which is non-negative
   .       is the output variable
    &      and the input
     ⌉₁    rounded up
           is also the output variable.

Any number with a decimal separator is a float.

><>, 10 bytes
:1%$0(+0=n

Try it online!
Explanation
Calculates (n%1 + n<0) == 0

TI-BASIC (TI-84), 3 bytes
not(fPart(Ans

Example:
3.5
             3.5
not(fPart(Ans
               0
21
              21
not(fPart(Ans
               1

Built-in functions are amazing, no?
Prints 0 (false) if Ans has a decimal part or 1 (true) if it doesn't.

Japt, 6 4 3 bytes
¶Âa

Try it

Explanation
Checks for strict equality (¶) between the input and the absolute value (a) of the input with bitwise NOT applied twice (Â).

Does it work for numbers > 2^31 ?

Scala, 25 chars
(f:Double)=>f.ceil.abs==f

Just to clarify, the type definition cannot be excluded

Recursiva, 4 bytes
=aIa

Try it online!

Python 3, 59 57 48  bytes
print("1")if float(input())%1==0else print("0")

Try it

Welcome to the site! You don't have to explicitly output true and false, instead you can output any two distinct values, such as 1 and 0, that are the same as true and false. Also, this answer can be golfed by removing unnecessary whitespace, and other such tricks found here

Fails for negative integers (the requirement is to treat these as not-whole numbers).

Note that eval is shorter than float and will suffice here. Also you can put the if inside your print: print("1"if eval(input())%1==0else"0"). Furthermore you could use string indexing: print("01"[eval(input())%1==0]). But we don't need "1" and "0" at all: print(eval(input())%1==0). A lambda would then save more: lambda n:n%1==0 (not that any of this fixes the issue I noted above).

Why not just print the boolean directly? print(float(input())%1==0) Although the negative integer problem is pretty major.

D : 43 bytes
Just discovered that D has strange cast rules. Code :
int w(float n){return n==cast(int)n&&n>=0;}

For testing
D : Try it online
D Code :
void main() {
    float[] f = [ 332,33.2f,128239847,0.128239847f,0,0.0000f,1.1111111111f,-3.1415926f,-3 ];
    for (int t = 0; t < f.length; ++t) {
        writeln(f[t]," = ", w(f[t])?"true":"false");
    }
}

Yeah, D has some weird casting rules for sure.

MY, 8 bytes
ω≥ωω⌊=∧←

Try it online!
The link uses arrays to test multiple numbers at once.
How?

ω≥ = ω>=0 (0 is popped when stack is empty)
ωω⌊= = ω==floor(ω)
∧← = take the logical and of the things above, then output.

Clojurescript, 12 bytes
#(=(int %)%)

No TIO, this doesn't work in Clojure, only Clojurescript. You can try it here though:
cljs.user=> (def f #(=(int %)%))
#'cljs.user/f
cljs.user=> (f 2)
true
cljs.user=> (f 2.0)
true
cljs.user=> (f 2.5)
false

PowerShell, 24 bytes
+"$args"-match'^[^-.]+$'

Try it online!
Convert the argument to a string, then back to a number (actually unnecessary, could have also just used $args[0] directly, but I thought of the latter first and it's the same byte count), then do a regex match, looking to see that the string has no - or . characters in its entirety.
Simple and boring :(

Hexagony, 6 bytes
?~<%@'

Try it online!
Output via exit code. 1 for whole numbers and 0 otherwise.
Explanation
Unfolded:
 ? ~
< % @
 ' .

If we try to read two integers, then the second one will be zero for whole numbers.
?    Read whole number part, N.
~    Multiply by -1.
<    This branches depending on whether the value is positive or not, i.e.
     whether N is negative or not.

     If it's negative, the IP moves SE.

'    Move the memory pointer backwards, to the right.
?    Read another value. Irrelevant.
%    Computes (0 % N). Irrelevant.
~    Multiply by -1. Irrelevant.
@    Terminate the program.

     If N isn't negative, the IP moves NE from the <.

?    Read the fractional part, F.
'    Move the memory pointer backwards, to the right.
%    Computes (0 % F). This terminates the program with exit code 1 if
     F is zero. Otherwise, it does nothing.
~    Multiply by -1. Irrelevant.
<    Reflect the IP to SW.
~    Multiply by -1. Irrelevant.
%    Computes (0 % F). Now irrelevant.
'    Move the IP back again.
@    Terminate  the program.

Pyth - 10 Bytes
&qQ.EQgQ0

Explanation :
              Implicitly Print
&              And
    q           Are Equal
        Q        Input
        .E       Ceiling of
            Q     Input
    g           Greater Than or Equal to
        Q        Input
        0         0

PHP, 28 bytes
First solution:
echo!(ceil($n=$argv[1])-$n);

Second solution:
echo floor($n=$argv[1])==$n;

gives false positive for every negative int

05AB1E, 3 bytes
ïÄQ

Try it online or verify all test cases.
Explanation:
ï      # Trim all decimals of the (implicit) input
 Ä     # Take its absolute value
  Q    # Check if it's equal to the (implicit) input (and output implicitly)

Scratch in scratchblocks2, 92 67 bytes
thanks lirtosiast
when gf clicked
ask[]and wait
say<([abs v]of(answer))=(round(answer

Try it online

Surely when gf clicked ask[]and wait say<([abs v]of(answer))=(round(answer is shorter?

Ah yes, somehow I forgot about that.

PHP, 23+1 bytes
<?=$argn==abs(0|$argn);

prints 1 for truthy; empty output for falsy.
Run as pipe with -F.

Ruby, 18 characters
->x{x>=0&&0==x%1}

Commodore BASIC (C64/128 C64Mini VIC-20...) 17 tokenized BASIC bytes
 0INPUTA:?A=INT(A)

In Commodore (Microsoft) 8-BIT BASIC, -1 is TRUE and 0 is FALSE.
If you require strictly 1 to represent TRUE and 0 to represent FALSE, this is how to do it:
Version 2, 20 tokenized BASIC bytes
 0INPUTA:?ABS(A=INT(A))

or
 0INPUTA:?-(A=INT(A))

Vyxal, 2 bytes
⌊=

Try it Online!
⌊  # Floor
 = # Is equal to original?

Thunno 2, 2 bytes
N=

Attempt This Online!
Explanation
N=  # Implicit input
N   # Cast to integer
 =  # Equals the input?
    # Implicit output

JavaScript, 9 12 bytes
n=>!n%1&n>=0

Didn't realize that I had to take in negatives. Pointed out by @kamoroso94.

REXX, 27 bytes
arg n
say trunc(n)=n & n>=0

Ruby, 20 bytes
->x{x.div(1)==x.abs}

Ruby, 22 bytes
->x{[0,x].max==x.to_i}

Why is there a leading space in the second code snippet?

C on Linux, 31 bytes
int f(float v){return!rintf(v);}

The correct prototype for rintf is float rintf(float). However, in IEEE floating-point, 0.0f has the binary representation of all zeros. We (mis)use this feature to get away without using a prototype; the zero/non-zero value is then inverted into 1 or 0.

or #define f(v)!rintf(v)

You should be able to use the implicit int typing if you drop the int.

@technosaurus - Why not accept double and save a byte? #define f(v)!rint(v)

Actually, I don't think this answer is correct at all - should it be v==rint(v)?  Or perhaps !fmod(v,1)

@TobySpeight, it would have to be !fmodf(v,1.0) for the return to be a float (int-sized), and 1.0 to force the parameter to a float, both needed because there is no prototype.

I missed the bit where you said it only works on platforms where int is the same size as float.  I'll read more carefully in future!  It's still the case that this returns true for 0.5 and false for 2.0, contrary to requirements.

Jq 1.5, 15 bytes
.>=0and.==floor

Not much to explain:
(. >= 0) and     # non-negative and
(. == floor)     # value == (value truncated to integer)

Try it online!

D, 36 33 30 bytes
T f(T)(T n){return(n<0)==n%1;}

Try it online!
I will not be beaten in D!

Enlist, 4 bytes
:1Ae

Try it online!
Direct port of my Jelly answer above. Because of some reasons HyperNeutrino didn't implement
Floor or Ceiling in Enlist, I use :1 (integer division by 1) instead, which takes 2 bytes.

Lua, 38 bytes
function f(n)print(n>=0 and n%1==0)end

Try it online!

Kotlin, 17 bytes
{it%1==.0&&it>=0}

Try it online!

C + ecpp, 23 bytes
#def $x !fmod(x,1)&x>=0

Defines an operator $ that takes one right operand x and evaluates to 1 if x is whole and 0 if it is not.
Try it online!

Pyth, 4 bytes
Not a difficult question, but I thought I’d give it a try. Also did not think that zero was whole, but it saves a byte.
qs.a

Explanation:
 s.a      Integer of the absolute value of the implicit input
q         Is it the same as the original implicit input?

Test Suite
Version that doesn’t find 0 as a whole number:
&qs.a

Ands the original answer with the input, so 0 falsifies the answer.
Test Suite
Returns a falsy or truthy value that isn’t always a Boolean.

Julia, 13 bytes
f(x)=x in 0:x

Try it online!

ARBLE, 9 7 bytes
nt(a%1)

Try it online!

Pyt, 3 4 bytes
Đ⎶Å≡

    implicit input
Đ   duplicates top value
⎶   pushes closest int to top value
Å   abs(TOS)
≡   checks if equal
    implicit output

Try it online!

Taxi, 553 bytes
Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Cyclone.Go to Cyclone:n 5 l 2 l.Pickup a passenger going to Trunkers.Pickup a passenger going to Equal's Corner.Go to Trunkers:s 1 l.Pickup a passenger going to Equal's Corner.Go to Equal's Corner:w 1 l.Switch to plan "b" if no one is waiting.'1' is waiting at Writer's Depot.[b]'0' is waiting at Writer's Depot.Go to Writer's Depot:n 1 l 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.

Try it online!
Ungolfed:
Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Cyclone.
Go to Cyclone: north 5th left 2nd left.
Pickup a passenger going to Trunkers.
Pickup a passenger going to Equal's Corner.
Go to Trunkers: south 1st left.
Pickup a passenger going to Equal's Corner.
Go to Equal's Corner: west 1st left.
Switch to plan "b" if no one is waiting.
'1' is waiting at Writer's Depot.
[b]
'0' is waiting at Writer's Depot.
Go to Writer's Depot: north 1st left 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.

I'm surprised it took this long to post such a basic challenge. I like them. Taxi is... still not good for golfing.

Jelly, 3 bytes
Ḟ⁼A

Try it online!
Uses Erik's strategy of floor(n) == abs(n).

Jelly, 3 bytes
AḞ=

Try it online!

SNOBOL4 (CSNOBOL4), 73 bytes
	DEFINE('W(N)D')
W	N SPAN('1234567890') '.' REM . D
	W =EQ(D) 1	:(RETURN)

Try it online!
An anonymous function; returns 1 for truthy and an empty string for falsey.
Takes N the input and matches it against the regex \\d.(\\d*)$, setting (\\d*) as D. Then if D==0 (''==0 in SNOBOL), sets W to 1. If not, it doesn't set W, which defaults to the empty string, and returns W.

Javascript - 16 Bytes
a=>a>=0&&a%1<=0

f=a=>a>=0&&a%1<=0

// ----------- Test Cases -------------

console.log(332, f(332))
console.log(33.2, f(33.2))
console.log(128239847, f(128239847))
console.log(0.128239847, f(0.128239847))
console.log(0, f(0))
console.log(0.000000000, f(0.000000000))
console.log(1.111111111, f(1.111111111))
console.log(-3.1415926, f(-3.1415926))
console.log(-3, f(-3))

Fails on 3 and -3.1415926

Python 2, 59 60 57 bytes
lambda s:re.match(r"^\+?[0-9]+(\.0*)?$",s)>None
import re

Try it online!
Takes input as a string.
Regex is as follows:

starts with + or a number
has AT LEAST 1 digit
either:

has a period, but only zeroes follow the period
has a period, but nothing after the period
terminates without a period

Python 2's re.match objects are greater than None objects, so it will return True if the regex matched and False otherwise.
Edit: no longer has false positives on negative numbers (not sure what i was thinking...) and correctly handles trailing periods. Thanks, Deadcode!
I feel so bad about the greater than None check.

This is incorrect. The problem defines a whole number as a non-negative integer, so you need \+? (or nothing) not [+-]?. Also, shouldn't it be 0* not 0+? Ending with a decimal point is generally valid.

@Deadcode Well, crap. You're right. Thanks for pointing this out!

TI-BASIC, 5 bytes
Takes input and gives output through Ans.
Ans=abs(int(Ans

JavaScript (SpiderMonkey), 24 bytes
s=>s<0?0:s==Math.ceil(s)

Try it online!
A great thanks to @Jo King for converting the code from 29bytes to 24.

@JoKing thanks for pointing out.

false can be 0 and I'm pretty sure === can be ==

@JoKing yes. that way I will reduce 1 byte.

and four bytes for false to 0.. or if you're really insistent on booleans rather than falsey values, at least do 0>1

@JoKing the output requires false. If think that way then 0 is not significant option.

No, if you look closer, it requires a falsey value, of which zero is an example

but the output will be differ from what he excepted.Is that ok in rules of codegolf.

The test cases only show an example of input and output, not the exact expectations. The question asks for a truthy/falsey value, which could be anything like 1 0, true false, '' 'non-empty string' or any mixture of  those

MathGolf, 3 bytes
i±=

Try it online!
Explanation
Same as a bunch of other answers.
i     Read input as integer
 ±    Convert to absolute value
  =   Is it equal to the implicit input?

Gol><>, 17 bytes
I:0(q0h:S(-zq1!0h

A simple solution, but I will be golfing this alot more
Try it online!

7 bytes, with error/0 as falsey, 1 as truthy. If you don't like that than you can at least get rid of no-ops (like q1!0 lol) and switch to modulo-1 for 10 bytes

@JoKing Those look really good, I honestly didn't realize that the '0' wasn't doing anything! I feel like such an idiot, in a little while I'll add your programs on (attributed to you of course)

@KrystosTheOverlord in a little while? :P

Runic Enchantments, 6 bytes
i:kn=@

Try it online!
Works on inputs up to 65535. Compares the input with the input cast to character and back to number. Inputs larger than 65535 cast to char exceed the byte size and roll over.

cQuents, 4 bytes
?$-1

Try it online!
Explanation
?        Given input n, output true if n is in the sequence and false if it is not
         Each term in the sequence equals
 $        current index
  -1                    - 1

The -1 in to include 0 - if the challenge just wanted positive integers, ?$ would be enough.

Stax, 2 bytes
1%

Run and debug it
Modulus by 1.

source: Stack Exchange

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/3.0/

all_licenses: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/

sort: votes


text:
Make a Robo-Reviewer: Close Votes
Write a program that reviews posts for the Close Votes queue on Stack Overflow.
Since it's near-impossible to write a bot that can accurately review posts in the actual queue, we're instead going to use a grossly oversimplified version of the queue and its rules.
Your program should take in the body of a question as a string, and output an array of option_ids for the applicable close reasons. For Leave Open, you can output an empty array OR a falsey value. Note: this is a significant change from the sandbox version of this challenge so make sure to update stashed solutions.
Here is a list of the close reasons, their fresh-off-the-API option_ids, and the gross oversimplifications that should be used to flag them. All keywords and key phrases are case-insensitive and should have word boundaries on both sides.

28509 - duplicate

Question contains the keyword NullPointerException. When this appears, the next array element should be the question ID 218384, for What is a NullPointerException, and how do I fix it?

off-topic because…

46431 - Questions about general computing hardware and software are off-topic for Stack Overflow unless they directly involve tools used primarily for programming. You may be able to get help on Super User.

Contains the keyword install, or its various conjugations: installs, installing, installation, installed.

36074 - Questions on professional server- or networking-related infrastructure administration are off-topic for Stack Overflow unless they directly involve programming or programming tools. You may be able to get help on Server Fault.

Contains the keyword server, but NOT php or cgi.

54583 - Questions asking us to recommend or find a book, tool, software library, tutorial or other off-site resource are off-topic for Stack Overflow as they tend to attract opinionated answers and spam. Instead, describe the problem and what has been done so far to solve it.

Contains one of the mentioned words (book, tool, software library, tutorial, API) or their plurals.

77 - Questions seeking debugging help ("why isn't this code working?") must include the desired behavior, a specific problem or error and the shortest code necessary to reproduce it in the question itself. Questions without a clear problem statement are not useful to other readers. See: How to create a Minimal, Complete, and Verifiable example.

The question has no code markdown. You may assume that code markdown will not be inside any other syntax.

44435 - This question was caused by a problem that can no longer be reproduced or a simple typographical error. While similar questions may be on-topic here, this one was resolved in a manner unlikely to help future readers. This can often be avoided by identifying and closely inspecting the shortest program necessary to reproduce the problem before posting.

There are unpaired or incorrectly paired parentheses, brackets, or braces.

16055 - unclear what you're asking

The question does not contain a question mark character.
The question has no latin characters.
If either of the above apply, then it should appear in the output array, but it shouldn't appear twice.

29650 too broad

The question contains a question starter (who, what, when, where, why, how) followed by should I.

62000 primarily opinion-based

The question contains the phrases best/good/bad practice(s), or good/bad idea(s).

As usual for a code-golf challenge, the winner is the shortest answer in bytes.
Test Cases

https://stackoverflow.com/revisions/092483f5-05a5-4488-a057-4ddb3040e380/view-source - [46431, 77, 16055]
https://stackoverflow.com/revisions/1914fd5e-8686-402a-839e-cd1ba849aafe/view-source - [36074, 77]
https://stackoverflow.com/revisions/db0992bb-f423-4a93-b349-ec887aea0a5f/view-source - [54583, 77, 16055]
https://stackoverflow.com/revisions/7c0a011f-7ebc-494d-bc8c-85bedefc53b7/view-source - [77, 16055, 62000]
https://stackoverflow.com/revisions/4e109537-ca2c-40ae-807e-e1132eb3e82f/view-source - [29650]
https://stackoverflow.com/revisions/79593197-9104-4dd4-8021-ff43f5a0b03d/view-source - [77, 16055]
https://stackoverflow.com/revisions/16b8e492-c425-4090-b283-c42e2177b34f/view-source - [16055]
https://stackoverflow.com/revisions/8cd44765-297e-435e-a035-044ff67fcd0c/view-source - [] or falsey
https://stackoverflow.com/revisions/932054a6-6e6b-4446-86a2-5deb8c505e96/view-source - [28509, 218384, 16055]

Whole word match or not? Case-sensitive or not?

@user202729 it should be a whole word match, and all but NullPointerException should be case-insensitive.

@Riker I've added test cases.

"we're instead going to use a grossly oversimplified version of the queue and its rules" I though this was what all mods used, plus a random number generator for security?

It would be interesting to try Reinforcement learning on all historical close votes to see if that is a classification task that can be learned...

My top three SO questions: 1: No code (or does code in the middle of text count?) 2: No code. 3: "Best practice" (in the question title and in the text). I guess they should all be closed... :(

You should probably clarify what "code markdown" means specifically. One interpretation is that any line of text that has at least four spaces before it will do, while another could be that you need an empty line on either side of the indented line. Yet another interpretation is that the use of the <code> and <pre> tags are also valid, as well as the use of backticks. Is the requirement really just that the string has no backticks in it? There are so many different meanings that that phrase could have, so it needs clarification.

@LyricLy block code. That's indented stuff after two line breaks.

Python 2.7, 644 639 593 560 549 bytes
from re import*
s,g,t,w=input(),"([{)]}",[],"NullPointerException"
l=g.index
print[[29650,46431,54583,62000,16055,77,36074,28509,218384][i]for i,r in enumerate(["(wh([oy]|at|en|ere)|how) should I","install(ing|s|ation|ed)","(book|tool|software librar(ies|y)|tutorial|API)s?","(best|good|bad) (practice|idea)s?","^[^a-z]*$|^[^?]*$","^((?![#*[(~>`=]|\d\.|\-{3}).)*$","(?=^.*server)(?!^.*(php|cgi))",w,w])if search(i<5and r or"(^|\W)"+r+"($|\W)",s,flags=I|S)]+[44435]*(any(t.append(g[l(c)+3])if l(c)<3else t==[]or c!=t.pop()for c in s if c in g)or[]<t)

Try it online!
The basic concept is to use a series of regex's to do most of the heavy lifting.  I do rebuild regex's to reduce bytes; if you wish to see the full regexes, refer to the ungolfed section below.  Then, I go through and check stuff that regex isn't good at (like matching parenthesis correctly).
Important note regarding testing
The examples as given in OP's post are wrong.  If you look through the links, you should be able to notice where my program is finding the correct solution.  For instance, the OP's didn't seem to recognize > and other markdown as markdown.  That is where most of the variance comes from.
Pseudo-ungolfed version
I decided that it may be beneficial for understanding to post a precursor to my code-golf.
import re

def doesMatch(string):
    openClosed = "([{)]}"
    current = []
    for char in string:
        if char in openClosed:
            if openClosed.index(char) < 3:
                current.append(openClosed[openClosed.index(char)+3])
            elif len(current) == 0 or current.pop() != char:
                return False
    return not len(current)

def take(post):
    regexes = [
        "(^|\W)(who|what|when|why|how|where) should I($|\W)",
        "(^|\W)install(ing|s|ation|ed)($|\W)",
        "(^|\W)(book|tool|software library|software libraries|tutorial|API)s?($|\W)",
        "(?=^[^a-z]*$)|(?=^[^?]*$)",
        "(^|\W)(best|good|bad) (practice|idea)s?($|\W)",
        "^((?![#*[(~>`=]|\d\.|\-{3}).)*$",
        "(?=^.*server)(?!^.*(php|cgi))"
        ]
    errors = [[29650,46431,54583,16055,62000,77,36074][i] for i,regex in enumerate(regexes) if re.search(regex,post,flags=re.I|re.S)]
    if not doesMatch(post):
        errors.append(44435)
    if post.find("NullPointerException") != -1:
        errors += [28509,218384]
    return errors

with open("test.txt","r") as fi:
    print(take(fi.read()))

Thanks to the following for helping reduce bytes:

LyricLy
notjagan
ovs
Mr. Xcoder

all_licenses: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/3.0/


text:
Translate Morse code based on tone duration
Goal
Morse code is often represented as sound.  Given a stream of bits that represent whether sound is on or off, translate the stream into letters and numbers and spaces.

Specifics

The bit stream is analysed based on the length of repeating ON/OFF bits.

1 ON bit is a dot
3 ON bits are a dash
1 OFF bit delimits dots and dashes
3 OFF bits delimits characters
7 OFF bits delimits words (space)

The input may be a string or array.  Only two unique characters/values of your choice are allowed in the input.  (eg. 0/1, true/false, comma/space)
The output returns a string or is printed to the standard output.

Example
Input:    101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
Analysis: \--H--/   E   \---L---/   \---L---/   \----O----/\-- --/\---W---/   \----O----/   \--R--/   \---L---/   \--D--/
Output:   HELLO WORLD

Assumptions

The stream always starts and ends with an ON bit.
There is no leading or trailing whitespace.
The input is always valid.
All letters (case-insensitive) and digits are supported.

Test Cases
101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101
HELLO WORLD

10100000001011100011101110000000101110000000101011101000101000101010001010101
I AM A FISH

1010111011101110001110111011101110111000101110111011101110001110111010101
2017

101010001110111011100010101
SOS

Scoring
This is code golf.  The lowest byte-count code by this time next week wins.

Can output have trailing whitespace?

APL (Dyalog), 65 62 60 57 bytes
-3 thanks to ngn.
Tacit prefix function.
⎕CY'dfns'
morse'/|[-.]+'⎕S'&'∘(⊃∘'/. -'¨6|'1+|(00)+'⎕S 1)

Try it online! Header, f←, and Footer are just to allow calling the function from Input while retaining TIO's byte count. In a normal APL session (corresponding to TIO's Input field), it would not be needed.
⎕CY'dfns' copy the dfns workspace (library)
(…) apply this tacit function:
 '1+|(00)+'⎕S 1 PCRE Search 1-runs and even-length 0-runs and return matches' lengths
 6| division remainder when divided by 6
 ⊃∘'/. -'¨ for each match length, pick the corresponding character from this string
'/|[-.]+'⎕S'&'∘ PCRE Search slashes and dash/dot-runs and return those
morse translate from Morse code to regular text

Wow, never knew Dyalog had a builtin for morse code.

@Zacharý There are many, many builtins in the dfns.

@Zacharý Always check dfns!

You're linking to an older version.

A BF function ... >_<, wow.

shorter:
⎕io←0 ⋄
morse'/|[-.]+'⎕s'&'∘(⊃∘'/. -'¨6|'1+|(00)+'⎕s 1)

@ngn ⎕io←0 doesn't count, but ⎕CY'dfns' does. Still, your golf brings this down to 57 bytes.

@ngn That is such a different (an ingenious) answer that you should post that separately.

@Adám well, it's still regexes and a call to the dfns ws... I derived it from yours.

Python 2, 142 135 bytes
lambda s:''.join(' E-T----Z-Q---RSWU--2FH-V980NIMA--1CBYX-6--GDOK534PLJ-7'[int('0'+l.replace('111','3'),16)%57]for l in s.split('000'))

Try it online!
Explanation:
Splits the string into letters on 000 (0 thus means space)
Replaces each 111 with 3, and converts into base 16.
Then each number is modded by 57, which gives a range of 0..54, which is the index of the current character.

Previous version that converted to base 3:
Python 2, 273 252 247 bytes
lambda s:''.join(chr(dict(zip([0,242,161,134,125,122,121,202,229,238,241]+[2]*7+[5,67,70,22,1,43,25,40,4,53,23,49,8,7,26,52,77,16,13,2,14,41,17,68,71,76],[32]+range(48,91)))[int('0'+l.replace('111','2').replace('0',''),3)])for l in s.split('000'))

Try it online!
Previous version that converted to binary:
Python 2, 282 261 256 bytes
lambda s:''.join(chr(dict(zip([0,489335,96119,22391,5495,1367,341,1877,7637,30581,122333]+[2]*7+[23,469,1885,117,1,349,477,85,5,6007,471,373,119,29,1911,1501,7639,93,21,7,87,343,375,1879,7543,1909],[32]+range(48,91)))[int('0'+l,2)])for l in s.split('000'))

Try it online!

Ruby, 123 bytes
->s{s.split(/0000?/).map{|r|r[0]?"YE9_0IZTO_BHKU58V_GR_SFA__1_4NP_60X_____C__D_ML7WQ3__2__J"[r.to_i(2)%253%132%74]:" "}*""}

Try it online!
Split the input string on character limit. Use 3 or 4 OFF bits so that spaces are converted to empty strings. Take the base 2 value of every character, and bring into a reasonable range (less than 60 possible values) using modulo on 3 successive divisions.

Very nicely done.

I'm note sure if it works for all cases, but if you remove 0? from the Regexp it still works for the four test cases.

Python, 175 168 bytes
s=lambda t,f=''.join:f('; TEMNAIOGKDWRUS;;QZYCXBJP;L;FVH09;8;;;7;;;;;;;61;;;;;;;2;;;3;45'[int('1'+f('0'if j[1:]else j for j in i.split('0')),2)]for i in t.split('000'))

First convert the string into list of 0(dash)/1(dot) string, add a prefix 1 (to prevent leading zeroes and deal with whitespaces), then convert to binary.
Since every code have length no more than 5, the result ranges from 0 to 63 and can be listed in a string.

I independently got basically the same solution, but 169 bytes: lambda s:''.join("_ TEMNAIOGKDWRUS__QZYCXBJP_L_FVH09_8___7_______61_______2___3_45"[int('1'+filter(int,l).replace('2','0'),2)]for l in s.replace('111','2').split('000'))

@AlexVarga Nice usage of Python 2 filter!

Jelly, 67 62 bytes
ṣ0L€«2ḅ2“>.&" þ/7;=¥çı¿¢×ÆÐ¤æ€Œ©¦Çß÷µ¬£®Ñ½ðȷñ‘iịØB;⁶¤
œṣ0ẋ3¤Ç€

Try it online!

Wait, link numbering wraps around?

@Zacharý Yes it does, line-links have modular indices.

Visual Basic .NET (.NET Core), 252 bytes
-7 bytes thanks to @recursive
Function A(i)
For Each w In i.Split({"0000000"},0)
For Each l In w.Split({"000"},0)
Dim c=0
For Each p In l.Split("0")
c=c*2+1+p.Length\2
Next
A &="!ETIANMSURWDKGOHVF!L!PJBXCYZQ!!54!3!!!2!!!!!!!16!!!!!!!7!!!8!90"(c)
Next
A+=" "
Next
End Function

A function that takes a string of 1s and 0s, and returns a string. (Actually, only the 0 for the OFF is a hard requirement. Anything not OFF is assumed to be ON).
The string literal is Morse code setup as a binary heap in array form. VB.NET lets you index strings as arrays of characters. The \ is integer division, taking the left sub heap for 1 or the right sub heap for 111.
I used ! as a blank for when there isn't a value in that heap spot. It's only necessary to properly pad out the indices.
VB.NET lets you return by assigning a value to the function name (in this case, A). I just iteratively do string concatenations (&) to build up the output string. The very first time I need to use & because using + leaves a leading null char, but any other time I can use +, which behaves the same as & for strings.
Try it online!

You can save 7 bytes by using "!ETIANMSURWDKGOHVF!L!PJBXCYZQ!!5473!!8290!!!!!16", and then indexing using M(c-c\48*22), and then you can save another 4 by not even using M, but just using the string literal inline.

@recursive I understand the 4 byte trick, thanks for the help! I'm having trouble understanding the way you're changing the index. If I replace the string literal, and then use M(c-c\48*22), I get index out of bounds on the 2017 case. I think VB will do division and multiplication at the same precedence; am I missing a parentheses?

You are right about precedence.  c\48*22 will be either 0 or 22.  It's a way of conditionally subtracting 22 from c, to make M shorter by "folding" the end of the string.  If that isn't working out for you, you can always remove the parens from A &=(" ") for another 2 bytes. :)

And then you can change &= to +=, and remove another two spaces.

@recursive Oh, duh! too many extra parens. The issue with changing to plus is then I have a leading null character at the start of my string. Maybe that's not a big deal, though.

JavaScript (ES6), 170 131 bytes
s=>s.split`000`.map(e=>'  ETIANMSURWDKGOHVF L PJBXCYZQ'[c=+`0b${1+e.replace(/0?(111|1)/g,d=>+(d>1))}`]||'473168290 5'[c%11]).join``

How it works:
If you change the dots to 0s and the dashes to 1s, and prefix with a 1, you get binary numbers, which when converted to decimal gives you:

Letters:  2 - 18, 20, and 22 - 29.
These can be converted to the correct letters by indexing into '  ETIANMSURWDKGOHVF L PJBXCYZQ'.
Numbers:  32, 33, 35, 39, 47, 48, 56, 60, 62, and 63.
If we take these numbers modulus 11, we get the numbers 0 - 8 and 10, which can be converted to the correct numbers by indexing into '473168290 5'.

The program splits on characters, then converts each character into dots and dashes, which are converted into the appropriate output based on the above rules.

Test Cases:

let f=

s=>s.split`000`.map(e=>'  ETIANMSURWDKGOHVF L PJBXCYZQ'[c=+`0b${1+e.replace(/0?(111|1)/g,d=>+(d>1))}`]||'473168290 5'[c%11]).join``

console.log(f('101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101'))
console.log(f('10100000001011100011101110000000101110000000101011101000101000101010001010101'));
console.log(f('1010111011101110001110111011101110111000101110111011101110001110111010101'));
console.log(f('101010001110111011100010101'));

Python 2, 127 bytes
lambda s:''.join("IVMB  T  K 9LZF 1HWO3 GUS4 8 7A  E QR 26   NJX    Y0P 5D  C"[(int('0'+l)^2162146)%59]for l in s.split('000'))

Try it online!
Building off of TFeld's solution by removing replace and by working in base 10, at the cost of a bitwise xor and a longer reference string.

PHP, 321 284 bytes
Saved 37 bytes thanks to @ovs
$a=array_flip([242,161,134,125,122,121,202,229,238,241,5,67,70,22,1,43,25,40,4,53,23,49,8,7,26,52,77,16,13,2,14,41,17,68,71,76]);foreach(split('0000000',$argv[1])as$w){foreach(split('000',$w)as$m){echo($v=$a[base_convert(str_replace([111,0],[2,],$m),3,10)])>9?chr($v+55):$v;}echo' ';}

Previous version (321 bytes)
$a=array_flip([22222,12222,11222,11122,11112,11111,21111,22111,22211,22221,12,2111,2121,211,1,1121,221,1111,11,1222,212,1211,22,21,222,1221,2212,121,111,2,112,1112,122,2112,2122,2211]);foreach(split('0000000',$argv[1])as$w){foreach(split('000',$w)as$m){echo($v=$a[str_replace([111,0],[2,],$m)])>9?chr($v+55):$v;}echo' ';}

Try it online!
Ungolfed version :
$a=array_flip(
// Building an array $a with every Morse letter representation (1=dot, 2=dash) and flip it
               [22222,12222,11222,11122,11112,
                // 01234
                11111,21111,22111,22211,22221,
                // 56789
                12,2111,2121,211,1,1121,221,
                // ABCDEFG
                1111,11,1222,212,1211,22,
                // HIJKLM
                21,222,1221,2212,121,111,2,
                // NOPQRST
                112,1112,122,2112,2122,2211]);
                // UVWXYZ
foreach (split('0000000', $argv[1]) as $w){
// for each word (separate with 7 consecutive zeroes)
    foreach (split('000',$w) as $m){
    // for each letter (separate with 3 consecutive zeroes)
        echo ($v = $a[str_replace([111,0],[2,],$m)]) > 9
        // Replace '111' with '2' and '0' with nothing and find $v, the corresponding entry in the array $a
            ? chr($v+55)
            // If > 9th element, then letter => echo the ASCII code equal to $v+55
            : $v;
            // Else echo $v
    }
    echo ' ';
    // Echo a space
}

Java (JDK), 355 bytes
s->{var r="";for(var t:s.split("0000000")){for(var u:t.split("000"))for(int x[]={1,7,5,21,29,23,87,93,119,85,117,341,375,343,373,471,477,349,469,1877,1367,1909,1879,1501,1911,1885,7637,5495,7543,7639,6007,30581,22391,122333,96119,489335},i=36;i-->0;)if(u.equals(Long.toString(x[i],2)))r+="ETISNAURMHD5WVLKGFB64ZXPOC73YQJ82910".charAt(i);r+=" ";}return r;}

Try it online!
Credits

-3 bytes saved thanks to @Jeutnarg.
-6 bytes thanks to @ceilingcat

can shave off a few by using Long.toString(x[i],2) instead of Integer.toString(x[i],2)

GNU sed, 261 + 1 = 262 bytes
+1 byte for -r flag.
s/000/;/g
s/111/_/g
s/0//g
s/$/;:51111141111_3111__211___i1____6_11117__1118___119____10_____H1111V111_F11_1L1_11P1__1J1___B_111X_11_C_1_1Y_1__Z__11Q__1_S111U11_R1_1W1__D_11K_1_N__1G__1O___I11A1_M__E1T_/
:
s/([1_]+);(.*([^1_])\1)/\3\2/
t
y/i/1/
s/;/ /g
s/:.*//g

Try it online!
Explanation
This is a very basic lookup table solution.
The first three lines transform the input so dashes are _s and dots are 1s. First, 000s are replaced with ;, so characters are separated by ; and words by ;;0. Then 111s are replaced by _ and all remaining 0s are discarded, leaving 1s for dots.
s/000/;/g
s/111/_/g
s/0//g

The next line appends the lookup table. It takes the form cmcmcm... where c is a character and m is the sequence of _s and 1s representing it. i is substituted for 1 in the table for disambiguation. Since regular expressions in sed are always greedy, the table is sorted from longest to shortest code (so e.g. 1_ matches A1_ instead of i1____).
s/$/;:51111141111_3111__211___i1____6_11117__1118___119____10_____H1111V111_F11_1L1_11P1__1J1___B_111X_11_C_1_1Y_1__Z__11Q__1_S111U11_R1_1W1__D_11K_1_N__1G__1O___I11A1_M__E1T_/

Next, in a loop, each sequence of _s and 1s (and the subsequent ;) is replaced by the corresponding character:
:
s/([1_]+);(.*([^1_])\1)/\3\2/
t

Finally, cleanup: is are replaced with 1s, remaining ;s are spaces, and the lookup table is deleted:
y/i/1/
s/;/ /g
s/:.*//g

Jelly, 67 bytes
ŒrḌṣ7ṣ€3ṣ€€1’H_4F€€ḅ3i@€€“ṗƙ⁶}zyȮẓŀȯ¦CFæ¢+ı(¥5ç1®¬ȷ4MÑÆ£Ç)×DGL‘ịØBK

Try it online!

Retina, 144 138 130 103 bytes
T`d`@#
^|@@@

 @?#
E
{T`L#@`R6_BI_Z5S1C_GD8__\L\HNF3P__7_`\w@#
T`589B-INPRSZ#@`490XYKT2\OVAMJWUQ_`\w##

Try it online! Link includes test cases. Explanation:
T`d`@#

Change the binary digits to other characters because 0 and 1 are valid outputs.
^|@@@

Insert a space before every character and two spaces between words.
 @?#
E

Assume that all characters are Es.
{T`L#@`R6_BI_Z5S1C_GD8__\L\HNF3P__7_`\w@#

Translate all letters assuming that they will be followed by a dot. For instance, if we have an E, and we see a second dot (we consumed the first when we inserted the E) then it translates to an I. For letters that can only be legally followed by a dash, they are translated with that assumption, and then the dash is consumed by the next stage. Other letters are deleted (keeping L costs a byte).
T`589B-INPRSZ#@`490XYKT2\OVAMJWUQ_`\w##

If it transpires that they were in fact followed by a dash, then fix up the mistranslations. This also consumes the dash when it was assumed by the previous stage. Both translations are repeated until all of the dots and dashes are consumed.

JavaScript (ES6), 104 102 101 99 bytes
s=>s.split`000`.map(n=>" _T__9VEFO0K7MX_CGS__LU1RYIJ845__Z_B_D6QP_3__AHNW2"[n*1741%8360%51]).join``

Test cases

let f =

s=>s.split`000`.map(n=>" _T__9VEFO0K7MX_CGS__LU1RYIJ845__Z_B_D6QP_3__AHNW2"[n*1741%8360%51]).join``

console.log(f("101010100010001011101010001011101010001110111011100000001011101110001110111011100010111010001011101010001110101"))
console.log(f("10100000001011100011101110000000101110000000101011101000101000101010001010101"))
console.log(f("1010111011101110001110111011101110111000101110111011101110001110111010101"))
console.log(f("101010001110111011100010101"))

How?
Because converting from binary to decimal costs bytes, we use a hash function which works directly on binary blocks interpreted in base 10.
Example
dot dash dot dot = 101110101
101110101 * 1741 = 176032685841
176032685841 % 8360 = 3081
3081 % 51 = 21

--> The 21st character in the lookup table is 'L' (0-indexed).

I like this one-step approach very much.  How big a search did you perform to fit these 37 outputs into a perfect hash of size 50 with a short enough function?

@jayprich This was brute-forced. It was almost 1 year ago, though, so I don't remember exactly how. :) Chances are that I tried all n*p%m0%m1 for $1\le p<10000$, $1<m_0<10000$ and $1<m_1<100$.

Perl 5, 241 + 1 (-p) = 242 bytes
%k=map{(23,469,1885,117,1,349,477,85,5,6007,471,373,119,29,1911,1501,7639,93,21,7,87,343,375,1879,7543,1909,489335,96119,22391,5495,1367,341,1877,7637,30581,122333)[$i++]=>$_}A..Z,0..9;map{$\.=$k{oct"0b$_"}for split/000/;$\.=$"}split/0{7}/}{

Try it online!

PHP, 181+1 bytes
foreach(explode(_,strtr($argn. 0,[1110=>1,10=>0,"0000"=>_A,"00"=>_]))as$t)echo$t<A?~$t[-5]?(10+substr_count($t,0)*(1-2*$t[-5]))%10:__ETIANMSURWDKGOHVF_L_PJBXCYZQ[bindec("1$t")]:" ";

Run as pipe with -nR or try it online.

ES6, 268 bytes
Uses ASCII encoding after mapping from a base36 representation of the morse to an index position.  Not my best golf day, but it only took around 15 mins.

s=>s.split('00000').map(w=>String.fromCharCode.apply({},w.split('000').map(c=>"ahkn,225z,h9z,48n,11z,9h,1g5,5w5,nlh,2me5,,,,,,,,n,d1,1gd,39,1,9p,d9,2d,5,4mv,d3,ad,3b,t,1h3,15p,5w7,2l,l,7,2f,9j,af,1g7,1h1".split(',').indexOf(parseInt(c,2).toString(36))+48))).join(' ')

Easier to read (kinda):

s=>
s
.split('00000')
.map(w=>
 String.fromCharCode.apply({},
  w.split('000')
   .map(c=>
    "ahkn,225z,h9z,48n,11z,9h,1g5,5w5,nlh,2me5,,,,,,,,n,d1,1gd,39,1,9p,d9,2d,5,4mv,d3,ad,3b,t,1h3,15p,5w7,2l,l,7,2f,9j,af,1g7,1h1"
    .split(',')
    .indexOf(
     parseInt(c,2).toString(36)
    )+48)
   )
 ).join(' ')

Wolfram Language (Mathematica), 288 bytes
Thought about reading in the data as binary from a file but that gets hard to explain.  Base 36 seemed like a good compromise way to store the data efficiently lexically.
Takes a string of 0's and 1's as input.  Does a series of replacements, starting with the runs of 7 zeros, then the runs of 3, then the longest binary letters down to the shortest.  Order of replacement is important.
StringReplace[#,Thread@Rule[Join[{"0000000","000"},#~FromDigits~36~IntegerString~2&/@StringSplit@"ahkn 2me5 225z nlh h9z 5w7 5w5 5tj 4mv 48n 1h3 1h1 1gd 1g7 1g5 15p 11z d9 d3 d1 af ad 9p 9j 9h 3b 39 2l 2f 2d t n l 7 5 1"],Insert[Characters@" 09182Q7YJ3OZCX6P4GKBWLFV5MDRUHNASTIE","",2]]]&

Try it online!

Wait, Mathematica doesn't have a morse code built-in?

Not yet! I checked.

Perl 5, 195 bytes
194 bytes code + 1 for -p.
%h=map{$_,(A..Z,0..9)[$i++]}unpack"S26I2S7I","\xd5]u]\xddUw\xd7uww\xdd\xd7]WWwWwuwwwwwWwWUU\xd5uw\xdd\xdd";s/0{7}/ /g;s/(\d+?)(000|\b)/$h{oct"0b$1"}/ge

I couldn't get this working with just a standard packed binary string, I had to escape the higher-byte chars otherwise I'd be on 171, if anyone knows what I've missed, or why it's breaking that'd be great!
Try it online!
Explanation
The binary string is a packed list of the numbers that relate to the morse characters (101011101 - 349 for F etc) and this is zipped with the ranges A..Z,0..9 and used as a lookup. The s/// expressions replace all runs of seven 0s with space and then all runs of digits, separated with three 0s or word boundaries \b, with their corresponding key from the %h hash.


text:
Print three columns vertically separated by space(s)
Task

Take input string separated by space.
Sort the words alphabetically.
Print them out vertically in 3 columns separated by space(s).

Challenge

All three column's heights should be as evenly weighted as possible.
All three column's should be left aligned.

This is code-golf, so shortest code wins!
Example
If the input is:
"cat caterpillar pie frog elephant pizza",

The output should be:
cat         elephant pie
caterpillar frog     pizza

Please beware of cases, if input is:
"a b c d e f g"

Should be printed as:
a c e
b d f
    g

# or

a d f
b e g
c

# and not

a d g
b e
c f

Also, I would recommend you remove the strict I/O requirement; that is, take input as a list of strings in any form (as answerer wants) and as a program or a function taking the list.

Is it acceptable to output this for the first example?

@Satendra Don't worry about the "put on hold as off-topic...", when/if the question is sufficiently good it will be reopened. | You can consider using the sandbox.

Please consider using the Sandbox in the future to get feedback on your challenges before posting them to the main site.

Probably trivial, but you can clarify the as evenly weighted as possible part as minimize the difference between the maximum height and the minimum height, if that's what you meant.

@Satendra Nice first challenge. If the columns must be separated by a single space at the narrowest gap, you should state so.

What characters can occur in the input?

@Zgarb only alphabets, no special character

How is the first "should be printed" as acceptable? Since it looks right aligned to me.

@Matt Each word should be left-aligned, the table itself can be right-aligned.

Husk, 24 17 bytes
TmoTT' §CȯmLTC3Ow

Try it online!
Explanation
This was a surprisingly tricky challenge, as Husk currently lacks a builtin for breaking a list into a given number of parts.
TmoTT' §CȯmLTC3Ow  Implicit input, say s="bbb a cc ddd e"
                w  Split at spaces: x=["bbb","a","cc","ddd","e"]
             C3    Cut into slices of length 3: [["bbb","a","cc"],["ddd","e"]]
            T      Transpose: [["bbb","ddd"],["a","e"],["cc"]]
         ȯmL       Map length: [2,2,1]
                   These are the correct lengths of the columns.
       §C      O   Sort x and split into these lengths: [["a","bbb"],["cc","ddd"],["e"]]
                   These are the columns of the correct output, without padding.
 mo                For each column,
    T'             transpose and pad with spaces: [["ab"," b"," b"],["cd","cd"," d"],["e"]]
   T               then transpose back: [["a  ","bbb"],["cc ","ddd"],["e"]]
T                  Transpose the whole list: [["a  ","cc ","e"],["bbb","ddd"]]
                   Implicitly join each row by spaces,
                   join the resulting strings by newlines and print.

Jelly, 6 bytes
Ṣœs3ZG

Try it online!

@DLosc It's actually been tested with the a b c d e f g case too, and I did other extensive tests because I had that feeling first too. Oh, and its shortness comes from the G (Format as Grid.) builtin.

Ah, there's a builtin. (Why am I surprised?) That explains a lot.

Python 3, 148 bytes
-6 bytes thanks to ovs.
l=sorted(input().split())
n=-~len(l)//3
f=lambda l:[i.ljust(max(map(len,l)))for i in l+['']]
for i in zip(f(l[:n]),f(l[n:n*2]),f(l[n*2:])):print(*i)

Try it online!
Workin' on it. Everything I've tried makes the output lopsided...

148 bytes using python 3.

Mathematica, 115 bytes
Grid[Transpose@PadRight@TakeList[#,Last@IntegerPartitions[Tr[1^#],3]]&@Sort@StringSplit@#/. 0->"",Alignment->Left]&

try it on wolfram sandbox
paste the following code and press shift+enter
Grid[Transpose@PadRight@TakeList[#,Last@IntegerPartitions[Tr[1^#],3]]&@Sort@StringSplit@#/. 0->"",Alignment->Left]&["cat caterpillar pie frog elephant pizza"]

@HalvardHummel fixed

Perl 5, 134 + 1 (-a) = 135 bytes
$.=(sort{$b=~y///c-length$a}(@F=sort@F))[0]=~y///c;@a=splice@F,0,@F/3;@b=splice@F,0,@F/2;printf"%-$.s "x3 .$/,shift@a,shift@b,$_ for@F

Try it online!

What does it mean?

05AB1E, 8 bytes
#{.B3äζ»

Try it online!

#        | Split on spaces.
 {       | Sort aphabetically.
  .B     | Pad to max string length.
    3ä   | Split into columns.
      ζ  | Transpose.
       » | Print with newlines.

Javascript 181 175 bytes

f=a=>(a=a.split` `).sort().map(c=>(t[y]=[...t[y]||[],c],M[x]>(l=c.length)?0:M[x]=l,a[++y*3+x]?y:y=x++*0),M=[t=[x=y=0]])&&t.map(x=>x.map((c,y)=>c.padEnd(M[y])).join` `).join`
`

console.log(f("cat caterpillar pie frog elephant pizza"))
console.log("-------------------")
console.log(f("cat caterpillar pie frog frog123123 pizza"))
console.log("-------------------")
console.log(f("a b c d e f g"))
console.log("-------------------")
console.log(f("a b c d e f"))
console.log("-------------------")
console.log(f("a b c d e"))
console.log("-------------------")
console.log(f("a b c d"))

/*
f=a=>(a=a.split` `).sort().map(c=>((t[y] =t[y]||[])[x]=c,M[x]>(l=c.length)?0:M[x]=l,++y*3+x<a.length?0:y=x++*0),M=[t=[x=y=0]])&&t.map(x=>x.map((c,y)=>c.padEnd(M[y])).join` `).join`\n`

f=a=>(a=a.split` `).sort().map(c=>(t[y]=[...t[y]||[],c],M[x]>(l=c.length)?0:M[x]=l,++y*3+x<a.length?0:y=x++*0),M=[t=[x=y=0]])&&t.map(x=>x.map((c,y)=>c.padEnd(M[y])).join` `).join`\n`

*/

J, 73 bytes
,.@(' ',"1[:>|:)@((](s,(s=.]{.1:),(1:{.~[-2*]))([:<.0.5+%&3))@#];.1])@/:~

I can explain this mess later if someone is interested.
Try it online!

Charcoal, 65 64 bytes
≔⪪θ ηＦη«⊞υ⌊η≔⟦⟧ηＦ⪪θ ¿¬№υκ⊞ηκ»ＦＥ³✂υ÷×ιＬυ³÷×⊕ιＬυ³Ｉ1«Ｐ⪫ι¶¿ιＭ⊕⌈ＥιＬκ→

Try it online! Link is to verbose version of code. Save 2 bytes if I don't have to handle the case of fewer than 3 words. There's probably a sorting "eval" I should be using... Explanation:
≔⪪θ η

Split the input on spaces.
Ｆη«⊞υ⌊η≔⟦⟧ηＦ⪪θ ¿¬№υκ⊞ηκ»

Sort the array.
ＦＥ³✂υ÷×ιＬυ³÷×⊕ιＬυ³Ｉ1«

Loop over three approximately equal slices of the array. (Ｉ1 should really be ¦¹.)
Ｐ⪫ι¶

Join the slice with newlines and print it without moving the cursor.
¿ιＭ⊕⌈ＥιＬκ→

If the slice is not empty then move right by one more than the length of the longest word in the slice.

358 bytes of minified JS:
function f(b){let d=[,,,],e=b.split(" ").sort(),g=[],h=[];for(var j in e){var k=Math.min(2,Math.floor(j/Math.floor(e.length/3)));d[k]||(d[k]=[],g[k]=e[j].length),d[k].push(e[j]),2==k&&h.push(""),g[k]=Math.max(e[j].length,g[k])}for(var o in g)for(var p=0;p<g[o]+1;p++)for(var q in h)h[q]+=q>=d[o].length||p>=d[o][q].length?" ":d[o][q][p];return h.join("\n")}

function f(b){let d=[,,,],e=b.split(" ").sort(),g=[],h=[];for(var j in e){var k=Math.min(2,Math.floor(j/Math.floor(e.length/3)));d[k]||(d[k]=[],g[k]=e[j].length),d[k].push(e[j]),2==k&&h.push(""),g[k]=Math.max(e[j].length,g[k])}for(var o in g)for(var p=0;p<g[o]+1;p++)for(var q in h)h[q]+=q>=d[o].length||p>=d[o][q].length?" ":d[o][q][p];return h.join("\n")}

console.log(f("cat caterpillar pie frog elephant pizza"));
console.log(f("a b c d e f g"));

@StephenLeppik np

GNU sed, 92 + 1 = 93 bytes
+1 bytes for -r flag.
I haven’t golfed this at all, but it turned out to be a lot simpler than I expected.
s/$/ /
s/(\S+ ){1,3}/:&\n/g
:
s/:(\S)/\1:/g
/:\S/!bZ
s/: / &/g
t
:Z
s/: / :/g
t
s/ *:.*$//gm

Try it online!

Bourne shell, 172 bytes
F=/tmp/t
<$1 tr \  \\n|sort>$F
N=$(wc -w $F|awk '{print $1/3}')
for i in 0 1 2
do
awk 'NR%N==C {print}' N=$N C=$i $F
done|awk '{printf "%s%s",$1,NR%3?" ":"\n"}'|column -t

It's more readable if formatted conventionally:
#! /bin/sh
F=/tmp/t
<$1 tr \  \\n | sort > $F
N=$(wc -w $F | awk '{print $1/3}')

for i in 0 1 2
do
    awk -v N=$N -v C=$i 'NR % N == C {print}' $F
done |
    awk '{printf "%s%s", $1, NR % 3 == 0? "\n" : " " }' | column -t

At the price of scanning the input once per column, it uses no arrays.  A more complex awk program could open 3 files (one for every Nth word), processing the input in one pass.  Then they could be concatenated and printed using the same last line.
The variable N isn't strictly needed, either; for the price of 4 bytes, we save scanning the input 3 more times.

Welcome to PPCG! Since this is a code golf challenge, we require all answers to make an effort to minimize the bytecount. You can do that in exactly the ways you've mentioned--removing whitespace, shortening invocations, etc. Once you've done that, add a header to your answer giving the language used and the number of bytes. And feel free to keep your current version underneath as an "ungolfed" solution.

Why aren't you making a scene about the 358 byte program, as well?


text:
Simple markdown rendering
There are several ways to create headers on posts on the Stack Exchange network. The format that's most commonly1 used on PPCG seems to be:
# Level one header
## Level two header
### Level three header

Note the space after the hash marks. Also, note that trailing hash marks are not included.
Challenge:
Take a (possibly multiline) string as input, and output the string on the following format:

If the header is level 1, then output each letter 4-by-4 times
If the header is level 2, then output each letter 3-by-3 times
If the header is level 3, then output each letter 2-by-2 times
If a line is not a header then output it as it is.

To illustrate:
--- Level 1 ---
# Hello
--- Output---
HHHHeeeelllllllloooo
HHHHeeeelllllllloooo
HHHHeeeelllllllloooo
HHHHeeeelllllllloooo

--- Level 2 ---
## A B C def
--- Output ---
AAA   BBB   CCC   dddeeefff
AAA   BBB   CCC   dddeeefff
AAA   BBB   CCC   dddeeefff

--- Level 3 ---
### PPCG!
--- Output---
PPPPCCGG!!
PPPPCCGG!!

Simple as that!

Rules:

You must support input over multiple lines. Using \n etc. for newlines is OK.

There won't be lines containing only a # followed by a single space

The output must be presented over multiple lines. You may not output \n instead of literal newlines.

Trailing spaces and newlines are OK.

Test cases:
Input and output are separated by a line of ....
# This is a text
with two different
### headers!
........................................................
TTTThhhhiiiissss    iiiissss    aaaa    tttteeeexxxxtttt
TTTThhhhiiiissss    iiiissss    aaaa    tttteeeexxxxtttt
TTTThhhhiiiissss    iiiissss    aaaa    tttteeeexxxxtttt
TTTThhhhiiiissss    iiiissss    aaaa    tttteeeexxxxtttt
with two different
hheeaaddeerrss!!
hheeaaddeerrss!!

This input has
## trailing hash marks ##
#and a hash mark without a space after it.
........................................................
This input has
tttrrraaaiiillliiinnnggg   hhhaaassshhh   mmmaaarrrkkksss   ######
tttrrraaaiiillliiinnnggg   hhhaaassshhh   mmmaaarrrkkksss   ######
tttrrraaaiiillliiinnnggg   hhhaaassshhh   mmmaaarrrkkksss   ######
#and hash marks without a space after it.

# This ## is ### strange
#### ###
........................................................
TTTThhhhiiiissss    ########    iiiissss    ############    ssssttttrrrraaaannnnggggeeee
TTTThhhhiiiissss    ########    iiiissss    ############    ssssttttrrrraaaannnnggggeeee
TTTThhhhiiiissss    ########    iiiissss    ############    ssssttttrrrraaaannnnggggeeee
TTTThhhhiiiissss    ########    iiiissss    ############    ssssttttrrrraaaannnnggggeeee
#### ###

Multiple

### newlines! #
:)
........................................................
Multiple

nneewwlliinneess!!  ##
nneewwlliinneess!!  ##
:)

Line with only a hash mark:
#
### ^ Like that!
........................................................
Line with only a hash mark:
#
^^  LLiikkee  tthhaatt!!
^^  LLiikkee  tthhaatt!!

1: I haven't really checked, but I think it's true.

May we take input as a string array?

Stacked, 51 50 bytes
Saved 1 byte thanks to @RickHitchcock - golfed regex
['^(##?#?) (.+)'[\#'5\-@k CS k*k rep LF#`]3/mrepl]

Try it online!
Anonymous function that takes input from the stack and leaves it on the stack.
Explanation
['^(##?#?) (.+)'[\#'5\-@k CS k*k rep LF#`]3/mrepl]
[                                            mrepl]   perform multiline replacement
 '^(##?#?) (.+)'                                     regex matching headers
                [                        ]3/         on each match:
                 \#'                                   count number of hashes
                    5\-                                5 - (^)
                       @k                              set k to number of repetitions
                          CS                           convert the header to a char string
                             k*                        repeat each char `k` times
                               k rep                   repeat said string `k` times
                                     LF#`              join by linefeeds

JavaScript (ES6), 111 105 bytes
Saved 6 bytes thanks to @Shaggy
s=>s.replace(/^(##?#?) (.+)/gm,(_,a,b)=>`
${b.replace(/./g,e=>e.repeat(l=5-a.length))}`.repeat(l).trim())

Matches 1-3 hashes at the beginning of the string or preceded by a new line, then repeats each character in the match along with the match itself, based on the length of the hashes.
Test Cases:

let f=

s=>s.replace(/^(##?#?) (.+)/gm,(_,a,b)=>`
${b.replace(/./g,e=>e.repeat(l=5-a.length))}`.repeat(l).trim())

console.log(f('# This is a text\nwith two different\n### headers!'));
console.log('______________________________________________');
console.log(f('This input has\n## trailing hash marks ##\n#and a hash mark without a space after it.'));
console.log('______________________________________________');
console.log(f('# This ## is ### strange\n#### ###'));
console.log('______________________________________________');
console.log(f('Multiple\n\n\n### newlines! # \n:)'));
console.log('______________________________________________');
console.log(f('Line with only a hash mark:\n#\n### ^ Like that!'));

Retina, 125 104 bytes
m(`(?<=^# .*).
$0$0$0$0
(?<=^## .*).
$0$0$0
(?<=^### .*).
$0$0
^#
$%'¶$%'¶$%'¶
^##
$%'¶$%'¶
^###
$%'¶

Try it online
Saved 21 bytes thanks to Neil.

Save 3 bytes by using %) on the third stage which allows you to remove the %s on the first two stages. Also one normally puts the G after the (s (of which you'll now need two) in the header.

Better still, you can use m) or m( which now saves 9 bytes because you can then remove all of the other ms.

The header turned out to be unnecessary. Also, I saved another 12 bytes: Try it online!

Oh, yeah I was just used to using the header for multiple test cases.

MATL, 43 42 40 bytes
1 byte removed thanks to Rick Hitchcock!
`j[]y'^##?#? 'XXgn:(2M4:QP&mt~+t&Y"0YcDT

This outputs a trailing space in each line (allowed by the challenge), and exits with an error (allowed by default) after producing the ouput.
Try it online!
Explanation
`            % Do...while loop
  j          %   Input a line as unevaluated string
  []         %   Push empty array
  y          %   Duplicate from below: push input line again
  '^##?#? '  %   Push string for regexp pattern
  XX         %   Regexp. Returns cell array with the matched substrings
  g          %   Get cell array contents: a string, possibly empty
  n          %   Length, say k. This is the title level plus 1, or 0 if no title
  :(         %   Assign the empty array to the first k entries in the input line
             %   This removing those entries from the input
  2M         %   Push k again
  4:QP       %   [1 2 3 4], add 1 , flip: pushes [5 4 3 2]
  &m         %   Push index of k in that array, or 0 if not present. This gives
             %   4 for k=2 (title level 1), 3 for k=3 (tile level 2), 2 for k=2
             %   (title level 1), and 0 for k=0 (no title). The entry 5 in the
             %   array is only used as placeholder to get the desired result.
  t~+        %   Duplicate, negate, add. This transforms 0 into 1
  t&Y"       %   Repeat each character that many times in the two dimensions
  0Yc        %   Postpend a column of char 0 (displayed as space). This is
             %   needed in case the input line was empty, as MATL doesn't
             %   display empty lines
  D          %   Display now. This is needed because the program will end with
             %   an error, and so implicit display won't apply
  T          %   True. This is used as loop condition, to make the loop infinite
             % End (implicit)

I was wondering what the best way to do this in MATLAB was... Kronecker product was of course the best way to do it :) Nice!

@StewieGriffin When I saw the challenge I immediately thought of Kronecker product. But I just found a way that is 2 bytes shorter using repelem (Y" in MATL). kron is still probably the shortest way in MATLAB

Perl 5, 47 +1 (-p) bytes
s/^##?#? //;$.=6-("@+"||5);$_=s/./$&x$./ger x$.

try it online

Charcoal, 46 bytes
ＦＮ«Ｓι≔⊕⌕Ｅ³…⁺×#κι⁴### θＦ⎇θ✂ι⁻⁵θＬι¹ι«Ｇ↓→↑⊕θκ→»Ｄ⎚

Try it online! Link is to verbose version of code. Charcoal doesn't really do string array input, so I've had to add the array length as an input. Explanation:
ＦＮ«Ｓι

Loop over the appropriate number of input strings.
≔⊕⌕Ｅ³…⁺×#κι⁴### θ

Create an array of strings by taking the input and prefixing up to 2 #s, then truncating to length 4, then try to find ### in the array, then convert to 1-indexing. This results in a number which is one less than the letter zoom.
Ｆ⎇θ✂ι⁻⁵θＬι¹ι«

If the letter zoom is 1 then loop over the entire string otherwise loop over the appropriate suffix (which is unreasonably hard to extract in Charcoal).
Ｇ↓→↑⊕θκ→

Draw a polygon filled with the letter ending at the top right corner, and then move right ready for the next letter.
»Ｄ⎚

Print the output and reset ready for the next input string.

SOGL V0.12, 31 28 bytes
¶Θ{■^##?#? øβlF⁄κ6κ5%:GI*∑∙P

Try it Here! - extra code added because the code is a function and takes input on stack (SOGL can't take multiline input otherwise :/) - inputs.value” - push that string, → - evaluate as JS, F - call that function
Explanation:
¶Θ                            split on newlines
  {                           for each item
   ■^##?#?                      push "^##?#? "
           øβ                   replace that as regex with nothing
             l                  get the new strings length
              F⁄                get the original strings length
                κ               and subtract from the original length the new strings length
                 6κ             from 6 subtract that
                   5%           and modulo that by 5 - `6κ5%` together transforms 0;2;3;4 - the match length to 1;4;3;2 - the size
                     :          duplicate that number
                      G         and get the modified string ontop
                       I        rotate it clockwise - e.g. "hello" -> [["h"],["e"],["l"],["l"],["o"]]
                        *       multiply horizontally by one copy of the size numbers - e.g. 2: [["hh"],["ee"],["ll"],["ll"],["oo"]]
                         ∑      join that array together - "hheelllloo"
                          ∙     and multiply vertiaclly by the other copy of the size number: ["hheelllloo","hheelllloo"]
                           P    print, implicitly joining by newlines

Proton, 130 bytes
x=>for l:x.split("\n"){L=l.find(" ")print(L>3or L+len(l.lstrip("\#"))-len(l)?l:"\n".join(["".join(c*(5-L)for c:l[L+1to])]*(5-L)))}

Try it online!

I think you are not allowed to receive and return a list of lines, the rules are quite strict: You must support input over multiple lines., The output must be presented over multiple lines. You may not output \n instead of literal newlines..

@Mr.Xcoder Whoops, my bad. Fixing.

Note: It's OK if the input has \n, but the output should be shown with literal newlines.

@mbomb007 Whoops I forgot to put the 5- in there. Sorry

@mbomb007 fixed

Python 3, 147 bytes
def f(x):
	for l in x.split("\n"):L=l.find(" ");print(L>3or L+len(l.lstrip("#"))-len(l)and l or"\n".join(["".join(c*(5-L)for c in l[L+1:])]*(5-L)))

Try it online!
-1 byte thanks to Mr. Xcoder

@mbomb007 Whoops I forgot to put the 5- in there. Sorry

Python 3, 131 bytes
from re import*
print(sub("^(#+) (.*?)$",lambda x:((sub('(.)',r'\1'*(5-len(x[1])),x[2])+'\n')*(5-len(x[1])))[:-1],input(),flags=M))

Try it online!
I used Python 3 in order to use [] with regex.

C# (.NET Core), 268 + 18 bytes
n=>{var r="";for(int l=0,c;l<n.Length;l++){var m=n[l];var s=m.Split(' ');var y=s[0];if(!y.All(x=>x==35)|y.Length>3|s.Length<2)r+=m+'\n';else for(int i=0,k=y.Length;i<5-k;i++){for(c=1;c<m.Length-k;)r+=new string(m.Substring(k,m.Length-k)[c++],5-k);r+='\n';}}return r;};

Try it online!

JavaScript, 112 bytes
x=>x.replace(/^(##?#?) (.*)/mg,(_,n,w)=>(t=>Array(t).fill(w.replace(/./g,c=>c.repeat(t))).join`
`)(5-n.length))

f=

x=>x.replace(/^(##?#?) (.*)/mg,(_,n,w)=>(t=>Array(t).fill(w.replace(/./g,c=>c.repeat(t))).join`
`)(5-n.length))
<textarea id=i style=display:block oninput=o.value=f(i.value)></textarea>
<output id=o style=display:block;white-space:pre></output>

I don't think this works for #### ##.

@RickHitchcock fixed

PHP, 122+1 bytes
for($y=$z=" "==$s[$i=strspn($s=$argn,"#")]&&$i?5-$i++:1+$i=0;$y--;print"
")for($k=$i;~$c=$s[$k++];)echo str_pad($c,$z,$c);

Run as pipe with -nR (will work on one input line after another) or try it online.

J, 55 bytes
([:{:@,'^##?#? 'rxmatch])((1 1 4 3 2{~[)([:|:[$"0#)}.)]

I don't know how to make TIO work with J regex, so I can't provide a working link.
Here's how to test it in the J interpreter (tested with J804)
   f=.([:{:@,'^##?#? 'rxmatch])((1 1 4 3 2{~[)([:|:[$"0#)}.)]
   txt=.'# Hello'; '## A B C def'; '### PPCG!'; '#and a hash mark without a space after it.'; '##### ###'
   ; f each txt

HHHHeeeelllllllloooo
HHHHeeeelllllllloooo
HHHHeeeelllllllloooo
HHHHeeeelllllllloooo
AAA   BBB   CCC   dddeeefff
AAA   BBB   CCC   dddeeefff
AAA   BBB   CCC   dddeeefff
PPPPCCGG!!
PPPPCCGG!!
#and a hash mark without a space after it.
##### ###

I simulate a multiline string through a list of boxed strings.

Python 2, 126 124 117 bytes
while 1:l=raw_input();i=l.find(' ');v=5-i*(l[:i]in'###');exec"print[l,''.join(c*v for c in l[i+1:])][v<5];"*(v>4or v)

Try it online!
or
while 1:l=raw_input();i=l.find(' ');t=''<l[:i]in'###';exec"print[l,''.join(c*(5-i)for c in l[i+1:])][t];"*(t<1or 5-i)

Try it online!

C# 4.5 158 Bytes
Where i is the input in the form of a string.
int l,m,t,s=0;while(i[s]=='#'){s++;};t=s>0?4-s+1:1;for(l=0;l<t;l++){foreach(char c in i.Skip(s>0?s+1:0))for(m=0;m<t;m++)Console.Write(c);Console.WriteLine();}

Stax, 27 bytes
é!?q╚<╙≈╣íå▒{¼Φ8ôƒ¡m↨;-◘-u♥

Run and debug it
This was fun.