Hỏi 2 bài luyện tập trên AtCoder

Em chào mọi người.
Em đang mới học Python nên có luyện thử web atcoder, đây là bài em thi hôm nay:


Trong đó có bài 1:

Em đã giải như sau

nNum = int(input("Enter your number"))
for i in range (0, nNum):
if ((nNum // 100) < 100):
    if ((nNum % 100) == 0):
        print("100")
        break
    else:
        nRemain = (100 - (nNum % 100))
        print(nRemain)
        break
else:
    nNum = (nNum // 10) + (nNum % 10)
    continue

Bài 2 là

En đã giải:

strWord = input("Enter your string")
strLower = strWord.lower()
strUpper = strWord.upper()
nCount1 = 0
nCount2 = 0

for i in range(0, len(strWord), 2):
    if (strWord[i] == strLower[i]):
        nCount1 += 1

for i in range(1, len(strWord), 2):
    if (strWord[i] == strUpper[i]):
        nCount2 += 1
        
if ((nCount1 + nCount2) == len(strWord)):
    print("Yes")
else:
    print("No")

Tuy nhiên em đều ăn 0 điểm hai bài dù em thấy nó vẫn giải quyết được vấn đề, không biết có anh chị nào giúp em được không
#Edit1
Solution bài 1 ngắn vậy mà em đi lòng vòng :v

nNum = int(input())
print(100- nNum % 100)

Cái này không ai giúp được, nó mang tính cách “giải bài tập giùm”. Bạn nên giải bằng tay và kiểm tra trước rồi mới chuyển thành mã lập trình. Mình thì chẳng có kiến thức gì về Python nhưng đọc vào thấy bạn 0 điểm là không oan, giải thuật vớ vẩn, hiểu sai đề (cái này là mình đang khích tướng để bạn cay cú mà học :D, chứ không dìm hàng).

Giờ để người khác giúp bạn, vui lòng viết lại đề bài bằng tiếng Việt, xem thử bạn có hiểu đề hay không hay là dùng Google dịch để rồi làm cái không liên quan gì đến yêu cầu đề bài.

Bài 2 mình hiểu vầy: chuỗi cOnHeO được xem là khó đọc vì nó thoả mãn ký tự ở vị trí lẻ là thường, vị trí chẵn là HOA. Kiểm tra một chuỗi xem có thoả 1 lẻ, 2 chẵn, 3 lẻ, 4 chẵn,… thường HOA luân phiên v.v… hay không để phán nó “khó đọc”. Giải thuật của mình sẽ như sau:

Bắt đầu: khó đọc = true

Duyệt chuỗi: lấy vị trí ký tự (nó) chia cho 2 lấy dư để xem vị trí đó là chẵn hay lẻ:

  • Nếu lẻ thì xét xem nó chấm isupper() trâu hay phêu. Nếu trâu, gán khó đọc bằng phêu rồi dừng lặp ngay và luôn.

  • Nếu chẵn thì xét xem nó chấm isupper() trâu hay phêu. Nếu phêu, gán khó đọc bằng phêu rồi dừng vòng lặp ngay và luôn.

  • Kiểm tra if khó đọc => in ra khó đọc, ngược lại in ra “KHÔNG khó đọc”.

Giải thuật của bạn là gì, thử viết ra đọc xem sao, mình đọc thấy nó chẳng trong sáng tí nào hết, cứ như thơ Bút Tre mà cố bỏ đúng dấu: Tiễn anh chỉ một quả chuồi, em về em nhớ cái buổi hôm nay.

4 Likes

Cái này là cho beginner nên em nghĩ nếu giải cách này thì có gì sai đâu anh?
Em vừa mới học đến function nên chỉ giải được thế này thôi. Với lại cái này cũng không phải giải bài tập giùm gì, vì lát cũng có đáp án. Nhưng mà kiểu em chạy xong, thử với trường hợp họ cho thì không xuất hiện lỗi gì nên em không biết nó chấm như thế nào.
Em thì dùng cái for đầu tiên để xét vị trí lẻ có phải lowercase không, for thứ 2 xét uppercase, nếu cộng hai cái lại mà bằng đủ độ dài thì là đúng. Em thấy nó vẫn được mà.
Em cảm ơn.

1 Like

Bài của mình là chưa xét khoảng trắng, và có thể có các ký tự không phân biệt hoa/ thường nên chạy cũng sai bét nhè ra. Bài của bạn có xét đến mấy cái đó không? Liệu đề trên luyện code có quan tâm đến việc ấy không hay họ chỉ nạp chuỗi “lý tưởng” kiểu như: DayLaMotChuoiKhoDoc.
Cho nên, bạn cứ thử xoay xở vài cách, làm chừng nào được thì thôi vì thực ra nó không khó đến mức bó tay. Bạn phải giải bằng tay, tức viết lên bảng trước và chạy thử trên máy của bạn có ổn không, chứ vội vã quá thì dễ bị “hổng chân” lắm, nó chỉ gây nản lòng thôi.
Mẹo: để học có hiệu quả, đừng quan tâm đến việc nó chấm mấy điểm vội, mà quan tâm vào những dòng code bạn viết ấy, có hiểu gì không, bạn trace xem qua từng bước nó như thế nào.

4 Likes

Khoảng trắng anh nói ý là dùng space thay vì dùng tab?
Tại vì web này nó có Custom Code cho mình chạy thử nhưng code vẫn chạy được ấy.
Mấy bài này thì em thấy thực ra không khó gì lắm, nhưng kiểu em thử nhưng vẫn chưa hiểu bị sai ở đâu. Cơ mà em cảm ơn anh nhiều ạ, có gì để em tìm hiểu rồi rèn thêm. Do hôm nay em mới luyện lần đầu trên này.
Phân biệt hoa thường thì em thử rồi, chuỗi DiFFiCuLT chả hạn thì nó vẫn ra NO.

2 bài này cũng không khó gì. Nhưng xem qua thì hướng giải bài 1 của bạn sai. Bài 2 cũng tạm nhưng vẫn chưa ổn lắm, có thể có vài trường hợp ngoài ý muốn.

  1. Bài 1: chỉ cần áp dụng phép chi lấy dưphép trừ, 1 hoặc không cần if - else nào.
  2. Bài 2: bạn chỉ cần duyệt chuỗi ban đầu và áp dụng tuần tự (chẵn - lẻ) cho char.islower()char.isupper().
    • Nếu vị trí lẻ và chữ thường => khó đọc = true. Ngược lại thì false và ngắt vòng lặp.
    • Nếu vị trí chẵn và chữ HOA => khó đọc = true. Ngược lại thì false và ngắt vòng lặp.
      Kết thúc thì xét giá trị khó đọc thôi.

Lưu ý: vị trí và chỉ số khác nhau đấy. Vị trí 1 = chỉ số 0, vị trí 2 = chỉ số 1,… vị trí i + 1 = chỉ số i.

4 Likes

Cảm ơn anh nhiều, em thử lại rồi, như bài 2 em thay lại bằng

strWord = input()
strLower = strWord.lower()
strUpper = strWord.upper()
nCount1 = 0
nCount2 = 0

for i in range(0, len(strWord), 2):
    if (strWord[i] == strLower[i]):
        nCount1 += 1

for i in range(1, len(strWord), 2):
    if (strWord[i] == strUpper[i]):
        nCount2 += 1
        
if ((nCount1 + nCount2) == len(strWord)):
    print("Yes")
else:
    print("No")

Hình như nó đòi y chang Input của nó thì cứ là đúng, weird thật sự

1 Like

Em cảm ơn anh nhiều ạ, để em tham khảo và học thêm hàm char.islower và hàm kia.
Em vừa chỉnh lại thành

strWord = input()
strLower = strWord.lower()
strUpper = strWord.upper()
nCount1 = 0
nCount2 = 0

for i in range(0, len(strWord), 2):
    if (strWord[i] == strLower[i]):
        nCount1 += 1

for i in range(1, len(strWord), 2):
    if (strWord[i] == strUpper[i]):
        nCount2 += 1
        
if ((nCount1 + nCount2) == len(strWord)):
    print("Yes")
else:
    print("No")

Bây giờ thì nó lại đúng :v Chắc phải y chang input của nó mới chịu

2 Likes

Cả có gì là kỳ lạ cả. Bất cứ thứ gì bạn in ra màn hình đều được chấm. Bất cứ câu mời mọc nhập dữ liệu vào đều bị tinh là output hết.

4 Likes

nNum chia hết cho 100 thì ra 0 chứ :smiley:

Giờ suy nghĩ làm sao thay vì (một phép tính nào đó) ra 0 thì ra 100, thì sẽ ko cần if.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?