CodeFights – Hướng dẫn chi tiết cách giải các dạng bài tập

Ở bài trước, tôi đã giới thiệu với các bạn về CodeFights . Bài lần này sẽ tập trung về việc giải quyết các dạng bài toán thường gặp trong CodeFights

1. Thông tin chung

Để giải quyết các bài tập trong Codefights , bạn cần phải viết một hàm bằng ngôn ngữ bạn thành thạo. Khi bạn nộp bài, hàm này sẽ được chạy trong 1 class được định nghĩa sẵn, do đó trong một số trường hợp có thể phát sinh lỗi Syntax (Compilation) Error. Do đó bạn cần phải tuân thủ các việc sau:

  1. Cần phải giữ nguyên tên của hàm đã được chỉ định. Nếu thay đổi tên của hàm sẽ phát sinh ra lỗi syntax error.
  2. Có thể lưu lại log để hỗ trợ việc thực hiện debug (ví dụ: console.log trong JSstd::cout trong C++).
  3. Nếu giá trị của các đối số trong input/output là string có chứa ký tự dấu ngoặc kép ( ” ) thì sẽ được hiển thị thêm dấu “\”. Ví dụ: inputString = hello”world”hello, sẽ được hiển thị ở console là “hello\”world\”hello”.

2. Quá trình thực thi code

Sau khi bạn nộp code để test, các trường hợp sau có thể sảy ra:

  1. Lỗi biên dịch/cấu trúc  – Khi gặp vấn đề này tức là bạn cđang ó lỗi về cú pháp, cấu trúc trong source code. Thông tin lỗi cụ thể (ví dụ dòng line bị lỗi, thiếu dấu “;” , dùng biến chưa được định nghĩa, ..)  sẽ được chỉ rõ ra, giúp bạn có thể xác định được vấn đề cụ thể để fix lại.
  2.  Lỗi thực thi – Khi chương trình chạy thì bị crash, có thể là tham số truyền vào hàm bị sai, bị lỗi null hoặc truy suất phần tử không có trong array .. thông tin cụ thể sẽ được cung cấp để giúp bạn xác định vấn đề.
  3. Vượt quá thời gian biên dịch code  – Lỗi này xảy ra khá hiếm và hầu hết chỉ phát sinh với C++ hoặc Java. Nguyên nhân của lỗi này có thể do code của bạn quá dài, hoặc lạm dụng sử dụng quá nhiều template, nên việc biên dịch tốn rất nhiều thời gian.
  4. Vượt quá thời gian thực thi code – Lỗi này phát sinh khi source code chạy vượt quá thời gian quy định. Có thể là bị treo ở 1 testcase nào đó, hoặc code chạy quá chậm. Do đó thuật toán của bạn đang không được hiệu quả với trường hợp data nhập vào rất lớn, hoặc đơn giản là có bug ở code.
  5. Vượt quá giớ hạn output – Lỗi này hiếm khi xảy ra. Nguyên nhân có thể do hàm của bạn trả ra giá trị rất lớn (ví dụ trả về 1 mảng hoặc 1 ma trận lớn), hoặc là do bạn lạm dụng in ra quá nhiều data ở consolse. Khả năng khả thi nhất là bạn liên tục in giá trị ở consolse trong 1 vòng lặp vô tận.
  6. Sai đáp án  – Code của bạn có thể biên dịch và chạy thành công, tuy nhiên kết quả thực hiện được thì sai trong 1 hoặc vài testcase. Bằng việc so sánh giữa giá trị output mong muốn và giá trị output của hàm của bạn, bạn có thể xác định phần logic sai trong code.
  7. Đúng hết tất cả các testcase – Xin chúc mừng, code của bạn đã chạy đúng tất cả các testcase và đáp ứng được thời gian thực thi.

3. Ngôn ngữ lập trình

CodeFights hỗ trợ một số trình biên dịch và ngôn ngữ lập trình. Bạn có thể giải quyết từng bài tập bằng ngôn ngữ bạn thành thạo bằng cách chọn ngôn ngữ ở góc phải của màn hình IDE. Bạn có thể tìm hiểu cụ thể về các ngôn ngữ và trình biên dịch hiện đang được hỗ trợ.

– NodeJS

CodeFights hỗ trợ trình biên dịch NodeJs v5.11.1 với hầu hết các tính năng của ES2015 .
Cách sử dụng hiệu quả Nodejs .

  1. Sử dụng console.log() để in data dùng để debug.
  2. Sử dụng let để khai báo biến, thêm  use strict tại đầu của mỗi hàm.
  3. Sử dụng arrow functions () => {} và các tính năng của ES2015 để viết code ngắn gọn, dễ hiểu.

– C++

CodeFights hỗ trợ g++ 5.0 c++14 . Bạn có thể sử dụng các tính năng unordered_map, regex, range for, auto … của  C++11 và 14 .
Các thư viện sau đã được include sẵn:

Cách sử dụng hiệu quả C++.

  1. Khi khởi tạo biến toàn cục ở C++, khi set giá trị biến ở thời điểm khởi tạo, sẽ phát sinh lỗi  syntax . Do đó nên set giá trị của biến ở trong hàm.
  2. Biến static bị vô hiệu hóa trong C++, do đó nếu cố tình sử dụng, sẽ dẫn tới việc phát sinh các kết quả không mong muốn.
  3. Thêm using namespace std; vào trên đầu của hạm để sử dụng tính năng std mà không phải sử dụng tiền tố std:: .
  4. Sử dụng std::cout để in data dùng để debug.
  5. Sử dụng tính năng của C++11 và 14 , ví dụ. for (x: vec) {…}, lambda functions [](int a, int b) -> bool {…}.

– Python

Phiên bản của Python đang được sử dụng là Python 2.7.6.

  1. Để biết thêm thông tin chi tiết về sự khác biệt giữa python3 và python2, tham khảo The Python Language Wiki.
  2. Sử dụng print … để in data dùng để debug.

Các thư viện sau đã được import tự động:

– Java

Trình biên dịch đang được sử dụng là Java8 1.8.0.

  1. Sử dụng System.out.println(…) để in data dùng để debug.
  2. Khi khởi tạo biến toàn cục ở Java, khi set giá trị biến ở thời điểm khởi tạo, sẽ phát sinh lỗi  syntax . Do đó nên set giá trị của biến ở trong hàm.

Các thư viện sau đã được import tự động:

– C#

Trình biên dịch đang sử dụng là Mono C# phiên bản 4.4.0.0. Sử dụng Console.Write(…) để in data dùng để debug.

Các thư viện sau đã được include tự động:

– Ruby

Trình biên dịch đang được sử dụng là ruby 2.2.4. Sử dụng puts … để in data dùng để debug.

Các thư viện sau đã được include tự động:

– PHP

Trình biên dịch đang được sử dụng là PHP 7.0.7. Sử dụng echo … để in data dùng để debug.

– Perl

Trình biên dịch đang được sử dụng là Perl 5.18.2. Sử dụng print … để in data dùng để debug.

Các thư viện sau đã được include tự động:

– F#

Trình biên dịch đang được sử dụng là Mono F# 3.0.

  1. Sử dụng printf để in data dùng để debug.
  2. Arrays được sử dụng làm tham số đầu vào thay vì sử dụng  lists.
  3. Giá trị trả về được quy định rõ ràng, do đó cần trả về object hoặc kiểu dữ liệu chính xác.

Các thư viện sau đã được include tự động:

– Go

Trình biên dịch đang được sử dụng là Go 1.2.1. Sử dụng fmt.Printf(…) để in data dùng để debug.
Các thư viện sau đã được include tự động:

– Swift

Trình biên dịch đang được sử dụng là Swift 3.0-dev cho Ubuntu. Chú ý rằng đây là phiên bản đang phát triển cho Swift 3, do vậy hiện tại nó không tương thích 100% với XCode Swift 3 . Sử dụng print(…) để in data dùng để debug.

Các thư viện sau đã được include tự động:

– Scala

Trình biên dịch đang được sử dụng là Scala 2.11.6. Sử dụng println(…) để in data dùng để debug.

– Haskell

Trình biên dịch đang được sử dụng là GHC 7.6.3.  Sử dụng unsafePerformIO và print …  để in data dùng để debug. Ví dụ dưới đây sử dụng hàm add và in ra data để debug:

– MySQL

Trình biên dịch đang được sử dụng là MySQL 14.14 Distrib 5.5.50.

– Visual Basic

Trình biên dịch đang được sử dụng là Mono 3.0. Sử dụng Console.WriteLine(…) để in data dùng để debug.

Các thư viện sau đã được include tự động:

– R

Trình biên dịch đang được sử dụng là R 3.0.2. Sử dụng cat(…) hoặc print(…) để in data dùng để debug.
Trả về giá trị list khi bài tập yêu cầu giá trị trả về là array. Luôn ép kiểu trả về thành dạng list  (ví dụ: return (as.list(ans))).
Các thư viện sau đã được include tự động:

– Bash

Đối với mục thử thách DevOps bạn được yêu cầu viết mã bash, và nên in các data yêu cầu tới stdout. Bạn có thể tim thấy tab Linux Terminal ở IDE, mục này đã được thiết kế giả lập môi trường linux terminal được cài đặt đầy đủ các script cần thiết . Xin lưu ý rằng khi chấm điểm source code của bạn sẽ chạy ở môi trường linux thật, do đó sẽ có thể phát sinh một số sai khác với môi trường giả lập.

– Python3

Phiên bản Python3 đang được sử dụng là 3.4.3.

  1. Sử dụng  print … để in data dùng để debug.

Các thư viện sau đã được import tự động:

 4. Các dạng bài tập

Có 3 dạng bài tập chính:

  • BUGFIX ( tối đa 100 điểm, 4 lần nộp bài): Tồn tại 1 bug trên 1 dòng của  code, các bạn cần fix bug đó.  Mẹo tìm lỗi nhanh: nên chạy thử source code, khi đó các lỗi cơ bản như NullPointerException, IndexOutOfBoundsException … sẽ xuất hiện 🙂

  • RECOVERY (tối đa 100 điểm, 4 lần nộp bài): Điền vào chỗ trống trong đoạn code được đưa ra.

  • CODEWRITING (tối đa 300 điểm, không hạn chế số lần nộp bài):  Tự viết 1 hàm để giải quyết vấn đề bài toán.

Các bài tập này sẽ được test bằng 2 loại test case

  • Test case bình thường: có thể nhìn thấy input, out put của testcase
  • Test case ẩn: không biết input của test case. Thực tế có rất nhiều bài tưởng dễ ăn, nhưng lại ko pass được các test case ẩn này, do đó việc review code và suy nghĩ về các adnormal, bounary test case là việc bắt buộc.

5. Lời kết

Bài viết này đã cung cấp cho các bạn các thông tin chi tiết về các ngôn ngữ lập trình, quá trình thực thi code cũng như cách giải quyết 3 dạng bài tập cơ bản. Ở bài viết sau, tôi sẽ giới thiệu về việc tính điểm, tăng thứ hạng và cách kiếm coin để mua các vật phẩm hữu dụng trong Codefights.

Join us today and SAVE the world!


tvOS for developers – Diving into now