Cần anh/chị hướng dẫn chèn dấu "." lần lượt vào một chuỗi trong excel (1 người xem)

Người dùng đang xem chủ đề này

ducthinh90tn

Thành viên mới
Tham gia
9/12/15
Bài viết
4
Được thích
0
Chào các anh chị ạ, em có chuyện này muốn nhờ các anh/chị giúp đỡ
bây giờ ví dụ e có email như này: conghung02@gmail.com . Bây h e muốn tạo dấu chấm "." lần lượt chèn vào giữa các kí tự như sauc.onghung02@gmail.com , co.nghung02@gmail.com , con.ghung02@gmail.com .v.v..
c.o.nghung02@gmail.com , c.on.ghung02@gmail.com , c.ong.hung02@gmail.com v.v
...
đến c.o.n.g.h.u.n.g.0.2@gmail.com

em đang có việc cần gấp,anh chị nào biết làm dc hàm này chỉ giáo em với ah.Tks mọi người nhiều
 
Mình cho là chả thể nào công thức giải quyết được chuyện của bạn; Họa may bỡi VBA mà thôi!

Đã vậy thì fải nhờ ai đó chuyễn vô mục "Lập trình" thì . . . . .
 
Chào các anh chị ạ, em có chuyện này muốn nhờ các anh/chị giúp đỡ
bây giờ ví dụ e có email như này: conghung02@gmail.com . Bây h e muốn tạo dấu chấm "." lần lượt chèn vào giữa các kí tự như sauc.onghung02@gmail.com , co.nghung02@gmail.com , con.ghung02@gmail.com .v.v..
c.o.nghung02@gmail.com , c.on.ghung02@gmail.com , c.ong.hung02@gmail.com v.v
...
đến c.o.n.g.h.u.n.g.0.2@gmail.com

em đang có việc cần gấp,anh chị nào biết làm dc hàm này chỉ giáo em với ah.Tks mọi người nhiều
Có vẻ như muốn tạo mail rác thì phải!$@!!
 
Xem cái gì vậy bạn??? Chuyện mail rác hay không là việc của tác giả topic. Chúng ta đâu cần quan tâm...
Cái chúng tôi đang quan tâm là còm men của bạn tại Post1 #3 ấy...

tôi đã viết là
Đợi chủ topic xem mục đích làm gì có chính đáng và thực tế không, làm xong mà hại thì làm làm j.

Nên đợi đi đã, còn làm được thì chắc bạn và nhiều người khác cũng là được, và hiểu cách làm. Nhưng vì mail rác thì ta không nên tiếp tay.
 
Mình cho là chả thể nào công thức giải quyết được chuyện của bạn; Họa may bỡi VBA mà thôi!

Đã vậy thì fải nhờ ai đó chuyễn vô mục "Lập trình" thì . . . . .

Cái này "xử" nó bằng công thức cũng được mà "Lão Ca".
A1= abcdef@taolao.com
PHP:
B1=IF(MID(A1;COLUMNS($A:A)*2;1)="@";"";REPLACE(A1;COLUMNS($A:A)*2-1;1;MID(A1;COLUMNS($A:A)*2-1;1) & "."))
Copy sang ngang đến khi kết quả =""
 
Cái này "xử" nó bằng công thức cũng được mà "Lão Ca".
A1= abcdef@taolao.com
PHP:
B1=IF(MID(A1;COLUMNS($A:A)*2;1)="@";"";REPLACE(A1;COLUMNS($A:A)*2-1;1;MID(A1;COLUMNS($A:A)*2-1;1) & "."))
Copy sang ngang đến khi kết quả =""
Cái này phải dùng rất nhiều cột phụ hả bác? bao nhiêu ký tự thì sử dụng bấy nhiêu cột phụ chắc chết mất.
 
Tác giả đâu nói rõ là kết quả chung 1 Cell.
Nếu chung 1 ô kết quả thì "tèo". VBA thôi.
Em đoán là bác làm đúng theo yêu cầu của tác giả: mỗi ô một kết quả.
Vì đểm chung 1 cell thì chẳng có ý nghĩa và giá trị sử dụng gì cả.
 
Cái này "xử" nó bằng công thức cũng được mà "Lão Ca".
A1= abcdef@taolao.com
PHP:
B1=IF(MID(A1;COLUMNS($A:A)*2;1)="@";"";REPLACE(A1;COLUMNS($A:A)*2-1;1;MID(A1;COLUMNS($A:A)*2-1;1) & "."))
Copy sang ngang đến khi kết quả =""
Hình như công thức chưa tính hết các trường hợp yêu cầu của chủ thớt thì phải.
Theo như bài 1 thấy có ít nhất ~ 9 nhóm trường hợp
Nhóm 1 là có 1 dấu "." chạy từ sau ký tự thứ nhất tới sát ký tự trước @
Nhóm 2 là có 2 dấu "." cũng chạy như trên
Nhóm 3 là có 3 dấu "." cũng chạy như trên...
cho tới có 9 dấu "."
Chào các anh chị ạ, em có chuyện này muốn nhờ các anh/chị giúp đỡ
bây giờ ví dụ e có email như này: conghung02@gmail.com . Bây h e muốn tạo dấu chấm "." lần lượt chèn vào giữa các kí tự như sauc.onghung02@gmail.com , co.nghung02@gmail.com , con.ghung02@gmail.com .v.v..
c.o.nghung02@gmail.com , c.on.ghung02@gmail.com , c.ong.hung02@gmail.com v.v
...
đến c.o.n.g.h.u.n.g.0.2@gmail.com
em đang có việc cần gấp,anh chị nào biết làm dc hàm này chỉ giáo em với ah.Tks mọi người nhiều
Không thấy chủ thớt phản hồi nên đoán đại vậy.
Nếu đúng là thế thì vẫn rất muốn ppc0312 thể hiện 1 lần cho mở rộng tầm mắt

---
Chỉ là mượn bài của bác BaTê để có cơ hội tìm hiểu thêm công thức của ppc0312, không có ý gì khác.
 
Lần chỉnh sửa cuối:
Dạ,em tạo mail rác để khảo sát các bác ạ chứ ko có hại gì hết á :(
 
Tạo mail rác sao không dùng hàm RANDBETWEEN(65,90) tạo chữ cái ABC ngẫu nhiên sau đó ráp vào @gmail.com cho nhanh?
 
Ví dụ e để ô A1 là conghung90@gmail.com xong kéo 1 loạt ra dc những mail có dấu chấm lần lượt như thế tiêu đề ấy các bác.Sao cho nó ko lặp lại giống nhau là dc ạ.Còn về mục đích là e tạo nhiều mail để làm khảo sát thoi chứ ko có ý gây hại gì cả
 
Cái này "xử" nó bằng công thức cũng được mà "Lão Ca".
A1= abcdef@taolao.com
PHP:
B1=IF(MID(A1;COLUMNS($A:A)*2;1)="@";"";REPLACE(A1;COLUMNS($A:A)*2-1;1;MID(A1;COLUMNS($A:A)*2-1;1) & "."))
Copy sang ngang đến khi kết quả =""

Dẫy trước @TaoLao đó là 10 kí tự;

Vậy chú mày làm thử các đáp án có trong nớ 5 (năm) dấu chấm thử coi!?!
Như

A.B.C.D.E.FGHIJ@ . . . cho đến: ABCDE.F.G.H.I.J@
 
Cái này là lãng phí tài nguyên, tôi nghĩ không nên giúp.
 
Rất tiếc xin lỗi bạn, vì lý do:
Dạ,em tạo mail rác để khảo sát các bác ạ chứ ko có hại gì hết á :(
Nên tôi không thể giúp được.


Không phải "Nguy hiểm" mà là "Hết sức nguy hiểm"... Tôi & các Thành viên GPE hóng hồi sáng tới bây chừ...mà chưa được thưởng thức..ấy chứ...
a01.gif
a01.gif
a01.gif

Không nguy hiểm đâu có thể làm công thức ra đủ 9 nhóm trường hợp như HungQuoc49 phân tích ở đây, tất nhiên mỗi email tạo ra ở 1 cell riêng lẻ. Nhưng rất tiếc là không giúp được bạn ấy vì tôi không muốn bị mail rác. Riêng sms rác cũng mệt rui
Hình như công thức chưa tính hết các trường hợp yêu cầu của chủ thớt thì phải.
Theo như bài 1 thấy có ít nhất ~ 9 nhóm trường hợp
Nhóm 1 là có 1 dấu "." chạy từ sau ký tự thứ nhất tới sát ký tự trước @
Nhóm 2 là có 2 dấu "." cũng chạy như trên
Nhóm 3 là có 3 dấu "." cũng chạy như trên...
cho tới có 9 dấu "."

Không thấy chủ thớt phản hồi nên đoán đại vậy.
Nếu đúng là thế thì vẫn rất muốn ppc0312 thể hiện 1 lần cho mở rộng tầm mắt

---
Chỉ là mượn bài của bác BaTê để có cơ hội tìm hiểu thêm công thức của ppc0312, không có ý gì khác.

chính xác là 9 nhóm như người hỏi yêu cầu
Bây h e muốn tạo dấu chấm "." lần lượt chèn vào giữa các kí tự như sau
1)
c.onghung02@gmail.com , co.nghung02@gmail.com , con.ghung02@gmail.com .v.v..
2) c.o.nghung02@gmail.com , c.on.ghung02@gmail.com , c.ong.hung02@gmail.com v.v
...
đến
9)
c.o.n.g.h.u.n.g.0.2@gmail.com
 
Lần chỉnh sửa cuối:
Rất tiếc xin lỗi bạn, vì lý do:

Nên tôi không thể giúp được.




Không nguy hiểm đâu có thể làm công thức ra đủ 9 nhóm trường hợp như HungQuoc49 phân tích ở đây, tất nhiên mỗi email tạo ra ở 1 cell riêng lẻ. Nhưng rất tiếc là không giúp được bạn ấy vì tôi không muốn bị mail rác. Riêng sms rác cũng mệt rui
Thật là đáng tiếc khi không thể chiêm ngưỡng được công thức của bạn.
Có lẽ cũng nên phô diễn tí kỹ năng để khẳng định câu nói của mình.
Liệu bạn có thể ?
 
Thật là đáng tiếc khi không thể chiêm ngưỡng được công thức của bạn.
Có lẽ cũng nên phô diễn tí kỹ năng để khẳng định câu nói của mình.
Liệu bạn có thể ?

Không có gì cao siêu đâu, kỹ năng thường thường ấy mà: left, mid, và & , kết hợp linh động tính toán ra vị trí dấu "." với rows(..) ,columns(...) là được (nhờ 2 hàm này trải ra trên vùng bảng tính thì sẽ có kết quả). bật mí nữa thành không còn bí mật.
 
Không có gì cao siêu đâu, kỹ năng thường thường ấy mà: left, mid, và & , kết hợp linh động tính toán ra vị trí dấu "." với rows(..) ,columns(...) là được (nhờ 2 hàm này trải ra trên vùng bảng tính thì sẽ có kết quả). bật mí nữa thành không còn bí mật.
Thêm tí nữa cho nó vui: right(),int(),mod() cho bài này.
Xưa có "thuyết trăm voi", tưởng là xạo, giờ mới biết là thật.


 
Thêm tí nữa cho nó vui: right(),int(),mod() cho bài này.
Xưa có "thuyết trăm voi", tưởng là xạo, giờ mới biết là thật.

Nếu muốn thì bạn có thể mở chủ đề mới, với bài gần tương tự , không liên quan mail rác tôi sẽ đưa công thức lên (chỉ trường hợp không thấy nguy hại chung , còn thấy thì cũng không), còn ở chủ đề này thì dính đến mail rác nên không thể. Vì trăm voi hay nghìn voi thì cũng không thể ảnh hưởng rác cho cộng đồng được.
 
Lần chỉnh sửa cuối:
Nếu muốn thì bạn có thể mở chủ đề mới, với bài gần tương tự , không liên quan mail rác tôi sẽ đưa công thức lên (chỉ trường hợp không thấy nguy hại chung , còn thấy thì cũng không), còn ở chủ đề này thì dính đến mail rác nên không thể. Vì trăm voi hay nghìn voi thì cũng không thể ảnh hưởng rác cho cộng đồng được.
Bạn nói đến rác nhiều quá mà chẳng có thể hiện gì để chứng thực.
Với cá nhân tôi thì có lẽ bạn không thể giải quyết bài này bằng công thức.

Lập chủ đề mới có lẽ cũng chẳng có kết quả gì, mất công.
Nếu tôi sai thì bạn hãy chứng minh là mình đúng xem sao, với một bài công thức tương tự theo sở trường của bạn.
Liệu chứng minh được ?
 
Bạn nói đến rác nhiều quá mà chẳng có thể hiện gì để chứng thực.
Với cá nhân tôi thì có lẽ bạn không thể giải quyết bài này bằng công thức.

Lập chủ đề mới có lẽ cũng chẳng có kết quả gì, mất công.
Nếu tôi sai thì bạn hãy chứng minh là mình đúng xem sao, với một bài công thức tương tự theo sở trường của bạn.
Liệu chứng minh được ?

Rất tiếc tôi không cần chứng minh với bạn làm gì. Giúp cho người hỏi thì mới cần thiết. Nhưng không giúp được chủ topic vì lý do tôi đã nói.
 
Rất tiếc tôi không cần chứng minh với bạn làm gì. Giúp cho người hỏi thì mới cần thiết. Nhưng không giúp được chủ topic vì lý do tôi đã nói.
Thôi thì làm thử nhóm trường hợp có 1 dấu "."
Với 9 cái mail rác thì có lẽ cũng chẳng có gì là tội lỗi đối với > 6 tỉ người
Mã:
Public Sub ppc0312()
Dim Chuoi, Tam, kq(), i As Long

Chuoi = Split("conghung02@gmail.com", "@")(0)
i = (Len(Chuoi) - 1) * 2 + 1
ReDim Tam(1 To i), kq(1 To 65000, 1 To 1)

For i = 1 To Len(Chuoi)
Tam((i - 1) * 2 + 1) = Mid(Chuoi, i, 1)
Next i

For i = 1 To Len(Chuoi) - 1
Chuoi = Tam
Chuoi(i * 2) = "."
kq(i, 1) = Replace(Join(Chuoi), " ", "")
Next i

Sheet1.UsedRange.Clear
Sheet1.Range("A1").Resize(i, 1) = kq
End Sub
---
Nhờ bạn cho ý kiến để rộng đường hiểu biết
 
Các cụ đã bảo "Thùng rỗng thì kêu to " rồi mà....quả không sai phải không bạn?

To hay không, rỗng hay không thì cuối cùng là không khả năng làm được là rỗng thui.
Mỗi người một quan điểm với việc gây hại (xấu), tôi không thể không vì lợi ích chung, không thể tiếp tay cho hành động có nguy cơ phương hại cộng đồng. Ai khác, thích thì cứ làm, đừng suy lung tung.
 
Thôi bạn dẹp quách cái kiểu đạo đức "vì lợi ích chung"...."nguy cơ phương hại cộng đồng". Có cái công thức excel thôi mà...
Tôi thừa biết từ đầu là bạn chả biết tí gì hết...chẳng qua tham gia trả lời là muốn bạn hành đồng & lời nói của mình như thế nào ở GPE này thôi.
đã không biết thì nói không biết, còn bày đặt...làm ra vẻ ta đây...
NÓi túm lại: GPE không chấp người người nguy hiểm như bạn đâu...
Ngày xưa Các cụ có câu: "biết thì thưa thốt không biết thì dựa cột mà nghe"
Ngày nay Lớp trẻ nó lại có câu: "Ngu mà tỏ ra nguy hiểm"

Tuy hai câu nó không ăn nhậu gì với nhau hết...Nhưng kể ra dùng cũng được!!!

Thui dẹp luôn cái kiểu nói của bạn đi, dẹp đi
Tôi không thích giúp thì không thế thui, nói năng linh tinh. Không biết gì nhưng làm được là được, còn hơn cứ oai oái suy người khác mà thui. Dừng đi. rac mãi là rác mà thui.

Nhờ smod bỏ hoặc khoá cái chủ đề này đi. Mục đích rác thì không nên để.
 
Đúng là nên dừng lại đi các bạn!

Nói ít hiểu nhiều, mong các bạn cảm thông.
 
Khoan nói chuyện rải mail rác, và bỏ đi chuyện thổi phồng.
Nới trên cương vị giải thuật thì đây là mọt bài toán hóc búa (trừ phi có chỗ nào quá đơn giản mà tôi không thấy nổi). Bạn nào đã thử code chưa?

Trước mắt thì khuynh hướng code là viết 1 hàm rải dẩu chấm lần lượt sau từng ký tự. Hàm này sẽ gọi dệ quy nó để rải chỗ còn lại.
vd chuỗi "quasuchocbua12":
Hàm rải dấu chấm vào sau q, và tự đệ quy nó để tính tiếp "uasuchocbua", cho ra dạng q.xxxxxxxx
Kế đó, nó rài dâu chấm sau u, và tự đệ quy nó để tính tiếp "asuchocbua", cho ra dạng qu.xxxxxxx
Tiếp tục cho đến ký tự cuối là 2

(*) đang suy nghĩ xem có cách nào rải bom (rải tùm lum) dấu cách rồi dùng hàm trim?
 
Nếu đề bài cho caigido@yahoo.com mà kết quả 2 kiểu là:
1) c.aigido@yahoo.com (1 cell); ca.igido@yahoo.com (1 cell); cai.gido@yahoo.com (1 cell).......caigid.o@yahoo.com (1 cell)
2) c.aigido@yahoo.com (1 cell); c.a.igido@yahoo.com (1 cell); c.a.i.gido@yahoo.com (1 cell).....c.a.i.g.i.d.o@yahoo.com (1 cell)
Thì dùng công thức hay code gì cũng.....đơn giản như nhau thôi
Híc
Như vậy chưa đủ đâu anh, còn cai.gi.do@yahoo.com (và những trường hợp khác) nữa.
 
Thôi thì làm thử nhóm trường hợp có 1 dấu "."
Với 9 cái mail rác thì có lẽ cũng chẳng có gì là tội lỗi đối với > 6 tỉ người
Mã:
Public Sub ppc0312()
Dim Chuoi, Tam, kq(), i As Long

Chuoi = Split("conghung02@gmail.com", "@")(0)
i = (Len(Chuoi) - 1) * 2 + 1
ReDim Tam(1 To i), kq(1 To 65000, 1 To 1)

For i = 1 To Len(Chuoi)
Tam((i - 1) * 2 + 1) = Mid(Chuoi, i, 1)
Next i

For i = 1 To Len(Chuoi) - 1
Chuoi = Tam
Chuoi(i * 2) = "."
kq(i, 1) = Replace(Join(Chuoi), " ", "")
Next i

Sheet1.UsedRange.Clear
Sheet1.Range("A1").Resize(i, 1) = kq
End Sub
---
Nhờ bạn cho ý kiến để rộng đường hiểu biết
Làm trường hợp của anh theo cách khác:
Mã:
Public Sub mail()
Dim i As Long, j As Long, mau As String, vt As Long, kq(), tmp As String
tmp = Sheet1.Range("A2")
vt = InStr(1, tmp, "@") - 1
mau = Left(tmp, vt)
ReDim kq(1 To vt, 1 To 1)
For i = 1 To vt
kq(i, 1) = Left(mau, i) & "." & Right(mau, vt - i) & "@gmail.com"
Next i
Sheet1.Range("B2").Resize(vt, 1) = kq
End Sub
Giả sử chuỗi mẫu đang nằm ở ô A2
 
Thôi bạn dẹp quách cái kiểu đạo đức "vì lợi ích chung"...."nguy cơ phương hại cộng đồng". Có cái công thức excel thôi mà...
Tôi thừa biết từ đầu là bạn chả biết tí gì hết...chẳng qua tham gia trả lời là muốn bạn hành đồng & lời nói của mình như thế nào ở GPE này thôi.
đã không biết thì nói không biết, còn bày đặt...làm ra vẻ ta đây...
NÓi túm lại: GPE không chấp người người nguy hiểm như bạn đâu...
Ngày xưa Các cụ có câu: "biết thì thưa thốt không biết thì dựa cột mà nghe"
Ngày nay Lớp trẻ nó lại có câu: "Ngu mà tỏ ra nguy hiểm"

Tuy hai câu nó không ăn nhậu gì với nhau hết...Nhưng kể ra dùng cũng được!!!

Bạn nói vậy không được đâu nha. Bởi người ta có nói rằng:
Nếu muốn thì bạn có thể mở chủ đề mới, với bài gần tương tự , không liên quan mail rác tôi sẽ đưa công thức lên (chỉ trường hợp không thấy nguy hại chung , còn thấy thì cũng không), còn ở chủ đề này thì dính đến mail rác nên không thể. Vì trăm voi hay nghìn voi thì cũng không thể ảnh hưởng rác cho cộng đồng được.
Vậy, bạn cứ làm hài lòng người ta bằng cách mở topic mới, đặt vấn đề tương tự nhưng không liên quan gì đến việc tạo mail rác, rồi người ta sẽ biểu diễn cho bạn thấy
Lưu ý cách đặt vấn đề sao cho không "phạm" vào chỗ màu đỏ là được!
 
Khoan nói chuyện rải mail rác, và bỏ đi chuyện thổi phồng.
Nới trên cương vị giải thuật thì đây là mọt bài toán hóc búa (trừ phi có chỗ nào quá đơn giản mà tôi không thấy nổi). Bạn nào đã thử code chưa?

Trước mắt thì khuynh hướng code là viết 1 hàm rải dẩu chấm lần lượt sau từng ký tự. Hàm này sẽ gọi dệ quy nó để rải chỗ còn lại.
vd chuỗi "quasuchocbua12":
Hàm rải dấu chấm vào sau q, và tự đệ quy nó để tính tiếp "uasuchocbua", cho ra dạng q.xxxxxxxx
Kế đó, nó rài dâu chấm sau u, và tự đệ quy nó để tính tiếp "asuchocbua", cho ra dạng qu.xxxxxxx
Tiếp tục cho đến ký tự cuối là 2

(*) đang suy nghĩ xem có cách nào rải bom (rải tùm lum) dấu cách rồi dùng hàm trim?

à há , lâu rồi chưa có ai đố anh Vetmini phải không ?
mời anh Vetmini cho biết
Đếm tất cả mọi trường hợp chèn dấu chấm vào chuỗi "quasuchocbua12"
từ "q.uasuchocbua12" đến "q.u.a.s.u.c.h.o.c.b.u.a.1.2" sẽ là bao nhiêu trường hợp ? (chỉ hỏi về tổng số) xin mời .
 
à há , lâu rồi chưa có ai đố anh Vetmini phải không ?
mời anh Vetmini cho biết
Đếm tất cả mọi trường hợp chèn dấu chấm vào chuỗi "quasuchocbua12"
từ "q.uasuchocbua12" đến "q.u.a.s.u.c.h.o.c.b.u.a.1.2" sẽ là bao nhiêu trường hợp ? (chỉ hỏi về tổng số) xin mời .
Ké chút cho xôm, kết quả chạy thử là 8191 thì phải.
 
à há , lâu rồi chưa có ai đố anh Vetmini phải không ?
mời anh Vetmini cho biết
Đếm tất cả mọi trường hợp chèn dấu chấm vào chuỗi "quasuchocbua12"
từ "q.uasuchocbua12" đến "q.u.a.s.u.c.h.o.c.b.u.a.1.2" sẽ là bao nhiêu trường hợp ? (chỉ hỏi về tổng số) xin mời .

Cái này thì dễ, chỉ là toán thuần tuý. Cứ giữa 2 ký tự thì có 2 trường hợp, có dấu chấm và không có dấu chấm. Như vậy nếu chuỗi có n ký tự thì có tất cả 2^(n-1) kiểu.

=== đính chính:
Uả quên, theo đúng toán nhị phân, n bit thì trị lớn nhất là 2^n-1, như vậy 2^n kiểu mới đúng chớ.
 
Lần chỉnh sửa cuối:
Sẵn đã gợi ý thì nhắc luôn. Bài này nếu đệ quy thì phải dùng phi tuyến, khó bỏ bố.
Cách dễ hơn là dùng dãy nhị phân, như tôi đã phân tích ở bài #49
 
Sẵn đã gợi ý thì nhắc luôn. Bài này nếu đệ quy thì phải dùng phi tuyến, khó bỏ bố.
Cách dễ hơn là dùng dãy nhị phân, như tôi đã phân tích ở bài #49
Đúng là hiện tại dùng chuỗi nhị phân thì tìm được 8191 mẫu + thêm 1 mẫu gốc không có dấu chấm nào cả thì ra 8192 = 2^(n-1) như bài 49 có nói.
Số lượng kết quả có thể thừa thiếu, nhưng không quan trọng lắm. Việc dùng nhị phân cho bài này có lẽ cũng tàm tạm hiểu được 1 phần.

Nhờ VetMiNi có thể gợi ý cụ thể thêm tí chút về đệ quy phi tuyến để có thể vận dụng cho các trường hợp khác.
Cảm ơn rất nhiều!
---
( Khó cũng được, lâu lâu gặm tí xương cho nó chắc cái răng --=0)
 
Lần chỉnh sửa cuối:
Đúng là hiện tại dùng chuỗi nhị phân thì tìm được 8191 mẫu + thêm 1 mẫu gốc không có dấu chấm nào cả thì ra 8192 = 2^(n-1) như bài 49 có nói.
Số lượng kết quả có thể thừa thiếu, nhưng không quan trọng lắm. Việc dùng nhị phân cho bài này có lẽ cũng tàm tạm hiểu được 1 phần.

Nhờ VetMiNi có thể gợi ý cụ thể thêm tí chút về đệ quy phi tuyến để có thể vận dụng cho các trường hợp khác.
Cảm ơn rất nhiều!
---
( Khó cũng được, lâu lâu gặm tí xương cho nó chắc cái răng --=0)
Anh tham khảo link này xem:
http://vuongwp.blogspot.com/2014/05/code-c-e-quy-phi-tuyen.html
 
Đệ quy: thú thật mình chỉ biết nhìn dạng bài để suy thuật toán thôi. Chứ cái này hướng đi thì dễ, nhưng thực hành thì nó liên quan đến cọng kết quả vào chuỗi nên rất khó. Phải ngồi vẽ đường (trên giấy trắng mực đen đàng hoàng) cả buổi mới hy vọng.

Bài này theo tôi thì các bạn thử dùng dãy nhị phân để giải dễ hơn. Lưu ý: số long chỉ có 32 bits, bỏ đi bit đánh dấu âm, chỉ còn lại 31 bits, tức là chỉ làm được chuỗi 32 ký tự. Muốn làm dài hơn thì phải thêm thuật toán "very long integer", dùng collection hoặc dùng byte array.
 
Vì topic liên quan nhiều vấn đề nhạy cảm , tôi không tổng quát bài toán , chỉ giải quyết chuỗi của anh Vetmini thôi

xét trường hợp cần chèn 2 dấu chấm
Chuỗi "quasuchocbua12" có 14 kí tự , vậy sẽ có 13 khe để dí dấu chấm vào
vị trí của 2 dấu chấm này là 1 con số trong đoạn [1,13] , ta cần tính tất cả mọi bộ 2 số (a,b) mà a và b nằm trong đoạn [1,3]
vậy chả khác nào biểu ta đi tìm số tổ hợp chập 2 của 13
tôi viết 1 thủ tục tạo danh sách các tổ hợp chập k của 13
Mã:
Public Sub createCBlist(maxI As Byte, ByVal i As Byte, ByVal r As Byte, coll As Collection, arr)
If i <= maxI Then
    Dim x As Byte
    For x = r + 1 To 13 Step 1
        arr(i) = x
        createCBlist maxI, i + 1, x, coll, arr
    Next
Else
    coll.Add Join(arr, ";")
End If
End Sub


thủ tục chính
Mã:
Public Sub hello2()
Dim coll As Collection, r As Long, i As Byte, arr, dArr
For i = 1 To 13 Step 1
    ReDim arr(1 To i)
    Set coll = New Collection
    createCBlist i, 1, 0, coll, arr
    ReDim dArr(1 To coll.Count, 1 To 1)
    For r = 1 To coll.Count Step 1
        dArr(r, 1) = coll(r)
    Next
    Sheet1.Range("H1").Offset(, i).Resize(coll.Count).Value = dArr
Next
End Sub

kết quả là ra được 1 mớ tả phí lù nằm rải rác từ cột I tới cột U
muốn có được chuỗi thật thì phải làm công đoạn chuyển đổi cái mớ nhìn thấy thành chuỗi thật
ví dụ "1;3" chuyển thành
q.ua.suchocbua12 , "1;2;3;6" chuyển thành q.u.a.suc.hocbua12 , ......
đấy là ngu kiến của tôi , bạn nào có cách hay hơn để chèn dấu chấm cũng mong nêu ý kiến để tôi học tập . cảm ơn .


 
Như bài 54 có nói, vì đề tài không bình thường nên thử tham gia thuật toán cho vui.
Chuỗi quasuchocbua12 có 14 ký tự, nếu chèn toàn bộ dấu "." sẽ thành "q.u.a.s.u.c.h.o.c.b.u.a.1.2" là 27 ký tự. Nếu tính từ chữ "q", tất cả các dấu "." đều nằm tại các vị trí chẵn.

Tạo một mảng A 1 chiều, có 27 phần tử, các vị trí lẻ là các ký tự của mail trên, chẵn là rỗng.
Tạo một loạt chuỗi nhị phân có độ dài là 13 ký tự, từ 0000000000001 ---> 1111111111111
Quét chuỗi nhị phân, tại vị trí =1 ---> A(vị trí *2)="."
replace() và join() mảng A

Chỉ là một cách xử lý, hy vọng được xem những hướng giải quyết khác.
 
Lần chỉnh sửa cuối:
Như bài 54 có nói, vì đề tài không bình thường nên thử tham gia thuật toán cho vui.
Chuỗi quasuchocbua12 có 14 ký tự, nếu chèn toàn bộ dấu "." sẽ thành "q.u.a.s.u.c.h.o.c.b.u.a.1.2" là 27 ký tự. Nếu tính từ chữ "q", tất cả các dấu "." đều nằm tại các vị trí chẵn.

Tạo một mảng A 1 chiều, có 27 phần tử, các vị trí lẻ là các ký tự của mail trên, chẵn là rỗng.
Tạo một loạt chuỗi nhị phân có độ dài là 13 ký tự, từ 0000000000001 ---> 1111111111111
Quét chuỗi nhị phân, tại vị trí =1 ---> A(vị trí *2)="."
replace() và join() mảng A

Chỉ là một cách xử lý, hy vọng được xem những hướng giải quyết khác.

Theo thuật toán chuỗi nhị phân thì bắt đầu như vậy là gần lắm rồi. Chỉ có điểm: riêng bài này thì không cần phải tạo chuỗi nhị phân riêng? Có thể chèn chuỗi vào thẳng trong chuỗi kia, các vị trí chẵn. Lúc ấy, ta có thể diễn đạt 1 là dấu chấm và 0 là trống.

Tiếp tục thử thuật toán quét chuỗi nhị phân xem.

Chú thích: nếu giới hạn chỉ 32 ký tự thì có thể dùng thuật toán quét theo số nguyên Long. Tạo một biến Long, quét từ 0 đến 2^n. Dùng phép toán tử And để biết bit nào 1 và bit nào 0.
 
Lần chỉnh sửa cuối:
Có bạn nào muốn thử bài toán quét chuỗi nhị phân?

Gợi ý:
Nguyên tắc số nhị phân: 2 ^x là số có bit thứ x+1 là 1, các bit khác là 0
Vì toán tử And trong VBA là toán tử bit And. Suy ra nếu ta And một số với 2 ^ (i-1) thì ta sẽ xét được bit thứ i của số có là 1 hay 0

Ví dụ có n vị trí cần đặt ( n = len(chuỗi) - 1 )

' trong code sau, biến SO tượng trưng cho tất cả các trường hợp dấu chấm
' biến VT dùng đế đọc dọc thoe SO bvaf xét xem bit nào 0 vào bit nào là 1

For SO = 0 to 2 ^ n - 1 ' quét số từ 0 (không có chấm nào) đến 2^n-1 (đủ số chấm)
for VT = 1 to n ' vòng lặp này xét các bits của SO ở vị trí từ 1 đến n
If SO And 2 ^ (VT-1) Then
' bit set, đặt dấu chấm
Else
' bit off, đặt trống
End If
next VT
Next SO
 
Thử làm theo thuật toán đệ quy:
PHP:
Sub Test()
Dim iKQ As Long, KQ(1 To 1048576, 1 To 1)
DeQuy Application.Name, 0, KQ, iKQ
Range("A1:A" & iKQ).Value = KQ
End Sub
PHP:
Private Function DeQuy(ByVal Ch As String, ByVal VTri As Long, ByRef KQ, ByRef iKQ As Long)
Dim i As Long
iKQ = iKQ + 1:  KQ(iKQ, 1) = Ch
For i = VTri + 1 To Len(Ch) - 1
    DeQuy Left(Ch, i) & ChrW(64) & Mid(Ch, i + 1), i + 1, KQ, iKQ
Next
End Function
 
Chuỗi nhị phân. Triong đây có 2 subs. Sub thứ nhất (NhetCham) nhái toán tử tăng 1 của lập trình để thực hiện các mẫu con số. Sub thứ hai (NhetCham2) dùng thẳng số đếm, cộng phép tính xét bit.

Lưu ý: code này tôi viết theo trường phái code của tôi, tách rời thuật toán ra khỏi cách chứa và hiển thị dữ liệu. Nói theo cách khác, bài giải gọi hàm con để chứa kết quả, và gọi hàm con khác để hiển thị kết quả. Kỹ thuật này tách biệt thuậ toán ra khỏi các vấn đề linh tinh.
Lợi điểm trước mắt là khi con số lên rất lớn (2^31 lên đến trên 2 tỷ), ta có thể sửa các hàm con để chứa và hiển thị kết quả theo cách khác mà không hề đụng chạm (hoặc chạm rất ít) vào thuật toán căn bản.

Mã:
' note that this code only demonsatrates the technique
' therefore, it only crunches up the results
' handling of results is left to the three peripheral subs which can be easily modified to suit user's need
' I normally avoid using global variables.
' However, in this case hey present the best way to handle the use of peripheral subs

Private resArr() As String, numEl As Long

Sub NhetCham(ByVal s As String)
Dim sArr() As String
Dim ln As Integer, el As Integer
PrepareResultset
AddToResultset s ' first entry, the string itself, no dots
ln = Len(s)
If ln <= 1 Then GoTo Wrap_Up
ReDim sArr(1 To ln * 2 - 1)
For el = 1 To ln ' copy each character of string to odd position in array
sArr(el * 2 - 1) = Mid(s, el, 1)
Next el
ln = UBound(sArr) - 1 ' ln is now the last even position in array
Do ' start building the rest of the resultset
' the following code simulates the action of adding 1 to an integer
' that is, 1+0 is 1; 1+1 is 0 plus 1 carried to the next digit
' simulation procedure: starting from left most, inspect the element
' if the emement is a dot, turn it to a blank and repeat with the next element
' if the elenemt is a blank, turn it to a dot and exit
    el = 0
    Do
        el = el + 2 ' our values are even-positioned elements of the array
        If el > ln Then Exit Do ' can not carry any further
        If sArr(el) = "" Then
            sArr(el) = "."
            Exit Do
        End If
        sArr(el) = ""
    Loop
    If el > ln Then Exit Do ' no more
    AddToResultset Join(sArr, "") ' add current result
Loop

Wrap_Up:
PresentResultset
End Sub

Sub NhetCham2(ByVal s As String)
Dim sArr() As String
Dim ln As Integer, el As Integer, num As Long
PrepareResultset
ln = Len(s)
If ln < 1 Then GoTo Wrap_Up
ReDim sArr(1 To ln * 2 - 1)
For el = 1 To ln ' copy each character of string to odd position in array
sArr(el * 2 - 1) = Mid(s, el, 1)
Next el
For num = 0 To 2 ^ (ln - 1) - 1
    For el = 0 To ln - 2
        sArr((el + 1) * 2) = IIf(num And 2 ^ el, ".", "")
    Next el
    AddToResultset Join(sArr, "") ' add current result
Next num
Wrap_Up:
PresentResultset
End Sub

Sub PrepareResultset()
numEl = 0
ReDim resArr(1 To 60000)
End Sub

Sub AddToResultset(ByVal s As String)
numEl = numEl + 1
resArr(numEl) = s
End Sub

Sub PresentResultset()
Dim i As Long
For i = 1 To numEl
Range("A" & i) = resArr(i)
Next i
End Sub
 

Bài viết mới nhất

Back
Top Bottom