Đếm số nguyên âm trong chuỗi kí tư

Liên hệ QC
[thongbao]Thiệt là mấy bạn nhiệt tình thật :)). Mình cám ơn lắm nếu viết được chương trình. Còn không thì cũng ko quan trọng, tại đây chỉ là bài tập phụ để kiếm điểm thôi, vì đây là Latin chứ ko phải tin học, mặc dù đều là "tinh" haha. [/thongbao]

Lần sao bạn nêu rõ hơn iêu cầu. Nếu không giống như là câu đố chứ đâu fải nhờ giúp; Bằng không không có lần sau nào nữa đâu bạn à!
 
Thực ra bài tập đưa cho mình thì phức tạp hơn, mình cũng cố gắng tìm hiểu marco, rồi viết code excel dựa trên kiến thức cơ bản của pascal mà học hồi 11. Mà gà mờ vẫn gà mờ. 2 vấn đề trên là cái quan trọng nhất để mình viết xong chương trình.
Thiệt là mấy bạn nhiệt tình thật :)). Mình cám ơn lắm nếu viết được chương trình. Còn không thì cũng ko quan trọng, tại đây chỉ là bài tập phụ để kiếm điểm thôi, vì đây là Latin chứ ko phải tin học, mặc dù đều là "tinh" haha.

Quả là một con la to
 
Phải nhìn nhận quý vị siêng thật.
Đây là bài tập Excel của một cô giáo đưa ra để dạy tiếng Latin.
Trước khi biết tiếng Latin định nghĩa nguyên âm và phụ âm ra sao, tất cả các lời giải đều là giải ẩu, không có căn bản gì cả.
Xin lĩnh giáo bạn VetMini. Ha ha. Mình thấy code cuối mình ở #18 khá ổn đấy chứ. Bạn VetMini có ý kiến đóng góp gì mình sửa. Mình không cần bạn phải viết code đâu. Ha ha
 
@chủ thớt:
Tôi đã nhắc nhở là ít nhất phải có một bảng định nghĩa thế nào là nguyên âm và thế nào là phụ âm rồi mới làm việc được.
Bạn không thể giao công việc lựa hàng cho người ta mà không có điều kiện để người ta xác định mặt hàng.

@doatmenhhon:
Ha với hót, lĩnh giáo với háng rộng. Bạn cũng lỳ không kém chủ thớt. Đã nói không có bảng phân biệt thì code của bạn hoàn toàn vô dụng.
Trong toán đại số, khi làm con toán thong thường, người ta ngầm hiểu là làm việc trên không gian véc tơ số thực. Nếu bài toán làm việc trên một vùng con của số thực, hoặc không gian véc tơ nào khác thì bài toán phải định nghĩa rõ ràng trước.

Nói thẳng, bạn chỉ là lập trình nghiệp dư. Tôi làm việc giao dịch với dân lập trình chuyên nghiệp nhiều năm, số năm giao dịch có thể lớn hơn số tuổi của bạn. Bất cứ thằng lập trình viên nào đưa code không có kèm bảng xác định phạm vi (scope) tôi đều xổ toẹt hết.
 
@chủ thớt:
Tôi đã nhắc nhở là ít nhất phải có một bảng định nghĩa thế nào là nguyên âm và thế nào là phụ âm rồi mới làm việc được.
Bạn không thể giao công việc lựa hàng cho người ta mà không có điều kiện để người ta xác định mặt hàng.

@doatmenhhon:
Ha với hót, lĩnh giáo với háng rộng. Bạn cũng lỳ không kém chủ thớt. Đã nói không có bảng phân biệt thì code của bạn hoàn toàn vô dụng.
Trong toán đại số, khi làm con toán thong thường, người ta ngầm hiểu là làm việc trên không gian véc tơ số thực. Nếu bài toán làm việc trên một vùng con của số thực, hoặc không gian véc tơ nào khác thì bài toán phải định nghĩa rõ ràng trước.

Nói thẳng, bạn chỉ là lập trình nghiệp dư. Tôi làm việc giao dịch với dân lập trình chuyên nghiệp nhiều năm, số năm giao dịch có thể lớn hơn số tuổi của bạn. Bất cứ thằng lập trình viên nào đưa code không có kèm bảng xác định phạm vi (scope) tôi đều xổ toẹt hết.
Hi mình chỉ làm việc ở phòng điều độ điện lực hông có liên quan gì đến lập trình cả. Công nhận bạn VetMini đanh đá kinh lên được ^^
 
Bạn là người thứ 1 triệu lẻ 1 chửi tôi đanh đá kiêu ngoa. Nếu mỗi lời rủa làm cho tôi giảm thọ 1 giây thì có thể giờ này tôi xuống lỗ rồi.

Người học mới cần khiêm tốn. Học mà còn tự ai vặt thì chỉ học được những trò múa rối, đem code về doạ thiên hạ. Là người chuyên môn xem phim tầu, đáng lẽ bạn phải học gương Chúa động Hoa Quả Sơn. Nếu chúa động tự ái khi bị Bồ Đề Lão Tổ gõ đầu 3 cái thì làm gì có ngày náo thiên cung doạt danh Tề Thiên Đại Thánh.
 
Bạn là người thứ 1 triệu lẻ 1 chửi tôi đanh đá kiêu ngoa. Nếu mỗi lời rủa làm cho tôi giảm thọ 1 giây thì có thể giờ này tôi xuống lỗ rồi.

Người học mới cần khiêm tốn. Học mà còn tự ai vặt thì chỉ học được những trò múa rối, đem code về doạ thiên hạ. Là người chuyên môn xem phim tầu, đáng lẽ bạn phải học gương Chúa động Hoa Quả Sơn. Nếu chúa động tự ái khi bị Bồ Đề Lão Tổ gõ đầu 3 cái thì làm gì có ngày náo thiên cung doạt danh Tề Thiên Đại Thánh.
Bạn nói thế mình không tự ái đâu. Mình chỉ kính nể bạn là người có tuổi uyên thâm. Code #18 test vẫn lỗi gắp 2 ý ở đấy lắp lại code cũ thì ổn. Mình lập lệnh rồi cắt điện giải tán nha ^^
 
Muốn giải loại bài này phải có một bảng chuyển ký tự. Có những ngôn ngữ có nguyên âm kép và có những ngôn ngữ có phụ âm kép (ví dụ tiếng Đức ss là một phụ âm)

Vì là loại đề chỉ tính nguyên/phụ âm cho nên ta có thể an toàn đổi tất cả các nguyên âm kép thành "a" và tất cả phụ âm kép thành "x". Sau đó đếm chúng bình thuờng. Và cách gải có những điểm đặc biệt sau đây:

- Trong các bài trước, có bài giải bằng cách chuyển thành Ucase để so sánh, cách này tốt nếu ta dùng đủ 26 ký tự. Ở đây chỉ có 5 (aeiou) thì ta dùng "AEIOUaeiou" quách cho khoẻ thân.

- Có một bạn dùng mảng cho dễ so sánh. Cách này rất mất công, Hàm InStr của VBA rất hiệu quả. Nhưng nếu bạn muốn dùng array thì cách gán trị cho bạn cũng rất khó kiểm soát. Có 3 cách khác để gán mảng:
1. Dúng hàm Array: a = array("A", "E", ...., "u")
2. Dùng hàm Evaluate: a = [ { "A", "E", ..., "u" } ] ' lưu ý: hàm evaluate là hàm worksheet cho nên chỉ số mảng bắt đầu từ 1
3. Dùng hàm Split: a = Split( "A,E,I,O,U,a,e,i,o,u", ",")

- Nếu dùng Regex thì dùng mẫu "[AEIOU ]" và chỉ cần đếm số matches : soNguyenAm = rx.Excutre("corrporus").Count : ignorecase = true

Đề thứ hai khó hơn nhiều. Cô giáo nào ra bài này có hơi bị khùng.

- Dùng InStr thì phải đọc ngược: Len(s) to 1 step -1
Tìm nguyên âm đầu tiên. Đọc hết dãy nguyên âm thì bắt đầu đếm số phụ âm cho đến khi gặp 1 nguyên âm khác.
Đề bài không cho biết nếu không có nguyên âm nào nữa thì sao? "scream" -> chỉ có 1 dãy nguyên âm.

- Dùng Regex thì mẫu là "[AEIOU][^AEIOU]+[AEIOU]". Lấy phần tử cuối cùng trong mảng kết quả, và bỏ đi ký tự đâu và cuối (vì kết quả sẽ là 1 chuỗi phụ âm kẹp giũa 2 nguyên âm).

=== đính chính:

Mẫu ở trên sai, ký tự nguyên âm thứ nhì sẽ bị ngốn mất trong lần match trước.
Ví dụ "aaabcdefghijkl" sẽ match ra "abcde" thay vì "efghi" (e bị ngốn vào "abcde" rồi, chỉ còn lại "fghi", không match)

Với dạng này, bắt buộc phải dùng kỹ thuật lookahead

"[AEIOU][^AEIOU]+(?=[AEIOU])" :---> ?= chỉ xét sự hiện hữu của chuỗi chứ không ngốn
"aaabcdefghijkl" sẽ match ra "efgh"
 
Lần chỉnh sửa cuối:
[thongbao]Thiệt là mấy bạn nhiệt tình thật :)). Mình cám ơn lắm nếu viết được chương trình. Còn không thì cũng ko quan trọng, tại đây chỉ là bài tập phụ để kiếm điểm thôi, vì đây là Latin chứ ko phải tin học, mặc dù đều là "tinh" haha. [/thongbao]

Lần sao bạn nêu rõ hơn iêu cầu. Nếu không giống như là câu đố chứ đâu fải nhờ giúp; Bằng không không có lần sau nào nữa đâu bạn à!
Ok, cám ơn bạn đã nhắc nhở.
 
Ok, cám ơn bạn đã nhắc nhở.
Bạn dùng tạm:
Mã:
 Function Rut(ByVal A As String) As String
A = UCase(A)
With CreateObject("VBscript.Regexp")
    On Error Resume Next
    .Pattern = "(O(?!.*O)\w{0,100}\I)"
    .IgnoreCase = True
    Rut = .Execute(A)(0)
End With
     Rut = Len(Replace(Replace(Replace(Replace(Replace(Replace(Rut, "A", ""), "E", ""), "I", ""), "O", ""), "U", ""), " ", ""))
End Function
khi nào nghĩ ra cách ngắn hơn mình sẽ chuyển cho bạn. Mình nhắc bạn gửi nhiều dòng vì nhiều ý tưởng của bạn có thể mâu thuẫn với nhau. Bài này mình đếm phụ âm giữa hai nguyên âm o và i cuối cùng
 

File đính kèm

  • DEM SO NGUYEN AM 15.11.xls
    42.5 KB · Đọc: 6
Lần chỉnh sửa cuối:
Bạn dùng tạm:
Mã:
 Function Rut(ByVal A As String) As String
A = UCase(A)
With CreateObject("VBscript.Regexp")
    On Error Resume Next
    .Pattern = "(O(?!.*O)\w{0,100}\I)"
    .IgnoreCase = True
    Rut = .Execute(A)(0)
End With
     Rut = Len(Replace(Replace(Replace(Replace(Replace(Replace(Rut, "A", ""), "E", ""), "I", ""), "O", ""), "U", ""), " ", ""))
End Function
khi nào nghĩ ra cách ngắn hơn mình sẽ chuyển cho bạn. Mình nhắc bạn gửi nhiều dòng vì nhiều ý tưởng của bạn có thể mâu thuẫn với nhau. Bài này mình đếm phụ âm giữa hai nguyên âm o và i cuối cùng

Cám ơn bạn rất nhiều, nếu lần sau mình có nhờ làm bài giúp thì mình sẽ ghi chi tiết hơn. Cám ơn bạn lần nữa
 
Bạn dùng tạm:
Mã:
 Function Rut(ByVal A As String) As String
A = UCase(A)
With CreateObject("VBscript.Regexp")
    On Error Resume Next
    .Pattern = "(O(?!.*O)\w{0,100}\I)"
    .IgnoreCase = True
    Rut = .Execute(A)(0)
End With
     Rut = Len(Replace(Replace(Replace(Replace(Replace(Replace(Rut, "A", ""), "E", ""), "I", ""), "O", ""), "U", ""), " ", ""))
End Function
khi nào nghĩ ra cách ngắn hơn mình sẽ chuyển cho bạn. Mình nhắc bạn gửi nhiều dòng vì nhiều ý tưởng của bạn có thể mâu thuẫn với nhau. Bài này mình đếm phụ âm giữa hai nguyên âm o và i cuối cùng

Không hiểu do version excel hay sao mà nó toàn #value ấy. Mình đang dùng excel macos Phiền bạn quá, nếu bạn bận thì không sao đâu bạn :))
 

File đính kèm

  • Screen Shot 2015-11-16 at 21.47.50.jpg
    Screen Shot 2015-11-16 at 21.47.50.jpg
    22.6 KB · Đọc: 33
Lần chỉnh sửa cuối:
Chủ thớt muốn học thì phải biết tự sửa code lấy.
Hiện tại thì có vẻ muốn ngồi mát ăn bát vàng, lấy bài dọn sẵn A-Z về kiếm điểm.

Đó cũng là lý do tôi nói "cô giáo này có hơi khùng". Ra bài tập kiểu này chả dạy được học sinh chỗ nào cả. Chỉ cần biết 1 vài diễn đàn chuyên nghiệp là ăn điểm gọn ơ.
 
Không hiểu do version excel hay sao mà nó toàn #value ấy. Mình đang dùng excel macos Phiền bạn quá, nếu bạn bận thì không sao đâu bạn :))
Mình chuyển thành đuôi .exe cho bạn hi vọng được. Khi nào có file tối ưu hơn mình sẽ gửi riêng cho bạn.
 

File đính kèm

  • Rut.rar
    123.8 KB · Đọc: 9
Mình chuyển thành đuôi .exe cho bạn hi vọng được. Khi nào có file tối ưu hơn mình sẽ gửi riêng cho bạn.
Viết bài này là để biết chỗ nào cần trân trọng

- Nếu dùng Regex thì dùng mẫu "[AEIOU ]" và chỉ cần đếm số matches : soNguyenAm = rx.Excutre("corrporus").Count : ignorecase = true

Mã:
Public Function TIM(DL)
With CreateObject("vbscript.regexp")
.Global = True
.IgnoreCase = False
.Pattern = "[AEIOU]"
TIM = .Execute(UCase(DL)).Count
End With
End Function
Đề thứ hai khó hơn nhiều. Cô giáo nào ra bài này có hơi bị khùng.
- Dùng Regex thì mẫu là "[AEIOU][^AEIOU]+[AEIOU]". Lấy phần tử cuối cùng trong mảng kết quả, và bỏ đi ký tự đâu và cuối (vì kết quả sẽ là 1 chuỗi phụ âm kẹp giũa 2 nguyên âm)
Từ gợi ý này, đảo ngược chuỗi sẽ là xong
Mã:
Function Tach(ByVal A As String) As String
A = UCase(StrReverse(A))
With CreateObject("VBscript.Regexp")
.Global = True
.Pattern = "[AEIOU]"
If .Execute(A).Count > 1 Then Tach = .Execute(A)(1).firstindex - .Execute(A)(0).firstindex - 1
End With
End Function
---
Chỉ là trao đổi học thuật, không phải là với chủ thớt. Vì bài của chủ thớt chẳng có gì khó khăn cả.
Một cái ly nước đầy có lẽ sẽ không thể chứa thêm giọt nước nào nữa cả.
 
Chủ thớt muốn học thì phải biết tự sửa code lấy.
Hiện tại thì có vẻ muốn ngồi mát ăn bát vàng, lấy bài dọn sẵn A-Z về kiếm điểm.

Đó cũng là lý do tôi nói "cô giáo này có hơi khùng". Ra bài tập kiểu này chả dạy được học sinh chỗ nào cả. Chỉ cần biết 1 vài diễn đàn chuyên nghiệp là ăn điểm gọn ơ.
Bạn nói vậy mình cảm thấy rất buồn và có vẻ bạn không đọc kid hoặc không đọc những gì mình đã post ở trên. Có thể cho mình là ngồi mát ăn bát vàng cũng chẳng sao, nhưng ở trên mình đã nói là bài của mình phức tạp hơn, và 2 yêu cầu ở trên là cái mà mình không thể làm được nên mình mới nhớ người khác. Mình không phải hạng người mà tất cả mọi thứ đều phải đi nhờ vả, chẳng phải là mình đã nói là ai giúp đuợc mình thì tốt còn ai không giúp được mình thì thôi.
Thứ 2 điều cần nói ở đây là cô giáo mình là Giáo Sư giỏi nhất dạy môn Latin trường mình, và cái yêu cầu ở trên không phải hoàn toàn là đề của cô. Bạn có học chung với mình không, có được cô chỉ từng li từng tí không mà bạn bảo cô mình bị khùng. Điểm của mình không phải là thấp đến nỗi phải bức thiết đi năn nỉ để làm cái bài không thuộc chuyên ngành của mình, ở đây mình chỉ muốn chứng tỏ là sinh viên Việt Nam cũng cần cù, cũng chịu khó. Bạn có biết là mình phải dịch, rồi dùng phần mềm excel tiếng Nga để sữa lại nhũng code trên bằng hiểu biết cơ bản của mình không, cũng mấy tiênga đồng hồ ngồi mỏi mắt.
Thôi không than với bạn nữa, tóm lại là mình muốn nói, con người cũng có giới hạn, không phải cái gì cũng giỏi, việc bạn giúp mình để mình đạt điểm coi như giúp người khác, nó cũng chẳng thiệt hại gì cho bạn, ngoài trừ còn nhận được sự nệ phục của mình. Nhưng wua đây thì mìn chỉ thấy bạn khá trẻ con với việc đi chỉ trích người khác. Việc của mình với bạn tới đây có thế dừng được ròii.
 
@CongHoai:
Quyết định và đánh giá là do bạn nhưng mọi việc đều có tiến trình thời gian của nó.
Bạn xem lại thứ tự bài viết trong chủ đề này xem sao.
 
...
Từ gợi ý này, đảo ngược chuỗi sẽ là xong
....

Không cần phải đảo ngược chuỗi.

Mã:
Function LayPhuAmGiuaHaiNguyenAm(ByVal s As String) As String
[COLOR=#008000]' hàm lấy chuỗi phụ âm cuối cùng giữa 2 nguyên âm[/COLOR]
Const NGUYENAM = "aeiou" [COLOR=#008000]' bởi vì cái này sẽ lặp lại nhiều lần cho nên dùng const để dễ chỉnh sửa, nếu muốn gồm cả y thì chỉ việc cho vào đây
[/COLOR]With CreateObject("VBScript.RegExp")
    .Global = True
    .ignoreCase = True
    .Pattern = Replace("[COLOR=#0000ff][N][^N]+(?=[N])[/COLOR][COLOR=#a52a2a](?!.*[N][^N]+(?=[N]))[/COLOR]", "N", NGUYENAM) [COLOR=#008000]' thay const vào[/COLOR]
    If .test(s) Then LayPhuAmGiuaHaiNguyenAm = Mid(.Execute(s)(0), 2)
End With
End Function

Để ý, cái mẫu gồm 2 phần. Phần màu xanh là lấy phụ âm nằm giữa 2 nguyên âm. Phần màu nâu lặp lại phần màu xanh, thêm điều kiện "không", chủ ý của "negative lookahead". Mục đích của phần này bảo rằng: không có cái nào giống vậy đi theo sau -> như vậy theo lô gíc, tức là cái cuói cùng.

Sau khi match xong rồi thì dùng hàm Mid để loại ký tự đầu. Bởi vì cái mẫu này sẽ lấy cả ký tự nguyên âm dẫn đầu nó.

LayPhuAmGiuaHaiNguyenAm("abce") = "bc"
LayPhuAmGiuaHaiNguyenAm("abcef") = "bc"
LayPhuAmGiuaHaiNguyenAm("abcdef") = "bcd" (giữa a và e)
LayPhuAmGiuaHaiNguyenAm("axyzaeibcdef") = "bcd" (giữa i và e)
LayPhuAmGiuaHaiNguyenAm("axyzaeibcd") = "xyz" (giữa 2 ký tự a)

...
Chỉ là trao đổi học thuật,...

Thì đúng vậy. Trao đổi là chính. Thực sự tôi chỉ cần người sẵn sàng trao đổi thì tôi nói chuyện.
 
@chủ thớt:
Tôi là dân chuyên về dữ liệu và đồ án. Tôi chỉ cần nhìn đề bài thì biết mức độ khó của nó.
Bài này phải dân có kinh nghiệm về sử lý chuỗi (*) trong lập trình mới làm được. Không phải là loại đề của dân mới học code. Và nó chả liên quan gì đến việc học ngôn ngữ (trừ ngôn ngữ VBA). Vì vậy có thể nói thẳng cô giáo này không biết cách thử sức học sinh.

(*) tôi nói "sử lý chuỗi" trên nghĩa bao quát. Tức là muốn dùng các hàm chuỗi của VBA cũng được, không nhất thiết phải dùng RegEx. Tôi chỉ đề nghị cái mẫu cho các bạn thích học regex thôi. Rất tiếc là cái bạn kia (bài #30) quá cố chấp cho nên phân tích trật vấn đề.
 
@chủ thớt:
Tôi là dân chuyên về dữ liệu và đồ án. Tôi chỉ cần nhìn đề bài thì biết mức độ khó của nó.
Bài này phải dân có kinh nghiệm về sử lý chuỗi (*) trong lập trình mới làm được. Không phải là loại đề của dân mới học code. Và nó chả liên quan gì đến việc học ngôn ngữ (trừ ngôn ngữ VBA). Vì vậy có thể nói thẳng cô giáo này không biết cách thử sức học sinh.

(*) tôi nói "sử lý chuỗi" trên nghĩa bao quát. Tức là muốn dùng các hàm chuỗi của VBA cũng được, không nhất thiết phải dùng RegEx. Tôi chỉ đề nghị cái mẫu cho các bạn thích học regex thôi. Rất tiếc là cái bạn kia (bài #30) quá cố chấp cho nên phân tích trật vấn đề.
Hi chuyên môn của mình là lập trình mạch điện không liên quan đến lập trình chuỗi gì cả. Cho mình hỏi bạn VetMini thế lập trình excel này ứng cho công việc ngành nghề gì cụ thể không bạn, mình vẫn chưa hình dung ra.
 
Web KT
Back
Top Bottom