Bài tập
Tạo một bot IRC đơn giản thực hiện nhiệm vụ đơn giản như chào người dùng.
Chi tiết
(Bạn có thể xem tài liệu RFC này .)
Viết một chương trình hoàn chỉnh thực hiện những điều sau:
Các chương trình đầu vào
nickname
vàrealname
từ người dùng.- Tất cả
nickname
vàrealname
hình thức nào[A-Za-z0-9]+
nên được cho phép, nhưng điều đó không quan trọng cho dù các hình thức khác được cho phép. Ví dụ, nếu người dùng muốn1234qwerty
nhưnickname
và5319009
nhưrealname
, chương trình nên sử dụng những cái tên đó, nhưng nó không phải là quan trọng cho dù chương trình có thể sử dụng^^☆Rick Astley☆^^
(bao gồm phi bảng chữ cái & số thập phân) như (nickname
hoặcrealname
) hay không, thậm chí còn nghĩ tên này có thể bị từ chối bởi máy chủ.
- Tất cả
Các chương trình đầu vào
serverAddress
từ người dùng.- Hình thức
serverAddress
làserverIP:serverPort
,serverIP
địa chỉ IP của máy chủ vàserverPort
là số cổng của máy chủ.
- Hình thức
Chương trình kết nối với cổng
serverPort
tại máy chủ IRCserverIP
và chương trình sẽ đặt biệt hiệu là tên thậtnickname
và tên thậtrealname
bằng cách gửiUSER realname 0 * :realname
vàNICK nickname
.Chương trình nhập một đơn vị
channelName
không bao gồm#
và tham gia vào kênh#channelName
.Gửi một tin nhắn riêng tư
Hello, world!
đến#channelName
kênh như thế này:PRIVMSG #channelName :Hello, world!
Sau đó, chương trình thực hiện những điều này:
A. Nếu ai đó tham gia, hãy chào hỏi anh ấy bằng cách nói
Hello, @!
với#channelName
, trong đó @ là biệt danh của anh ấy / cô ấy.B. Nếu chương trình được khởi động, hãy thử tham gia lại.
C. Nếu một người bị đá hoặc bị cấm, hãy nói
POW HAHA
.D. Nếu một người rời khỏi (
PART
hoặcQUIT
), giả sửGoodbye, @!
, trong đó @ là biệt danh của anh ấy / cô ấy.E. Nếu ai đó nói một số văn bản bao gồm
Turing test
hoặcturing test
, nóiI'm a human!
.F. Nếu ai đó nói một số văn bản bao gồm
6*9
, thoát bằng cách gửiQUIT :42
đến máy chủ.G. Nếu ai đó nói một số văn bản bao gồm
all your base are belong to us
(không phân biệt chữ hoa chữ thường), hãy thoát bằng cách gửiQUIT :What you say!
đến máy chủ.H. Nếu ai đó nói rằng một số văn bản có trước một khoảng trắng và các hành vi trên không được thực hiện bởi văn bản, hãy nói tổng số ký tự của tất cả (ngoại trừ khoảng trắng đầu tiên) trong văn bản.
Nếu xảy ra lỗi
Nếu xảy ra lỗi (như lỗi kết nối hoặc không hợp lệ nickname
), bạn có thể làm những gì bạn muốn làm. Ví dụ: nếu nickname
chương trình đã được sử dụng, chương trình có thể dừng, nhận thông tin mới nickname
từ người dùng hoặc tự động thay đổi nickname
và thử lại.
Sự hạn chế
Chương trình
- Không nên sử dụng bất kỳ chức năng hoặc thư viện nội bộ nào dành cho việc tạo / máy khách IRC. tức là một cái gì đó giống như các thư viện máy khách IRC
- Nên nhắc những gì nó sẽ nhập, trước khi nó nhận được một đầu vào . Ví dụ, trước khi đầu vào
serverAddress
, nó sẽ nhắcWrite the address of server:
,serverIP:serverPort >
,serverAddress >
, hoặc một số văn bản mà người dùng có thể nhận ra. - Nên hoạt động trên một số máy chủ IRC sử dụng UTF-8. (tức là không dành cho máy chủ đơn lẻ)
- Không nên gửi tin nhắn đến máy chủ
NOTICE
. (RFC 2812, 3.3.2 Lưu ý: Sự khác biệt giữaNOTICE
vàPRIVMSG
là trả lời tự động PHẢI KHÔNG BAO GIỜ được gửi để trả lờiNOTICE
tin nhắn.) - Nên gửi một tin nhắn trong đó yêu cầu đến từ (
#channelName
hoặcnickname
). - Nên
PONG
khiPING
ed, tất nhiên.
PS
Vâng, tôi chỉ làm điều này, bởi vì không có câu đố nào về IRC bot.
Biên tập
Sau khi đọc bình luận của @ dmckee, tôi đã thay đổi quy tắc chọn người chiến thắng.
Mặc định
bonus
= +0Nếu bằng cách nào đó, chương trình có thể kết nối với một kênh (ngay cả khi không phải vậy
#channelName
),bonus
= 1Nếu chương trình có thể thực hiện bước 1 ~ 5,
bonus
* = 2.Đối với mỗi tác vụ A ~ H trong bước 6, nếu chương trình thực hiện,
bonus
* =1.2
.Đối với mỗi sáu hạn chế, nếu chương trình tuân theo điều đó,
bonus
* =1.05
.
và score = int(codelength/bonus)
.
Chương trình có số điểm thấp nhất là người chiến thắng. Nếu hai câu trả lời có cùng số điểm, thì câu trả lời có số phiếu cao nhất sẽ thắng.
EDIT Chỉnh sửa: Tôi nghĩ 1.2
và 1.05
trong bước 4 và 5 nên điều chỉnh lớn hơn một chút .. Bạn nghĩ gì về điều này?
Người chiến thắng được quyết định, tuy nhiên, tôi nghĩ có quá ít mục.
Bất cứ ai vẫn có thể gửi mã ..: P