Saturday, 16 May 2015

[CodeGolf] Dài nhất và ngắn nhất

Đã có code Golang, các ngôn ngữ khác lại chờ bạn đóng góp :D 

Trong cuộc sống, người ta vẫn luôn quan tâm đến những cái nhất, nhất, nhất chứ không phải thứ 2 hay thứ 10.
WorldCup cứ 4 năm diễn ra, nóng bỏng là thế, nhưng vẫn có đội đề xuất bỏ hẳn trận đá tranh giải 3-4 vì người ta xem cũng chỉ quan tâm đội được nhất thôi.

Và để được nhớ mãi, hãy là dài nhất, hoặc ngắn nhất chứ đừng là dạng vừa:

Cho một danh sách các loài, tìm con nào tên dài nhất và ngắn nhất:
In [6]: xs = ['chim', 'bo', 'ga', 'vit', 'voi', 'buom', 'than lan']
Golang: http://play.golang.org/p/b5Zka-L5dm

Python:
Lợi dụng hàm sorted:
In [19]: sorted(xs, key=len)[-1]
Out[19]: 'than lan'

In [20]: sorted(xs, key=len)[0]
Out[20]: 'bo'
Nhưng khi nghe đến đề bài đã nghĩ tới ngay hai builtin-function min và max của Python, vấn đề là không phải ai cũng biết khả năng linh hoạt của chúng:
In [7]: max(xs, key=len)
Out[7]: 'than lan'

In [8]: min(xs, key=len)
Out[8]: 'bo'
argument key nhận giá trị là một function và function này được sử dụng trong việc tính toán để sắp xếp.

Không cần benchmark cũng thấy rõ max và min (O(n)) sẽ nhanh hơn sorted, và sự thật thì đúng là thế:
In [8]: %timeit sorted(xs, key=len)[-1]
The slowest run took 8.95 times longer than the fastest. This could mean that an intermediate result is being cached
100000 loops, best of 3: 1.89 µs per loop

In [9]: %timeit max(xs, key=len)
The slowest run took 10.41 times longer than the fastest. This could mean that an intermediate result is being cached
1000000 loops, best of 3: 778 ns per loop
Vậy trong cuộc tranh đấu về độ dài này, thằn lằn đã dành danh hiệu dài nhất,
bò thì là ngắn nhất rồi, mặc dù nó có thể chia sẻ với "gà".

Hết.
hvn@familug.org