Мова машини машини IBM PC DOS 8088, 165 байт
Це безпосередньо ґрунтується на відповіді gwaugh , але я поголив 26 байт, опустивши $
роздільники з таблиці слів "NATO" та зайвий 1 байт, не пропускаючи перший символ рядка параметра командного рядка (який завжди буде /
або
і, отже, програма ігнорується в будь-якому випадку). Програма виявилася точно такої самої довжини, щоб можна було обробляти таблицю в такому форматі (в якому слова розмежовуються лише великими літерами, які служать подвійній меті також бути другою літерою кожного слова), або 2 байти довше, якщо величина капіталізації виходу буде такою ж, як і раніше. Таблиця на 26 байт менша.
У наступному дампі програми, конкатенація на :
використовується для показу кожної послідовності послідовних байтів, що відповідають інструкції:
0000 BE:80:00 AC 91 AC 24:DF 8A:D0 2C:40 3C:1A 77:21 ······$···,@<·w!
0010 8A:F0 B4:02 CD:21 56 BE:34:01 AC A8:20 75:FB FE: ·····!V·4··· u··
0020 :CE 75:F7 8A:D0 CD:21 AC A8:20 75:F7 B2:20 CD:21 ·u····!·· u·· ·!
0030 5E E2:D2 C3 4C 66 61 52 61 76 6F 48 61 72 6C 69 ^···LfaRavoHarli
0040 65 45 6C 74 61 43 68 6F 4F 78 74 72 6F 74 4F 6C eEltaChoOxtrotOl
0050 66 4F 74 65 6C 4E 64 69 61 55 6C 69 65 74 74 49 fOtelNdiaUliettI
0060 6C 6F 49 6D 61 49 6B 65 4F 76 65 6D 62 65 72 53 loImaIkeOvemberS
0070 63 61 72 41 70 61 55 65 62 65 63 4F 6D 65 6F 49 carApaUebecOmeoI
0080 65 72 72 61 41 6E 67 6F 4E 69 66 6F 72 6D 49 63 erraAngoNiformIc
0090 74 6F 72 48 69 73 6B 65 79 52 61 79 41 6E 6B 65 torHiskeyRayAnke
00A0 65 55 6C 75 40 eUlu@
Завантажте виконуваний файл DOS NATO.COM:
з некоректованою написанням великої літери (165 байт),
з чистою великою літеристю (167 байтів)
Бонусна версія, яка пише велику літеру кожного слова так само, як і вхідна (167 байт)
Не зібрано:
.MODEL TINY ; .COM program, maximum addressing space 65536 bytes
.CODE
ORG 100h
start:
MOV SI, 80h ; Point SI to DOS PSP (Program Segment Prefix).
LODSB ; Load command-line parameter (input string) length
; into AL; assume AX=0 before this, which is true
; in most versions of DOS; advance SI to first char
; of parameter, which is either '/' or ' '.
XCHG CX, AX ; Set up loop counter with length of input string.
search:
LODSB ; Load next character from [SI] into AL; advance SI.
AND AL, NOT ('A' XOR 'a') ; Make this character uppercase.
MOV DL, AL ; Save character for output. Move this before the
; AND instruction to capitalize the first letter of
; each word identically to how it is in the input.
SUB AL, 'A'-1 ; convert letter to one-based index (A=1, Z=26, etc)
CMP AL, 'Z'-'A'+1 ; Is this an alphabetical character?
JA notFound ; If not, move to next character.
MOV DH, AL ; Set up DH as our word-finding loop counter.
MOV AH, 02h ; AH=02h, INT 21h: Write character to STDOUT
INT 21h ; Display first character of this NATO word.
PUSH SI ; Save our current position in the input string.
MOV SI, OFFSET table ; Point LODSB to beginning of word data.
scanLoop: ; Find the word in the table corresponding to our
; current character.
LODSB ; Load next character from [SI] into AL; advance SI.
TEST AL, 'A' XOR 'a' ; Is this character uppercase?
JNZ scanLoop ; If not, move to next character.
DEC DH ; Delimiter (uppercase) found; decrement counter.
JNZ scanLoop ; Keep looping until counter reaches 0.
OR AL, 'A' XOR 'a' ; Make this character lowercase. This is not
; required by the challenge's specification, and
; this instruction can be removed.
wordLoop:
MOV DL, AL ; Display next character from NATO word.
INT 21h ; (We still have AH=02h from before.)
LODSB
TEST AL, 'A' XOR 'a' ; Is this character lowercase?
JNZ wordLoop ; If so, continue the loop.
MOV DL, ' ' ; Display a space between words.
INT 21h ; (We still have AH=02h from before.)
POP SI ; Restore our current position in the input string.
notFound:
LOOP search ; Move to next character in input string.
RET
table DB 'LfaRavoHarlieEltaChoOxtrotOlfOtelNdia'
DB 'UliettIloImaIkeOvemberScarApaUebecOmeo'
DB 'IerraAngoNiformIctorHiskeyRayAnkeeUlu'
DB '@' ; Terminate the list to make sure that uninitialized
; memory doesn't cause a problem.
END start
Зразок введення:
>NATO The quick brown fox jumped over the lazy dog.
>NATO Jackdaws love my big sphinx of quartz.
Вихід (версія 165 байт):
TAngo hOtel eCho qUebec uNiform iNdia cHarlie kIlo bRavo rOmeo oScar wHiskey nOvember fOxtrot oScar xRay jUliett uNiform mIke pApa eCho dElta oScar vIctor eCho rOmeo tAngo hOtel eCho lIma aLfa zUlu yAnkee dElta oScar gOlf
JUliett aLfa cHarlie kIlo dElta aLfa wHiskey sIerra lIma oScar vIctor eCho mIke yAnkee bRavo iNdia gOlf sIerra pApa hOtel iNdia nOvember xRay oScar fOxtrot qUebec uNiform aLfa rOmeo tAngo zUlu
Версія з чистою капіталізацією (167 байт):
Tango Hotel Echo Quebec Uniform India Charlie Kilo Bravo Romeo Oscar Whiskey November Foxtrot Oscar Xray Juliett Uniform Mike Papa Echo Delta Oscar Victor Echo Romeo Tango Hotel Echo Lima Alfa Zulu Yankee Delta Oscar Golf
Juliett Alfa Charlie Kilo Delta Alfa Whiskey Sierra Lima Oscar Victor Echo Mike Yankee Bravo India Golf Sierra Papa Hotel India November Xray Oscar Foxtrot Quebec Uniform Alfa Romeo Tango Zulu
Версія з чистою капіталізацією з тією ж великою буквою, що і вхідна (167 байт):
Tango hotel echo quebec uniform india charlie kilo bravo romeo oscar whiskey november foxtrot oscar xray juliett uniform mike papa echo delta oscar victor echo romeo tango hotel echo lima alfa zulu yankee delta oscar golf
Juliett alfa charlie kilo delta alfa whiskey sierra lima oscar victor echo mike yankee bravo india golf sierra papa hotel india november xray oscar foxtrot quebec uniform alfa romeo tango zulu