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
в двійковому поданні довжини рядка є непарна кількість біт, прапор парності CPU встановлюється непарним, і навпаки. Таким чином , вхідний рядки ' Bad'
довжини 4
( 0000 0100
), є непарність і вхідний рядок ' Good'
є 5
( 0000 0101
) навіть на парність.
DX
спочатку встановлюється вказівку на рядок 'Good$Bad$'
, і якщо парність є парною (означає, що введення було ' Good'
), просуньте вказівник рядка на цю довжину ( 5
), так що тепер він вказує на 'Bad$'
. Якщо парність є непарною, не робіть нічого, оскільки це вже вказує на 'Good$'
. Потім використовуйте API DOS для відображення $
завершеного рядка для консолі.
Приклад:
Завантажте та протестуйте GOODBAD.COM або створити з xxd
дампа:
0000000: ba10 01d1 ee02 047b 0202 d0b4 09cd 21c3 .......{......!.
0000010: 476f 6f64 2442 6164 24 Good$Bad$