Đố chơi đầu năm

Liên hệ QC

VetMini

Ăn cùng góc phố
Tham gia
21/12/12
Bài viết
16,947
Được thích
23,329
Bài này khá dễ. Tôi chỉ đưa ra cho các con gà chiến chai mặt có dịp chỉ dẫn các gà tơ về nghệ thuật code.

Điều kiện: không dùng các hàm có sẵn trong VBA hoặc WorkSheet.

Cho ba con số nguyên ngay, thang, nam. Viết code VBA thử xét tính cách hợp lệ của ba con số này khi đi với nhau.
(hàm Date của WorkSheet nhận 2021, 50, 50 và đổi nó thành ngày đâu đó trong năm 2025. Nhưng hàm của bạn phải xét là nó không hợp lệ)

Sau khi viết xong, bạn có thể thêm ý kiến nếu dùng VBA hay WorkSheet function thì code của bạn như thế này...

Lưu ý:
- bạn nào thích Google Sheets thì viết Apps Code, hay JavaScript cũng được.
- viết theo Delphi, hay Python thì tôi cũng ủng hộ tuốt.
- bài này tôi đoạt giải viết code C. Nếu bạn viết bằng ngôn ngữ khác thì có dịp chúng ta so sánh.
 
Mùa dịch không có chỗ đi chơi, thôi thì ...
Mã:
Function ngaythang(ByVal ngay As Long, ByVal thang As Long, ByVal nam As Long) As Boolean
    If thang < 0 Or thang > 12 Or nam < 1900 Or nam > 2100 Then Exit Function
    Select Case thang
        Case 2
            ngaythang = ngay <= 28 - (nam Mod 4 = 0) And ((nam Mod 100 <> 0) Or (nam Mod 400 = 0))
        Case 1, 3, 5, 7, 8, 10, 12:
            ngaythang = ngay <= 31
        Case Else
            ngaythang = ngay <= 30
    End Select
End Function
 
Mùa dịch không có chỗ đi chơi, thôi thì ...
Mã:
    If thang < 0 Or thang > 12 Or nam < 1900 Or nam > 2100 Then Exit Function
Tôi cho rằng mọi năm <> 0 đều là hợp lệ chứ anh nhỉ? Kể cả năm trước công nguyên (số âm), trừ khi xa quá thì chưa có lịch hoặc chưa có chữ viết, hoặc tương lai tận thế đánh số lại như phim "tận thế 2012".
 
Tôi cho rằng mọi năm <> 0 đều là hợp lệ chứ anh nhỉ? Kể cả năm trước công nguyên (số âm), trừ khi xa quá thì chưa có lịch hoặc chưa có chữ viết, hoặc tương lai tận thế đánh số lại như phim "tận thế 2012".
Năm của tôi chỉ giới hạn thế thôi. Chừa cho người khác cơ hội nữa chứ anh.

Cho code Delphi/Object Pascal đi bác ơi. :p
Thôi để cho người khác. Delphi đời mới hơn Delphi5 thì tôi không muốn nghiên cứu, rất có thể có nhiều hàm "độc lạ", mà tôi có cài Delphi đâu. Còn Delphi5 thì code tôi vừa đưa ra ở đoạn xét năm nhuận chính là code của Delphi 200%. - hàm IsLeapYear :D
 
Lần chỉnh sửa cuối:
Khi làm bài này (C) thì tôi không viết code trực tiếp xét ngày tháng năm.
Tôi viết một hàm con tính số ngày trong tháng, và so sánh với ngày cần xét.

Code JavaScript (cũng gần như C thôi)

PHP:
function SoNgayTrongThang(thang, nam) {
// fucntion tính số ngày trong tháng (thang), thuộc về năm (nam)
// nếu tháng không hợp lệ (không trong 1-12), hoặc năm <0 thì hàm trả về 0
if (nam < 0) return 0;
switch (thang) {
  case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31;
  case 4: case 6: case 9: case 11: return 30;
  case 2: return ((nam % 4 != 0 || nam % 100 == 0 && nam % 400 != 0)? 28 : 29);
}
return 0;
}

var ng = 30, th = 15, nm = 2021;
console.log((ng <= 0 || ng > SoNgayTrongThang(th,nm))? "không hợp lệ" : "hợp lệ");

Lưu ý cho các bạn mới tập làm quen với Select Case:
So sánh code này với code bài #2 sẽ thấy Select Case của VBA hoạt động khác hẳn switch của JavaScript.[/code]
 
Ăn uống no nê rồi, đi chơi cũng chán rồi. Nào ta cùng nhau thư giãn chút.

Có anh A, ta coi anh A như là 1 điểm trong hình học. Anh A hôm qua đi thăm bạn bè, đi chơi đi nhậu, tẩm quất khắp nơi. Tổng cộng về tới nhà thì anh A đã đi trong ngày một đoạn đường dài bằng 2*k (mét, cm - không quan trọng đơn vị tính.). Chứng minh rằng trong ngày hôm qua anh A không đi ra khỏi một hình tròn nào đấy có đường kính k.
 
... Chứng minh rằng trong ngày hôm qua anh A không đi ra khỏi một hình tròn nào đấy có đường kính k.

Đoán được. Nhưng chứng minh thì chưa tìm được hướng đi.
Cứ lẩn quẩn mãi ở chỗ bất đẳng thức tam giác - tổng hai cạnh luôn luôn lớn hơn cạnh thứ ba. Cõ lẽ đi trật đường?
 
Đoán được. Nhưng chứng minh thì chưa tìm được hướng đi.
Cứ lẩn quẩn mãi ở chỗ bất đẳng thức tam giác - tổng hai cạnh luôn luôn lớn hơn cạnh thứ ba. Cõ lẽ đi trật đường?
:D Nếu nối đỉnh với trung điểm cạnh thứ ba rồi kéo dài thêm một đoạn bằng trung tuyến thì tổng 2 cạnh kia sẽ được biểu diễn như thế nào?
 
:D Nếu nối đỉnh với trung điểm cạnh thứ ba rồi kéo dài thêm một đoạn bằng trung tuyến thì tổng 2 cạnh kia sẽ được biểu diễn như thế nào?
Đầu đoạn nói ấy sẽ là một góc hình bình hành. Chuyển tam giác sang phần thứ hai của hình bình hành. Ta được tam giác khác, với hai cạnh bằng tam giác cũ, và cạnh thứ ba là hai đoạn nối kia. Tiếp tục áp dụng bất đẳng thức, tổng hai cạnh dài hơn cả hai đoạn nối kia. Như vậy, tổng hai cạnh lớn hơn hai lần trung tuyến.
Từ đó đi ra vòng tròn thì tôi bí. :(
 
Đầu đoạn nói ấy sẽ là một góc hình bình hành. Chuyển tam giác sang phần thứ hai của hình bình hành. Ta được tam giác khác, với hai cạnh bằng tam giác cũ, và cạnh thứ ba là hai đoạn nối kia. Tiếp tục áp dụng bất đẳng thức, tổng hai cạnh dài hơn cả hai đoạn nối kia. Như vậy, tổng hai cạnh lớn hơn hai lần trung tuyến.
Từ đó đi ra vòng tròn thì tôi bí. :(
Khoảng cách từ đỉnh tới trung điểm của cạnh thứ ba so với k là như thế nào? Nói cách khác trung tuyến so với k là như thế nào?

Nếu bác xác định chính xác cái mà bác gọi là "cạnh thứ ba" thì bác đã có cốc nước đầy. Chỉ cần 1 giọt nhỏ nữa là sẽ có nước tràn ly.
 
Lần chỉnh sửa cuối:
Khoảng cách từ đỉnh tới trung điểm của cạnh thứ ba so với k là như thế nào? Nói cách khác trung tuyến so với k là như thế nào?

Nếu bác xác định chính xác cái mà bác gọi là "cạnh thứ ba" thì bác đã có cốc nước đầy. Chỉ cần 1 giọt nhỏ nữa là sẽ có nước tràn ly.
Tôi tưởng tượng, sau đó thử vẽ ra giấy thì thấy được cái đường chéo hình bình hành. Dùng đường chéo lớn của hình bìnhn hành, chuyển sang chữ nhật thì biết được cái góc thức nhất (đường đi) bắt buộc phải nằm trong vòng tròn tiếp xúc hình chữ nhật.
Tuy nhiên, moi óc hoài mà không nhớ nổi cái định luật nào giản dị hơn để chứng minh.
 
Tôi tưởng tượng, sau đó thử vẽ ra giấy thì thấy được cái đường chéo hình bình hành. Dùng đường chéo lớn của hình bìnhn hành, chuyển sang chữ nhật thì biết được cái góc thức nhất (đường đi) bắt buộc phải nằm trong vòng tròn tiếp xúc hình chữ nhật.
Tuy nhiên, moi óc hoài mà không nhớ nổi cái định luật nào giản dị hơn để chứng minh.
Tôi không hiểu bác xét hình chữ nhật nào và góc nào để làm gì.

Cái mà bác gọi là đường chéo lớn nó có độ dài bằng 2 đường trung tuyến tới cạnh thứ ba. Nếu tôi và bác cùng nghĩ tới 1 cạnh thứ ba thì có nghĩa là điểm C bất kỳ trên đường gấp khúc khép kín - lộ trình của anh A cách điểm cố định - trung điểm cạnh thứ ba một khoảng bằng trung tuyến xuống cạnh thứ ba. Nếu chứng minh được trung tuyến đó LUÔN NHỎ HƠN HOẶC BẰNG k/2 thì có nghĩa là điểm C phải nằm trong đường tròn có bán kính là k/2, tức đường kính k.

Tóm lại bài toán thực chất là: "Hãy chứng minh là khoảng cách từ một điểm bất kỳ của lộ trình (đường gấp khúc khép kín) luôn cách một điểm O cố định nào đó một khoảng nhỏ hơn hoặc bằng k/2"
 
Ngày Xuân ngồi nhàn dỗi, xin góp vui một bài toán: Lúc 12 giờ đêm 3 kim (giờ, phút, giây) của đồng hồ có kim trùng kít lên nhau ở điểm 12. Hỏi bao nhiêu lâu nữa thì 3 kim lại trùng kít lên nhau?
Tôi đã giải được bài này bằng đại số (nhưng là hồi còn học phổ thông-cách đây đã hơn 50 năm), giờ không thể nhớ được cách giải và làm mãi mà không ra.
Mong anh chị em ghé xem cho lời giải. Nếu bằng VBA thì cũng cho luôn giải thuật.
Trân trọng.
 
Ngày Xuân ngồi nhàn dỗi, xin góp vui một bài toán: Lúc 12 giờ đêm 3 kim (giờ, phút, giây) của đồng hồ có kim trùng kít lên nhau ở điểm 12. Hỏi bao nhiêu lâu nữa thì 3 kim lại trùng kít lên nhau?
Chỉ là bài toán tốc độ và rượt đuổi thôi mà. Khác toán lớp 5 ở chỗ đây là tốc độ góc.
 
Chỉ là bài toán tốc độ và rượt đuổi thôi mà. Khác toán lớp 5 ở chỗ đây là tốc độ góc.
Vâng, chỉ là bài toán tốc độ và dượt đuổi nhưng các kim nó chạy vòng tròn. Tôi không còn nhớ nổi cách giải mà chỉ nhớ máng là hình như nó có đến 11 nghiệm.
Nếu anh đã có lời giải bằng đại số hoặc bằng VBA thì cho tôi xin nhé.
 
Ngày Xuân ngồi nhàn dỗi, xin góp vui một bài toán: Lúc 12 giờ đêm 3 kim (giờ, phút, giây) của đồng hồ có kim trùng kít lên nhau ở điểm 12. Hỏi bao nhiêu lâu nữa thì 3 kim lại trùng kít lên nhau?
Tôi đã giải được bài này bằng đại số (nhưng là hồi còn học phổ thông-cách đây đã hơn 50 năm), giờ không thể nhớ được cách giải và làm mãi mà không ra.
Mong anh chị em ghé xem cho lời giải. Nếu bằng VBA thì cũng cho luôn giải thuật.
Trân trọng.
Trước tiên không cần tra tấn tôi cũng khai là chưa suy nghĩ sâu, và rất có thể các kết luận không chính xác.

Trước hết ta thấy là muộn nhất là sau 12 tiếng 3 kim lại gặp nhau. Vậy khoảng cách giữa 2 lần liên tiếp mà 3 kim gặp nhau <= 12 tiếng.

Trên đồng hồ cứ 1 tiếng có 5 "nấc" (vạch kẻ). Tức mỗi vòng có 60 "nấc".

Ta coi là ở thời điểm 12:00 thì kim giờ ở trước kim phút 60 nấc và kim phút đuổi theo kim giờ. Trong 12 phút kim phút đi được 12 nấc, kim giờ đi được 1 nấc. Tức nếu cự li giữa 2 kim là 11 nấc thì kim phút đuổi kịp kim giờ sau 12 phút. Vậy cự li 60 nấc thì kim phút mất 60*12/11 phút = 12/11 giờ để đuổi kịp kim giờ. Tóm lại cứ 12/11 giờ thì 2 kim giờ và phút trùng nhau.

Ta coi là ở thời điểm 12:00 thì kim phút ở trước kim giây 60 nấc và kim giây đuổi theo kim phút. Trong 1 phút kim giây đi được 60 nấc, kim phút đi được 1 nấc. Tức nếu cự li giữa 2 kim là 59 nấc thì kim giây đuổi kịp kim phút sau 1 phút. Vậy cự li 60 nấc thì kim giây mất 60/59 phút = 1/59 giờ để đuổi kịp kim phút. Tóm lại cứ 1/59 giờ thì 2 kim giây và phút trùng nhau.

Giả sử sau một thời gian 3 kim lại trùng nhau và đó là lần thứ x kim giờ và phút gặp nhau, cũng là lần thứ y kim phút và giây gặp nhau. Ta có x, y là nguyên dương và

12x/11 = y/59 (thời gian trôi qua tính từ lần trùng trước)

=> 12*59*x = 11*y

Vế phải chia hết cho 11 vậy vế trái cũng chia hết cho 11, tức x chia hết cho 11 do 12 và 59 là số nguyên tố lớn hơn 11. x nhỏ nhất là x = 11.
Tức lần gặp tiếp là sau 12*x/11 [giờ] = 12 [giờ]

Kiểm tra lại ta thấy là rõ ràng sau 12 tiếng thì 3 kim lại gặp nhau.
 
Thấy không ai tham gia nữa nên tôi đưa ra lời giải bài #1 và kết thúc.

Lộ trình của anh A là một đường gấp khúc khép kín (đi từ nhà và về nhà). Ta biết rằng đoạn thẳng nối 2 điểm là đường đi ngắn nhất từ 1 điểm tới điểm còn lại. ***

Lấy A và B bất kỳ trên lộ trình nhưng chia lộ trình thành 2 nửa có độ dài như nhau và đều bằng k, với 2*k là độ dài toàn lộ trình. Gọi O là trung điểm AB. Ta xét điểm C BẤT KỲ trên lộ trình. Gọi D là điểm đối xứng với C qua tâm O. Dễ thấy ACBD là hình bình hành và:

k = <đường gấp khúc AC> + <đường gấp khúc CB> >= AC + CB (do ***) = AC + AD >= CD = 2*OC

=> OC <= k/2

Điểm C luôn cách điểm cố định O một khoảng <= k/2 nên nằm trọn trong hình tròn tâm O có bán kính k/2, tức đường kính k. Dấu =, tức điểm nằm trên đường tròn (bờ biên của hình tròn) khi lộ trình là 2 đoạn AB và BA (lộ trình ABA) và điểm xét là A hoặc B.
 
chỉ nhớ máng là hình như nó có đến 11 nghiệm.
Theo tôi thì phải sau 12 giờ 3 kim mới gặp lại nhau. Giữa khoảng 12 giờ không có nghiệm nào. Tôi suy luận kém nên không dùng suy luận ra kết quả như anh @batman1 mà dùng phép tính rượt đuổi như thời học sinh:
Tốc độ quay của kim giờ là 1/12 vòng / giờ = 30 độ góc/ giờ
Tốc độ quay của kim phút là 1 vòng/ giờ = 360 độ góc/ giờ
Đặt 12 giờ là gốc 0 độ.
Sau 1 giờ thì kim giờ nằm ở số 1 tức là 30 độ, kim phút nằm ở số 12 tức là 0 độ. Vậy khoảng cách 2 động tử cùng chiều là 30 độ
Thời gian kim phút đuổi kịp kim giờ là 1 giờ cộng thêm:
t = khoảng cách / hiệu số vận tốc
t = 30 / (360 - 30) = 1/11 giờ = 5.454545 phút (gần bằng 5.5 phút tức là gần bằng 5'30")
Nghĩa là kim giây đã vượt qua cả 2 kim còn lại khoảng 25 giây (có thập phân).
Suy luận tí nữa thì không khi nào kim giờ gặp kim phút mà kim giây không vượt qua miếng nào. Trừ khi quay về vạch12:00:00 tiếp theo. Tôi kết luận là không phải 11 nghiệm mà là vô nghiệm trong khoảng 0 - 12 giờ
-------------
Chỉ có kim giờ và kim phút gặp nhau 11 lần.
 
Xin các bạn giúp tôi sửa vài câu lệnh làm sao để rút gọn (BỎ BỚT) khoảng trên ba câu lệnh trong macro trong #19 sau:
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom