iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 16
0
自我挑戰組

TDD - 紅燈,綠燈,重構,30天 TDD之路有你有我系列 第 16

Day16. 你484正方形?-Codewars_You’re Squre!

  • 分享至 

  • xImage
  •  

強壯先生說你好(?

https://ithelp.ithome.com.tw/upload/images/20180102/20107209MkpuM8jVIu.png

今天的題目長這樣

https://ithelp.ithome.com.tw/upload/images/20180102/20107209fxU8WOehbN.png

今天題目是要判斷這個數字是不是正方形,然後只需要考慮到整數即可
然而要知道這個數字是不是可以組成一個正方形,我們需要知道這個數字是不是一個被某個數字平方出來的數字,就可以知道他是不是一個正方形了。

現在就來拆一下題目吧。

  1. For迴圈跑過每一個輸入數字以內的數字
  2. 將每一個跑過的數字平方
  3. 判斷平方出來的數字是否等於輸入的數值

現在就來想一下最簡單的測試案例吧!

既然是要先印出最大的數字,那就先從找出最大數字來寫測試案例吧!

[TestMethod]
public void Input_0_Should_Be_False()
{
    Assert.IsFalse(Kata.IsSquare(0));
}

而Production Code 也就是老樣子會長成這個樣子

public static bool IsSquare(int n)
{
    throw new System.NotImplementedException();
}

老樣子,跑個測試,沒過很正常,commit一下

https://ithelp.ithome.com.tw/upload/images/20180102/20107209PAwnYSdCOu.png

接下來把Production Code改一下,用最簡單的方式解決他!

public static bool IsSquare(int n)
{
    return false;
}

接下來跑個測試,PASS!

https://ithelp.ithome.com.tw/upload/images/20180102/20107209YCnDmB0ZCG.png

接下來寫一個測試讓他fail吧!

[TestMethod]
public void Input_1_Should_Be_true()
{
    Assert.IsTrue(Kata.IsSquare(1));
}

接下來跑一下測試吧,紅燈!

之後再把Production Code改一下

public static bool IsSquare(int n)
{
    if (n > 0)
    {
        return true;
    }
    return false;
}

寫完就來跑個測試,PASS,Commit一下唄!

https://ithelp.ithome.com.tw/upload/images/20180102/20107209eGZl9K5BHM.png

接下來再寫1個測試案例讓他fail吧! 然後就commit

[TestMethod]
public void Input_2_Should_Be_False()
{
    Assert.IsFalse(Kata.IsSquare(2));
}

再來改Production Code!

public static bool IsSquare(int n)
{
    if (n - 1 * n - 1 == n || n == 1)
    {
        return true;
    }
    return false;
}

接下來就來寫輸入4的測試案例吧,這時候ProductionCode就需要for迴圈了

 [TestMethod]
public void Input_4_Should_Be_True()
{
    Assert.IsTrue(Kata.IsSquare(4));
}

Production Code就會變成這個樣子

public static bool IsSquare(int n)
{
    for (int i = 1; i <= n / 2 + 1; i++)
    {
        if (i * i == n)
        {
            return true;
        }
    }
    return false;
}

這樣應該就可以涵蓋到所有測試範圍了
所以,接下來就多寫幾個測試案例,跑個測試,Pass,Commit!

https://ithelp.ithome.com.tw/upload/images/20180102/20107209vDqMoPpwr5.png

都過了之後就來重構一下程式碼吧!

public static bool IsSquare(int n)
{
   return  Enumerable.Range(1, n / 2 + 1).Any(a => a * a == n);
}

然後再Codewars上提交! Pass!!

https://ithelp.ithome.com.tw/upload/images/20180102/20107209UM5cPcEBmh.png

通過! PASS!
老樣子我最喜歡的部分就是去看看別人寫這題寫得怎麼樣勒

https://ithelp.ithome.com.tw/upload/images/20180102/20107209a8imwqH9Jt.png

原來有這個Math.Sqrt的方法可以使用啊…
第一次看到
那我剛才寫的這麼辛苦………QAQ

Git url :
https://github.com/SQZ777/Codewars_YouAreSquare

下一題,明天見!


上一篇
Day15. 你最大,你最小啦!-Codewars_Highest and Lowest
下一篇
Day17. LeetCode我這不是來了嗎?-LeetCode_First Missing Positive
系列文
TDD - 紅燈,綠燈,重構,30天 TDD之路有你有我30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言