[Coding4Fun] 生命靈數

其實會寫這支程式是因為 Allen Kuo 大在 BS 上發出的一個問題...

其實會寫這支程式是因為 Allen Kuo 大在 BS 上發出的一個問題:

image

這個問題我花了十幾分鐘把主幹寫了出來,但後來和 Allen 討論,而且自己對這個算法有點印象,後來上網查詢才知道這是生命靈數演算法 (The Number of Life),就是那個把生日每個數字相加後得到一個個位數字,那個數字就代表了某些人格特質之類的 ...

後來我又把程式修改了一下,直接傳入生日就可以得到生命靈數:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Calculate(new DateTime(1962, 10, 3))); // 1+9+6+2+1+0+3 = 22 = 4
            Console.WriteLine(Calculate(new DateTime(2001, 3, 5)));  // 2+0+0+1+3+5 = 11 = 2
            Console.WriteLine(Calculate(new DateTime(1978, 5, 26))); // 1+9+7+8+5+2+6 = 38 = 11 = 2
            Console.ReadLine();
        }

        public static string Calculate(DateTime Birthday)
        {
            // convert birthday to number (0-99).
            int numeric = GetNumericFromBirthday(Birthday);

            string template1 = "{0},{1}";
            string template2 = "{0}/{1},{2}";
            string template3 = "{0}/{1}/{2},{3}";
            List<int> nums = new List<int>();
            int index = 0;

            nums.Add(numeric);

            while (true)
            {
                if ((nums[index] / 10) > 0)
                    nums.Add((nums[index] / 10) + (nums[index] % 10));
                else
                {
                    nums.Add(nums[index]);
                    break;
                }

                index++;
            }

            int[] nums2 = nums.ToArray();

            if (nums.Count == 2)
                return string.Format(template1, nums2[0], nums2[1]);
            else if (nums.Count == 3)
                return string.Format(template2, nums2[0], nums2[1], nums2[2]);
            else
                return string.Format(template3, nums2[0], nums2[1], nums2[2], nums[3]);
        }

        private static int GetNumericFromBirthday(DateTime Birthday)
        {
            int result = 0;
            string bstr = Birthday.ToString("yyyyMMdd");

            foreach (char c in bstr)
                result += Convert.ToInt32(c.ToString());

            return result;
        }
    }
}

Allen 對我這支程式有一點小小的 concern,就是我把結果歷程都列出來了,不過因為我是呈現和邏輯分離,所以很好改,只要改一下 template 和 string.Format 就可以得到他要的結果 :)