git init
should do the job. Commit early and often.
Use Generally Useful Resources™ to find out more information about what you're facing. If you need, use paper, draw diagrams, bite pencils.
If the problem seems too difficult, try to simplify it and find a special case that may be easier to design and implement. If it seems too easy, generalize it; invent more complicated variations, or perhaps try to combine with other problems.
Start with whatever language you know best or feel most comfortable with. If the problem is easy, pick a language you've never used before or one that you don't know too well yet. Don't be afraid to write ugly or non-idiomatic code as long as you understand what's going on. You can clean up the mess later.
Write tests checking both the ordinary and the exceptional cases of your program. Compile/interpret/eval whatever you've written and run the tests. Find bugs; fix them; repeat. Again, commit often, lest your progress vanish into the abyss.
Now that you have a reference implementation, you can go wild! Reimplement the task in a different language this time, perhaps one that you've been meaning to learn for years, Try to achieve the same outcome using different techniques or different idioms. Try to make the code as short as possible -- or the contrary.
Generally Useful Resources™ Google, Wikipedia, Stack Overflow, the web in general - don't ask stupid questions, look them up first
Literature
See also
Difficulty Each "bonus" you choose to implement adds one level of difficulty, more or less. But note that the difficulty levels are highly subjective! Do not treat them as final truths.
/dpt/ challenge list version
Based on list version 1.4ε, made by Anonymous in January 2015
This tool made by some random jackass in June 2015
Github repo