8088 Assembly, IBM PC DOS, 25 byte
Belum dirakit:
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$'
Penjelasan:
Melihat panjang string input (ditambah ruang utama) yang disimpan oleh DOS di alamat memori 80H
, dan ditambahkan ke AL
(awalnya 0
oleh DOS ). Jika ada jumlah ganjil 1
bit dalam representasi biner dari panjang string, flag paritas CPU diatur ke ganjil, dan sebaliknya. Jadi ' Bad'
panjang string input 4
( 0000 0100
), adalah paritas ganjil dan string input ' Good'
adalah 5
( 0000 0101
) bahkan paritas.
DX
awalnya diatur untuk menunjuk ke string 'Good$Bad$'
, dan jika paritas genap (berarti input tadinya ' Good'
) memajukan pointer string dengan panjang itu ( 5
) jadi sekarang menunjuk ke 'Bad$'
. Jika paritas aneh, jangan lakukan apa-apa karena itu sudah menunjuk ke 'Good$'
. Kemudian gunakan DOS API untuk menampilkan $
string yang dihentikan ke konsol.
Contoh:
Unduh dan uji GOODBAD.COM atau build from xxd
dump:
0000000: ba10 01d1 ee02 047b 0202 d0b4 09cd 21c3 .......{......!.
0000010: 476f 6f64 2442 6164 24 Good$Bad$