Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Hack lấy vé miễn phí đi AngelHack Ho Chi Minh 2015
Gần đây thấy sự kiện AngelHack Việt Nam 2015 quảng cáo rầm rộ trên FB, trong đó có một đoạn nói rằng, nếu giải được bài toán do họ đặt ra thì có thể lấy vé miễn phí đến sự kiện:
http://angelhack.com/hackathon/vietnam-2015/
Tóm tắt đề bài:
Đọc một xâu Braille và in ra từ tiếng Anh tương ứng. Ở đây Braille chỉ dùng với 26 ký tự tiếng Anh.
# Input
Input và một mảng chữ Braille trên cùng một dòng. Vì mỗi chữ Braille cần 3 dòng để hiển thị nên số dòng input luôn luôn là 3. Dấu ‘.’ tượng trưng cho ký tự nhấn xuống, chữ ‘O’ tượng trưng có ký tự nổi.
# Output
In ra từ tiếng Anh tương ứng
# Sample Input
O. O. O. O. O. .O O. O. O. OO
OO .O O. O. .O OO .O OO O. .O
.. .. O. O. O. .O O. O. O. ..
# Sample Output
helloworld
# Challenge Input
.O O. .O OO O. O. .O OO O. OO O. .O O. .O
O. .O O. .. .. OO OO .. .. .. OO OO .O OO
O. O. O. O. .. O. O. O. OO .. .. .O O. .O
Lời giải sẽ là promotion code để lấy vé miễn phí!
Phân tích
Sau khi tìm hiểu ở Wikipedia thì ta có thể hiểu cách map thông tin từ Braille sang English
Để tạo từ điển chuyển đổi thì có thể làm đơn giản bằng brute-force
braille = [
"O.....",
"O.O...",
"OO....",
"OO.O..",
"O..O..",
"OOO...",
"OOOO..",
"O.OO..",
".OO...",
".OOO..",
"O...O.",
"O.O.O.",
"OO..O.",
"OO.OO.",
"O..OO.",
"OOO.O.",
"OOOOO.",
"O.OOO.",
".OO.O.",
".OOOO.",
"O...OO",
"O.O.OO",
".OOO.O",
"OO..OO",
"OO.OOO",
"O..OOO"
]
braille_dict = {k:v for k,v in zip(braille,'abcdefghijklmnopqrstuvwxyz')}
Với từ điển này thì chỉ cần gọi braille_dict(braille_char)
là có thể tìm được chữ cái tương ứng. Vấn đề còn lại chỉ là xử lý đoạn input. Input của chúng ta trải trên 3 dòng, và cần đọc 2 ký tự của cả 3 dòng thẳng cột để tạo ra một chữ braille
Cho là dòng được đọc từ file braille.txt
, đoạn đọc input sẽ có thể viết như là
f = open("braille.txt")
data = [l.split() for l in f.readlines()]
braille_data = ["".join(i) for i in zip(data[0],data[1],data[2])]
Vậy là cuối cùng chỉ cần
print "".join([braille_dict[x] for x in braille_data])
Đoạn mã giải tổng kết như sau
braille = [
"O.....",
"O.O...",
"OO....",
"OO.O..",
"O..O..",
"OOO...",
"OOOO..",
"O.OO..",
".OO...",
".OOO..",
"O...O.",
"O.O.O.",
"OO..O.",
"OO.OO.",
"O..OO.",
"OOO.O.",
"OOOOO.",
"O.OOO.",
".OO.O.",
".OOOO.",
"O...OO",
"O.O.OO",
".OOO.O",
"OO..OO",
"OO.OOO",
"O..OOO"
]
braille_dict = {k:v for k,v in zip(braille,'abcdefghijklmnopqrstuvwxyz')}
f = open("braille.txt")
data = [l.split() for l in f.readlines()]
braille_data = ["".join(i) for i in zip(data[0],data[1],data[2])]
print "".join([braille_dict[x] for x in braille_data])
Bây giờ thay ký tự input đầu vào vào file braille.txt
như thử thách ta sẽ có lời giải cho bài toán
$ python braille.py
sosmartmuchwow
Vậy còn chần chừ gì nữa, lấy vé free thôi nào ! 5$ for free !



