Các bài tập Ruby cơ bản phần 1


Xin chào các bạn,dạo này mình có hơi rảnh nên lên mạng nghịch ngợm,thấy khá nhiều bài tập về ruby hay mà bình thường các bạn mới học khó có thể tìm được.Vì vậy mình viết serries này để tổng hợp và chia sẻ cho các bạn mới làm quen với ruby.Vì blog này của mình viết ra cũng là để cho mình xem lại lỡ như quên nên mình sẽ viết để sao cho sau này mình có xem lại cũng hiểu một cách nhanh nhất.Nào chúng ta bắt đầu thôi.Mình sẽ để nguyên đề bài và từ từ giải quyết nhé.

1.Đề bài thứ nhất

Đề bài

This is a wonderful exercise which explains the concept of infinite loops. "A hacker practices on HackerRank until getting to a rating of O(1) read as (Oh-one)" An infinite loop in Ruby is of the form

 loop do  
 end  

Use an infinite loop and call the method coder.practice within it and break if coder.oh_one? is true. break if conditions in Ruby are of the form

 if <condition>  
   break  
 end  

or a one-liner

 break if <condition>   

Đáp án :
Đề bài nó bảo trong ruby có thể sử dụng vòng lặp vô hạn để giải quyết vấn đề nào đó.Nó yêu cầu sử dụng vòng lặp vô hạn và gọi method coder.practice trong nó và sẽ dừng lặp khi code.oh_one? là đúng.Nó còn ví dụ trong ruby để dừng vòng lặp vô hạn thì có cú pháp như thế nào.Thực ra đề bài không khó lắm chỉ là chạy cái method coder.practice trong một vòng lặp vô hạn và sẽ dừng vòng lặp nếu method coder.oh_one = true.

 loop do  
   if coder.oh_one?   
     break  
   else  
     coder.practice  
   end  
 end  

2.Đề bài thứ 2

Đề bài

This challenge has a beautiful one-liner answer.

"A hacker practices on HackerRank until getting to a rating of O(1) read as (Oh-one)"

Call the method coder.practice until coder.oh_one? becomes true.

Use the until control structure.

until is the logical equivalent of while not.

Hint

 while not <condition>  
   <code>  
 end  

or

 until <condition>  
   <code>  
 end  

or

 <code> until <condition>   

Đáp án:
Ở bài toán này yêu cầu của nó là phải gọi method coder.practice cho đến khi coder.oh_one? chúng ta sẽ sử dụng until.Bản chất until là ngược lại của while.Tức là sẽ thực hiện yêu cầu đến khi biểu thức có giá trị true thì sẽ dừng vòng lặp(while sẽ thực hiện yêu cầu đến khi biểu thức có giá trị false sẽ dừng vòng lặp.Chúng ta sẽ code như sau

 until coder.oh_one?  
   coder.practice  
 end  

hoặc

 while not coder.oh_one?  
   coder.practice  
 end  

hoặc

 coder.practice until coder.oh_one?  

Đề thứ 3:

Đề bài

HackerRank is written in RoR and we have various classes defined in it. Some of them are

Hacker
Submission
TestCase
Contest
etc.

You have been given a function where an object which may or may not be of the above mentioned type is sent as an argument. You have to use the case control structure in Ruby to identify the class to which the object belongs and print the following output:

if Hacker, output "It's a Hacker!"
if Submission, output "It's a Submission!"
if TestCase, output "It's a TestCase!"
if Contest, output "It's a Contest!"
for any other object, output "It's an unknown model"
Note

use case (switch statement of Ruby)
use puts for printing
Ruby Docs on case

Đáp án

Yêu cầu của bài toán là sử dụng cấu trúc rẽ nhánh (swich) để in ra thông báo.Đầu vào của method là một object.Nên mình sẽ viết như sau

 def identify_class(obj)  
   case obj  
     when Hacker  
     puts "It's a Hacker!"  
     when Submission  
     puts "It's a Submission!"  
     when TestCase  
     puts "It's a TestCase!"  
     when Contest  
     puts "It's a Contest!"  
   else  
     puts "It's an unknown model"  
   end    
 end  

Thực ra có thể dùng if else như bình thường nhé.

Đề bài 4:
Remove Duplicates from Sorted Array

Giải thích :
Cho một mảng các số nguyên đã được sắp xếp, nhiệm vụ của các bạn xóa các phần tử trùng nhau trong mảng đó.Sau đó tính số phần tử của mảng sau khi đã xóa các phần tử trùng.
VD: [1,1,2,3,4,5,5,5,6] mảng này có 9 phần tử sau khi xóa các phần tử sẽ còn lại mảng như sau: [1,2,3,4,5,6] và mảng mới này có 6 phần tử.

Đáp án : Trong ruby có một method để loại bỏ các phần tử trùng nhau trong mảng đó là uniq!().Nếu ở trong các ngôn ngữ khác chúng ta sẽ phải loop 2 lần(một lần loop các phần tử 1 lần loop các index các phần tử ).Mình sử dụng uniq! để apply trực tiếp giá trị vào mảng ban đầu(tức là thay đổi luôn giá trị của mảng ban đầu nhé).Dòng cuối mình sử dụng (&) để validate trường hợp arr = nil thì hàm cũng sẽ không lỗi.(nil.length sẽ gây lỗi nhé ).

 # @param {Integer[]} nums  
 # @return {Integer}  
 def remove_duplicates(nums)  
   a = nums.uniq!  
   a&.length  
 end  

Đề bài 5:
Given an array of integers, find if the array contains any duplicates. Your function should return true if any value appears at least twice in the array, and it should return false if every element is distinct.

Giải thích :
Cho một mảng các số nguyên, viết một function kiểm tra xem trong mảng đó có chứa các phần tử trùng nhau không.Kết quả trả về true hoặc false nhé.

Đáp án :
Chúng ta dùng hàm uniq() để check xem mảng truyền vào có chứa phần tử trùng nhau không ? gán giá trị sau khi đi qua hàm uniq vào một mảng khác.Sau đó so sánh mảng này và mảng ban đầu, nếu 2 mảng có số phần tử khác nhau thì chứng tỏ mảng ban đầu có chứa phần tử trùng nhau (uniq xóa các phần tử trùng nhau nhưng nó ko làm thay đổi giá trị mảng ban đầu nên chúng ta có thể gán nó sang mảng khác để so sánh )

 # @param {Integer[]} nums  
 # @return {Boolean}  
 def contains_duplicate(nums)  
   a = nums.uniq  
   a.length < nums.length ? true : false  
 end  

Còn tiếp....

Nhận xét

Bài đăng phổ biến từ blog này

Cài đặt SSL cho website sử dụng certbot

Xây dựng một hệ thống comment real-time hoặc chat đơn giản sử dụng Pusher

CÁC BÀI TẬP SQL CƠ BẢN - PART 1

Xây dựng một hệ thống tracking hành vi người dùng (phần 1)

Xây dựng một hệ thống tracking hành vi người dùng (phần 2)

Enterprise architecture trên 1 tờ A4

Web caching (P2)

Bàn về async/await trong vòng lặp javascript

Web caching (P1)

Cài đặt môi trường để code website Rails