Kata Potter

Mô tả bài toán

Một bộ các cuốn sách về người anh hùng nước Anh tên là Harry gồm 5 cuốn. (Cơ bản chỉ có 5 cuốn tính đến thời điểm ra đời Kata này) Trẻ em trên khắp thế giới hâm mộ Harry, và dĩ nhiên các nhà xuất bản cũng vậy. Do đó để khuyến khích bạn đọc (và để tăng doanh số bán hàng) các nhà xuất bản đã đưa ra chính sách về giá nhằm tận dụng sự lôi cuốn của người anh hùng Harry.

Mỗi cuốn sách về Harry có giá 8 EUR. Tuy nhiên nếu bạn mua 2 cuốn khác nhau (trong bộ sách 5 cuốn) bạn sẽ được giảm giá 5%. Nếu bạn mua 3 cuốn khác nhau sẽ được giảm 10%. Và giảm 20% nêu mua 4 cuốn khác nhau. Bạn sẽ được giảm 25% nếu mua trọn bộ gồm 5 cuốn.

Lưu ý, nếu bạn đặt hàng 4 cuốn nhưng chỉ thuộc 3 loại khác nhau, bạn chỉ được giảm 10% cho 3 cuốn khác hay đó, cuốn còn lại bạn vẫn phải trả đúng giá 8 EUR.

Cơn bão Harry Potter đã tràn qua các quốc gia và các bậc phụ huynh đang xếp hàng dài ở những hiệu sách để mau bộ truyện này. Bạn có nhiệm vụ viết chương trình để tính tiền cho các cửa hiệu sách theo các chính sách về giá được mô tả ở trên, chương trình đảm bảo người mua được lợi nhất về giá khi mua sách.

Ví dụ, tính giá bán của đơn hàng gồm các cuốn sách như sau:

2 cuốn Tập 1
2 cuốn Tập 2
2 cuốn Tập 3
1 cuốn Tập 4
1 cuốn Tập 5

Đáp án:

Giá bán = ( (4 x 8) – 20% [Tập 1, Tập 2, Tập 3, Tập 4] ) + ( (4 x 8) – 20% [Tập 1, Tập 2, Tập 3, Tập 5] = 25.6 * 2 = 51.20 EUR

Gợi ý:

Bạn có thể nhận thấy Kata này khá dễ để triển khai. Bạn có thể bắt đầu với test-case cho đơn hàng không có cuốn sách nào, 1 cuốn sách, 2 cuốn sách cùng tập, 2 cuốn sách khác tập, v.v… và sẽ không hề khó khăn nếu triển khai việc này với baby step và nâng dần độ phức tạp.

Tuy nhiên, sai sót sẽ dễ xảy đến khi bạn bắt tay tính toán số tiền mà sẽ cho rằng đơn hàng trên cần phải thanh toán. Đơn hàng không có giá trị là 5 x 8 x 0,75 + 3 x 8 x 0,90 = 51.6 EUR mà thực tế sẽ là 4 x 8 x 0,8 + 4 x 8 x 0,8 = 51.2 EUR. Mẹo ở đây là bạn phải viết mã đủ thông minh để lưu ý việc tính với trường hợp trên thì 2 bộ sách 4 cuốn sẽ rẻ hơn 1 bộ sách 5 cuốn và 1 bộ sách 3 cuốn.

Bạn sẽ phải đưa ra một số giải thuật thông minh để tối ưu hóa giá mua cho một đơn hàng. Đừng quá đòi hỏi một giải pháp tối ưu đầy đủ cho bài toán này. Cố gắng giải quyết bài toán này chỉ với mục tiêu chia sẻ nó cho người khác. Hãy tin rằng bạn có thể khái quát hóa và cải thiện giải pháp của mình khi có thêm các yêu cầu mới.

Gợi ý các test-case

Các test-case căn bản:

  • assert_equal(0, price([])) : đơn hàng không có cuốn nào, 0 EUR
  • assert_equal(8, price([0])): đơn hàng có 1 cuốn Tập 1, 8 EUR
  • assert_equal(8, price([1])): đơn hàng có 1 cuốn Tập 2, 8 EUR
  • assert_equal(8, price([2])): đơn hàng có 1 cuốn Tập 3, 8 EUR
  • assert_equal(8, price([3])): đơn hàng có 1 cuốn Tập 4, 8 EUR
    assert_equal(8, price([4])): đơn hàng có 1 cuốn Tập 5, 8 EUR
  • assert_equal(8 * 2, price([0, 0])): đơn hàng có 2 cuốn Tập 1, 16 EUR
  • assert_equal(8 * 3, price([1, 1, 1])): đơn hàng có 3 cuốn Tập 2, 24 EUR

Các test-case một loại giảm giá:

  • assert_equal(8 * 2 * 0.95, price([0, 1])): đơn hàng có 1 cuốn Tập 1, 1 cuốn Tập 2, giảm giá 5% còn 15,2 EUR.
  • assert_equal(8 * 3 * 0.9, price([0, 2, 4])): đơn hàng có 1 cuốn Tập 1, 1 cuốn Tập 3 và 1 cuốn Tập 5, giảm giá 10% còn 21,6 EUR.
  • assert_equal(8 * 4 * 0.8, price([0, 1, 2, 4])): đơn hàng có 1 cuốn Tập 1, 1 cuốn Tập 2, 1 cuốn Tập 3 và 1 cuốn Tập 5, giảm giá 20% còn 25,6 EUR.
  • assert_equal(8 * 5 * 0.75, price([0, 1, 2, 3, 4])): đơn hàng có 1 cuốn Tập 1, 1 cuốn Tập 2, 1 cuốn Tập 3, 1 cuốn Tập 4 và 1 cuốn Tập 5, giảm giá 25% còn 30 EUR.

Các test-case có vài loại giảm giá:

  • assert_equal(8 + (8 * 2 * 0.95), price([0, 0, 1])): đơn hàng có 2 cuốn Tập 1, 1 cuốn Tập 2, giá bán còn 23,2 EUR.
  • assert_equal(2 * (8 * 2 * 0.95), price([0, 0, 1, 1])): đơn hàng có 2 cuốn Tập 1, 2 cuốn Tập 2, giá bán còn 30,4 EUR.
  • assert_equal((8 * 4 * 0.8) + (8 * 2 * 0.95), price([0, 0, 1, 2, 2, 3])): đơn hàng có 2 cuốn Tập 1, 1 cuốn Tập 2, 2 cuốn Tập 3 và 1 cuốn Tập 4, giá bán còn 40,8 EUR.
  • assert_equal(8 + (8 * 5 * 0.75), price([0, 1, 1, 2, 3, 4])): đơn hàng có 1 cuốn Tập 1, 2 cuốn Tập 2, 1 cuốn Tập 3, 1 cuốn Tập 4 và 1 cuốn Tập 5, giá bán còn 38 EUR.

Các test-case biên:

  • assert_equal(2 * (8 * 4 * 0.8), price([0, 0, 1, 1, 2, 2, 3, 4])): đơn hàng có 2 cuốn Tập 1, 2 cuốn Tập 2, 2 cuốn Tập 3, 1 cuốn Tập 4 và 1 cuốn Tập 5, giá bán còn 51,2 EUR.
  • assert_equal(3 * (8 * 5 * 0.75) + 2 * (8 * 4 * 0.8), price([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4])): đơn hàng có 5 cuốn Tập 1, 5 cuốn Tập 2, 4 cuốn Tập 3, 4 cuốn Tập 4 và 4 cuốn Tập 5, giá bán còn 141.2 EUR.

Nguồn: http://codingdojo.org/KataCatalogue/

Kata NumbersInWords

Mô tả bài toán

Trong cuộc sống khi mọi người muốn viết số tiền, đặc biệt là một con số cụ thể. Khi viết séc, hóa đơn hoặc hợp đồng, ví dụ một số quốc gia yêu cầu phải viết kèm số tiền bằng chữ để tránh sai sót hoặc gian lận. Do đó khi bạn chuyển 745$ cho ai đó qua séc bạn phải viết như sau:

745.00 $, bằng chữ là “Bảy trăm bốn mươi lăm đô la”

Bước 1

Hãy xây dựng chương trình (method, function) để chuyển đổi số thành chữ.

Bước 2

Xây dựng chương trình chuyển đổi chữ sang số.

Bước 3

Xây dựng tổng hợp các chức năng đó với đầy đủ các kiểm thử.

Nguồn: http://codingdojo.org/KataCatalogue/

Kata FooBarQix

Kata này yêu cầu xây dựng một hàm nhận vào một số để tính toán và trả về một chuỗi thỏa mãn quy tắc sau:

Level 1

Các quy tắc:

  • Nếu số đó chia hết cho 3 thì thêm vào chuỗi từ “Foo”
  • Nếu số đó chia hết cho 5 thì thêm vào chuỗi từ “Bar”
  • Nếu số đó chia hết cho 7 thì thêm vào chuỗi từ “Qix”
  • Nếu số đó chứa chữ số 3, 5, 7, thì thêm vào chuỗi các từ “Foo”, “Bar”, “Qix”.

Ví dụ:

1 => 1
2 => 2
3 => FooFoo (chia hết cho 3, chứa số 3)
4 => 4
5 => BarBar (chia hết cho 5, chứa số 5)
6 => Foo (chia hết cho 3)
7 => QixQix (chi hết cho 7, chứa số 7)
9 => Foo
10 => Bar
12 => Foo
13 => Foo
15 => FooBarBar (chia hết cho 3, chia hết cho 5, chứa số 5)
21 => FooQix (Chia hết cho 3, chia hết cho 7)
33 => FooFooFoo (Chia hết cho 3, chứa hai số 3)
51 => FooBar (Chia hết cho 3, chứa số 5)
53 => BarFoo (Chứa số 5 và số 3)

Level 2

Kata này có thêm một yêu cầu mới đó là đánh dấu vị trí của số 0 bằng cách thêm vào chuỗi ký tựu “*”.

Ví dụ:

101 => 1*1
303 => FooFoo*Foo
105 => FooBarQix*Bar
10101 => FooQix**

Kata DictionaryReplacer

Kata này yêu cầu xây dựng một chức năng đơn giản để thay thế một\một số vị trí nào đó trong chuỗi. Ý tưởng của bài toán này xuất phát từ những chia sẻ của Corey Haines về luyện tập viết mã (aac2009.confreaks.com/06-feb-2009-20-30-lightning-talk-under-your-fingers-corey-haines.html).

Hãy tạo một phương thức nhận vào một chuỗi và một bộ từ điển. Thay thế các vị trí (key) trong chuỗi với các key có trong từ điển. Mỗi key trong chuỗi được đánh dấu bằng cặp ký tự $.

VD về test-case:

  • Test-case 1:
    • Input:
      • Chuỗi: “”
      • Từ điển: null
    • Output: “”
  • Test-case 2:
    • Input:
      • Chuỗi: “\$temp\$“
      • Từ điển: [“temp”, “temporary”]
    • Output: “temporary”
  • Test-case 3:
    • Input:
      • Chuỗi: “\$temp\$ here comes the name \$name\$“
      • Từ điển: [“temp”, “temporary”], [“name”, “John Doe”]
    • Output : “temporary here comes the name John Doe”

Những quy tắc của coderetreat

,

Nhóm nào cũng tuân thủ

  1. Lập trình cặp (Pair Programming): Bạn đã có ai để cặp chưa? Đừng lo, tới sự kiện bạn sẽ kiếm được cạ của mình. Nhưng đừng vội mừng kiếm được cạ rất ưng ý, bởi sau mỗi phiên đối tác của bạn sẽ phải ra đi. Autumn Coderetreat 2017 có 5 phiên (session) làm việc vậy nên bạn có cơ hội cặp với 5 người khác nhau đấy!
  2. Phát triển Hướng Kiểm thử (Test Driven Development – TDD): Bạn đã biết phương pháp code này chưa? Nếu chưa, chớ ngại ngần trong việc đi tìm đối tác biết TDD, cùng lắm là sau 1 phiên làm việc (45′) là bạn TDD nhoay nhoáy thôi! Còn bạn đã thực hành TDD rồi, hãy thực hành nó hoặc dạy cho đối tác của mình về nó nhé. “Một người thạo, hai người vui” :o)
  3. Thiết kế Đơn giản (Simple Design): 4 quy tắc về Thiết kế Đơn giản bạn đã biết rồi chứ? Hãy thực hành nó nhé. Nếu không, chúng cũng không khó khăn để bạn tuân thủ đâu. Cứ đọc kỹ bên dưới là bạn sẽ rõ thôi. Bằng không, đối tác của bạn hoặc các facilitator sẽ giúp bạn hiểu và thực hành chúng.

Cặp nào, quy tắc ấy

Ngoài 3 quy tắc mà nhóm nào cũng phải tuân thủ ở trên, coderetreat còn định nghĩa một loạt các quy tắc khác để các nhóm sử dụng cho các phiên làm việc của mình. Những tuy tắc này là tùy chọn đối với mỗi nhóm, phụ thuộc vào mong muốn nhóm đó muốn rèn luyện kỹ năng\kỹ thuật nào trong lập trình. Dưới đây là danh sách các quy tắc tùy chọn này, đầu phiên làm việc nhóm thảo luận rồi chọn một hoặc một số trong những quy tắc này và tuân thủ chúng suốt phiên làm việc của mình.

  1. No conditional statements
  2. No loops
  3. No mouse
  4. No keyboard shortcut
  5. No naked primitives
  6. Paper only
  7. Text editor only
  8. Max 8|6|4 lines per method
  9. TDD as if you meant it
  10. Other

 

Tìm hiểu nhanh về CodeRetreat

,

Codetreat là gì?

“Retreat” đang là xu hướng. Nhiều người sẽ nghĩ đó là một cuộc trải nghiệm sự tĩnh tâm trong một tu viện. Các lập trình viên thì biết đến thuật ngữ CodeRetreat: Một hình thức học tập đã được thực chứng, nơi bạn tập trung toàn bộ thời gian, khả năng của mình cho việc viết và thiết kế ra những mã tốt mà không chịu áp lực của công việc thường ngày. Qua đó bạn có cơ hội cải tiến kỹ năng, nâng cao kiến thức của mình trong phát triển phần mềm – Bạn được làm điều này mà không bị vướng bận bởi các dự án hiện tại và các deadline bủa vây bạn hằng ngày.

Coderetreat là sự kiện thực hành lập trình chuyên sâu trong một ngày, các hoạt động trong sự kiện tập trung vào những nguyên tắc cơ sở của phát triển và thiết kế phần mềm. Bằng việc tạo cho các nhà phát triển cơ hội để tham gia thực hành có chủ ý, tránh xa những áp lực phải “làm xong hết mọi thứ”, format của coderetreat đã chứng tỏ nó có hiệu quả cao trong việc nâng cao kỹ năng. Luyện tập các nguyên tắc cơ sở của thiết kế theo mô-đun và hướng đối tượng, các nhà phát triển có thể cải thiện khả năng viết mã với chi phí tối thiểu cho sự thay đổi theo thời gian.

Coderetreat không phải là một cuộc hội thảo về công nghệ! Các quy tắc làm việc của sự kiện này hoàn toàn khác, người tham dự tích cực tham gia vào việc viết mã: thực hành rất nhiều, lắng nghe đôi chút.

Cha đẻ của CodeRetreat là Corey Haines, ông và một số bạn bè khác đã đưa ra ý tưởng này từ năm 2009. Bạn có thể tham khảo thêm các thông tin khác về Coderetreat trên trang web http://coderetreat.org

Tại sao tôi nên tham dự?

  1. Có cơ hội thực hành và học những nguyên tắc và kỹ năng căn bản\nền tảng của software craftsmanship (nghề thủ công phần mềm) như Thiết kế Đơn giản (Simple Design), Thiết kế Tiến hóa (Evolutionary Architecture\Emergent Design), Thiết kế Theo Mô đun (Modular Design), Phát triển Hướng Kiểm thử (Test Driven Development – TDD), Các nguyên tắc của OOP, Clean Code, Refactoring, v.v.;
  2. Được tham gia vào Thực hành có Chủ ý , tránh xa những áp lực của công việc thường ngày. Nâng cao kỹ năng của một thợ thủ công phần mềm và khả năng tạo ra các sản phẩm phần mềm có chất lượng cao, giảm thiểu chi phí thay đổi theo thời gian;
  3. Thoát khỏi áp lực deadline\dự án để thoải mái thử nghiệm những ý tưởng mới;
  4. Có cơ hội cải thiện tiến kỹ năng, nâng cao kiến thức của mình trong phát triển phần mềm;
  5. Được giao lưu học hỏi từ người khác, người có kinh nghiệm hơn và thể hiện mình;
  6. Cơ hội gặp gỡ và thảo luận với những thợ thủ công phần mềm cũng như những người quan tâm tới nghề thủ công phần mềm tới từ nhiều nơi trong một phạm vi rộng lớn
  7. Và hơn thế nữa… !

 

Danh sách các Kata dành cho CodingDojo

Kata là một bài tập (bài toán, thử thách, v.v.) về lập trình đi kèm các quy tắc được lựa chọn và thiết kế để giúp các thành viên tham gia buổi Coding Dojo sử dụng để cải thiện kỹ năng\kỹ thuật cụ thể nào đó của lập trình: TDD, Pair-Programming, Unit Testing, Refactoring, v.v..

Bạn không nên chọn một bài toán bất kỳ nào đó trong lập trình để làm một Kata. Thay vào đó bạn nên chọn từ danh sách các bài đã được tổng kết ở một số trang web nổi tiếng về Coding Dojo như:

Dưới đây là những bài Kata đã được CodeGym Premium lựa chọn từ CodingDojo.org và dịch ra tiếng Việt:

  1. Kata FizzBuzz
  2. Kata RomanNumerals
  3. Kata RomanCalculator
  4. Kata Minesweeper
  5. Kata Bowling
  6. Kata PokerHands
  7. Kata YahtZee
  8. Kata DeepFirstSearch
  9. Kata WordWrap
  10. Kata Tennis
  11. Kata NumberToLCD
  12. Kata GameOfLife
  13. Kata DictionaryReplacer
  14. Kata FooBarQix
  15. Kata NumbersInWords
  16. Kata Potter

Kata GameOfLife

Giới thiệu kata :

Game Of Life là một bài toán rất thú vị của Conway, một nhà Toán học người Anh. Bài toán của ông đơn giản nhưng khi triển khai nó bạn sẽ được những kết quả thật tuyệt vời như cuộc sống đang diễn ra xung quanh ta vậy.

Mô tả bài toán :

Giả thiết thế giới chúng ta đang sống là một không gian n chiều (để đơn giản ta dùng không gian hai chiều). Ví dụ:

Game of life không gian đa chiều

Mỗi sự sống trong thế giới này là một ô (cell) nhỏ bé và chịu những quy tắc sống còn như sau:

  • Ô đang SỐNG mà xung quanh nó (kề sát) có ít hơn 2 ô hàng xóm sống thì sẽ CHẾT (Ô màu vàng)

Game of life hai ô đang sống

  • Ô đang SỐNG mà xung quanh nó có nhiều hơn 3 ô hàng xóm sống thì sẽ CHẾT. (Ô màu vàng)

Game of life ba ô đang sống

  • Ô đang SỐNG mà xung quanh có 2 hoặc 3 ô hàng xóm sống thì tiếp tục SỐNG. (Ô màu vàng)

Game of life 2 hoăc 3 ô đang sống

  • Ô đang CHẾT mà xung quanh có đúng 3 ô hàng xóm sống thì sẽ SỐNG lại. (Ô màu vàng)

Game of life 3 ô đang sống

Bài toán này thú vị khi khởi tạo (gieo mầm) sự sống cho thế giới này. Tức là bạn đóng vai Chúa, đặt các “hạt giống” sự sống vào thế giới này và rồi … quy luật “sinh tồn” sẽ quyết định.

Bạn có thể xem một số mẫu đơn giản và phức tạp sau đây để thấy Game Of Life thú vị thế nào:

Mẫu 1: Hạt mầm sự sống (các ô màu xanh) được gieo như sau…

Game of life hạt mầm sự sống

Và rồi… https://youtu.be/bJ_Hhh5gV4w

Mẫu 2: Hạt mầm sự sống được gieo như sau…

Game of life hạt mầm sự sống được gieo

Và rồi… https://youtu.be/nlzATno5ek8

Mẫu 3: Hạt mầm sự sống (ô màu xanh và ô màu cam) được gieo như sau…

Game of life hạt mầm sự sống được gieo theo ô màu cam

Và rồi… https://youtu.be/OlIuo4If18Y

Mẫu 4: Hạt mầm sự sống (ô màu xanh và ô màu cam) được gieo như sau…

Game of life hạt mầm sự sống được gieo

Và rồi… https://youtu.be/mhswQu_VLQk

 Nguồn Kata: http://codingdojo.org/kata/GameOfLife/

Kata NumberToLCD

Giới thiệu về Kata

Viết một chương trình hiển thị số giống kiểu màn hình LCD.

Mô tả bài toán : 

Phần 1

Viết một chương trình chuyển một số (với độ dài tùy chọn) thành kiểu hiển thị trên LCD theo mẫu sau:

             _   _       _   _  _   _   _  
          |  _|  _| |_| |_  |_   | |_| |_|  
          | |_   _|   |  _| |_|  | |_|  _|  

(mỗi chữ số được trình bày trên 3 dòng)

Chú ý: Không đọc Phần 2 trước khi làm xong Phần 1. Một mục đích của bài kata này là thực hành tái cấu trúc và thích ứng với việc yêu cầu thay đổi.

Phần 2

Thay đổi chương trình đã viết để hỗ trợ việc tùy biến hiển thị theo chiều rộng và chiều cao của số.

Ví dụ: với chiều rộng = 3 và chiều cao = 2, số 2 sẽ hiển thị như sau:

___
   |
   |
 ___
|
|___

Bài Kata này dựa vào một chương trình trên:

https://github.com/coreyhaines/kata-number-to-led

http://rubyquiz.com/quiz14.html

Bài Kata ngược lại: LCD to number

 

Nguồn Kata: http://codingdojo.org/kata/NumberToLCD/

Kata Tennis

Giới thiệu kata

Trong bài Kata này ta sẽ xây dựng một phiên bản trò chơi tennis đơn giản. Khi tạo ra bài Kata này, tác giả lấy ý tưởng từ trò tennis trên Wii và đã đơn giản hóa thành mỗi set là một trận đấu.

Cách tính điểm đơn giản như sau:

  1. Mỗi người chơi ghi được các điểm số sau: 0, 15, 30, 40
  2. Nếu người chơi đạt được điểm 40 và thắng lượt đánh hiện tại, người đó sẽ thắng trận đấu này, tuy nhiên có thêm luật cho các trường hợp đặc biệt.
  3. Nếu cả hai người chơi đều được 40 điểm thì hai người hòa (deuce).
    1. Nếu trận đấu đang hòa, người thắng lượt sau sẽ được gọi là “người chơi có lợi thế (advantage)” và được phát bóng.
    2. Nếu “người chơi có lợi thế (advantage)” thắng lượt chơi sau thì sẽ thắng cả trận đấu.
    3. Nếu “người chơi có lợi thế (advantage)” không thắng lượt chơi sau thì hai người lại hòa.

Cách tính điểm được mô tả trên Wikipedia:

  1. Một người thắng trò chơi khi ghi được ít nhất 4 điểm và nhiều hơn đối thủ ít nhất 2 điểm.
  2. Trong tennis, tỉ số được gọi theo cách riêng:
Số điểm Cách gọi
0 “love”
1 “15”
2 “30”
3 “40”
  1. Nếu hai người chơi đều đạt được ít nhất 3 điểm (“40”) và có số điểm bằng nhau, tỉ số được gọi là “hòa”.
  2. Nếu khi hai người đang hòa, một người thắng nhiều hơn 1 điểm so với đối thủ thì tỉ số của trò chơi được gọi là người chơi (nhiều điểm hơn) hoặc “người chơi có lợi thế (advantage)”.

 

Nguồn Kata: http://codingdojo.org/kata/Tennis/