Given the following code:
const K = a => b => a
const cat = 'cat'
const dog = 'dog'
Calling K
like this will output cat
K(cat)(dog)
//=> "cat"
How can you call K
to output dog
without swapping the order of cat
and dog
?
cat
and dog
must appear exactly once.
The Given cannot be modified.
// INVALID: Cannot swap order!
K(dog)(cat)
// NO CHEATING: May only appear once.
K.bind(null, dog)(cat)(dog)
I know of two ways to solve this problem. Surprise me with another!
I should have also specified no bind, call, or apply, but the solutions are just too interesting :)
Hints: K
in the problem is the K combinator, part of the SKI combinator calculus.
Spoilers are in the comments! BEWARE!
Many great solutions have been posted below! A lot I never considered. Also some very creative loopholes around the rules I created ;)
Here's one solution that went undiscovered. It's base64 encoded to hide the "spoiler". But if you are curious you can decode it using your console's atob
function.
Syh4PT54KShjYXQpKGRvZyk=
Oldest comments (40)
There is no restriction to call
K
, right?Done! Both of these should output dog.
Update: You can actually put anything you want instead of cat. Or complicate it even more with infinite recursive inputs.
I assumed the other solution would have been found first.
Congratulations!
Well I updated with other solution.
haha I didn't consider
K(dog)()
would be within the rules. I have updated to rules to require bothdog
andcat
to appear exactly once ;)Lol no! You cannot change the rules after I won :P
I'm still giving you credit for both solutions ;)
Very creative!
There is also a solution with a single call to
K
:)That violates
K(dog)()
K(K)()(dog)()
K(K(K)()(dog))(K)()
I was the first to solve his problem :D
He changed the rules after I posted my solution.
Check the comments.
I added that rule in afterwards. These solutions were valid at the time he posted, so I'll give him credit for the creativity :)
In FP, there is a fairly common operation for this called
flip
. Here is a solution I tested in Chrome console.I did not consider this as a possible solution!
I give up. This is still within the rules, right?
lol. not what I was looking for, but I would say it technically meets the rules.
Very creative!
These are less clever yet might be valid solutions:
One more:
lol. Clearly I have to get better at writing rules! Technically these qualify!
This call makes no sense in reality, but it will yield the desired output:
Pretty interesting solution. You are binding the first value to
this
so that thea
gets set as your second argument. Very creative!Awesome work!
You found the clue I left, the K combinator! And it does come from the SKI calculus.
So many interesting solutions!
Comma operator:
Extra hearts for the comma operator. Kudos!
Do you really need the second
dog
since you already.bind
?Maybe I do not understand, what is the second
dog
??
Brilliant.
Technically within the rules and as valid as any other solution!
So many unique solutions. Fantastic!
Well...
Generators and iterators. quite a unique solution. I love it!
I didn't see this one in the comments
And arrays are fun
Technically i think this follows the rules.
And if the does then this should work too
Beautiful!
This one is pretty creative. Modifying the original
K
function to swapa
andb
. I like it.Exactly! That is definitely the
I
combinator. It works beautifuly with theK
combinator in the problem to solve this problem.Two parts of
SKI
combinator calculus!Hey Joel, I enjoy your articles and I think you deliver a good contribution overall to this website but I would like to see you use better use cases in your examples than cats and dogs meowing. Not for me but for others less experienced. :)
But cats and dogs are the best ;)