Is it possible to make a clamp function shorter than a ternary in JS?Let's create random number...
What are all the squawk codes?
Difference between 'stomach' and 'uterus'
When was drinking water recognized as crucial in marathon running?
Borrowing Characters
In iTunes 12 on macOS, how can I reset the skip count of a song?
It took me a lot of time to make this, pls like. (YouTube Comments #1)
What Does the Heart In Gyms Mean?
Practical reasons to have both a large police force and bounty hunting network?
Are there any other Chaos-worshipping races?
How to substitute values from a list into a function?
What could trigger powerful quakes on icy world?
Pure Functions: Does "No Side Effects" Imply "Always Same Output, Given Same Input"?
How to evaluate the limit where something is raised to a power of x?
I encountered my boss during an on-site interview at another company. Should I bring it up when seeing him next time?
Don't know what I’m looking for regarding removable HDDs?
What type of investment is best suited for a 1-year investment on a down payment?
Why are special aircraft used for the carriers in the united states navy?
Analog Mute Circuit - Simplest Solution
At what level can a party fight a mimic?
Skis versus snow shoes - when to choose which for travelling the backcountry?
Six real numbers so that product of any five is the sixth one
Where is the fallacy here?
Reason why dimensional travelling would be restricted
Giving a talk in my old university, how prominently should I tell students my salary?
Is it possible to make a clamp function shorter than a ternary in JS?
Let's create random number genratorBase-2 integer logarithm of 64-bit unsigned integerInteger square root of integerTweetable Mathematical ArtShortest Minmod FunctionNon-repeating random numbersCompute the Mertens functionMagic popcount numbersBe as evil as possibleTernary Triangles
$begingroup$
Imagine this short function to clamp a number between 0 and 255:
c = n => n > 0 ? n < 255 ? n : 255 : 0
Is this the shortest possible version of a clamp function with JavaScript (without ES.Next features)?
P.S: Not sure if it's relevant but, the 0 and 255 are not random, the idea is to clamp a number as an 8-bit unsigned integer.
code-golf math tips javascript
New contributor
Ricardo Amaral is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
$endgroup$
|
show 3 more comments
$begingroup$
Imagine this short function to clamp a number between 0 and 255:
c = n => n > 0 ? n < 255 ? n : 255 : 0
Is this the shortest possible version of a clamp function with JavaScript (without ES.Next features)?
P.S: Not sure if it's relevant but, the 0 and 255 are not random, the idea is to clamp a number as an 8-bit unsigned integer.
code-golf math tips javascript
New contributor
Ricardo Amaral is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
$endgroup$
$begingroup$
Hi and welcome to PPCG! Just to be clear, any answer you receive here will not necessarily be a good idea to use in anything except for code golfing. Aside from that, if you care about what version / environment it has to work in you might want to specify it.
$endgroup$
– FryAmTheEggman
1 hour ago
$begingroup$
Oh, I'm well aware. I've updated the question a bit. Thank you :)
$endgroup$
– Ricardo Amaral
1 hour ago
$begingroup$
Shouldn't you at least remove all the spaces?
$endgroup$
– Adám
1 hour ago
1
$begingroup$
I don't know JS, but one way to clamp is to sort[0,n,255]and take the middle element -- might that be shorter?
$endgroup$
– xnor
1 hour ago
1
$begingroup$
@xnor Unfortunately, the JSsort()method uses a lexicographical comparison by default, so that would require an explicit callback. (Something like that.)
$endgroup$
– Arnauld
1 hour ago
|
show 3 more comments
$begingroup$
Imagine this short function to clamp a number between 0 and 255:
c = n => n > 0 ? n < 255 ? n : 255 : 0
Is this the shortest possible version of a clamp function with JavaScript (without ES.Next features)?
P.S: Not sure if it's relevant but, the 0 and 255 are not random, the idea is to clamp a number as an 8-bit unsigned integer.
code-golf math tips javascript
New contributor
Ricardo Amaral is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
$endgroup$
Imagine this short function to clamp a number between 0 and 255:
c = n => n > 0 ? n < 255 ? n : 255 : 0
Is this the shortest possible version of a clamp function with JavaScript (without ES.Next features)?
P.S: Not sure if it's relevant but, the 0 and 255 are not random, the idea is to clamp a number as an 8-bit unsigned integer.
code-golf math tips javascript
code-golf math tips javascript
New contributor
Ricardo Amaral is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
Ricardo Amaral is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
edited 1 hour ago
Ricardo Amaral
New contributor
Ricardo Amaral is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
asked 1 hour ago
Ricardo AmaralRicardo Amaral
1162
1162
New contributor
Ricardo Amaral is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
Ricardo Amaral is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
Ricardo Amaral is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
$begingroup$
Hi and welcome to PPCG! Just to be clear, any answer you receive here will not necessarily be a good idea to use in anything except for code golfing. Aside from that, if you care about what version / environment it has to work in you might want to specify it.
$endgroup$
– FryAmTheEggman
1 hour ago
$begingroup$
Oh, I'm well aware. I've updated the question a bit. Thank you :)
$endgroup$
– Ricardo Amaral
1 hour ago
$begingroup$
Shouldn't you at least remove all the spaces?
$endgroup$
– Adám
1 hour ago
1
$begingroup$
I don't know JS, but one way to clamp is to sort[0,n,255]and take the middle element -- might that be shorter?
$endgroup$
– xnor
1 hour ago
1
$begingroup$
@xnor Unfortunately, the JSsort()method uses a lexicographical comparison by default, so that would require an explicit callback. (Something like that.)
$endgroup$
– Arnauld
1 hour ago
|
show 3 more comments
$begingroup$
Hi and welcome to PPCG! Just to be clear, any answer you receive here will not necessarily be a good idea to use in anything except for code golfing. Aside from that, if you care about what version / environment it has to work in you might want to specify it.
$endgroup$
– FryAmTheEggman
1 hour ago
$begingroup$
Oh, I'm well aware. I've updated the question a bit. Thank you :)
$endgroup$
– Ricardo Amaral
1 hour ago
$begingroup$
Shouldn't you at least remove all the spaces?
$endgroup$
– Adám
1 hour ago
1
$begingroup$
I don't know JS, but one way to clamp is to sort[0,n,255]and take the middle element -- might that be shorter?
$endgroup$
– xnor
1 hour ago
1
$begingroup$
@xnor Unfortunately, the JSsort()method uses a lexicographical comparison by default, so that would require an explicit callback. (Something like that.)
$endgroup$
– Arnauld
1 hour ago
$begingroup$
Hi and welcome to PPCG! Just to be clear, any answer you receive here will not necessarily be a good idea to use in anything except for code golfing. Aside from that, if you care about what version / environment it has to work in you might want to specify it.
$endgroup$
– FryAmTheEggman
1 hour ago
$begingroup$
Hi and welcome to PPCG! Just to be clear, any answer you receive here will not necessarily be a good idea to use in anything except for code golfing. Aside from that, if you care about what version / environment it has to work in you might want to specify it.
$endgroup$
– FryAmTheEggman
1 hour ago
$begingroup$
Oh, I'm well aware. I've updated the question a bit. Thank you :)
$endgroup$
– Ricardo Amaral
1 hour ago
$begingroup$
Oh, I'm well aware. I've updated the question a bit. Thank you :)
$endgroup$
– Ricardo Amaral
1 hour ago
$begingroup$
Shouldn't you at least remove all the spaces?
$endgroup$
– Adám
1 hour ago
$begingroup$
Shouldn't you at least remove all the spaces?
$endgroup$
– Adám
1 hour ago
1
1
$begingroup$
I don't know JS, but one way to clamp is to sort
[0,n,255] and take the middle element -- might that be shorter?$endgroup$
– xnor
1 hour ago
$begingroup$
I don't know JS, but one way to clamp is to sort
[0,n,255] and take the middle element -- might that be shorter?$endgroup$
– xnor
1 hour ago
1
1
$begingroup$
@xnor Unfortunately, the JS
sort() method uses a lexicographical comparison by default, so that would require an explicit callback. (Something like that.)$endgroup$
– Arnauld
1 hour ago
$begingroup$
@xnor Unfortunately, the JS
sort() method uses a lexicographical comparison by default, so that would require an explicit callback. (Something like that.)$endgroup$
– Arnauld
1 hour ago
|
show 3 more comments
1 Answer
1
active
oldest
votes
$begingroup$
19 bytes
You can save a byte by inverting the logic of the ternary tests and using n>>8 to test whether $n$ is greater than $255$. Because of the bitwise operation, this will however fail for $nge 2^{32}$.
n=>n<0?0:n>>8?255:n
Try it online!
19 bytes
This one returns $false$ instead of $0$ but works for $nge 2^{32}$.
n=>n>255?255:n>0&&n
Try it online!
The original version without whitespace (and without naming the function) is 20 bytes:
n=>n>0?n<255?n:255:0
Try it online!
$endgroup$
$begingroup$
Why stop there? If you're extremely liberal with what counts as a 0 (as JavaScript tends to do) you can always go forn=>n>>8?255:n>0&&nfor 18 bytes, sincefalsecan be coerced to0and this will make all negative numbers evaluate tofalse
$endgroup$
– Value Ink
56 mins ago
$begingroup$
@ValueInk If you don't test $n<0$ beforhand,n>>8will be truthy for any negative input.
$endgroup$
– Arnauld
53 mins ago
$begingroup$
@ValueInk I've however added another 19-byte version if supporting integers beyond 32-bit is required.
$endgroup$
– Arnauld
36 mins ago
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
});
});
}, "mathjax-editing");
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "200"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Ricardo Amaral is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f180949%2fis-it-possible-to-make-a-clamp-function-shorter-than-a-ternary-in-js%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
19 bytes
You can save a byte by inverting the logic of the ternary tests and using n>>8 to test whether $n$ is greater than $255$. Because of the bitwise operation, this will however fail for $nge 2^{32}$.
n=>n<0?0:n>>8?255:n
Try it online!
19 bytes
This one returns $false$ instead of $0$ but works for $nge 2^{32}$.
n=>n>255?255:n>0&&n
Try it online!
The original version without whitespace (and without naming the function) is 20 bytes:
n=>n>0?n<255?n:255:0
Try it online!
$endgroup$
$begingroup$
Why stop there? If you're extremely liberal with what counts as a 0 (as JavaScript tends to do) you can always go forn=>n>>8?255:n>0&&nfor 18 bytes, sincefalsecan be coerced to0and this will make all negative numbers evaluate tofalse
$endgroup$
– Value Ink
56 mins ago
$begingroup$
@ValueInk If you don't test $n<0$ beforhand,n>>8will be truthy for any negative input.
$endgroup$
– Arnauld
53 mins ago
$begingroup$
@ValueInk I've however added another 19-byte version if supporting integers beyond 32-bit is required.
$endgroup$
– Arnauld
36 mins ago
add a comment |
$begingroup$
19 bytes
You can save a byte by inverting the logic of the ternary tests and using n>>8 to test whether $n$ is greater than $255$. Because of the bitwise operation, this will however fail for $nge 2^{32}$.
n=>n<0?0:n>>8?255:n
Try it online!
19 bytes
This one returns $false$ instead of $0$ but works for $nge 2^{32}$.
n=>n>255?255:n>0&&n
Try it online!
The original version without whitespace (and without naming the function) is 20 bytes:
n=>n>0?n<255?n:255:0
Try it online!
$endgroup$
$begingroup$
Why stop there? If you're extremely liberal with what counts as a 0 (as JavaScript tends to do) you can always go forn=>n>>8?255:n>0&&nfor 18 bytes, sincefalsecan be coerced to0and this will make all negative numbers evaluate tofalse
$endgroup$
– Value Ink
56 mins ago
$begingroup$
@ValueInk If you don't test $n<0$ beforhand,n>>8will be truthy for any negative input.
$endgroup$
– Arnauld
53 mins ago
$begingroup$
@ValueInk I've however added another 19-byte version if supporting integers beyond 32-bit is required.
$endgroup$
– Arnauld
36 mins ago
add a comment |
$begingroup$
19 bytes
You can save a byte by inverting the logic of the ternary tests and using n>>8 to test whether $n$ is greater than $255$. Because of the bitwise operation, this will however fail for $nge 2^{32}$.
n=>n<0?0:n>>8?255:n
Try it online!
19 bytes
This one returns $false$ instead of $0$ but works for $nge 2^{32}$.
n=>n>255?255:n>0&&n
Try it online!
The original version without whitespace (and without naming the function) is 20 bytes:
n=>n>0?n<255?n:255:0
Try it online!
$endgroup$
19 bytes
You can save a byte by inverting the logic of the ternary tests and using n>>8 to test whether $n$ is greater than $255$. Because of the bitwise operation, this will however fail for $nge 2^{32}$.
n=>n<0?0:n>>8?255:n
Try it online!
19 bytes
This one returns $false$ instead of $0$ but works for $nge 2^{32}$.
n=>n>255?255:n>0&&n
Try it online!
The original version without whitespace (and without naming the function) is 20 bytes:
n=>n>0?n<255?n:255:0
Try it online!
edited 38 mins ago
answered 1 hour ago
ArnauldArnauld
77.7k694325
77.7k694325
$begingroup$
Why stop there? If you're extremely liberal with what counts as a 0 (as JavaScript tends to do) you can always go forn=>n>>8?255:n>0&&nfor 18 bytes, sincefalsecan be coerced to0and this will make all negative numbers evaluate tofalse
$endgroup$
– Value Ink
56 mins ago
$begingroup$
@ValueInk If you don't test $n<0$ beforhand,n>>8will be truthy for any negative input.
$endgroup$
– Arnauld
53 mins ago
$begingroup$
@ValueInk I've however added another 19-byte version if supporting integers beyond 32-bit is required.
$endgroup$
– Arnauld
36 mins ago
add a comment |
$begingroup$
Why stop there? If you're extremely liberal with what counts as a 0 (as JavaScript tends to do) you can always go forn=>n>>8?255:n>0&&nfor 18 bytes, sincefalsecan be coerced to0and this will make all negative numbers evaluate tofalse
$endgroup$
– Value Ink
56 mins ago
$begingroup$
@ValueInk If you don't test $n<0$ beforhand,n>>8will be truthy for any negative input.
$endgroup$
– Arnauld
53 mins ago
$begingroup$
@ValueInk I've however added another 19-byte version if supporting integers beyond 32-bit is required.
$endgroup$
– Arnauld
36 mins ago
$begingroup$
Why stop there? If you're extremely liberal with what counts as a 0 (as JavaScript tends to do) you can always go for
n=>n>>8?255:n>0&&n for 18 bytes, since false can be coerced to 0 and this will make all negative numbers evaluate to false$endgroup$
– Value Ink
56 mins ago
$begingroup$
Why stop there? If you're extremely liberal with what counts as a 0 (as JavaScript tends to do) you can always go for
n=>n>>8?255:n>0&&n for 18 bytes, since false can be coerced to 0 and this will make all negative numbers evaluate to false$endgroup$
– Value Ink
56 mins ago
$begingroup$
@ValueInk If you don't test $n<0$ beforhand,
n>>8 will be truthy for any negative input.$endgroup$
– Arnauld
53 mins ago
$begingroup$
@ValueInk If you don't test $n<0$ beforhand,
n>>8 will be truthy for any negative input.$endgroup$
– Arnauld
53 mins ago
$begingroup$
@ValueInk I've however added another 19-byte version if supporting integers beyond 32-bit is required.
$endgroup$
– Arnauld
36 mins ago
$begingroup$
@ValueInk I've however added another 19-byte version if supporting integers beyond 32-bit is required.
$endgroup$
– Arnauld
36 mins ago
add a comment |
Ricardo Amaral is a new contributor. Be nice, and check out our Code of Conduct.
Ricardo Amaral is a new contributor. Be nice, and check out our Code of Conduct.
Ricardo Amaral is a new contributor. Be nice, and check out our Code of Conduct.
Ricardo Amaral is a new contributor. Be nice, and check out our Code of Conduct.
If this is an answer to a challenge…
…Be sure to follow the challenge specification. However, please refrain from exploiting obvious loopholes. Answers abusing any of the standard loopholes are considered invalid. If you think a specification is unclear or underspecified, comment on the question instead.
…Try to optimize your score. For instance, answers to code-golf challenges should attempt to be as short as possible. You can always include a readable version of the code in addition to the competitive one.
Explanations of your answer make it more interesting to read and are very much encouraged.…Include a short header which indicates the language(s) of your code and its score, as defined by the challenge.
More generally…
…Please make sure to answer the question and provide sufficient detail.
…Avoid asking for help, clarification or responding to other answers (use comments instead).
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodegolf.stackexchange.com%2fquestions%2f180949%2fis-it-possible-to-make-a-clamp-function-shorter-than-a-ternary-in-js%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
$begingroup$
Hi and welcome to PPCG! Just to be clear, any answer you receive here will not necessarily be a good idea to use in anything except for code golfing. Aside from that, if you care about what version / environment it has to work in you might want to specify it.
$endgroup$
– FryAmTheEggman
1 hour ago
$begingroup$
Oh, I'm well aware. I've updated the question a bit. Thank you :)
$endgroup$
– Ricardo Amaral
1 hour ago
$begingroup$
Shouldn't you at least remove all the spaces?
$endgroup$
– Adám
1 hour ago
1
$begingroup$
I don't know JS, but one way to clamp is to sort
[0,n,255]and take the middle element -- might that be shorter?$endgroup$
– xnor
1 hour ago
1
$begingroup$
@xnor Unfortunately, the JS
sort()method uses a lexicographical comparison by default, so that would require an explicit callback. (Something like that.)$endgroup$
– Arnauld
1 hour ago