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=
Top 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.
That violates
K(dog)()
K(K)()(dog)()
K(K(K)()(dog))(K)()
I added that rule in afterwards. These solutions were valid at the time he posted, so I'll give him credit for the creativity :)
I was the first to solve his problem :D
He changed the rules after I posted my solution.
Check the comments.
There is also a solution with a single call to
K
:)Very creative!
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 ;)
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!
?
Brilliant.
Technically within the rules and as valid as any other solution!
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!
So many unique solutions. Fantastic!
Well, I looked up SKI combinators. If I am understanding it correctly, and if I've implemented S correctly here...I think the following would work:
I am going to have to add "Learn SKI Combinators" to my list of things to do. :D
After you research SKI Combinators, look into Church Encoding.
These are less clever yet might be valid solutions:
lol. Clearly I have to get better at writing rules! Technically these qualify!
One more:
This one is pretty creative. Modifying the original
K
function to swapa
andb
. I like it.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 ;)
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!