text:
Cat goes "Meow"
cat goes  "Meow"
We are all familiar with the concept of a cat program. The user types something in, it is echoed back to the user. Easy. But all cat programs I've seen so far have missed one fact: a cat goes "Meow". So your task is to write a program that copies all STDIN to STDOUT UNLESS the input is cat, in which case your program should output cat goes "Meow".
Scoring
This is code-golf, so your score is your byte count, with a few modifiers:

If your program works for any additional animals other than cat (e.g. cow: cow goes "Moo"), for each additional animal: -10
If your program doesn't use the word "cat": -15
If your program responds to fox with "What does the fox say": -25

Animals and sounds that go together:
cow goes moo
duck goes quack
sheep goes baa
bees go buzz
frogs go croak
Anything else on this list is allowed.
Rules

Standard loopholes apply
You must not write anything to STDERR
You can use single quotes/no quotes instead of double quotes.

Leaderboard
Here is a Stack Snippet to generate both a regular leaderboard and an overview of winners by language.
To make sure that your answer shows up, please start your answer with a headline, using the following Markdown template:
## Language Name, N bytes

where N is the size of your submission. If you improve your score, you can keep old scores in the headline, by striking them through. For instance:
## Ruby, <s>104</s> <s>101</s> 96 bytes

If there you want to include multiple numbers in your header (e.g. because your score is the sum of two files or you want to list interpreter flag penalties separately), make sure that the actual score is the last number in the header:
## Perl, 43 + 2 (-p flag) = 45 bytes

You can also make the language name a link which will then show up in the leaderboard snippet:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes

var QUESTION_ID=62500;var OVERRIDE_USER=46470;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="
"+e.body.replace(OVERRIDE_REG,"")+"
")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(-?\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
 <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">

Leaderboard

	Author	Language	Size

Winners by Language

Language	User	Score

{{PLACE}}	{{NAME}}	{{LANGUAGE}}	{{SIZE}}	Link

{{LANGUAGE}}	{{NAME}}	{{SIZE}}	Link

For the bonuses: What does the fox say?

For the bonuses: can each additional animal be singular, or does "bees" always have to be plural, as in your list?

@ProgramFOX It doesn't matter.

Should this replace each line (or word?) individually, or only the whole input? (I.e. if the input is cat\nduck, should the output be the same or cat goes meow\nduck goes quack?

Cats say meow..

@PaŭloEbermann Only if the input is only the animal (your input would output cat\nduck).

Instead of double quotes, can you use single ones? Also, can you output to stderr?

Can it be a function, and can it take command line args instead?

@muddyfish Um... I didn't write the snippet myself, but I'll have a look.

@muddyfish No idea, sorry.

Why is there no link to this in this challenge?

You can use single quotes, but can't output to STDERR

I'm going to revise bonuses.

@Dennis - Yeah, sorry, that was my suggestion, but I wasn't expecting he'd actually change it this late in the game.  That was more of a recommendation for future challenges.  Admittedly, the old scoring method was subject to serious abuse, since a longer program could easily get a lower score, which is very un-golf-like...

@Dennis Point taken, I'll rollback. Didn't think it would have so great an effect.

Is this eligible for the -15 bonus?

Pyth, 231-255 = -24 bytes
-24*10 extra animals, -15 for no "cat" string
pzI}zJv.Z"xÚ]ArÃ E¯âñMOÛ|°
Ø¢mÞ½`&ÉR¯'_ãPÍm1;ñÝ|,F ¹×z#½öÂ÷ÜAPúõMh#Ì©UOC *CÑ°k%¹ö´qÌzj,å<&{jàRFÖ(¥s    ñ`GÂ:çkô#ù\M+üqíéaw ÑuW6Lã,¶w/'87ö×_r]¢:jkz»ÚFÙ¦ÈcÅËØíëûÖOa¿Þµ´6 ø¡ãEþþ:"jk(" goes "N@JzN

Link to code
Pseudocode
Auto assign z to input
print z
J = decompress animal-sound dict
if z in J:
    print " goes ", J[z], '"'

Animals it knows:
{'hare': 'squeak', 'seal': 'bark', 'lion': 'growl', 'rook': 'hiss', 'sheep': 'baa', 'hamster': 'squeak', 'moose': 'bellow', 'grasshopper': 'chirp', 'rhinoceros': 'bellow', 'cat': 'meow', 'tiger': 'growl', 'stag': 'bellow', 'crow': 'caw', 'okapi': 'bellow', 'snake': 'hiss', 'cicada': 'chirp', 'badger': 'growl', 'dog': 'bark', 'cricket': 'chirp', 'tapir': 'squeak', 'bird': 'chirp', 'sparrow': 'chirp', 'lamb': 'baa', "frog": "croak", "raven": "croak"}

I feel like the bonus should be -10%, not -10 bytes.  That would give a diminishing return to prevent abuses like this.  (And that's 10% multiplied each time, not 10% of original added up, otherwise you'd only need 10 animals to get a score of 0 no matter how long the code was...)

@DarrelHoffman I'll bear that in mind for all future challenges.

Well, you successfully made my head explode, and I no longer know what the fox says. +1

The raven goes croak?

@carusocomputing According to wikipedia it does. I think they go squalk myself

TeaScript, 29 - 15 = 14 bytes
Doesn't use string cat.
xr(/^c\at$/,'$& goes "Meow"')

"What does the fox say" (length = 21) is longer than the bonus is worth.

The fox bonus is now worth it!

PXLCODE, 114 bytes
I SHOULD GET BONUS BECAUSE THIS IS CAT LANGUAGE RIGHT?
ALSO FEED ME BUTTER
HAI 1.3
I HAS A V
GIMMEH V
BOTH SAEM V AN "cat",O RLY?
YA RLY,VISIBLE "cat goes meow"
NO WAI,VISIBLE V
OIC
KTHXBYE

Welcome to Code Go- wait a second

APOL, 34 bytes
p(¿(=(i "cat") "cat goes meow" ⋔))
BEEP BOOP I AM NOT A ROBOT

Once again, I posted this to get this account enough rep to chat.

CJam, 12 bytes
q_:)"dbu"=" goes \"Meow\""*

The program is 27 bytes bytes long and doesn't use the word cat (-15 bytes).
Try it inline in the CJam interpreter.
How it works
q_                e# Read all input and push a copy.
:)                e# Increment all code points of the copy.
"dbu"=            e# Push 1/0 if the result is/isn't "dbu".
" goes \"Meow\""* e# Repeat the string that many times.

I like the smiley :)

JavaScript, 45 - 15 = 30 / 264 - 235 = 29
alert((s=(d='MeowBuzzSongMooMooCawBarkQuackCroakHissOinkBaaSingRoarLowCooCawBarkBaaHissCryRoarSingC\x61tBeeBirdCattleCowCrowDogDuckFrogHorseHogLambLarkLionOxPigeonRookSealSheepSnakeSwanTigerWhale'.split(/(?=[A-Z])/))[d.indexOf(i=prompt())-23])?i+' goes "'+s+'"':i)

Downside: you have to write the name of the animal with the first letter in uppercase and the rest in lowercase. Look below for another version which fixes this. This version escapes the a in cat with \x61 and includes code for the 22 extra animals from this list (all the allowed animals which had short enough words to be worth it):

bee buzz   7
  bird song  8
  cattle moo 9
  cow moo    6
  crow caw   7
  dog bark   7
  duck quack 9
  frog croak 9
  horse hiss 9
  hog oink   7
  lamb baa   7
  lark sing  8
  lion roar  8
  ox low     5
  pigeon coo 9
  rook caw   7
  seal bark  8
  sheep baa  8
  snake hiss 9
  swan cry   7
  tiger roar 9
  whale sing 9

(thanks to my friend for helping me with the tedious task of making this list)
Ungolfed code:
data = 'MeowBuzzSongMooMooCawBarkQuackCroakHissOinkBaaSingRoarLowCooCawBarkBaaHissCryRoarSingC\x61tBeeBirdCattleCowCrowDogDuckFrogHorseHogLambLarkLionOxPigeonRookSealSheepSnakeSwanTigerWhale'.split(/(?=[A-Z])/);

input = prompt();
index = data.indexOf(input);
sound = data[index-23];
result = sound ? input + ' goes "' + sound + '"' : input;
alert(result);

First version, 45 bytes - 15 bonus = 30
alert((i=prompt())=='\x63at'?i+' goes "Meow"':i)

Yes, I know. I went from 30 to 29 with ALL that extra work. It was fun!
Version that allows full lowercase input, 294 bytes - 235 bonus = 59
alert((s=(d='MeowBuzzSongMooMooCawBarkQuackCroakHissOinkBaaSingRoarLowCooCawBarkBaaHissCryRoarSingC\x61tBeeBirdCattleCowCrowDogDuckFrogHorseHogLambLarkLionOxPigeonRookSealSheepSnakeSwanTigerWhale'.split(/(?=[A-Z])/))[d.indexOf((i=prompt())[0].toUpperCase()+i.slice(1))-23])?i+' goes "'+s+'"':i)

I also tried removing casing from the data array with .join().toLowerCase().split(',') but it ended up taking 297 characters instead.

edit: fixed quote marks and capital on meow (although the question isn't consistent with capitals)

And... my work here is done, proving that the -10 bonus was just enough :)

APL (Dyalog), 28 - 15 = 13 bytes
{⍵,' goes "Meow"'/⍨⍵≡⌽'tac'}

Input followed by  goes "Meow" if input is equivalent to tac reversed.
Try it online!
{…} anonymous function
 ⌽'tac' reverse the string (to get the -15 bonus by avoiding the characters cat)
 ⍵≡ Boolean for whether the argument is identical to that
 ' goes "Meow"'/⍨ use that to filter the string (i.e. returns empty string if false)
 ⍵, append to the argument

JavaScript, 81 - 20 - 15 = 46 bytes 50 - 15 = 35 bytes
(o=prompt()=="ca"+"t")&&o+=' goes "Meow"';alert(o)

You can drop the double-quotes around Meow.

no, that's actually part of the question

How about 'c\at' instead of 'ca'+'t'?

alert({'c\at':'c\at goes "Meow"',fox:'What does the fox say'}[a=prompt()]||a). Why not even drop the alert? It already returns the result to console.

Python 3, 81 70 55 46 - 15 = 31 bytes

Thanks to Stewie Griffin for saving 15 bytes
Thanks to grc for saving 8 bytes.
Not using the string cat gives -15 bytes.
y=input()
print(y+' goes "Meow"'*(y=="ca""t"))

Stack, 51 bytes
'' input dup 'cat' = { 'cat goes "meow"' } if print

Pyke, 391 -595 = -204 bytes
-58*10 extra animals, -15 for no "cat" string
"goes"Q.dt偮晪ꅢὐὥ墵셞᳙ᄷ쟿䁔漲ᬰ䵙ꄨ塋튖თ᠞鮔૪爟㍅爟⼱]꣟勒〥鴞᫠⬻䋥ュ⣹邦㺓堚퀦잓號漲ქ䦙ᔯ漲ᠥ쏔っ鮔牔鶇Ƒ䂝雥⬻⯎偮燩巺䯥봽鮔튖➒゗ᨼ䄇嚕㮷鮏ᘽ挳ᖘ漲睴윿꒲⬻鼤㨂ᘽdc2cY@]3J

Try it here!
Uses dictionary-based compression to store the words. Pyke is older than the question.
Animals it knows:
{'seals': 'bark', 'turkeys': 'gobble', 'mosquitos': 'whine', 'curlews': 'pipe', 'dogs': 'howl', 'sheep': 'bleat', 'elephants': 'trumpet', 'eagles': 'scream', 'raccoons': 'trill', 'goats': 'bleat', 'donkeys': 'bray', 'monkey': 'whoop', 'snakes': 'hiss', 'wolves': 'howl', 'grasshoppers': 'chirp', 'ferrets': 'dook', 'geese': 'honk', 'ducks': 'quack', 'chinchillas': 'squeak', 'oxen': 'low', 'pigs': 'snort', 'lions': 'snarl', 'antelopes': 'snort', 'crows': 'caw', 'hamsters': 'squeak', 'ravens': 'croak', 'leopards': 'snarl', 'tapirs': 'squeak', 'lambs': 'bleat', 'horses': 'neigh', 'jaguars': 'snarl', 'crickets': 'chirp', 'moose': 'bellow', 'cattle': 'moo', 'deer': 'bellow', 'rooks': 'caw', 'dolphins': 'click', 'whales': 'sing', 'owls': 'hoot', 'walruses': 'groan', 'cicadas': 'chirp', 'tigers': 'snarl', 'chickens': 'cluck', 'giraffes': 'bleat', 'mice': 'squeak', 'peacocks': 'scream', 'songbirds': 'sing', 'geckos': 'croak', 'frogs': 'croak', 'pigeons': 'coo', 'swans': 'cry', 'bitterns': 'boom', 'rhinoceros': 'bellow', 'cats': 'purr', 'badgers': 'growl', 'magpies': 'chatter', 'vultures': 'scream', 'elk': 'bleat'}

Why is this marked as noncompetitive?

At the time of writing, there was a rule where languages older than the question were non-competing

languages older than the question? or languages newer than the question? because im pretty sure it was the latter :P either way, you can take off the noncompetitive mark, site has new standards :-)

LOLCODE, 100 109 Bytes
HAI 1
I HAS A I
GIMMEH I
BOTH SAEM I "cat",O RLY?
YA RLY,VISIBLE "cat goes Meow"
NO WAI,VISIBLE I
OIC
KTHXBYE

Try it out online
My first post on this platform, as well as my first code-golf challenge and my first code in LOLCODE, so there's probably lots to improve. I tried avoiding the "cat" with casting the equivalent hex-code ":(63):(61):(74)" instead, but it didn't work out for me. If you know a solution to this, please let me know!
*+9 Bytes because I didn't read the instructions clear enough

Welcome to CGCC! Your TIO link appears to be blank, though the code itself looks valid

Thanks for pointing that out @JoKing I fixed the link, it should include the code now.

the code turns "cat" into "Meow", but it should instead turn it into "cat goes Meow". Still nice code though!

Thanks @Belhenix. I fixed it for the price of adding 9 bytes. Sadly the use of a variable for "cat" would've turned out to be 5 bytes longer, so I chose to stick with the uglier code.

GNU sed, 37 - 15 = 22 bytes
sed -r 's/^(\x63at)$/\1 goes "Meow"/'

sed '/^c[a]t$/s/$/ goes "Meow"/' saves a few bytes. But the new 5% bonus is worthless compared to the original 15 byte bonus for not having "cat".

@GlennRanders-Pehrson Not any more!

MATLAB, 58 -  15 = 43 bytes
Pretty straight forward, with bonus for not using cat in the code:
x=input('');if isequal(x,'dbu'-1);x=[x ' goes "Meow"'];end;x

Input must be given inside single quotes: ' '.

In its current form, this doesn't output correctly if 'cat' is given as input. You probably forgot x= within the if-statement.

But I'll also give you a tip to win back these bytes plus an additional 2: replace your entire if-statement by: if~any(x-'dbu'+1)

@slvrbld, thanks for noticing, it happened after I made an edit. BTW: your suggestion doesn't work for inputs that aren't 3 characters. =)

Ah, you're correct. I was too focused on the cat and fox and forgot about the rest.

C++11, 316 - 11*10 - 15 = 191 bytes
#include <map>
#define t(a,b){#a,#b},
using s=std::string;int main(){std::map<s,s>m{t(cow,moo)t(crow,caw)t(dog,bark)t(hog,oink)t(lark,sing)t(lion,roar)t(oxen,low)t(rook,caw)t(seal,bark)t(sheep,baa)t(swan,cry){"c""at","meow"}};s l;while(int i=~getchar())l+=~i;printf("%s",(m[l]==""?l:l+" goes \""+m[l]+'"').c_str());}

Compiles well with VisualStudio. GCC wants me to #include <string> and #include <cstdio>. It would be shorter if I wouldn't go for bonuses, but I still hope author revises bonuses. I can't think of language where defining cow -> moo or so is way way shorter than 10bytes. Mine cost 3+key+value bytes for additional animal and flat 22+17 bytes for defining structure and so.
Ungolfed
#include <map>

#define t(a, b) { #a, #b },
using s = std::string;
int main()
{
    std::map<s, s> m{
        t(cow,moo)
        t(crow,caw)
        t(dog,bark)
        t(hog,oink)
        t(lark,sing)
        t(lion,roar)
        t(oxen,low)
        t(rook,caw)
        t(seal,bark)
        t(sheep,baa)
        t(swan,cry)
        { "c""at", "meow" }
    };
    s l;
    while (int i = ~getchar())
        l += ~i;
    printf("%s", (m[l] == "" ? l : l + " goes " + m[l]).c_str());
}

"t(crow,caw)" has a length of 11.  So getting rid of that to "t(swan,cry)" would drop 14 bytes.  And admittedly make it less fun :(

@user, As I said,  I still hope author revises bonuses.

You should state C++11 in the headline. Python 2 and 3 are also always distinct noted. While the using is no big deal, the initializer list is.

@KarlNapf Thanks for pointing that out.

You can also change #include <map> to #import<map> for -2 bytes. The space before < can be omitted and #import throws some warnings but is accepted be GCC and MSVC

Javascript, 117 bytes
for(c=0,s="bee.Buzz.bird.Song.c\at.Meow.cow.Moo.crow.Caw.dog.Bark.oxen.Low.owl.Who.rook.Caw.sheep.Baa.swan.Cry".split('.'),p=prompt(),a=![];c<s.length;c+=2){if(p==s[c])a=c}if(!a)alert(p=='fox'?'What does the fox say':p);else alert(s[a]+' goes "'+s[a+1]+'"')

I definitely haven't won here, but I've covered a lot of extra animals.
Javascript, 31 bytes
p=prompt();alert(p=='c\at'?p+' goes "Meow"':p)

HALT, 71 - 15 = 56 bytes
1 IF "cat" 2 ELSE 3
2 TYPE "MEOW";HALT
3 SET 0;NEXT
4 INCREMENT;STORE 0

HALT is a language I (@Downgoat) made designed for string processing, the only problem is that it's a bit long
Formatted
1              IF "cat" 2 ELSE 3
2 TYPE "MEOW"; HALT
3 SET 0      ; GOTO 6
4 INCREMENT  ; STORE 0

Python, 62 58 48 - 15 = 48 44 33 bytes
Thanks to Unrelated String for -10 bytes!
x=input()
print(x,*['goes "Meow"'][:"c""at"==x])

0x61 = a.
Try it online!
Revision 3: with cat without cat
Revision 2: with cat without cat
Revision 1: with cat without cat

The first cat is there

@l4m2 Sorry, that will be fixed.

62-15

-2 by spinning the comparison around and using adjacent string literal concatenation over an escape sequence. Or, all the way down to 48.

Beam, 208 206 - 15 = 191 bytes
Not a competitive entry, but a bit of fun to do.  It checks the first for letters of the input against cat.  If it gets a mismatch it will shortcut to the standard cat program.  If it matches it will append goes "Meow"
'''''''''>`\/n@>`)'''>`++\
/++++++++++/r /SP''+(++++/
\+)'PSrn@--S/ \rn@`>`)rn'''''>`++++++)++@P'p++++@'p-----@`p++@'p-@``p@++@'''''>`+++++++++)--@'p++@'p-----@++++++++@``p++@H
/@<  (`<     < `<    ''<
>ruH

, 23 - 15 = 8 chars / 58 - 15 = 43 bytes
ïċɘ㴃탵ˠⓀ㐀攁退胦ްおр夁䰰ᷗȿ 쨀#

Try it here (Firefox only).
The byte to char ratio is real.

PHP, 1204 - (10 * 64) - 15 - 20 = 529 bytes
<?php $i = $argv[1];$s = json_decode(gzuncompress(hex2bin("78da555351b2db200cbc8a27dfee057a1b192bc018104f40dcbccebb7b25d9499d8fcc588b10abddcddf1b64e4e8a04c3bd1eac86db7df3774e136dfa0744c5451805688bb400bac1e5900cfb42703ba1e3bc6e3ce82dabe8cef6f2d22af52b910b95ad93b72d173a22c8083f4d0f63bc75c131aa2e332d2ae45886e43ed7769082f438afc52027df46b20182af457b83c24537ad2c199484b99f6fe669dd9afcd6cc70ef67972a03bb8c10915abb12aa995bc7206deac48555818a9e80ea46cf8142020fe0aa0ccd761327e0db00e046f745426d0c531610d22af609d47aea8dade91d998ad447aebcef6aef0b32d7d64b8df4ddd84a0173c436b816a35475efbf8110bc254a3bf6a1420b76e7d1788f1a346ceb14f8e61b98c0bc44ddb0a46afe284582b55ea9087e1af2004236b3999278a452726c8cb8bef3c2d0086b14ad362f1f3b4032fe67b8aa59cae88742744aab26ccff3f47a2583af11ad0f344c0a1119910553b2d864929562270577b14a87d10635ea351a3e0895572ffd11f0f8ac0867fadf36898668249c65a732448e387de481c1c96931272598863c8ed09ec6b17020874c5792ac1e5bea8ee234c7c238df1a42faff449360552b55c05660d3d5426c4dcb0a7c26f874ac75f0d7a7da0e079da7145d74f848418fc71f5a75d652947a4e1edd469715fae023e29e96c3b0c748027e847a87c4ef4cc893820438722f666bc9a6cb69facf3f28e87499")));echo array_key_exists($i,$s)?"$i goes {$s->$i}":($i=="fox"?"What does the $i say":$i);

I use a json encoded gz compressed array of animal sounds.
This means it works with all 65 allowed animals, but my script is huge.
Also works with fox and doesn't have the word cat in it.

MATLAB, 46 bytes
regexprep(input(''),'^cat$','cat goes "Meow"')

Admittedly trivial. The input must be given in single quotes.

I'm not sure, but I think ans = ..  is generally not accepted, if the challenge is to print something. I'm not sure if it's a consensus, but it's quite common to use disp or something similar.

+1 though, for being shorter than mine =)

Ruby, 49 46 50 - 15 = 35 bytes
Pretty straight-forward I guess. Not using cat.
$<.map{|l|puts l==?c+'at
'??c+'at goes "Meow"':l}

Edit: Thanks for @w0lf for saving 3 bytes!

apparently there's no need for chop: http://ideone.com/lTpShD

@w0lf "cat\n" != "cat" (At least it doesn't work for me)
I'm guessing that ideone's STDIN doesn't have a trailing newline

Fair enough, I see where my example was wrong. Then your could consider doing this to shorten the code.

@PeterLenkefi, there are still a few cats left in your code... Did you forget to update it or...?

@StewieGriffin Damn it I did! My multitasking is not on top today. However in 5 mins I'll update it again.

@StewieGriffin Updated, thanks!

JavaScript, 48 - 15 = 33 bytes
Uses \x61 as a substitute for the a in cat.
i=prompt();alert(i=="c\x61t"?i+' goes "Meow"':i)

Perl, 46 - 15 = 31
$_=join'',<>;s/(?<=^ca)t$/t goes "Meow"/;print

Java = 222 bytes (compressed)
public class A {public static void main(String[] args) {Scanner a=new Scanner(System.in);for(;;){String b=a.nextLine();if(!b.equalsIgnoreCase("cat"))System.out.println(b);else {System.out.println("meow");System.exit(0);}}}

Or I could decompress it.
Batch = 52 bytes
set /p k=
if "k"=="cat" (echo cat) ELSE (echo %k%)

Javascript: 48 Characters, 48 Bytes
function(s){return (s=="cat")?"cat goes meow":s}

Test
=>"Dog"
<="Dog"
=>"cat"
<="cat goes meow"

Good work! You could drop the parentheses around s=="cat". Also, the cat's string is supposed to be cat goes "Meow", so 'function(s){return s=="cat"?'cat goes "Meow"':s} is completely valid.

If you wanted to save even more, you could use ES6: s=>s=="cat"?s+' goes "Meow"':s (30 bytes)

@ETHproductions OOooh, that's good! I don't know that kind of syntax though, a link perhaps?

@Fuzzyzilla it's part of a new version of JavaScript called "ES6", link to the new function syntax and overview. Here are also tips for ES6 and tips for JavaScript in general

Haskell, 52-15 = 37 bytes
c"\99at"="\99at goes \"Meow\""
c s=s
main=interact c

Using \99 as a substitute for c in “cat” so as to get the 15 bytes bonus.

Prolog, 48 bytes
p:-read(X),write(X),X=cat,write(' goes "Meow"').

Attempts to bring more animals to the party made the program longer even with bonuses.

Pyth, 26-15 (no "cat") = 11 bytes
My first ever Pyth program!
Iqz_"tac"+z" goes meow";Ez

Try it here
Explaination
   _"tac"                   # Reverse the string "tac"
Iqz                         # If the input equals "tac" reversed
         +z" goes meow";    # Append " goes meow"
                        Ez  # Else, use the input.
                            # Implicit: print the input, if it's used.

Pyth, 82-95 = -13 bytes
+z*}zKc."atÜiÃ'4ãl¾Eªîiû<-È&e"\jjk[d"goes"dNr@c."bw««[áÅ3ÏB"\c%x`Kz3 3N

I finally got around to converting my new functional Python 2 entry to Pyth. It doesn't beat the top contender. Turns out zipping together more animals into a larger dictionary reduces score faster than cleverly associating animals with sounds. This supports 8 animals in addition to cat: rhino, okapi, moose, lion, tiger, badger, hippo, and stag.
Try it online

O, 22 16 14 bytes
29 bytes - 15
Q"tac"`J=J" goes \"Meow\""+Q?
It's long and can be golfed more

Japt, 25-15=10 24-15 = 9 bytes
First time trying Japt:
N¦`¯t`?N:`¯t goƒ \"´ow\"

ƒ should be replaced with unprintable character U+0083
Compiles to:
N!="cat"?N:"cat goes \"meow\""

Old solution:
N¥`¯t`?`¯t goƒ \"´ow\"`:N

Try it here

Pretty nice! Sorry the backslashes are necessary, I thought I had fixed that.

Since the code contains an unprintable character, which Markdown discards, could you please add a link?

Added the link, also why does U+0083 get replace U+0192 or ƒ when you run this snippet: "\u0083".charCodeAt()

I have no clue. I can't seem to reproduce this.

Pyth, 132 - 150 (animals) - 15 (no cat) = -33 bytes
pJjb.zp.x++" goes \""r@.dmcd\ic."ay-ÝÏåâšB²ÅuŠ°µ²¦DÄ²Öì |t`2“‚Êôë¨}èÔèw:ÿÊ_OƒÄ<Ú›ø‚î½ùÛ&L°„6a<9-¾¹™,Uø0é6Œû²Ù²ËyÊ·%C"\lJ4\"k

Try it online!
Uses a packed string to fit in animals for less than 10 bytes each
Full list:
parrot goes "Squack"
cat goes "Meow"
rook goes "Caw"
ass goes "Bray"
goose goes "Honk"
dog goes "Woof"
duck goes "Quack"
sheep goes "Baa"
ox goes "Moo"
raven goes "Caw"
goat goes "Baa"
swan goes "Cry"
frog goes "Croak"
toad goes "Croak"
monkey goes "Chatter"

Edit 1: Almost forgot the no cat bonus :P

GolfScript, 25 - 15 = 10 bytes
."c""at"+=" goes 'Meow'"*

Try it online!
Example
."c""at"+=" goes 'Meow'"*   # Input: cat
."c""at"                    # Duplicate input, push c and at. Stack: cat cat c at
        +                   # Concatenate, Stack: cat cat cat
         =                  # Check if equal, Stack: cat 1
          " goes 'Meow'"*   # " goes 'Meow'" pushed onto stack n times, Stack: "cat" " goes 'Meow'"
                            # Implicitly print

Alternate Example
."c""at"+=" goes 'Meow'"*   # Input: asdf
."c""at"                    # Duplicate input, push c and at. Stack: asdf asdf c at
        +                   # Concatenate, Stack: asdf asdf cat
         =                  # Check if equal, Stack: asdf 0
          " goes 'Meow'"*   # " goes 'Meow'" pushed onto stack n times, Stack: "asdf" ""
                            # Implicitly print

05AB1E, score: -136 (214 bytes - 31*10 - 15 - 25)
'¨›Qi“What‚à€€ ÿ…è“ë“ÓÕŸâÍÝ¹ÐÀ¼ÛË—Ä¬…Ð§ÀÛÆÓ‹·»ÑÐœ²èàæÑåî€žÚÆÚØåÊÓ³âÌ–ÔÄ¤•ã‚í„ÄŠêÂÝ¢“#sk©di.•QÃ€}£≠‰ŒΛ(Ïûвrüéä[ñøuF½3¡üÃïßåιQÊçdï€]Üвβ`šŠû©ª«ĀLΩÝβ\à¨TĆηÎ.₄₆öª$γâôΘ:Æ™{¹и5|Âć®λ¬¡¸αâË::´óýÏƶ5~¦m.škα†#Ð6λ•#®è™s“ÿ—± "ÿ"

Bonuses:

-15 for not using cat
-25 for outputting What does the fox say when the input is fox
31 times -10 for the animals and sounds: ["bat screech","bear roar","bee buzz","tiger roar","lion roar","jaguar snarl","cat meow","chicken cluck","cow moo","cricket chirp","deer bellow","dog bark","wolf howl","duck quack","eagle screech","elephant trumpet","frog croak","horse neigh","mouse squeak","monkey scream","pig oink","rabbit squeak","seal bark","sheep baa","snake hiss","turkey gobble","whale sing","ass heehaw","rat squeak","goat bleat","lamb baa"]

Try it online or verify all used animals.
Explanation:
'¨›                  '# Push dictionary word "fox"
   Qi                 # If the (implicit) input-string equal "fox":
     “What‚à€€ ÿ…è“   #  Push dictionary string "What does the ÿ say"
                      #  (where the `ÿ` is automatically filled with the implicit input)
   ë                  # Else:
    “ÓÕŸâÍÝ...ÄŠêÂÝ¢“ #  Push dictionary string "bar bear bee ... rat goat lamb"
    #                 #  Split it on spaces
    sk                #  Get the index of the input-string in this list (-1 if not found)
    ©                 #  Store this index in variable `®` (without popping)
    di                #  If this index is non-negative (>= 0):
      .•QÃ€...Ð6λ•    #   Push compressed string "screech roar ... bleat baa"
      #               #   Split it on spaces
      ®è              #   Index variable `®` into this list
      ™               #   Titlecase this sound
      s               #   Swap to get the (implicit) input-string at the top of the stack
      “ÿ—± "ÿ"        #   Push dictionary string 'ÿ goes "ÿ"'
                      #   (where the first `ÿ` is the input at the top of the stack,
                      #    and the second `ÿ` is the titlecased sound below it)
                      # (after which the top of the stack is output implicitly as result,
                      #  which will be the (implicit) input itself for any other input)

See this 05AB1E tip of mine (sections How to use the dictionary? and How to compress strings not part of the dictionary?) to understand why:

'¨› is "fox"
“What‚à€€ ÿ…è“ is "What does the ÿ say"
“ÓÕŸâÍÝ¹ÐÀ¼ÛË—Ä¬…Ð§ÀÛÆÓ‹·»ÑÐœ²èàæÑåî€žÚÆÚØåÊÓ³âÌ–ÔÄ¤•ã‚í„ÄŠêÂÝ¢“ is "bat bear bee tiger lion jaguar cat chicken cow cricket deer dog wolf duck eagle elephant frog horse mouse monkey pig rabbit seal sheep snake turkey whale ass rat goat lamb"
.•QÃ€}£≠‰ŒΛ(Ïûвrüéä[ñøuF½3¡üÃïßåιQÊçdï€]Üвβ`šŠû©ª«ĀLΩÝβ\à¨TĆηÎ.₄₆öª$γâôΘ:Æ™{¹и5|Âć®λ¬¡¸αâË::´óýÏƶ5~¦m.škα†#Ð6λ• is "screech roar buzz roar roar snarl meow cluck moo chirp bellow bark howl quack screech trumpet croak neigh squeak scream oink squeak bark baa hiss gobble sing heehaw squeak bleat baa"
and “ÿ—± "ÿ" is 'ÿ goes "ÿ"'

Nim, 65 - 15 = 56 50 bytes
Does not use the word cat. Supports only cat and then "Meow", no other animals.
while 1>0:
 var i=readLine stdin;echo if i=="ca"&"t":"Meow"else:i

Attempt This Online!
(-6 bytes thanks to Steffan)

65 byets

Vyxal, 285 - 310 - 15 - 25 = -65 bytes
`∷¾`=[`λ⟩ ƛ∪ λλ ∷¾ ∨¶`|`Ḃṙ ∞¨ εċ ṗµ √₇ Ṁ⋎ ¢₌ β¡ ¦‹ √⊍ ₃⇩ •ƈ ṡƒ ¦ø ḟ₇ Ẇ⟑ µɽ ½ż Þ‡ ₃⅛ Ḣ⟨ ₈Ḋ ġṄ ⁋ė Ċṁ ∴† Ẏ₇ ass ₀⌈ ⌊ṫ Ȯ⁰`⌈?ḟ:£0≥[`s⇩⋏↳⋎ r⋎« Ȧ¨ r⋎« r⋎« sn₴£ m□ŀ cḟĿ moo ch↲Ṗ Ǎ⟩⟑ṙ •øk h⋎₄ qꜝ½k s⇩⋏↳⋎ t≥⁋⌐¨ crβ⁰ ne⋏ṫ sȧ‛ak s›‹ o›₌ sȧ‛ak •øk baa λµs £⁋ǎʁ ⟩ɽ hee¥↓ sȧ‛ak bl↓⟑ baa`⌈¥i`% ¢₃ `?%$+

Try it Online!
Port of Kevin Cruijssen's 05AB1E answer.
Vyxal, 42 - 15 - 25 = 2 bytes
`¢₌`=[`¢₌ ¢₃ "M□ŀ"`|`∷¾`=[`λ⟩ ƛ∪ λλ ∷¾ ∨¶`

Try it Online!
Bonuses:

-15 for not using cat
-25 for responding to fox with What does the fox say

Vyxal, 19 - 15 = 4 bytes
`¢₌`=[`¢₌ ¢₃ "M□ŀ"`

Try it Online!
Bonuses:

-15 for not using cat

Explanation
Most of it is just string compression:

`¢₌` is cat
`¢₌ ¢₃ "M□ŀ"` is cat goes "meow"
`∷¾` is fox
`λ⟩ ƛ∪ λλ ∷¾ ∨¶` is What does the fox say

TI-Basic, 48 bytes
Input Str1
Str1="cat
If Ans
Disp Str1+" goes Meow
If not(Ans
Disp Str1

All those lowercase letters are increasing the bytecount by a lot.

C, 76 bytes
main(){char a[99];gets(a);printf("%s%s",a,strcmp(a,"cat")?"":" goes meow");}

PHP, 70-15 = 55 bytes
<?=$l=rtrim(stream_get_contents(STDIN),~òõ),$l==~œž‹?~ß˜šŒßÝ²šˆÝ:'';

(saved as ISO-8859-1)
Uses inverted undefined constants as string literals:

~òõ == "\r\n"
~œž‹ == 'cat'
~ß˜šŒßÝ²šˆÝ == ' goes "Meow"'

Everything is combined in a single echo statement, shorthanded with <?=

Ruby, 35 + 2 (-p flag) - 15 = 22 bytes
$_==?c'at
'&&$_[-2]+=' goes "Meow"'

Inspired by trying to improve Peter Lenkefi's solution.

Ruby, 110 + 2 (-p flag) -60 (cow, ox, dog, bee, pig and crow) -15 (no cat) = 37 bytes
(h=Hash[*%W(cow Moo ox Low c\141t Meow dog Woof bee Buzz pig Oink crow Caw)][$_.chop])&&$_[-2]+=' goes "'+h+?"

Multiple animal Ruby solution...  As long as the animal+sound is <8 characters, it shrinks for each one added.  Gross abuse of Ruby. :)

Ruby, 26 + 1 = 27
With command-line flag -p, run
sub /^cat$/,'\& goes Meow'

Getting the no-cat bonus costs 2 bytes, which isn't actually worth it:
sub /^c at$/x,'\& goes Meow'

Pyth, 31 - 15 = 16 bytes
You can try it out here
In+C99"at"zz;E+z" goes \"Meow\"

Explaination:
I                                # If-statement
 n                               # not equal
  +C99"at"                       # Adds the char 99 with the string "at" = "cat"
          z                      # z, the user input
           z                     # Print the user input
            ;                    # Ends all open parentheses
             E                   # Else-statement
              +z" goes \"Meow\"  # Adds ' goes "Meow"' to z and prints the result

C99 can be replaced with \C. It's still +\C"at", so you can keep the bonus.

Hassium, 67 Bytes
func main()if((x=input())=="cat")print(x+" goes meow")else print(x)

See expanded here

It's fine to link to an online interpreter so that readers can test the code themselves, but you should still include sufficient explanation or expansion in the post such that a casual reader could convince themself that your submission is correct.

JacobFck, 31 Bytes
I really like the golfed version of this.
"cat"<|=_e>!:e"cat goes Meow">

See commented and expanded here

Python 2, 149-95 = 54 bytes
-8*10 extra animals, -15 for no "cat"
u=raw_input()
l="ca""t badger rhino okapi moose stag tiger hippo lion".split()
print u+' goes "%s"'%["Growl","Bellow","Meow"][`l`.find(u)%3]*(u in l)

Supported animals:

moose, stag, okapi, rhino (all Bellow)
tiger, badger, lion, hippo (all Growl)

This is not the shortest Python answer, but at least it does bother to try at some other animals! I add it here because the answer i had previously did not work, and I'm confident this will become the shortest Pyth answer once I translate it and golf it there.
How it works:

Take input
Create a list of animals in a very precise order.
Print the input, and if the input is in the list, use the location of the input in the string representation of the list to index an array of sounds, and append the appropriate "goes" string.

JavaScript, 35 - 15 (-p no cat) = 20 Bytes
c=i=>(i=='c\at')?i+' says "Meow"':i

Can someone check to see that I did the header right?

Arcyóu, 38 bytes (non-competitive)
Since this version of the language was made after the challenge was posted, it is not eligible.
(: s(q))(?(= s "cat")"cat goes Meow" s

Arcyóu is a LISP-like golfing language.
Explanation:
(: s(q))           ; Set the variable s to the contents of STDIN
(? (= s "cat")     ; If-statement. Condition is s == "cat"
  "cat goes Meow"  ; If true: return the string "cat goes Meow"
  s                ; Otherwise, return what was entered

Arcyóu automatically prints the result of the last expression evaluated. In this case, it is the ? statement. It also allows you to leave off trailing close-parens.

Emacs Lisp (67 Bytes)
(set'a(read-string""))(message(pcase a("cat""cat goes meow")(_ a)))

It uses pattern matching to distinguish cats from other input. This could be extended to fit other animals in as well, but as most of them take up more than 10 characters, there is not much to be gained from that.

Milky Way 1.5.16, 29 bytes - 15 = 14
"c""at"+'?{b_" goes Meow"+_}!

Doesn't use a "cat" string.

Explanation
"c""at"      " goes Meow"      # push string to the stack
       +                 +     # add the TOS and the STOS
        '                      # read input from the command line
         ?{ _             _}   # if statement
           b                   # equality of the TOS and the STOS
                            !  # output the TOS

Usage
python3 milkyway.py <path-to-code> -i <input>

Swift 2.0, 71 68-15 (no "cat") = 53 bytes
func a(s:String)->String{return s=="c\u{61}t" ?s+" goes \"Meow\"":s}

For some reason, a compilation error is thrown if there isn't a space before the ternary operator ?
Ungolfed
func a(s: String) -> String{
    return s == "c\u{61}t" ? s + " goes \"Meow\"" : s
}

This doesn't use "cat" in it by replacing the a with the unicode literal \u{61}. You can test this code here

Perl, 13 bytes
The string "cat" does not appear in my code (Special thanks to Dennis for shaving 15 bytes off of the code, and teaching me some new Perl tricks):
s/^(c)at$/$& goes Meow/

Neither of those are mentioned in the OP, unless I am missing something? It simply needs to take input and replace "cat" with cat goes Meow. I'm not sure if I missed something but I think my answer is valid.

In other words, unless the string is exactly the string "cat" it should not be reached.

Ah, I see what you mean. Very well, I'll make a minor edit to it.

Alternatively, s/^(c)at$/$& goes Meow/ with the -p switch.

DIG, 163 - 15 = 148 bytes
Disclaimer: Due to the fact that DIG was created after the challenge, this answer is non-competing.

Zoomed in (Note: This file will NOT compile, due to the nature of the language)

While I have no idea if this is considered a valid language for PPCG, it does complete the challenge. Documentation for the language can be found here and the interpreter can be found here.

Welcome to Programming Puzzles & Code Golf! This language is pretty cool but I think the community and readers would benefit if you took this approach and included as well an enlarged version of the image -- even zooming on this one is too small.

C#6, 302 - 110 - 15 = 177 bytes
This works for 12 different animals, including cat.  It does not include the word "cat" verbatim.
using static System.Console;class P{static void Main(){var a=ReadLine();var d="bee,Buzz,c\x61t,Meow,cow,Moo,crow,Caw,dog,Bark,hog,Oink,lamb,Baa,lion,Roar,ox,Low,owl,Hoo,pig,Oink,rook,Caw,seal,Bark,sheep,Baa,swan,Cry".Split(',');int i=22;while(--i>0&&d[--i]!=a);Write(i<0?a:d[i]+" goes '"+d[i+1]+"'");}}

Indentation and new lines for clarity.
using static System.Console;
class P{
    static void Main(){
        var a=ReadLine();
        var d="bee,Buzz,c\x61t,Meow,cow,Moo,crow,Caw,dog,Bark,hog,Oink,lamb,Baa,lion,Roar,ox,Low,owl,Hoo,pig,Oink,rook,Caw,seal,Bark,sheep,Baa,swan,Cry".Split(',');
        int i=22;
        while(--i>0&&d[--i]!=a);
        Write(i<0?a:d[i]+" goes '"+d[i+1]+"'");
    }
}

Retina, 23 - 15 = 8 bytes
^ca\0*t$
$& goes "Meow"

Pylongolf2, 33-15=18 bytes
"tac"╨1cd_@0=b?" goes Meow"¿~

Explanations:
"tac"╨1cd_@0=b?" goes Meow"¿~
"tac"                         push "tac" to stack
     ╨1                       reverse it
       cd                     read input and then select latest item in stack
         _                    duplicate input
          @0                  select first item in stack
            =b                compare then swap places
              ?               if true,
               " goes Meow"¿  push " goes Meow" to stack and end if statement
                            ~ print it.

Lua 5.3.2, 229 - 25 - 15 - 80 (extra animals) = 109 bytes
r={...}a={['\99\97\116']='Meow',duck='Quack',sheep='Baa',bee='Buzz',frog='Croak',bat='Screech',elk='Bugle',swan='Cry',pig='Oink'}print(r[1]=='fox' and 'What does the fox say' or(a[r[1]] and r[1]..' goes "'..a[r[1]]..'"' or r[1]))

Ungolfed
local Args = {...}
local Sounds = {
    ['\99\97\116'] = 'Meow',
    duck = 'Quack',
    sheep = 'Baa',
    bee = 'Buzz',
    frog = 'Croak',
    bat = 'Screech',
    elk = 'Bugle',
    swan = 'Cry',
    pig = 'Oink'
}
print(
    Args[1] == 'fox' and 'What does the fox say' or (
        Sounds[Args[1]] and Args[1] .. ' goes "' .. Sounds[Args[1]] .. '"' or Args[1]
    )
)

I tried to make the logic a little clearer by putting it on multiple lines.
It's essentially a ternary operator ?:

AWK, 32 - 15 = 17
/^[c]at$/{$0=$0" goes 'Meow'"}1

I think this counts as not using "cat".  Could have saved a couple bytes if "cat" were allowed to be anywhere in the line.
For giggles I also put together one with more animals, but it's not competitive, especially with trying to capture the correct verb to use, but here's what I came up with :)
{for(;I<split("ca""t,Meow,bees,Buzz,bird,Song,cow,Moo,crow,Caw,dog,Woof,duck,Quack,frogs,Croak,hog,Oink,ox,Low,pig,Oink,sheep,Baa,swan,Cry",a,",");)
m[a[I-1]="'"a[I+=2]"'"}
m[$0]{$0=$0($0~/s$/?" go ":" goes ")m[$0]}
/^fox$/{$0="What does the fox say"}
1

Java, 174 - 15 = 159 bytes
interface a{static void main(String[]A){for(String s="";;s=new java.util.Scanner(System.in).nextLine())System.out.println(s+(s.equalsIgnoreCase("ca"+"t")?" goes meow":""));}}

Ungolfed:
interface a {
    static void main(String[] A){
        for (String s = "";;s = new java.util.Scanner(System.in).nextLine())
            System.out.println(s + (s.equalsIgnoreCase("ca"+"t") ? " goes meow" : ""));
    }
}

Python 3, 44 - 15 = 29
i=input();print(i+' goes Meow'*(i=='ca''t'))

0815, 132 - 15 = 117
}:(:!~>^:(:}:):{~$>^:):{=<:63:-^:
:{=<:61:-^:
:{=<:74:-^:
:{=<:0:-^:
:<:20:~>$<:67:~$<:6F:~>$<:65:~>$<:73:~${~$<:4D:~$&{~${~$<:77:~$

PHP, 47-15=32 bytes
<?=($s=fgets(STDIN)).[" goes Meow"][c.a.t!=$s];

4 bytes longer than on $argv[1], and: it works only on the first line of input (including the linebreak).
69-15=54 bytes to take all lines:
while(false!==$n=fgets(STDIN))$s.=$n;echo$s,[" goes Meow"][c.a.t!=$s];

@user46470: I guess that echo$argn,[" goes Meow"][c.a.t!=$argn],~õ; using php -R '' (execute code for every line of input) would be a little cheating ... but it´s 5 bytes shorter. ;)

Pepe, 244 - 15 = 229 bytes
Bonus -15 for not containing the word "cat"
rEeEEeeeEErrEEREEeererEeEEeeeeErrEEREEeererEeEEEeEeerrEEREEeererErrEEreeEEeeeEEreeEEeeeeEreeEEEeEeereeeEeeeeereeEEeeEEEreeEEeEEEEreeEEeeEeEreeEEEeeEEreeeEeeeeereeeEeeeEereeEeeEEeEreeEEeeEeEreeEEeEEEEreeEEEeEEEreeeEeeeEeREEEEeEEErEeREEeREReEReee

Try it online!
Commented version
re  # fix syntax highlighting, doesn't affect the program
rEeEEeeeEE  # push "c"
rrEE  # func

REEee re  # pop "c"
rEeEEeeeeE  # push "a"
rrEE  # func

REEee re  # pop "a"
rEeEEEeEee  # push "t"
rrEE  # func

REEee re  # pop "t"
rE
rrEE  # func

# Output the text
reeEEeeeEE reeEEeeeeE reeEEEeEee reeeEeeeee reeEEeeEEE reeEEeEEEE reeEEeeEeE reeEEEeeEE reeeEeeeee reeeEeeeEe reeEeeEEeE reeEEeeEeE reeEEeEEEE reeEEEeEEE reeeEeeeEe

# Clear the stack
REEEEeEEE

rEe  # end-pop

# Loop
REEe RE  # Take input, add a trailing null
ReE

Reee

Runic Enchantments, 50 - 15 = 35
D q?=1l" "\>
Rlril1-{=?/:1´759E" "=?@"goes Meow"@

Try it online!
In general, for a zero-length animal name and zero-length sound, the overhead for another animal is 10 bytes (roughly, :0""=2*?""). The fifteen bytes we get for cat makes it worth spending a net 1 byte encoding "cat" as the numerical value 1759 and extracting "cat" from the dictionary.

C (gcc), 81 - 15 = 66 bytes
Text input version
Does not contain the word "cat", so gets that bonus. All attempts at further bonuses made the program larger.
Assumes a little-endian machine where sizeof(int) >= 4 and where signed integers are of the two's complement variety.
q;main(c){for(;c=~getchar();)q=q<<8|putchar(~c);q^6513012||printf(" goes meow");}

Try it online!
q;main(c){
for(;c=~getchar();)         Read bit-flipped character from STDIN into c. getchar()
                            returns -1 on EOF, and with two's complement, ~c == -c - 1,
                            so we stop on EOF.
q=q<<8|putchar(~c);         Insert character at LSB of q, moving the current values along one
                            byte, while also sending it to STDOUT.
q^6513012||                 Is q non-equal to "cat"?
printf(" goes meow");}      If no (it IS equal), print addendum, otherwise ignore.

The above is fine for text-only input, and most binary input. The only (known by me) corner case is if the file happens to end with a NUL character followed by "cat" (\0cat), which will give a false positive. I am not 100% sure if we were meant to deal with anything but text, so here is the safer version too:
Binary-friendly version, 90 - 15 = 75 bytes
q,x;main(c){for(;c=~getchar();x++)q=q<<8|putchar(~c);x^3|q^6513012||printf(" goes meow");}

Try it online!

86-15 binary-friendly storing count in q

Japt, 18 bytes
r`^¯t$`È+` go ´ow

Try it

Gema, 24 characters - 15 = 9
\Ac\Lat\Z=$0 goes "Meow"

gema works like a filter, so an empty gema '' is the same as cat.
To avoid using the word “cat” literally, inserted a pointless \L (turns on line mode, like an inline -line switch, meaning following arguments can't cross line boundary).
Sample run:
bash-5.0$ echo -n cat | gema '\Ac\Lat\Z=$0 goes "Meow"'
cat goes "Meow"

bash-5.0$ echo -n cats | gema '\Ac\Lat\Z=$0 goes "Meow"'
cats

Try it online!

Python 3, 516 - [10 x 53] - 15 = -29 bytes
lambda i:([i+f' goes "{a.split(",")[0]}"'for a in("bark,dog,wolf,seal,zebra bellow,alligator,moose,okapi bleat,deer,elk,giraffe,sheep,goat,lamb bray,donkey,ass buzz,bee,mosquito caw,crow,raven,rook chirp,cicada,cricket,songbird chuckle,linnet croak,frog,toad cry,swan hiss,goose,snake,tarantula meow,c"+"at moo,calf,cow,ox oink,pig,hog roar,badger,bear,lion,tiger,jaguar,leopard scream,monkey,peacock,vulture screech,bat,eagle,owl squeak,hamster,mouse,rat,rabbit,hare,tapir").split()if i in a.split(",")[0:]]+[i])[0]

Try it online!
Started with all the animals on the list, sorted into optimal groupings by sounds they make, then culled down animals whose bytes use more than 10. The final list contains 54 animals, for a bonus of -540 bytes.
It doesn't contain cat for another -15 bytes.
It's an anonymous function that works like a table with the animal sounds as headers, and finds the corresponding header for the animal in the table, otherwise returns the input.
If I'm allowed to respond to cat with cat goes "hiss" as in the list of animal sounds, I can pull off another 5 bytes.
-3 bytes thanks to Reinstate Monica.

@ReinstateMonica Thanks, I had it that way to handle multi-word animals, but I've removed them all. Cheers


text:
"i" have "i" chance of occuring

Design a random number generator where the i th number has i% chance
  of occurring for all 0 < i < 14. 0 should have exactly 9% chance of
  occurring. The seed for the generator should be the system time.
  You cannot use a pre-defined function for random number generation.

Basically 1 has 1% chance of occurring, 2 has 2% chance and so on up to 13 having 13% chance of occurring. This is code-golf, so the shortest code wins.

What about the other 9% chance?

@LegionMammal978 I already specified. It should print 0.

Yes, it's fine now. What was the problem earlier?

@ghosts_in_the_code The < from the inequality and the > from the quote block were forming an HTML tag.

Is a resolution of seconds OK?

@xnor What does that mean?

@ghosts_in_the_code That the seed only changes every second (as opposed to every millisecond, say). That is, if the random number generator is run twice within the same second, the results would be identical.

@xnor Yes, it is allowed.

CJam, 14 bytes
E,_T9t\]ze~es=

Test it here.
Explanation
E,   e# Push [0 1 2 ... 12 13].
_    e# Make a copy.
T9t\ e# Set the first element to 9. Swap with the original range.
]z   e# Wrap them in an array and transpose to get [[9 0] [1 1] [2 2] ... [13 13].
e~   e# Run-length decode to get `[0 0 0 0 0 0 0 0 0 1 2 2 3 3 3 ... 13 13 ... 13 13].
es=  e# Use the current timestamp as a cyclic index into this array.

Umm, why not mR?

@Optimizer "The seed for the generator should be the system time. You cannot use a pre-defined function for random number generation."

Ah, missed that part.

Python 2, 54
import time
print((time.time()*1e4%800+1)**.5+1)//2%14

The expression f(t) = ((8*t+1)**.5+1)//2 transforms a uniform distribution to a triangular integer distribution by mapping the intervals
[0,1)  --> 1
[1,3)  --> 2
[3,6)  --> 3
[6,10) --> 4
...

We convert the millisecond digits of the time to a uniform float from 0 to 100 by doing time.time()*1e4%100. Actually, we do %800 to replace multiplying by 8 in the conversion step. At the end, 14's are converted to 0's by doing %14.

Dyalog APL, 20 bytes
⊃(⌊.1×⊃⌽⎕TS)↓(/⍨⍳13)

⍳13 integers 1 though 13
(/⍨ … ) replicate by itself, e.g. /⍨3 is 3 3 3 and /⍨2 3 is 2 2 3 3 3
n↓ … drop n elements (leaves empty list if n > length of list)
⎕TS system time stamp e.g. 2015 11 1 13 28 56 834
⊃⌽ last element, i.e. current millisecond 0–999
⌊.1× multiply with 0.1 and round down
⊃ first element, gives 0 if if data is empty

Pyth - 14 bytes
@+mZ9smRd14.d8

Generates array with the specified distribution, then pick a random one.
Try it online here.

Processing 3, 65 55 74 bytes
long i=0,c=8,r=System.nanoTime()%100;for(;r>c;i++,c+=i);print(i);

Get a random number from 0 to 99 (inclusive). If number is 0-8, print 0, if it is 9 print 1, if 10-11 print 2, if 12-14 print 3, etc...
No one noticed it, but the problem with the old code is that millis() returns the amount of time the application has been running, which would give very similar numbers on subsequent runs of the program. At least now we have nano precision!

PHP, 50 bytes
<?for($t=microtime()*100;0<=$t-=++$i;)?><?=$i%14;

microtime returns the time as a string like "0.04993000 1446409253", when I multiply this by 100, PHP coerces the string into 0.04993000, result 4.993000. So $t is initialized with a "random" number in [0,100)
We subtract 1, 2, 3, ... from $t until it reaches 0
The result is the last subtracted number, modulo 14

You can actually write ;echo instead of ?><?=, for the same byte count. But nicely done!

Python3, 86 Bytes
straight forward:
import time;print(sum([[i]*i for i in range(1,14)],[0]*9)[int(str(time.time())[-2:])])

JavaScript (ES6) 116
This is an adaptation of a simple seeded RNG that I have used instead of the standard RNG of javascript that cannot be seeded (and so is not repeateble)

R=(s=~new Date,p=[],i=0,j=9)=>{
while(p.push(i)<100)--j?0:j=++i;
return _=>(s=(1+Math.sin(s))*1e5,p[100*(s-~~s)|0])
};

// test

var rnd=R()

t=[0,0,0,0,0,0,0,0,0,0,0,0,0,0];
rgb='000,444,666,888,aaa,ddd,f0f,ff0,0ff,0ff,0f0,00f,f00,fff'.split`,`
.map(v=>(v=parseInt(v,16),[(v&15)*17,(v>>4&15)*17,(v>>8)*17]))

cnt=400*300
//for (i=0;i<cnt;i++)t[rnd()]++;

ctx = C.getContext("2d");
img=ctx.getImageData(0, 0, 400, 300)
for(p=0,y=0;y<300;y++)for(x=0;x<400;x++)
  v=rnd(),t[v]++,
  img.data[p++]=rgb[v][0],img.data[p++]=rgb[v][1],
  img.data[p++]=rgb[v][2],img.data[p++]=255
ctx.putImageData(img, 0, 0)

o=''
for(i=0;i<14;i++)
  t[i]/=cnt, o+=`<p><i>${i}</i><b style="width:${t[i]*300}%">,</b>${(t[i]*100).toFixed(2)}%</p>`;
G.innerHTML=o
#G { width: 400px; font-size: 12px; border: 1px solid #000;  }
p { margin: 0}
b { display: inline-block; font-size:80%; background: #08c; margin: 2px }
i { display: inline-block; width: 20px; text-align: right; padding: 0 4px }
#C { width: 400px; height: 300px; }

<canvas id=C></canvas>

I really love how you prove that the returned value is really close to the requirements. Nicely done! +10 on that canvas!

J - 28 char
This one was silly.
{:({:1e3*6!:0'')$100{.#~i.14

6!:0'' is the current Y M D h m s time as a 6-item list, where milliseconds are represented as fractions on the seconds—to get at them, we have to no choice but to multiply the seconds ({:) by 1e3. Meanwhile, #~i.14 is a list of zero 0s, one 1, two 2s, and so on through to thirteen 13s, and we pad that out to 100 items with 100{..
J doesn't have cyclic indexing, so it might be tempting to take the milliseconds modulo 100 before indexing the big list. However, we can save two characters by using $ to instead cyclically extend the 100-item list to however many milliseconds we get (anywhere from 0 to 60999) and take the last entry then.
Not that a 60000 element list is a whole lot of memory used or anything, it just feels like overkill :P

TI-BASIC, 18 bytes
real(int(.5+2√(-4+50fPart(sub(getTime

100fPart(sub(getTime gets the random residue between 0 and 99. The (n-1)th triangular number is equal to (N^2+N)/2, so the inverse is equal to √(2y+1)-.5. Floor this after adjusting downwards by 9, and we have the result
The only problem is that for residues less than 8, we get an imaginary square root. So we take the real part to have the program output 0 instead.

Perl 5, 51 bytes
50 bytes + 1 for -E instead of -e:
@_=(0)x 9;push@_,($_)x$_ for 0..13;say$_[time%100]

source: Stack Exchange

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

sort: votes


text:
Generate 0 or 1
Is this Q too easy to ask, or has it just never been thought of?

Generate a random number, either 0 or 1 using a program

You may use a pre-defined function. The code must be executable. (It can't be just a function that requires more code to execute.) Randomness of the output will be verified by showing that it is not possible for a human/computer today to predict the output of the next execution (unless the exact algorithm is revealed), even when given an infinite set of outputs on previous executions of the code.
I'm looking for the most interesting code (never mind if it's lengthy).
Note: I had initially asked for the shortest code. The answer to that is 2 bytes long. It's O2 in Pyth, according to @Dennis

All challenges require an objective winning criterion. Unless you specify how code length (code golf) and votes (popularity contest) are going to be combined, the challenge doesn't have one and is therefore off topic.

Also, this is trivial in most programming languages, but depends highly on what you mean by random in those where it's an interesting task. You should probably clarify how submissions are tested for randomness.

@Dennis Is it okay now? I meant for the shortest code challenge to be only an additional one (since it's easier).

Asking for "interesting solutions" to trivial tasks doesn't usually inspire creativity. While popularity-contests are certainly on topic, you should expect quite a lot of downvotes, as they aren't usually very well received unless the challenge is actually best judged by humans (e.g. image processing). If you just went with a plain code golf, you might get boring answers in common languages with built-ins but very interesting answers in esoteric languages which have to implement their own random number generator.

@MartinBüttner There can be interesting answers such as '#@>#0?1@' in Befunge. Are you going to reopen the Q?

@ghosts_in_the_code I reopened it 8 minutes ago. My point is that you'll still get interesting answers exactly like the one you've mentioned if you make it a code golf.

For such a simple and standard task, popularity contest is meaningless. Many languages have an obvious way to do it. You might get answers that do it in a weird way, but most will just use the built-in made for it. For these, there's nothing to judge except the choice of language. There's no point making weird embellishments either for the sake of creativity.

The question as specified is impossible without custom hardware by a simple counting argument.

+(Bool.pick)

for determining how random the function is, I would recommend simply running things many times and counting the results. Since I assume you want uniform randomness, you'd be looking for 50/50.

Labyrinth, 7 bytes
I think this is also the shortest answer in Labyrinth... and I think it's fairly interesting.
v
)
"!@

Labyrinth does have built-in random behaviour but it's normally very hard to access. The conditions are as follows:

The instruction pointer (IP) needs to be on a cell with two neighbours in opposite directions.
The IP must not be pointing at either of the neighbours.
The value on top of the main stack must be zero.

If all of those conditions are met, the IP will choose a uniformly random direction towards one of the two neighbours.
In larger programs, this is incredibly tricky to setup, because normally there is no way to make the IP move such that it faces a wall if there isn't another neighbour at its back. The only way to set this up is by using the source-manipulation commands <^>v. These cyclically shift a row or a column of the source code. If the shifted row or column is the one the IP is one, the IP will be shifted along without changing its orientation. This way we can move the IP into position.
Now let's look at the code. The IP starts out on the first cell, pointing right. The v shifts the first column down one cell, taking the IP with it:
"
v
)!@

Now the IP points East, has a neighbour North and South, and the main stack still has only zeroes on it, so all conditions are met. What are the options now?
If the IP decides to move South, ) increments the zero on top of the stack to 1 and ! prints it. @ terminates the program.
If the IP decides to move North, " is a no-op. The IP hits a dead end and turns around. Now it hits the v again. So we shift one further:
)
"
v!@

Now the IP is in a corner and follows the path around the bend. ! prints the zero on top of the stack, and @ terminates the program.

><>, 5 bytes
lxn;n

><> is a 2D language, and x is "random direction" (up/down/left/right) in ><>. Since ><> is toroidal, up and down do nothing, as this is a one-liner and wrapping around makes us end up in the same spot. Thus, only moving left or right at the x do anything in this program.
The initial l pushes the length of the stack, 0. At the x, moving right makes us print the top of the stack with n, then halt with ;. Otherwise, moving left executes l again, pushing 1 before we wrap around, print and halt.

And for the popcon, we have:
0 >   xxxxx aa*(n;
  ^+1 <<<<<

This is "The Ledge: ><> plays Pokemon version". The instruction pointer needs to get past the row of xs, with falling off the ledge (random up/down) moving us back to the start, incrementing a failure counter. It's a race against time, with the program printing 1 if the IP makes it to the end whilst falling off at most 99 times, else 0.

Pyth, 2 bytes
O2

Try it online.

AppleScript/osascript, 17 Bytes
AppleScript is really a passive-aggressive teenager. o-o
some item of{1,0}
Or, 18 bytes:
random number of 1
This is kinda the cheaty way to do it. some item will grab a random item of a list. If I wanted a random item of a series, I would use:
random number from 0 to 100
For a random integer in the set [0, 100].

I like how lazy AppleScript sounds here. "Eh, some item from that set. Whatever, I don't care."

"Meh." - Script Editor, 2015

@AlexA. Actually, Script Editor is a grammar nazi. If you put in it's <property>, it'll autocorrect to its property --Grammar Police, where -- is a comment.

Vitsy
I'm changing my answer to fit the popcon description.
2R(10r68*+DD:::?? WHY WOULD YOU WRITE LIKE THIS?
2R                                                Random float in [0,2).
  (10                                             If its truncated value is 1,
                                                  Push one. Then push 0.
     r                                            Reverse the stack.
      68*+                                        Add 48.
          DD                                      Duplicate, duplicate.
            :::??                                 Clone the stack thrice, rotate
                                                  stack position twice.
                   WH  W U D  U W       K   H     NOPs.
                     Y                            Delete the current stack.
                        O                         Output the top item of the stack
                                                  as a truncated int character.
                          L                       Get the length of the stack.
                            Y                     Delete the current stack.
                             O                    Output again (outputs nothing)
                                 R                Random integer.
                                  I               Get the input length.
                                   T              Tangent of the top item.
                                    E             Push the constant e to the stack.
                                      LI E T IS?   Already described above...

Clever using the NOPS to form a coherent thought

In Vitsy, anything that's not a command is a NOP. I hadn't used this feature before, so I though... whynaut? @CᴏɴᴏʀO'Bʀɪᴇɴ

Fascinating! ``

Microscript, 2 bytes
r2

Microscript II, also 2 bytes
2R

TeaScript, 2 bytes
N¡

Using some not-so-new-but-implemented-last-night features, ¡ (inverted exclamation) compiles to (). Because of issues with permalinks and special characters, you have to copy and paste this code into the online interpreter

Simplex v.0.7, 2 bytes
IX
I  ~~ increment byte
 X ~~ set byte to a random number from 0 to the current byte value

The byte is valued 0 by default; incrementing it by 1 then applying the random function makes it a random value from 0 to 1 inclusive.

Python 3, 22 bytes
print((hash(id)>>9)&1)

In python 3, the output for the hash function was randomized per run by default.
This was because in older versions, you could make an attack on the dictionary object if you could insert arbitrary objects (such as strings for usernames or integers for uuids). You could exploit the way the dict object was implemented so you could make retrieving objects from the dictionary take much much longer than normal.
Because of this, hash became randomised. I'm exploiting this for the challenge so I don't need to import the random module. I'm doing >>9 because although randomised, during the tests I ran, the last several bits never changed although this bit sometimes did. On my computer, it outputs 0 most of the time but sometimes outputs a 1.

Befunge, 6 bytes
?1.@.0

The PC starts at the top-left corner, moving right. When it runs into ?, it will either

Move up or down, in which case it wraps vertically back to the very same ?
Move left, wrapping around and executing 0, . and @: this prints a zero and halts the program
Move right, executing 1, ., and @, which prints a one and halts the program.

Works for both Befunge-93 and Befunge-98.

Perl, 28 bytes
my $rand=int(rand(2));
print $rand, "\n";

Golfed version, just in case it changes back again (I'm scoring in the headline by this):
my $a=int(rand(2));print $a;

You can do say int rand 2 for 14 bytes. You can use say for free because you can run with -E instead of -e on the command line. Try it with perl -E'say int rand 2'

Mathematica
Boole[OddQ[ToExpression[StringSplit[ToString[s = SiderealTime[][[1, 3]]], "."][[-1]]]]]

Explanation
SiderealTime[] gives the present sidereal time.
s = SiderealTime[]

The code for the above time is revealed by its LongForm.
LongForm[s]

Quantity[MixedRadix[14, 10, 33.3553], MixedRadix["HoursOfRightAscension", "MinutesOfRightAscension", "SecondsOfRightAscension"]]

s[[3,1]]

The element at position {3,1} in the expression is

33.3553

ToString[%] converts this to a string.

"33.3553"

StringSplit["33.3553", "."]

breaks the string at the decimal point.

{"33","3553"}

{"33","3553"}[[-1]]

returns the last element, namely, "3553"

ToExpression["3553"]

converts this to an integer.

3553

OddQ[3553] returns

True

because 3553 is odd.

Boole[True] returns 1 for True.
Boole[False] would have returned 0.

Once again, Mathematica saves the day with the awesome power of built-ins...or not. +1 anyway.

Ruby, 8 bytes
p rand 2

Probably the shortest it gets in Ruby.

Python 2, 16 bytes
This one is pretty fun:
print id('')/3&1

In CPython, at least, id('') is different every time, because the string literal '' is at a different position in memory each time the interpreter is ran. We can't directly take the least-significant bit, because it's obviously aligned to a valid address. However, dividing by three first works fine.

My and your answer are pretty much identical. Also posted in same minute. How can we work out who was first?

CJam, 3 bytes
2mr

Try it here.

Java, 88 Bytes
class A{public static void main(String[]a){System.out.println((int)(Math.random()*2));}}
Readable version:
class A{
    public static void main(String[]a) {
        System.out.println((int)(Math.random()*2)); // Get a random float from [0, 2) and truncate it to an integer.
    }
}

GolfScript, 5 bytes
2rand

Basically exactly like the CJam answer, but with a longer keyword.

Ruby, who cares bytes
Seems this isn't a code-golf challenge anymore? Here's some multithreading for ya.
[0,1].map{|i|Thread.new{$n=i}}.map{|t|t.join}
p $n

gs2, 2 bytes
In CP437:
↕%

Hex dump:
12 25

Pushes 2, then calls random, generating a random number between 0 and 1.

Perl, 14 bytes
print 0|rand 2

Example:
$ perl -e 'print 0|rand 2'
1
$ perl -e 'print 0|rand 2'
1
$ perl -e 'print 0|rand 2'
0
$

bash, 19 bytes
echo $(($RANDOM%2))

RANDOM needs no leading $ inside ((...)) and $((...)) can be written as $[...].

Javascript ES6, 22 bytes
Quite simple.
alert(0|Math.random()+.5)

PHP "The Lottery"
In Germany we have a very popular lottery called "6 aus 49" ("6 from 49"). You tip 6 numbers out of the range 1 to 49. If you have selected at least 2 numbers that also the "Lottofee" ("Lottery Fairy") has picked, you win.1
The code below has a player against the lottery. If the player loses it will output 0, if the player wins it outputs 1. As the distribution of a lose to win was still 1:5 I changed the rule, that at least one number must be picked by both the player and the lottery for a win. This results in an almost even distribution with slightly more wins.
function pick() {
    $numbers = [];
    for ($i = 0; $i < 6; ++$i) {
        $pick = mt_rand(1, 49);
        while(in_array($pick, $numbers)) {
            $pick = mt_rand(1, 49);
        }
        $numbers[] = $pick;
    }
    return $numbers;
}

$player = pick();
$lottery = pick();

print ( count(array_intersect($player, $lottery)) > 0 ? 1 : 0 ) . "\n";

That's a bit simplified, but the general idea.

Lua,   30   18 bytes
This answer is based on the same idea as muddyfish's answer.
In Lua order of elements in a table depends on hash, which is randomized per run.
We simply printing the first key in a table consisting of just '0' and '1':
$ lua -e "print(next{['0']='',['1']=''})"

EDIT:
Another version (length mod 2 of some unpredictably chosen global variable's name):
$ lua -e "print(#next(_G)%2)"

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


text:
N numbers closest to zero staying balanced
Objective: Given a positive integer n:

If n is odd, output the list of n numbers closest to 0 in increasing order
If n is even, output a Falsey value.

Test cases:
5 -> [-2,-1,0,1,2]
4 -> false (or any Falsey value)
1 -> [0]

Reference implementation

function update(){
  var num = +document.getElementById("yield").value;
  if(num){
    var out = document.getElementById("output");
    if(num % 2 == 1){
      // base is balanced
      var baseArr = [];
      for(var i=0;i<num;i++){
        baseArr.push(i-Math.floor(num/2));
      }
      out.innerHTML = baseArr.join(" ");
    } else {
      out.innerHTML = "false";
    }
  } else {
    out.innerHTML = "enter input";
  }
}

setInterval(update,1);
* {
  font-family: "Constantia", "Consolas", monospace;
}

[type="number"] {
  width: 10px;
  width: 2em;
}

#output {
  font-family: "Consolas", monospace;
}
Input: <input type="number" id="yield" value="3"> is enter input

Can the output be a range object rather than a list?

@BradGilbertb2gills Sorry, a range object is an invalid output.

The empty list is not always falsey.

@SuperJedi224 In which contexts?

There are languages (I.E. Javascript) in which the empty list is considered a truthy value.

@SuperJedi224 so it is...

I know it's been a while, but can we use [0] as falsey result, even though $n=1$ results in [0] as truthy result as well?

Pyth, 10 bytes
*-R/Q2Q%Q2

Try it online.
How it works
            (implicit) Store the input in Q.
   /Q2      Calculate Q/2 (integer division).
 -R   Q     Subtract that value (-R) from each element in [0, ..., Q-1] (Q).
*      %Q2  Repeat the resulting array Q%2 times.

Mathematica, 32 30 24 bytes
OddQ@#&&Range@#-(#+1)/2&

Code-golfing trick: The last argument to And doesn't have to be a boolean.

You can save a byte by using the Unicode brackets for Floor.

Also, Range[-a,a=...] seems to work, saving another byte.

OddQ@#&&Range@#-(#+1)/2&

APL, 16 15 13 bytes
Thanks to @Dennis for -2 bytes!
⌊(⍳⊢×2|⊢)-÷∘2

This is a monadic train that gives an empty array for even input. Below is the diagram:
┌────┴─────┐
⌊ ┌────────┼─┐
┌─┴─┐      - ∘
⍳ ┌─┼───┐   ┌┴┐
  ⊢ × ┌─┼─┐ ÷ 2
      2 | ⊢

First, ⊢×2|⊢ gives the input times its mod 2; that is, odds will give themselves, and evens give 0. We use ⍳ to create a list of numbers from 1 to that (⍳0 gives the empty array), and then we subtract half the input and floor.

Brachylog, 9 bytes
%₂1&~l≠≜o

Try it online!
Explanation
An interesting (ab)use of Brachylog's backtracking algorithm:
%₂1        First, assert that the input mod 2 is 1 (if not, the predicate fails)
   &       Then, the input
    ~l      is the length of some list
      ≠     in which all elements are different
       ≜   Generate a list that matches those conditions
           Brachylog will try to fill the array with integers, starting from 0 and
            increasing in absolute value; since they all have to be different, the result
            will be of the form [0, 1, -1, 2, -2, ...]
        o  Sort ascending

Haskell, 37 36 31 bytes
g n=take(n*mod n 2)[-div n 2..]

Unbalanced is indicated by the empty list. Usage example: g 7 ->
[-3,-2,-1,0,1,2,3].
@xnor found 5 bytes. Thanks!

Is there no way to make the empty list case a condition? Doing g n=[x|x<-[-div n 2..(n+1)/2],odd n] is equally long.

34: g n=[1|odd n]>>[-div n 2..div n 2]

You should edit it in, it's a small change.

g n=[1|odd n]>>take n[-div n 2..] also saves a char.

@xnor: you're golfing it down faster than I can edit my posts.

I'd like something like g n=take(sum[n|odd n])[-div n 2..] to work, but it's 34 chars.

g n=take(n*mod n 2)[-div n 2..]

@xnor: thanks again! Unfortunately the challenge now requires a falsey value for the unbalanced case.  As [] is not falsey in Haskell, the answer is now invalid.

Is only False falsey? Do you have to Either?

@xnor: there's the Maybe type, i.e.   Just [-1,0,1] or Nothing, but I think according to meta a falsey value must work within a if ... then .. else, so I'm afraid only Bool (Trueor False) fits.

@xnor: there's listToMaybe which turns the empty list into Nothing and a non empty list l into Just l, but it needs the Data.Maybe import.

@xnor: ... sorry a mistake listToMaybe makes Just (head l) in the non empty case, i.e. only the first element of l is wrapped into Just.

JavaScript (ES6), 44 43 42 41 bytes
crossed out 44 is still regular 44 ;(
n=>[...Array(n&1&&n--)].map((x,i)=>i-n/2)

For odd inputs, returns a integer array of length x, centered at 0; for even, returns 0. I think this is as short as it can get. (Saved a couple bytes thanks to @edc65 and @ןnɟuɐɯɹɐןoɯ!)
ES6 alternative: (42 bytes, thanks to @intrepidcoder)
x=>x%2&&[for(y of Array(x--).keys())y-x/2]

Suggestions welcome!

Using x%2&&[for(y of...] saves a byte.

ES6, 43, n=>Array(n&1&&n--).fill().map((x,i)=>i-n/2) if returning an empty array is allowed

@intrepidcoder Thanks! I've changed this.

@edc65 Thanks as well! I've added this into the answer.

x=>x%2&&[for(y of Array(x--).keys())y-x/2] is 42.

@intrepidcoder Thanks again!

42 for ES6 too n=>Array(n&1&&n).fill(n=-n>>1).map(x=>++n)

41: n=>[...Array(n&1&&n--)].map((x,i)=>i-n/2) for the ES6 entry

@ןnɟuɐɯɹɐןoɯ and edc65 Holy cow, this is getting ridiculous ;) Thanks for the help! I wonder if 40 is possible...

PowerShell, 50 52 Bytes
param($a)$b=$a/2-.5;(0,((0-$b)..$b-join' '))[($a%2)]

Oof. Pretty verbose answer. Takes input $a, then sets a new variable $b as the "floor" of $a/2. Generates a new number range from (0-$b) to $b, then joins the range with spaces, and has that as the second element of a two-element array (the first element is 0). Then uses $a%2 to index into that array for output.
Alternate version using more "traditional" if/else flow, at 54 bytes:
param($a)$b=$a/2-.5;if($a%2){(0-$b)..$b-join' ';exit}0

Edit - Needed to add some logic to output a falsey value if the input is even

Save 3 bytes by changing (0-$b) to just -$b.  Also, just multiplying by *0 will output a null string (evaluates to false in powershell). (see: http://codegolf.stackexchange.com/a/63005/45925)

J, 12 bytes
i:@%~2&!*2&|

This is a monadic verb that returns 0 (falsy) for even numbers. Try it online with J.js.
Test run
   (i:@%~2&!*2&|) 3
_1 0 1
   (i:@%~2&!*2&|) 2
0

How it works
              Right argument: y
         2&|  Take y modulo 2.
     2&!      Calculate y C 2 = y(y-1)/2.
        *     Multiply the results.
   %~         Divide the product by y.
              This yields (y-1)*(y%2)/2 = (y-1)/2 (y even) | 0 (y odd).
  @           Take the result and...
i:              apply the bilateral index generator z -> (-z ... z).

Python 2, 34 32 Bytes
Right now I'm not sure if I can output whatever I want if it's not balanced, so currently this just returns an empty list in the case of an unbalance-able base. It's an anonymous lambda function, so give it a name to use it.
lambda k:k%2*range(-k/2+1,-~k/2)

If you do k%2*, you can avoid the parens.

Minkolang 0.10, 18 bytes
nd2%?.d2:~r[dN1+].

Explanation
n          Take input as integer (k)
d2%?.      Duplicate k and stop if it's even
d2:~       Duplicate k, then divide by 2 and negate to get first number
r          Put k on top
[    ].    Loop k times and then stop
 dN1+      Duplicate, output as integer, and increment

DUP, 31 bytes
[a:a;2/b:[b;_[$b;<][$1+]#][0]?]

Try it here.
Anonymous lambda. Usage:
5[a:a;2/b:[b;_[$b;<][$1+]#][0]?]!

Explanation
[                             ] {lambda}
 a:                             {store input to a}
   a;2/                         {divmod a by 2}
       b:                       {store quotient to b, top of stack is now remainder}
         [               ][ ]?  {conditional}
          b;_                   {if remainder is 1, get b and negate it}
             [    ][   ]#         {while loop}
              $b;<                {while top of stack is less than b}
                    $1+           {duplicate and increment}
                           0    {otherwise, leave falsy value}

Vyxal, 8 bytes
∷$½:N$ṡ∧

Try it Online!
Explanation
∷$½:N$ṡ∧
∷          Parity
 $         Swap (putting the input on top again)
  ½        Half
   :       Duplicate
    N      Negate
     $     Swap
      ṡ    Range from a to b
       ∧   Logical AND

Try it Online! for 6 bytes no?

@lyxal The program must give a falsy output for all even numbers.

CJam, 13 12 bytes
{_2md@,@f-*}

This is an anonymous function that pops an integer from the stack and pushes a digit array (odd base) or an empty array (even base) in return. Try it online in the CJam interpreter.
How it works
_          e# Copy the input (N).
 2md       e# Push N/2 and N%2.
    @      e# Rotate N on top of the stack.
     ,     e# Push [0 ... N-1].
      @    e# Rotate N/2 on top of the stack.
       f-  e# Subtract N/2 from each element of [0 ... N-1].
         * e# Repeat the resulting array N%2 times.

Japt, 21 19 bytes
Japt is a shortened version of JavaScript.
U%2&&(X=-U/2+K o1-X

For odd inputs, returns a integer array of length x, centered at 0; for even, returns 0. Rough JS translation:
output(U%2&&(X=-U/2+.5).range(1-X));

where x.range(y) creates a list of integers from x to y. Test it online!

In modern Japt, this is only 11 bytes:
u ©Uo-U/2-½

Try it online!

To whoever downvoted this answer, can you please explain why? I'd like to know where I went wrong so I can fix it. Thanks. :-)

Perhaps they don't like the language? (I love the language, though I can see how others might not.)

O, 18
M(.e\2/.@{_}dmrr]p

Live demo.

Is there a language for every capital letter in the English alphabet?!

They should also be listed in increasing order.

@MickeyT Fixed that at the cost of 5 bytes.

@Geobits Fixed that, too.

@CᴏɴᴏʀO'Bʀɪᴇɴ There are a couple available

@phase If anyone takes Z, I will be ticked. ;)

@ConorOBrien https://github.com/z-lang/z-lang and https://github.com/matt-auld/z-lang...

Vitsy, 27 25 Bytes
I'm gonna golf this down tomorrow, but I really ought to go to bed now.
D2M)[&1]D1-i*}\[D2/NaO2+]
D                             Duplicate the input.
 2M)[&1]                      If the input is even (input%2=0) generate a new stack
                              and push 1 to it.
        D                     Duplicate the top value - if it wasn't even, this will be the input. Otherwise, it's one.
         1-                   Subtract one (to balance around zero)
           i*                 Additively invert
             }                Shift over an item in the stack - this ensures that
                              we have either the input or one on top.
              \[        ]     Repeat input times.
                D2/N          Duplicate the top item and print it out.
                    aO        Newline (I'm pretty sure this is valid separation)
                      2+      Add one to the top item of the stack.

"Final global var" that sounds intense

It is intense.

@CᴏɴᴏʀO'Bʀɪᴇɴ intensity intensifies

TeaScript, 16 bytes 18
x%2Þr(xØ)ßl-x/2)

Pretty simple. The special characters are actually just "abbreviations" for longer code sequences.
I still haven't made permalinks so you'll have to copy paste into the interpreter
Explanation
x%2 &&    // If x is NOT even return falsy, else...
r(x--)    // Range 0-input. Subtracts one from input
m(#       // Loop through range
  l-      // Current item in loop, minus...
    x/2   // input - 1, divided by two
)

This answer is non-competing

I should implement these special-char abbreviations into Japt. :) BTW, are you sure Ω is 1 byte?

@ETHproductions Aww :( forgot to check that before I implemented that. I'll fix that in the next commit

I hate that the Greek letters are 2-byte ;-;

Y'all are complaining? Feel glad you don't have to deal with 's unprintable chars. ;___;

@ןnɟuɐɯɹɐןoɯ lol, but looking at ESMin's source code, I recommend trying to keep special characters under 0xFF (255) to keep them 1-byte

@Vɪʜᴀɴ Nah, it's a nice challenge/quirk that keeps stuff interesting. Besides, unprintable chars look cool.

@ןnɟuɐɯɹɐןoɯ As long as you can actually see them. On my phone, not even your language's name is visible. :P

@Dennis It adds to the language's mysterious aura...

R, 30 bytes
function(n)(x=(1-n)/2*n%%2):-x

Roughly, x:-x returns the integers from x to -x, where I set x to (1-n)/2. I also use the modulo-2 factor n%%2 in the definition of x to force x to zero when n is even, in which case, 0:0 returns 0 (falsey).

, 21 chars / 37 bytes
ô[…Ѧ(ï&1⅋ï‡)]ć⇀_-ï/2⸩

Try it here (Firefox only).
Here's a 20-char / 35-byte answer (non-competing, since the answer uses changes implemented after the question was asked):
ô(ï%2⅋ѨĶ(ï‡)ć⇀$-ï/2⸩

Try it here (Firefox only).

F#, 38 bytes
The falsey result is an empty list.
let O n=if n%2<1 then[]else[-n/2..n/2]

MathGolf, 6 (or 4?) bytes
½k¥¿╤<

Outputs 0 as falsey output.
Try it online.
If we're allowed to output [0] as falsey output, even though \$n=1\$ results in [0] as truthy output as well, this could be 4 bytes instead:
¥*½╤

Try it online.
Explanation:
½       # Integer-divide the (implicit) input-integer by 2
 k      # Push the input-integer again
  ¥     # Modulo-2
   ¿    # If input%2 is truthy / 1 / odd:
    ╤   #  Pop the input//2 and push a list in the range [-input//2, input//2]
        # Else (it's falsey / 0 / even instead):
     <  #  Check if the (implicit) input is smaller than input//2, which is falsey / 0
        # (after which the entire stack joined together is output implicitly as result)

¥       # Modulo-2 on the (implicit) input-integer (1 if odd; 0 if even)
 *      # Multiply that by the (implicit) input-integer
  ½     # Integer-divide it by 2
   ╤    # Pop and push a list in the range [-(input%2*input//2), input%2*input//2]
        # (after which the entire stack joined together is output implicitly as result)

Is there a way in MathGolf to just multiply the two numbers after step 3 and then skip the if-else?

@DominicvanEssen That would result in outputs of [0] instead of 0 though. And since test case $n=1$ is truthy with output [0], I can't use that same [0] as falsey value. I assume you meant something like ½k¥*╤?

Yes, that's what I meant, but I didn't expect that [0] would be truthy in MathGolf.

(after writing my first ever golfing program to check that [0] is actually falsey) let's put it a different way: why does the output of n=1 need to be different from the falsey output of even n?

@DominicvanEssen No, [0] isn't truthy in MathGolf. But it is for this challenge for $n=1$. So if I also use [0] for all falsey results, how would you differentiate between a truthy [0] and falsey [0] result in this challange?

I just can't find anywhere where it says that the result of n=1 should be truthy...  (or even that one needs to discriminate at all between the output of n=1 and n=even; my answer currently gives exactly the same output (0) for both, and so do many of the others...)

@DominicvanEssen You're right, it indeed doesn't. And I indeed saw a few answers that do the same, like the Japt answer. I've asked OP to verify, although since the challenge is from 5 years ago I have no idea if he'll respond. I'll edit my answer to include both versions for now.

R, 26 bytes
a=scan();-(i=a%/%2*a%%2):i

Try it online!
Integer-divide input by 2, and multiply by input modulo 2 (so it becomes zero if input is even).
Then output the range of integers from negative to positive of this value.
(for a fairer comparison with the previous (half-decade-old!) R answer, the approach here would be 28 bytes as a function).

Python 3.8 (pre-release), 37 bytes
lambda x:x%2*[*range(-x//2+1,x//2+1)]

Try it online!

Perl, 36 bytes
I have a feeling this can be shortened:
$,=$";$n=<>;print$n%2?-$n/2..$n/2:0;

Range treats floats as integers, so, e.g. 5/2 = 2.5 gets silently converted to 2.
(If formatting doesn't matter, then remove $,=$"; for a total of 30 bytes).

Powershell, 49 bytes
param($a)$b=$a/2-.5;"[$(-$b..$b-join",")]"*($a%2)

Even numbers evaluated to $false since they provide an empty line output.
("[$(-$b..$b-join",")]"*($a%2))-eq $True ===> False

Odd numbers output the exact reference string.  You can save 4 more bytes (now 45) by removing the [] from the output string.
PS> .\balanced.ps1 4

PS> .\balanced.ps1 5
[-2,-1,0,1,2]

PS> .\balanced.ps1 0

PS> .\balanced.ps1 1
[0]

PS>

Powershell, 36 Bytes
param($a)$b=$a/2-.5;(-$b..$b)*($a%2)

This has the same falsey result but outputs the list of numbers separated by newlines:
PS> .\balanced-newline.ps1 4

PS> .\balanced-newline.ps1 1
0

PS> .\balanced-newline.ps1 5
-2
-1
0
1
2

PS>

Perl 6, 25 bytes
The shortest lambda expression I could come up with that outputs a list rather than a range is:
{$_%2&&|((1-$_)/2..$_/2)} # 25

Testing:
for 0..10 -> $a {
  if {$_%2&&|((1-$_)/2..$_/2)}($a) -> $b {
    say "$a.fmt('%5s')  $b"
  } else {
    say "$a.fmt('%5s')  False"
  }
}

    0  False
    1  0
    2  False
    3  -1 0 1
    4  False
    5  -2 -1 0 1 2
    6  False
    7  -3 -2 -1 0 1 2 3
    8  False
    9  -4 -3 -2 -1 0 1 2 3 4
   10  False

This takes advantage of the fact that Perl 6 treats the number 0 as a false value. If the output had to be exactly False you could replace $_%2 with $_!%%2.

05AB1E, 8 bytes
Code:
È#¹;D(ŸR

Try it online!
Explanation:
È#        # If input % 2 == 0, end the program
  ¹       # Push the first input from the register
   ;      # Halve, push input / 2 rounded down
    D     # Duplicate top of the stack
     (    # Negate
      Ÿ   # Inclusive range, pushes [a .. b]
       R  # Reverse the array

Uses CP-1252 encoding.

Jelly, 6 5 bytes
HŒRxḂ

Try it online!
Explanation
HŒRxḂ   Main monadic link
H       Halve
 ŒR     Balanced range
   x    Repeat
    Ḃ    parity of n

-1 byte by finding out there's almost a builtin for this

Risky, 10 bytes
0?+0*:?\2__?+0-_?/2

Try it online!
Explanation
0     range
?         input
+       +
0         0
*   repeat
:     0 ≠
?         input
\       mod
2         2
_ map
_
?         item
+       +
0         0
-   -
_
?         input
/       /
2         2

Java, 145 bytes
public class c{static void c(int n){for(int i=n/2*-1;i<=n/2;i++){if(n%2==0){System.out.print("false");break;}System.out.print(i);}}}

Explanation: Sorry, I know this is really long. I didn't see an answer for java so I decided to put one in. Let me know if I need to write the main function (Im not sure if thats the policy or not). Basically it divides the number by two and multiplies it by -1 for the lower bound and for the upper bound it just uses the number divided by two. I'm kind of new to this page so if I didn't format anything right then let me know. Also, I know that answers can be shortened with lambda functions but I don't know how to use them and Im not sure if Java supports them.
Here is a more readable version which is less golfed:
public class StackOverflow {
static void c(int n){
    for (int i = n/2*-1; i<=n/2; i++){
        if(n%2==0){
            System.out.print("false");
            break;
        }
        System.out.print(" " + i);
    }
}
}

The normal rule is that you need to write a program or function. In Java, a function will nearly always be shorter (especially as it lets you output via return – the return value is a legitimate form of output – rather than needin to use System.out, although in this case for return to work you'd need to store the partially constructed lists in a string). Recent Java does support lambdas, and they normally come out shorter than a "regular" function definition. (Also, why the leading whitespace?)

@ais523 The leading whitespace is just my own personal habit and I didn't include it in the byte count, I guess I should get rid of it. Thanks for the help!

PHP, 50 bytes
<?=($n=$argv[1])&1?join(_,range(-$k=$n/2|0,$k)):0;

program, takes input from STDIN, prints _ delimited list or 0.
or
function f($n){return$n&1?range(-$k=$n/2|0,$k):0;}

function takes argument, returns array or 0.

Ruby, 27 bytes
->n{[*0-n/2..n/2]if n.odd?}

Creates an anonymous lambda function that will return the array of n numbers closest to 0 if n is odd, and returns nil (a falsey value in ruby) otherwise.
Ruby rounds its integer division towards -infinity, but 0-n/2 is shorter than -n/2+1 (since the minus sign is there anyway), and because n is now considered positive, the rounding works in my favour.
Old Version (28 bytes)
->n{[*-n/2+1..n/2]if n.odd?}

Ruby, 25 bytes
->n{n%2>0&&[*(-n/=2)..n]}

Japt, 8 bytes
Outputs 0 for even inputs.
u ©Uo-Uz

Try it
u ©Uo-Uz     :Implicit input of integer U
u            :Modulo 2
  ©          :Logical AND with
   Uo        :Range [0,U)
     -       :From each subtract
      Uz     :U floor divided by 2

GolfScript, 15 bytes
~:&,{&2/-}%&2%*

Try it online!
~:&               # Assign n to &                    5                  4
   ,              # Make an array from 0 to n-1      [0 1 2 3 4]        [0 1 2 3]
    {    }%       # For every element in the array
     &2/-         # Subtract n/2                     [-2 -1 0 1 2]      [-2 -1 0 1]
           &2%*   # Multiply the array by n%2        [-2 -1 0 1 2]      []

Nibbles, 5 bytes (10 nibbles)
^`%$~.`,@-

Verbose version
^   # Repeat
  `% $ ~   # (input mod 2) times; save the value of input div 2
  .   # Map
    `, @   # Range from 0 to (input - 1)
    -   # argument - saved value

JavaScript (Node.js), 41 bytes
f=(n,y=~n/2)=>y%1+!n?'':[++y,...f(n-1,y)]

Try it online!
Output empty string as false

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


text:
It's bulking season
The barbells at my gym look like this:
=========[]-----------------------[]=========

They can hold plates of five different sizes, 2.5 pounds, five pounds, ten pounds, 25 pounds, and 45 pounds:
                .
        .   !   |
.   !   |   |   |
|   |   |   |   |
'   !   |   |   |
        '   !   |
                '

For safety, we also add a clip ] or [ on the outside of all of our plates if there are any. The bar itself weighs 45 pounds. We always put the heaviest plates closest to the center, with no gaps between any plates, and put identical plates on both sides. We also always use the minimum number of plates possible, e.g. we never use two five-pound plates on one side instead of a single ten-pound plate. So if I want to lift 215 pounds, my bar looks like this:
        .                           .
      .!|                           |!.
     !|||                           |||!
====]||||[]-----------------------[]||||[====
     !|||                           |||!
      '!|                           |!'
        '                           '

Your code, a function or complete program, must take an integer from 45 to 575, always a multiple of 5, and output the bar that adds up to that weight. For example:
Input: 45
Output (note there are no clips on an empty bar):
=========[]-----------------------[]=========

Input: 100
Output:
        !                           !
       .|                           |.
======]||[]-----------------------[]||[======
       '|                           |'
        !                           !

Input: 575
Output:
    .....                           .....
  .!|||||                           |||||!.
 !|||||||                           |||||||!
]||||||||[]-----------------------[]||||||||[
 !|||||||                           |||||||!
  '!|||||                           |||||!'
    '''''                           '''''

You can have trailing spaces on each line or not, but your output cannot have leading or trailing empty lines (the output for 45 should be one line, for 50 should be three lines, for 65 should be five lines, and so on.)
This is code golf, shortest code wins!

Are we allowed to print one trailing empty line for every case, including the 7-high ones, as if the string was printed using Python's print?

Pyth, 126 bytes
K[Z5TyT50 90)jfrT6.e::++J+?qk3\=dsm@bxKdhfqQ+45sTSSM^K8?qk3r"[]23-[]"9*27d_J"=\|""]|""\|=""|["c7s@L". !|='"jC"¾ª±À£¤¯aàI7"6

The source code contains unprintable characters, so here it is as an XXD dump:
0000000: 4b5b 5a35 5479 5435 3020 3930 296a 6672  K[Z5TyT50 90)jfr
0000010: 5436 2e65 3a3a 2b2b 4a2b 3f71 6b33 5c3d  T6.e::++J+?qk3\=
0000020: 6473 6d40 6278 4b64 6866 7151 2b34 3573  dsm@bxKdhfqQ+45s
0000030: 5453 534d 5e4b 383f 716b 3372 225b 5d32  TSSM^K8?qk3r"[]2
0000040: 332d 5b5d 2239 2a32 3764 5f4a 223d 5c7c  3-[]"9*27d_J"=\|
0000050: 2222 5d7c 2222 5c7c 3d22 227c 5b22 6337  ""]|""\|=""|["c7
0000060: 7340 4c22 2e20 217c 3d27 226a 4322 04be  s@L". !|='"jC"..
0000070: aa1f b1c0 a3a4 81af 61e0 4937 2236       ........a.I7"6

This code is extremely slow, to the point of no actual use. You can speed it up by about 1000 times by adding a .{ (set) call in between, while keeping the code functionally equivalent. Here's a copy-paste friendly version of the resulting code:
K[Z5TyT50 90)jfrT6.e::++J+?qk3\=dsm@bxKdhfqQ+45sTS.{SM^K8?qk3r"[]23-[]"9*27d_J"=\|""]|""\|=""|["c7s@L". !|='"j96235640060099376576144045263159 6

Python 2, 295 bytes
i=input()-45
w=90,50,20,10,5;p=".|||||'"," !|||! "," .|||' ","  !|!  ","  .|'  "
a=[' '*46]
b=zip(*a*3+['='*9+'[]'+'-'*24+'[]'+'='*9]+a*3)
v=8
j=0
while i:
 if i>=w[j]:i-=w[j];b[v]=b[-v-1]=p[j];v-=1
 else:j+=1
if v<8:b[v]=b[10];b[-v-1]=b[9]
for l in zip(*b):
 L=''.join(l).rstrip()
 if L:print L

Builds the bar vertically, then rotates and prints non-empty lines.

-v-1 is a prime candidate for bitwise negation; ~v.

Charcoal, 65 bytes
¹²[]Ｐ×=⁹≔⁻Ｎ⁴⁵θＷΦ⟦⁵χ²⁰¦⁵⁰¦⁹⁰⟧¬›κθ«Ｐ|§⪪”{⊞⧴＆β1←Z↶ＲΣ”,Ｌι→Ｐ[≧⁻⊟ιθ»‖Ｂ←

Try it online! Link is to verbose version of code. Explanation:
¹²[]Ｐ×=⁹

Print 12 -s, the [] and 9 =s. This comprises half of the bar. The cursor is left at the beginning of the =s.
≔⁻Ｎ⁴⁵θ

Subtract 45 from the input to allow for the weight of the bar.
ＷΦ⟦⁵χ²⁰¦⁵⁰¦⁹⁰⟧¬›κθ«

Filter a list of the possible weights of pairs of weights for those that are not greater than the input, and repeat while the list is not empty.
Ｐ|§⪪”{⊞⧴＆β1←Z↶ＲΣ”,Ｌι

Split the string |||.,|.,|!,||.,||! on commas and select the piece corresponding to the heaviest possible weight, and print it both upwards and downwards. (Alternatively, it's possible to just print it upwards and reflect in the ¬ direction at the end; a number of variations have the same length.)
→Ｐ[

Print the clip (will get overwritten by the next weight if any).
≧⁻⊟ιθ»

Subtract the weight from the input.
‖Ｂ←

Reflect to complete the barbell.


text:
Monday Mini-Golf #7: Simplify ingredient measurements
Monday Mini-Golf: A series of short code-golf challenges, posted (hopefully!) every Monday.
Sorry it's late; I realized 90% of the way through writing out a different idea that it was a duplicate.
My family is rather large, so we eat a lot of food. We usually need to double, triple, or even quadruple recipes to make enough food! But as multiplying the measurements can be a pain, it'd be nice to have a program to do this for us.
Challenge
Your challenge is to create a program or function that takes in a measurement as a number N and a letter L, and returns the same measurement, simplified as much as possible. Here's the required measurement units (all are American, like my family), and their corresponding letters:
1 cup (c) = 16 tablespoons (T) = 48 teaspoons (t)
1 pound (l) = 16 ounces (o)
1 gallon (g) = 4 quarts (q) = 8 pints (p) = 128 fluid ounces (f)

"simplified as much as possible" means:

Using the largest measurement unit possible. Each unit can have a remainder of 1/4, 1/3, 1/2, 2/3, or 3/4.
Turning the result into a mixed number, if necessary.

For example, 4 o is four ounces, which becomes 1/4 l, a quarter pound. 8 t, 8 teaspoons, becomes 2 2/3 T.
Details

The input may be taken in any reasonable format; same with output. (1 t, 1,"t", 1\nt, etc.)
Make sure any fractional part is dealt with properly. (11/4 in place of 1 1/4 is not allowed.)
The number will always be a mixed number, and will always have a denominator of 2, 3, or 4 (or none). (no 1 1/8 T, no 1.5 T, etc.)
As a result of the above, no downward conversions (e.g. cups to tablespoons) are ever needed.
The letter will always be one of the letters listed above (Tcfglopqt).

Test-cases
Here's an large list, hopefully covering all types of cases:
Input   | Output
--------+--------
1/2 t   | 1/2 t
3/4 t   | 1/4 T
1 t     | 1/3 T
1 1/2 t | 1/2 T
2 t     | 2/3 T
2 1/4 t | 3/4 T
2 1/2 t | 2 1/2 t
3 t     | 1 T
10 t    | 3 1/3 T
16 t    | 1/3 c
5 1/3 T | 1/3 c
8 T     | 1/2 c
16 T    | 1 c
36 T    | 2 1/4 c
1/4 c   | 1/4 c
1024 c  | 1024 c
1 o     | 1 o
4 o     | 1/4 l
5 1/3 o | 1/3 l
5 2/3 o | 5 2/3 o
8 o     | 1/2 l
28 o    | 1 3/4 l
28 l    | 28 l
2 f     | 2 f
4 f     | 1/4 p
8 f     | 1/4 q
16 f    | 1/2 q
32 f    | 1/4 g
64 f    | 1/2 g
128 f   | 1 g
2/3 p   | 1/3 q
1 1/3 p | 2/3 q
2 p     | 1/4 g
1 q     | 1/4 g

Scoring
Our kitchen is very small, so the code should be as short as possible, so as not to make the kitchen more cramped. Shortest valid code in bytes wins; tiebreaker goes to submission that reached its final byte count first. The winner will be chosen next Monday, Nov 9. Good luck!
Please note that this challenge is similar to, but not a duplicate of, World Big Dosa.

Closely related.

@AlexA. Ah, yes, I forgot to link to that. IMHO, it's sufficiently different: 1) it takes a different input format. 2) the output is quite a bit different. 3) more conversion types are required. 3a) the 1/8 measurement is not used.

@ETHproductions similiar spirit is equivalent to duplicate.

This'd never happen in proper, excuse me, metric units ;)

Your golfs are getting less and less mini.

@Dennis Yeah, sorry about that. This time, it happened for two reasons: 1) I didn't check for duplicity before writing out the original challenge. It was about continued fractions, and I found three of which it might be called out as duplicate. 2) I didn't try writing out a program myself to see how hard it would be. I'll make sure these things don't happen again in the future.

I'm sorry, but for personal reasons, I won't be able to be on PPCG as often as I have been. This means I won't be able to continue writing these challenges for a while. Hopefully I will continue this series in the future.

Mathematica, 349 334 330 322 bytes
This answer section felt a little lonely. So uh, here's my attempt. Input should be given as in the test cases.
n=ToExpression@StringSplit@InputString[];i=#~Mod~1&;b=#&@@n;If[Length@n==3,{x,y,z}=n,{x,y,z}=If[IntegerQ@b,{b,0,Last@n},{0,b,Last@n}]];v={0,1/4,1/3,1/2,2/3,3/4};s=<|T->16,t->3,o->16,q->4,p->2,f->16|>;r=<|T->c,t->T,o->l,f->p,p->q,q->g|>;If[v~MemberQ~i[a=(x+y)/s@z],{x,y,z}={Floor@a,i@a,r@z}]~Do~3;Print@Row[{x,y,z}/. 0->""]

Explanation
First get the user input, split that input on whitespace, and assign that to n. i=#~Mod~1& creates a function that gets the fractional part of a number, by taking it mod 1. b=#&@@n will simply get the first item in n; that would be everything up to the first space.
If n is 3 elements long, that means we have an integer, a fraction, and a unit. {x,y,z}=n will assign x, y and z to be the three parts of n.
The other case is that n is not 3 elements long; that means it’ll be 2 elements long instead. To stay consistent with above, we want x to be the integer part, y to be the fraction, and z the unit. So in this case, we need to check:

If b (the first element of n) is an integer, then x=b, y=0 and z=Last@n (the last element of n).
If b isn’t an integer, that means we only have a fraction with no integer. So we want to swap x and y from above; instead, x=0, y=b, and z is the same as above.

Now we need to set up some lists:
v = {0, 1/4, 1/3, 1/2, 2/3, 3/4} is the list of acceptable fractions, as stated in the question.
s = <|T -> 16, t -> 3, o -> 16, q -> 4, p -> 2, f -> 16|> is an association (key-value pair, like a dictionary in Python) that represents the amount needed of a given unit to go “up” to one of the next largest unit. For example, o -> 16 is because 16 ounces are required before we go up to 1 pound.
r = <|T -> c, t -> T, o -> l, f -> p, p -> q, q -> g|> is the association that actually represents what the next unit up is. For example, T -> c means one unit larger than Tablespoons is cups.
If[v~MemberQ~i[a = (x + y)/s@z], {x, y, z} = {Floor@a, i@a, r@z}]~Do~3
Now, the maximum number of times we need to go up a unit is 3; that would be fluid ounces (f) -> pints (p) -> quarts (q) -> gallon (g). So, now we do the following 3 times:

Add x and y, (the integer and fractional parts)
From the s association above, get element z; that is, access the current unit, and get the corresponding value in that association.
Divide (x+y) by that value we got above, assign it to a, then get its fractional part.
If that part is in the list v, then we can go up one unit; set x to a rounded down (integer part), set y to the fractional part of a, then access the association r with the current unit z to get the next unit up, and set that to z.
If it’s not part of v instead, we don’t do anything, since it can’t be simplified.

Once that’s done 3 times, we print out the result:
Print@Row[{x,y,z}/. 0->””]
This simply prints out {x,y,z} in a row, but replaces any zeroes (if there’s no integer, or no fraction), with an empty string, so those don’t print out.