iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 9
1
自我挑戰組

見習村-30 Day CodeWars Challenge系列 第 9

見習村09 - Sums of Parts

09 - Sums of Parts

Don't say so much, just coding...

Instruction

Let us consider this example (array written in general format):

ls = [0, 1, 3, 6, 10]

Its following parts:

  ls = [0, 1, 3, 6, 10]
  ls = [1, 3, 6, 10]
  ls = [3, 6, 10]
  ls = [6, 10]
  ls = [10]
  ls = []

The corresponding sums are (put together in a list): [20, 20, 19, 16, 10, 0]

The function parts_sums (or its variants in other languages) will take as parameter a list ls and return a list of the sums of its parts as defined above.

Other Examples:

  ls = [1, 2, 3, 4, 5, 6] 
  parts_sums(ls) -> [21, 20, 18, 15, 11, 6, 0]
  
  ls = [744125, 935, 407, 454, 430, 90, 144, 6710213, 889, 810, 2579358]
  parts_sums(ls) -> [10037855, 9293730, 9292795, 9292388, 9291934, 9291504, 9291414, 9291270, 2581057, 2580168, 2579358, 0]

Ruby

Init

  def parts_sums(ls)
    #...
  end

Sample Testing

  describe("parts_sums") do
    def dotest(ls, expect)
      actual = parts_sums(ls)
      Test.assert_equals(actual, expect, "")
    end
  
    it("Basic tests") do    
      dotest([], [0])
      dotest([0, 1, 3, 6, 10], [20, 20, 19, 16, 10, 0])
      dotest([1, 2, 3, 4, 5, 6], [21, 20, 18, 15, 11, 6, 0])
      dotest([744125, 935, 407, 454, 430, 90, 144, 6710213, 889, 810, 2579358], 
      [10037855, 9293730, 9292795, 9292388, 9291934, 9291504, 9291414, 9291270, 2581057, 2580168, 2579358, 0])
    end
  end

Javascript

Init

  function partsSums(ls) {
    // your code
  }

Sample Testing

  const chai = require("chai");
  const assert = chai.assert;
  chai.config.truncateThreshold = 0;
  
  describe("partsSums",function() {
  
  function dotest(ls, expect) {
      let actual = partsSums(ls);
      assert.deepEqual(actual, expect);
  }
  
  it("Basic tests",function() {
      dotest([], [0]);
      dotest([0, 1, 3, 6, 10], [20, 20, 19, 16, 10, 0]); 
      dotest([1, 2, 3, 4, 5, 6], [21, 20, 18, 15, 11, 6, 0]); 
      dotest([744125, 935, 407, 454, 430, 90, 144, 6710213, 889, 810, 2579358], 
              [10037855, 9293730, 9292795, 9292388, 9291934, 9291504, 9291414, 9291270, 2581057, 2580168, 2579358, 0]); 
  })})

Thinking

想法(1): 這題應該來算是數學題,傳進來的值(陣列)會先加總,並且減掉陣列第一項
想法(2): 直至把所有值都扣除完,會得到一個新的陣列,並帶有每次扣除的總和

https://ithelp.ithome.com.tw/upload/images/20200924/20120826GsGyEU0V2s.jpg
圖片來源:Unsplash Christin Hume

Hint & Reference

  • Ruby
  • JavaScript

之前前幾篇應該都介紹到可以用到的方法了,接下來的十天也開始挑戰更高一個階級的題目ouo

Solution

Ruby

  # Solution 1
  def parts_sums(ls)
    sum = ls.sum
    result = [sum]
    (0...ls.size).each { |index|
      result << result.last - ls[index]
    }
    result
  end
  
  # Solution 2
  def parts_sums(ls)
    sum = ls.sum
    [sum] + ls.map{ |el| sum -= el }
  end

Javascript

  // Solution 1
  function partsSums(ls) {
    var sum = ls.reduce((a, b) => a + b, 0);
    var result = [sum];
  
    for(i = 0; i < ls.length; i++){
      result.push((result[result.length-1]) - ls[i]);
    };
    return result
  }

上一篇
見習村08 - Mexican Wave
下一篇
見習村10 - Playing with digits
系列文
見習村-30 Day CodeWars Challenge30

尚未有邦友留言

立即登入留言