diff --git a/pyproject.toml b/pyproject.toml
index 14190d8..8cc4c25 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -6,3 +6,5 @@ requires-python = ">=3.10"
[tool.unittest]
# No special configuration needed, unittest is standard library
+[tool.vercel]
+entrypoint = "math.Happy-Number.Happy-Number:app"
diff --git a/utilities/Caesar-cipher/caesar_ciphar.py b/utilities/Caesar-cipher/caesar_ciphar.py
new file mode 100644
index 0000000..d09ab6c
--- /dev/null
+++ b/utilities/Caesar-cipher/caesar_ciphar.py
@@ -0,0 +1,63 @@
+print("š Caesar Cipher Encoder & Decoder š")
+print("Encrypt and decrypt messages using Caesar Cipher\n")
+
+
+def encrypt(text, shift):
+
+ result = ""
+
+ for char in text:
+
+ if char.isupper():
+ result += chr((ord(char) - 65 + shift) % 26 + 65)
+
+ elif char.islower():
+ result += chr((ord(char) - 97 + shift) % 26 + 97)
+
+ else:
+ result += char
+
+ return result
+
+
+def decrypt(text, shift):
+
+ return encrypt(text, -shift)
+
+
+while True:
+
+ print("=" * 50)
+ print("šÆ Choose an option:")
+ print("1ļøā£ Encrypt Text")
+ print("2ļøā£ Decrypt Text")
+ print("3ļøā£ Exit")
+ print("=" * 50)
+
+ choice = input("\nā”ļø Enter your choice (1-3): ")
+
+ if choice == '1':
+
+ text = input("\nš Enter text to encrypt: ")
+ shift = int(input("š Enter shift value: "))
+
+ encrypted = encrypt(text, shift)
+
+ print(f"\nš Encrypted Text: {encrypted}\n")
+
+ elif choice == '2':
+
+ text = input("\nšØ Enter text to decrypt: ")
+ shift = int(input("š Enter shift value: "))
+
+ decrypted = decrypt(text, shift)
+
+ print(f"\nš Decrypted Text: {decrypted}\n")
+
+ elif choice == '3':
+
+ print("\nš Thanks for using Caesar Cipher! Goodbye!\n")
+ break
+
+ else:
+ print("\nā Invalid choice! Please select 1-3.\n")
\ No newline at end of file
diff --git a/web-app/assets/banners/caesar-cipher.jpg b/web-app/assets/banners/caesar-cipher.jpg
new file mode 100644
index 0000000..e1d9124
Binary files /dev/null and b/web-app/assets/banners/caesar-cipher.jpg differ
diff --git a/web-app/index.html b/web-app/index.html
index f3a0a9a..07813e5 100644
--- a/web-app/index.html
+++ b/web-app/index.html
@@ -72,6 +72,219 @@
+
+
+
+
+ Combine tiles and reach 2048! Identify progression types from any sequence. Check special number properties! Beat the dealer! Your mathematical companion! Encrypt & decrypt with a shift! Heads or tails with spinning animation! Explore the 3n+1 problem! Generate palettes + CSS snippets for any website type and mood! Transform Cartesian (x, y) into polar (r, theta). Compute 1st/nth polynomial derivatives and evaluate them. Roll the dice with 3D animation! Challenge friends or AI in this strategy game! Test your memory with matching emojis! Generate Fibonacci sequences! Discover your relationship status! Dodge the incoming balls and survive! Classic word-guessing game! MCQ quiz with lives and difficulty levels! Translate with lights & sound! Convert Dec, Bin, Oct, and Hex! Guess the secret number! Beautiful hexagon visualization! Survive evolving firewall password rules! All-in-one prime number toolkit! Calculate TOF, Hmax, and Range with physics! Battle against the computer! Repeat the pattern and test your memory skills! Classic snake game! Solve the classic puzzle! Test your typing skills! Hit the moles before they disappear! Unscramble words before attempts run out!
+
+ 2048 Game
+
+
+ AP/GP/AGP/HP Recognizer
+
+
+ Armstrong Numbers
+
+
+ BlackJack21
+
+
+ Calculator
+
+
+ Caesar Cipher
+
+
+ Coin Flip
+
+
+ Collatz Conjecture
+
+
+ Color Palette Suggestor
+
+
+ Coordinate to Polar
+
+
+ Derivative Calculator
+
+
+ Dice Rolling
+
+
+ Dots & Boxes AI
+
+
+ Emoji Memory Game
+
+
+ Fibonacci Series
+
+
+ FLAMES Game
+
+
+ Flappy Game
+
+
+ Hangman
+
+
+ Math Quiz
+
+
+ Morse Code
+
+
+ Number Converter
+
+
+ Number Guessing
+
+
+ Pascal's Triangle
+
+
+ Password Forge
+
+
+ Prime Analyzer
+
+
+ Projectile Motion
+
+
+ Rock Paper Scissors
+
+
+ Simon Says
+
+
+ Snake Game
+
+
+ Tower of Hanoi
+
+
+ Typing Speed Tester
+
+
+ Whack-a-Mole
+
+
+ Word Scramble
+
-
- Game
- Beat the dealer with strategy!
-
-
- Game
- Battle against the computer!
-
-
- Game
- Roll the dice with 3D animation!
-
-
- Game
- Heads or tails with spinning animation!
-
-
- Game
- Guess the secret number!
-
-
- Game
- Classic word-guessing game!
-
-
- Game
- Unscramble words before time runs out!
-
-
- Game
- Discover your relationship status!
-
-
- Game
- Challenge friends or AI in strategy!
-
-
- Game
- Survive evolving firewall password rules!
-
-
- Game
- MCQ quiz with lives and difficulty levels!
-
-
- Game
- Classic snake ā eat, grow, survive!
-
-
- Game
- Test your memory with matching emojis!
-
-
- Game
- Hit the moles before they disappear!
-
-
- Game
- Dodge the incoming balls and survive!
-
-
- Game
- Combine tiles and reach 2048!
-
-
- Game
- Classic 3-in-a-row with AI!
-
-
- Math
- Generate Fibonacci sequences!
-
-
- Math
- Identify progression types from any sequence.
-
-
- Math
- Beautiful hexagon visualization!
-
-
- Math
- Check special number properties!
-
-
- Math
- Your mathematical companion!
-
-
- Math
- Explore the 3n+1 problem!
-
-
- Math
- All-in-one prime number toolkit!
-
-
- Math
- Calculate TOF, Hmax, Range!
-
-
- Math
- Transform Cartesian (x, y) into polar (r, Īø).
-
-
- Math
- Compute 1st/nth polynomial derivatives.
-
-
- Utility
- Translate with lights & sound!
-
-
- Utility
- Solve the classic puzzle!
-
-
- Utility
- Convert Dec, Bin, Oct, and Hex!
-
-
- Utility
- Test your WPM and accuracy!
-
-
- Utility
- Generate palettes + CSS snippets for any mood!
-
-
- Utility
- A virtual pet that grows as you work!
-Encrypt and decrypt messages using Caesar Cipher
+ +Your result will appear here...
+Your result will appear here...
'; + copyBtn.style.display = 'none'; + goBtn.textContent = isEncrypt ? 'š Encrypt Message' : 'š Decrypt Message'; + } + + function syncSlider(val) { + const clamped = Math.min(25, Math.max(1, val)); + shiftNumber.value = clamped; + shiftSlide.value = clamped; + showPreview(clamped); + } + + function showError(msg) { + outputBox.innerHTML = `ā ${msg}
`; + copyBtn.style.display = 'none'; + } + + function showResult(text) { + outputBox.innerHTML = ''; + const p = document.createElement('p'); + p.className = 'result-text'; + p.textContent = text; + outputBox.appendChild(p); + copyBtn.style.display = 'inline-block'; + copyBtn.dataset.result = text; + } + + encryptRadio.addEventListener('change', () => setMode(true)); + decryptRadio.addEventListener('change', () => setMode(false)); + + shiftSlide.addEventListener('input', () => syncSlider(parseInt(shiftSlide.value))); + shiftNumber.addEventListener('input', () => syncSlider(parseInt(shiftNumber.value))); + + goBtn.addEventListener('click', () => { + const text = textBox.value; + const shift = parseInt(shiftNumber.value); + + if (!text.trim()) return showError('Please enter some text first!'); + if (isNaN(shift) || shift < 1 || shift > 25) return showError('Please enter a shift value between 1 and 25!'); + + const result = encryptRadio.checked ? encryptText(text, shift) : decryptText(text, shift); + showResult(result); + }); + + clearBtn.addEventListener('click', () => { + textBox.value = ''; + outputBox.innerHTML = 'Your result will appear here...
'; + copyBtn.style.display = 'none'; + }); + + copyBtn.addEventListener('click', () => { + navigator.clipboard.writeText(copyBtn.dataset.result).then(() => { + const original = copyBtn.textContent; + copyBtn.textContent = 'ā Copied!'; + setTimeout(() => copyBtn.textContent = original, 1500); + }); + }); + + showPreview(3); +} \ No newline at end of file diff --git a/web-app/utilities.html b/web-app/utilities.html index c0b3ee5..7ab314d 100644 --- a/web-app/utilities.html +++ b/web-app/utilities.html @@ -200,6 +200,13 @@
+
+ Encrypt & decrypt with a shift!
+ +