8088 hội, IBM PC DOS, 25 byte
Chưa được lắp ráp:
BA 0110 MOV DX, OFFSET GB ; point DX to 'Good','Bad' string
D1 EE SHR SI, 1 ; point SI to DOS PSP (80H)
02 04 ADD AL, [SI] ; add input string length to AL, set parity flag
7B 02 JNP DISP ; if odd parity, input was 'Bad' so jump to display 'Good'
02 D0 ADD DL, AL ; otherwise add string length as offset for 'Bad' string
DISP:
B4 09 MOV AH, 9 ; DOS display string function
CD 21 INT 21H ; call DOS API, write string to console
C3 RET ; return to DOS
GB DB 'Good$','Bad$'
Giải trình:
Xem xét độ dài của chuỗi đầu vào (cộng với không gian hàng đầu) mà DOS lưu trữ tại địa chỉ bộ nhớ 80H
và thêm nó vào AL
(ban đầu0
bằng DOS ). Nếu có một số 1
bit lẻ trong biểu diễn nhị phân của độ dài chuỗi, cờ chẵn lẻ CPU được đặt thành lẻ và ngược lại. Vì vậy, ' Bad'
độ dài chuỗi đầu vào 4
( 0000 0100
), là chẵn lẻ và chuỗi đầu vào ' Good'
là 5
( 0000 0101
) là chẵn lẻ.
DX
ban đầu được đặt để trỏ đến chuỗi 'Good$Bad$'
và nếu chẵn lẻ (nghĩa là đầu vào là ' Good'
) tiến con trỏ chuỗi theo độ dài đó ( 5
) để bây giờ nó trỏ đến 'Bad$'
. Nếu chẵn lẻ là lẻ, không làm gì vì nó đã trỏ đến 'Good$'
. Sau đó, sử dụng API DOS để hiển thị một $
chuỗi kết thúc vào bàn điều khiển.
Thí dụ:
Tải xuống và kiểm tra GOODBAD.COM hoặc xây dựng từ xxd
kết xuất:
0000000: ba10 01d1 ee02 047b 0202 d0b4 09cd 21c3 .......{......!.
0000010: 476f 6f64 2442 6164 24 Good$Bad$