New FAMILUG

The PyMiers

Saturday, 9 May 2015

[Code] Tính từ cùng 9gag

UPDATE: đã có code Go, Ruby.  Các ngôn ngữ khác đang chờ bạn đóng góp :p 
Tối ngủ, sốt, nóng, thấy 9gag có cái hình hay hay, code ngay cho nóng

http://9gag.com/gag/aWWP7bd?ref=fbp


Hãy nghĩ thuật toán bạn sẽ dùng để tính ra số theo quy tắc trong bức hình trước khi bấm đọc tiếp.


Thuật toán khá đơn giản:
- Map lần lượt từng chữ với từng số: A-1, B-2 ...
như vậy có thể lấy ký tự cần tính trừ đi số đại diện cho A rồi + 1 vào là đổi được chữ ra số
- Chú ý không phân biệt hoa thường

Ta có hàm sum:
func sum(s string) int {
    s = strings.ToLower(s)
    sum := 0
    for _, char := range s {
        sum += int(char-'a') + 1
    }
    return sum
}
Dễ thấy từ nào càng dài và chứa càng nhiều chữ cuối bảng chữ cái thì sẽ càng to:
- PROCASTINATION: 174
- masturbation: 153
- pussy: 100
- discipline: 100

--- ai có đầu óc khoa học và chăm chỉ có thể mở rộng chương trình để tìm tất cả các từ có tổng == 100 ~ kết quả sẽ khá bất ngờ.

Chạy code trực tiếp ở
Golang:  https://play.golang.org/p/6oKJFUf6EP
Ruby: http://www.rubystub.com/23396892/ (Thank to +Lam Tung )
Python: ???

Hết.
Happy meo meo.

14 comments:

  1. #!/usr/bin/python

    def sum(chuoi):
    chuoi = chuoi.lower()
    tong = 0
    for kytu in chuoi:
    gt = ord(kytu) - 96
    tong += gt
    return tong
    def main():
    words = ['attitude','love','knowledge','laziness','whiskey','discipline']
    for chuoi in words:
    print chuoi, sum(chuoi)
    main()

    ReplyDelete
    Replies
    1. chào mừng bạn lần đầu comment vào familug (y)
      Do độ lởm của blog nên không hỗ trợ format code (không indent được) trong comment, để cho tiện đọc bạn vui lòng sử dụng dịch vụ pastebin của các bên như gist.github.com hoặc pastebin.com để code được xinh nhất.

      code của bạn khá ổn, việc dùng biến "chuối" làm mình nhớ lại những ngày xưa vẫn code bằng tiếng Việt (y).

      Cám ơn bạn rất nhiều :D mong bạn sẽ tiếp tục tham gia vào các bài viết sau.

      Delete
  2. import string

    word = raw_input("Enter your word:").upper()

    print sum(string.ascii_uppercase.index(char) + 1 for char in word))

    ReplyDelete
    Replies
    1. lời giải rất hay và khác biệt (y) hoàn toàn có thể viết thành 1 dòng (y)

      Delete
  3. Ruby: ["Attitude", "Love"].each {|char| p (char.downcase.sum + ( - "a".ord + 1)*char.length) }

    ReplyDelete
  4. Thêm qủa LUA nữa cho đẹp

    ReplyDelete
    Replies
    1. https://gist.github.com/tunglam14/72b6e70bac9f462ee5d5

      Delete
  5. This comment has been removed by the author.

    ReplyDelete
    Replies
    1. Copy-paste mistake:

      $ perl -MList::Util=sum -le 'print sum map{ord(lc)-ord(a)+1}split// for @ARGV' "Attitude" "Love"
      100
      54

      Delete
  6. Perl6 one:

    $ perl6 -e 'say [+] .lc.ords.map(*+1-ord("a")) for @*ARGS' "Attitude" "Love"
    100
    54

    ReplyDelete
    Replies
    1. perl thật đáng sợ :-s **+@+“”'[]

      Delete