Сборка 8088, IBM PC DOS, 25 байтов
разобранное:
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$'
Объяснение:
Просматривает длину входной строки (плюс начальный пробел), которую DOS хранит по адресу памяти 80H
, и добавляет ее AL
(изначально 0
в DOS ). Если 1
в двоичном представлении длины строки присутствует нечетное число битов, флаг четности ЦП устанавливается на нечетное, и наоборот. Таким образом , входной строки ' Bad'
длины 4
( 0000 0100
), является нечетность и входная строка ' Good'
является 5
( 0000 0101
) даже на четность.
DX
изначально установлен для указания на строку 'Good$Bad$'
, и если четность четна (что означает, что ввод был ' Good'
), передвиньте указатель строки на эту длину ( 5
), так что теперь он указывает на 'Bad$'
. Если четность нечетна, ничего не делайте, поскольку она уже указывает на 'Good$'
. Затем используйте DOS API для отображения $
завершенной строки на консоли.
Пример:
Скачайте и протестируйте GOODBAD.COM или соберите из xxd
дампа:
0000000: ba10 01d1 ee02 047b 0202 d0b4 09cd 21c3 .......{......!.
0000010: 476f 6f64 2442 6164 24 Good$Bad$