Some of us have trust issues. Or worked with Java.
Which, now that I think about it, comes to the same thing.
Well, the question sort of implies that you're needing to implementing Math.max
yourself, for whatever reason. Probably as an exercise. It doesn't make sense to reuse a library that implements the feature if you're explicitly being asked how you would implement it yourself.
This is why I think school and interviews are like a whole different universe from the one where actual work gets done.
In some ways they can be wholly different, but I don't think this is a good example of it.
Any programmer who cannot implement "take two numbers, return the larger one" is clearly not very competent. Even though you're never going to literally need to implement Math.max yourself at work, you are going to need basically the same types of skills. Probably 95% of the work I do day-to-day is stuff you'd learn in your first year at uni, and this just shows that you've got that ability.
In practice, the best interviews I've had usually set a slightly more complicated task as a do-in-your-own-time problem and then go through what you did in the actual interview. Problems like "read a list of names in the form , each name on a separate line, from a text file. Sort the names by last name, then by other names. Output to another text file. Include unit tests." They wouldn't then expect you to re-implement the sorting algorithm itself, but more want to look at the quality of code, extensibility, etc.
More basic questions like the one in the OP, or fizzbuzz, are decent as well, and a big step up from lame questions like "what does SOLID stand for? What does the Liskov substitution principle mean to you?" Even if they're not quite as valuable as a miniature project.
I think you can probably make the question a lot more interesting by asking them to implement max without using any branching syntax. I'm not saying that is necessarily a good interview question, but it is certainly more interesting. That might also be where some of the more esoteric answers are coming from.
In practice, the best interviews I've had usually set a slightly more complicated task as a do-in-your-own-time problem and then go through what you did in the actual interview.
The best interviews you've had are the ones where you're doing free work on your own time?
"Work" is a debatable term. It's not work that provides any direct value to the company, if that's what you mean. But yes, it involves more effort on my part.
But yes. Not only does this method let me show that I'm good at what I do (far better than nonsense theory questions do), I have also found that companies that use this approach tend to come across as a better fit in other ways during the interview process.
For me, a good interview is a dialogue where the company representative shows me as much about the company as I do about me as a candidate. Take-home tasks are okay, I guess, but I suspect they might balk at me requesting they handle a mock HR issue, or whatever, for me!
Why would you use anything other than Math.max?
I mean, I might be being paid by the hour or my performance measured by lines of code...
Something has gone horribly wrong if you're trying to do such optimisations when you've already chosen JavaScript...let alone Electron.
Thankfully the only interaction I have with teams is when a supplier arranges the call. Once every two weeks. It grosses me out every time...and that's the Web app.
Do you really think they have done such optimisation efforts as minimising function calls? I can't imagine it's required for what is actually a fairly simple frontend app. The complexity is the enabling stack on the backend.
Good answer.
Even if it made me throw up in my mouth a little. /s
Edit: Not the concept of Electron, itself - but being asked to write highly performant code in Electron.
I was under the impression that modern compilers just inline something like that, and even in older languages (like C) use trickeries are used to inline it (typically MAX is a macro rather than a real function, so its always inlined)
Ultimatelly it depends not just on what you're doing but also the language and compiler you're using.
If you're optimizing that hard you should probably sort the data first anyway, but yeah, sometimes it's absolutely called for. Not that I've actually needed that in my professional career, but then again I've never worked close enough to metal for it to actually matter.
That said, all of these are implemented as functions, so they're already costing the function call anyway...
They’re setting a variable to a function. Just use the original function. All thief does is obfuscate for literally no gain except character count.
TDD
const max12 = (x, y) => {
if (x === 1 && y === 2) {
return 2;
} else if (x === 7 && y === 4) {
return 7;
} else {
return x;
}
};
Writing code is for chumps, and the more code you right, the more of a chump you are.
So you're the one in there wronging up my code?
Where's the Julia programmer that hits every one of these with @benchmark and then works for six hours to shave three nanoseconds off of the fastest one?
(Example: https://discourse.julialang.org/t/faster-bernoulli-sampling/35209)
Mathematician 2 kinda blew my mind, kinda obvious, just can't believe I was never taught or thought about it.
Simple, really. Abs(x-y) is the difference between the two numbers, absolute, so positive value. So, adding abs(x-y) to the smaller of the two numbers turns it into the bigger number. Plus the bigger number, now you have 2 times the bigger number
Bit hacker 2 is really fascinating. It uses a bit mask of all 1s (-1) or all 0s (0) and takes advantage of the fact that y ^ (x ^ y) = x and y ^ 0 = y
Thief gang. Why stand on shoulders of giants if you're not using it to your advantage?
wtf kind of cursed programming language is this? JS? it's so ugly, in no universe should a function look like that
but obviously as a rust enjoyer i have to do it like
fn max ⟨T: PartialOrd + Copy⟩(nums: ⁊[T]) -> Option⟨T⟩ {
let mut greatest: ⁊T = ⁊nums[0];
match nums.len() {
0 => None,
1 => Some(*greatest),
_ => {
for num in nums {
if num > greatest {
greatest = num;
}
}
Some(*greatest)
}
}
}
edit: lemmy formatting REALLY hates references and generics it seems... time to go back to medieval times
Wow that's a very exhausting language. I dropped your code into an online rust to asm converter and it actually wasn't more! I did try to post it for fun but lemmy kept messing up the code block. Oh well, wasn't that amusing anyway!
lol that's not actually how rust is written, it was just a joke
it'd really be written
if x > y { x } else { y }
Hah thanks for clarifying. I was joking too and it's a shame I couldn't post the results.
Though I admit i don't know anything about rust. I'm sure I'd like it better than the proprietary garbage i use now that just gets converted to ASM / PLC code in the end. But I can't skip the middle man. I'm not gonna try but probably 30mins for me to "write" the above.
Besides, how do you make money if I can code something in an hour as opposed to 2 days?
No no no you misunderstood me.
I was being honest, I know nothing of rust. I have however used python in embedded systems with positive results. The product didn't make it but for other reasons.
Funny you mention java, that's sorta what I'm stuck in but not like you think. Beyond the fact that it's a bloated nightmare.
I'm just a low-level programmer at heart but I have bills to pay. The rust stuff was all just a joke.. i don't know it but maybe i should. Thanks for the info.
Saying anymore about what I do is just super embarrassing but i promise i meant no ill will. Excuse my frustration, I'm locked into a proprietary system i have no control over. You would laugh your ass off if you saw it. Anyway, i meant no offense, have a good night!
Ah yes, rust. The language that somehow manages to manages to as verbose as possible, with as much jargonized shorthand that a computer could handle.
Exactly, I don't understand why languages have decided that every keyword needs to be as randomly minified as possible.
fn
, def
, rune
(ok that's not minified, just a dumb name), fmt
, std
. Many of these things aren't new, but programmers recognize descriptive variable names are important, the same should be true for keywords.
Hmm.
"`" section .data nums: dd 1, 2, 3, 4, 5 len: equ $ - nums
section .text global _start
_start: mov ecx, len mov esi, nums mov eax, [esi] mov ebx, eax
loop_start: add esi, 4 cmp ecx, 1 jle loop_end
mov eax, [esi]
cmp eax, ebx
jle loop_start
mov ebx, eax
loop loop_start
loop_end: mov eax, ebx ret
"`"
Oh i have no idea if that code is valid, just pasted from some online converter. Been a long time since asm days and I never really felt it. but wow rust seems a bit, uh.. that's a lot of typing.
so 0.3 ~= 1-ln(2)=max(1-ln(2),1-ln(2)) = floor(ln(2*e^(1-ln(2)))) = floor(ln(2)+(1-ln(2))) = 1 ?
That would bee engeneer 2, not Mathematician3 xD.
Just out of curiostity, what was you Idea behind that?
Guess only work with integers, specially for the floor function that is going to give you an integer at the end everytime.
Not my idea, learned it somewhere while doing college in an statistics class. The idea is that the exponential function grow really fast, so small difference on variables become extreme difference on the exponential, then the log function reverse the exponential, but because it grew more for the biggest variable it reverts to the max variable making the other variables the decimal part (this is why you need the floor function). I think is cool because works for any number of variables, unlike mathematician 2 who only work for 2 variables (maybe it can be generalized for more variables but I don't think can be done).
For a min fuction it can be use ceiling(-ln(e^-x + e^-y))
to be fair it does seem to work for any two numbers where one is >1. As lim x,y--> inf ln(e^x+e^y) <= lim x,y --> inf ln(2 e^(max(x,y))) = max(x,y) + ln(2).
I think is cool because works for any number of variables
using the same proof as before we can see that: lim,x_i -->inf ln(sum_{i/in I} e^(x_i)) <= ln(|I|) +max{x_i | i /in I}.
So it would only work for at most [base of your log, so e<3 for ln] variables.
After searching a little, I found the name of the function and it's proof: https://en.wikipedia.org/wiki/LogSumExp
thanks for looking it up:).
I do think the upper bound on that page is wrong thought. Incedentally in the article itself only the lower bound is prooven, but in its sources this paper prooves what I did in my comment before as well:
for the upper bound it has max +log(n) . (Section 2, eq 4) This lets us construct an example (see reply to your other comment) to disproove the notion about beeing able to calculate the max for many integers.
I just remembered where I learned about that function, in this course on convex optimization that unfortunately I never had the opportunity to finishing it but is really good.
I don't have a mathematical proof, but doing some experimental tests on excel, using multiple (more than 3) numers and using negative numbers (including only negative numbers) it works perfectly every time.
Try (100,100,100,100,100,101) or 50 ones and a two, should result in 102 and 4 as a max respectively. I tried using less numbers, but the less numbers you use, the higher the values (to be exact less off a deviation(%-difference) between the values, resulting in higher numbers) have to be and wolframAlpha does not like 10^100 values so I stopped trying.
#define max(x,y) ( { __auto_type __x = (x); __auto_type __y = (y); __x > __y ? __x : __y; })
GNU C. Also works with Clang. Avoids evaluating the arguments multiple times. The optimizer will convert the branch into a conditional move, if it doesn't I'd replace the ternary with the "bit hacker 2" version.
__auto_type
is a compiler builtin, not a library function. It's not a function at all, the parentheses are for precedence & grouping.
Reminded of how truly little I know about programming despite the time have spent doing it
Ugh. I'll never be any good.
Listen, in industry programming (and for personal projects if you want to get them done), the thief is the way to go. By all means, challenge yourself to understand each of these functions, but 99% of day to day development will not look like this.
How much time have you spent doing it? What part didn't you understand? If it's the bit shifting stuff, don't worry about it - hardly anyone actually knows how that works unless they look it up.
About a year with varying levels of commitment and intensity.
I kind of just threw myself into the deep end. Which was a rewarding but frustrating experience. My first project was one hot encoding 400gb of reddit porn to try and teach stylegan3 how to make porn. And then turning the function on in stylegan3. And then there was validating the images and ditching the ones that erroted. Resizing the whole datasets. Using ffmpeg to extract stills from the gifs and mp3s
I found stable diffusion existed like 5 days into actually training it which was bitter sweet. I mean. No way it would have produced actual porn but I was really looking forward to the horror.
I taught myself as I went along which is a great way to learn but it's super disheartening when I see the math that's second nature to anyone whose studied this stuff academically.. I don't like math. In fact I hate it, and no matter how skilled (or not) a coder I become I'll never learn calculus sometimes makes it all feel like a fools errand.
I also hate math, and am jealous of people who are good at it. I get anxiety just doing simple multiplications, and have to look everything up. That said, I'm a senior platform developer, and earn more than anyone else in my family, so like... math helps a lot, but you don't neeed it to be a real dev. Certainly not to be a hobbyist/hacker, like yourself.
Engineer I guess... Thief is the objectively better enterprise programmer option but I don't know why I always forget about it and just write a ternary ¯\_(ツ)_/¯
Either engineer or bit hacker, depending on whether or not I'm trying to avoid branching.
And then your customer changes their mind. Instead of two numbers, they will now input three numbers. How easy will it be for you to change your code?
And then the customer changes their mind. Instead of three numbers, they will now input any series of numbers. How easy will it be for you to change your code? And why didn't you already do this is the previous step?
And then the customer changes their mind. Instead of any set of numbers, they will now input numbers and text. How easy will it be to change your code?
And then the customer changes their mind. They now have no idea of what they're sending you or if they're even sending you anything. Nevermind the code now, you already did that in the previous step, right? How easy will it be to explain what you're invoicing them for?
If only you'd done the most bloated and well documented function first, you could have saved yourself the time and your client for the money.
I mean this is the kind of shit my boss would argue about. Why pay for the first attempts that didn't work.. blabla bla. He always ends up paying but it's always such a hassle.
Otherwise, realistically, I’m prob the worst of all worlds … the procrastinator waiting/hoping to be the pair programmer that has hopefully remembered to just be the thief.