--- title: "Jam 03 - Exercise 5 - Base-3 Converter" tags: - 3 🧪 in testing - 4 🥳 done - jam03 - regex - refactoring - input validation --- <!-- markdownlint-disable line-length single-h1 no-inline-html --> <!-- markdownlint-configure-file { "ul-indent": { "indent": 4 }, "link-fragments": {"ignore_case": true} } --> {%hackmd dJZ5TulxSDKme-3fSY4Lbw %} # Exercise 5: Base-3 Converter with Regex and Refactoring Before you start coding, take a few minutes to read through this entire exercise. Understanding the full requirements and seeing the example output will help you plan your approach. :::info 💪 **You've Got This!** You now have all the skills needed to tackle this challenge: - You know how to create and test regex patterns - You've learned powerful debugging techniques - You understand how to organize code through refactoring Remember: - ✨ **Trust Your Skills**: Don't immediately jump to searching for solutions online. You're better than that! - 🧠 **Use Your Brain**: The satisfaction of solving a problem on your own is worth the extra effort - 👥 **Work Together**: Complex problems are more manageable when you discuss them with classmates - 🌱 **Be Patient**: Take time to think through the problem before seeking help The goal isn't just to make it work - it's to develop your problem-solving abilities and confidence as a programmer. ::: ## Understanding Base-3 Numbers Before we start coding, let's understand what base-3 (or ternary) numbers are: - Just like decimal (base-10) uses digits 0-9 - And binary (base-2) uses digits 0-1 - Base-3 uses only digits 0, 1, and 2 Each position in a base-3 number represents a power of 3 ```text In decimal: 147 = 1×100 + 4×10 + 7×1 = 1×10² + 4×10¹ + 7×10⁰ In base-3: 121 = 1×9 + 2×3 + 1×1 = 1×3² + 2×3¹ + 1×3⁰ = 9 + 6 + 1 = 16 (in decimal) ``` Some examples: - Base-3: `101` → Decimal: `10` (because `1`×9 + `0`×3 + `1`×1 = 9 + 0 + 1 = 10) - Base-3: `212` → Decimal: `23` (because `2`×9 + `1`×3 + `2`×1 = 18 + 3 + 2 = 23) ## Program Requirements Create a class called `BaseConverter` that: 1. **Input Handling**: - Asks the user for a base-3 number - Validates input using regex (only digits 0, 1, 2 allowed) - Discards any initial zeros - Prompts again if input is invalid 2. **Conversion**: - Converts valid base-3 numbers to decimal - Must implement conversion logic without using Integer.parseInt() or similar methods 3. **User Experience**: - Provides clear error messages for invalid input - Asks if user wants to try again (y/n prompt) - Exits gracefully when user is done ### Example Output ```text Welcome to the base-3 converter. Enter a base-3 number: 101 10 Try again? [Y|N] y Enter a base-3 number: 232 Invalid input! Please use only 0, 1, or 2. Try again. Enter a base-3 number: 212 23 Try again? [Y|N] y Enter a base-3 number: 3 Invalid input! Please use only 0, 1, or 2. Try again. Enter a base-3 number: 2 2 Try again? [Y|N] y Enter a base-3 number: 12012012012012012012 2011606385 Try again? [Y|N] n Goodbye! ``` :::warning 🎯 **The Key to Success: Iterative Development** Don't try to write the entire program at once! Students who attempt to build everything in one go often end up frustrated and with code that doesn't work at all. Instead: 1. **Start Small, Test Often**: - Begin with just the input validation - Make sure it correctly identifies valid and invalid base-3 numbers - Only move on when this part works perfectly 2. **Add Features One at a Time**: - Next, implement the base-3 to decimal conversion - Then add the "try again" functionality - Test each piece thoroughly before adding the next 3. **Keep What Works**: - Each time you get something working, commit it! - This way, if something breaks later, you can go back - You'll also have parts working for partial credit if you run into trouble Remember: It's better to have some parts working perfectly than everything half-broken! ::: ### Implementation Tips 1. **Input Validation**: Remember the regex concepts from Exercise 1: - What character class matches specific digits? - How do you ensure the entire string matches? - Test your pattern on various cases (valid and invalid) 2. **Code Organization**: Look for opportunities to extract methods, similar to the log analyzer: - What parts of your code have distinct responsibilities? - Which pieces might need to change independently? - How can you make the code more maintainable? 3. **Testing Strategy**: - Use the debugger to inspect your conversion logic - Test edge cases thoroughly - Verify each part works before moving on > 🔍 **Final Checkpoint**: Before submitting, verify that: > > - Your regex correctly validates base-3 numbers > - Your conversion works for all test cases > - Your code is well-organized and refactored > - Your program handles errors gracefully ## Save Your Work - Exercise 5 Verify what files are uncommitted: ```bash git status ``` Stage your changes: ```bash git add src/main/java/jam03/BaseConverter.java ``` Commit your work: ```bash git commit -m "jam03: Complete base-3 converter with regex and refactoring" ``` Your working directory should now be clean. :::warning 🚧 **Check Your Working Directory** If your working directory is not clean after committing, run `git status` and check: 1. **Modified Files**: - Did you forget to commit changes from earlier exercises? - Are there IDE configuration changes that need to be committed? 2. **Untracked Files**: - The course `.gitignore` is already set up to handle generated files - Any untracked files you see likely need to be committed or deleted. Where did it come from? For each file in the status output, ask yourself: - Is this a file I modified while working on the exercises? - Did I forget to commit something from an earlier exercise? - Is this a new file I created that should be part of my solution? Remember: IDE configuration files should be committed to ensure consistent project setup. If you're unsure about a file, ask rather than modifying `.gitignore` or just ignoring it yourself. :::