using System.Collections.Generic;
namespace Function_Kata_Happy_Numbers
public static void Main(string[] args)
var isHappyNumber = HappyNumberCalculator.CheckIfHappy(19);
Console.WriteLine(isHappyNumber);
Console.WriteLine(HappyNumberCalculator.Check(21));
class HappyNumberCalculator
const int MAX_TRIALS = 100;
public static bool Check(int number) {
return Check2(number, MAX_TRIALS);
private static bool Check(int number, int trialsLeft) {
if (number == 1) return true;
if (trialsLeft == 0) return false;
var digits = Digits_of_number(number);
var squares = Square_digits(digits);
return Check(sum, trialsLeft-1);
private static IEnumerable<int> Digits_of_number(int number) => number.ToString().ToCharArray().Select(d => int.Parse(d.ToString()));
private static IEnumerable<int> Square_digits(IEnumerable<int> digits) => digits.Select(d => d*d);
private static bool Check2(int number, int trialsLeft) {
return Is_happy(number, trialsLeft, () => {
var digits = Digits_of_number(number);
var squares = Square_digits(digits);
return Check2(sum, trialsLeft-1);
private static bool Is_happy(int number, int trialsLeft, Func<bool> yetUndecided) {
if (number == 1) return true;
if (trialsLeft == 0) return false;
public static bool CheckIfHappy(int number)
var sumOfDigitSquares = 0;
while (sumOfDigitSquares != 1)
int[] digits = SplitNumberIntoDigits(number);
sumOfDigitSquares = SumDigitSquares(digits);
if (sumOfDigitSquares == 1)
if (tries == 100000) return false;
number = sumOfDigitSquares;
static int SumDigitSquares(IEnumerable<int> digits)
foreach (var digit in digits)
static int[] SplitNumberIntoDigits(int num)
List<int> listOfInts = new List<int>();
listOfInts.Add(num % 10);
return listOfInts.ToArray();