เขียนฟังก์ชั่น / วิธีการที่ใช้ในสตริงและคาถาที่คำว่าออกโดยใช้ตัวอักษรสัทอักษรนาโต Titlecase เป็นทางเลือก


17

เขียนโปรแกรมที่ใช้เป็นสตริงและสะกดคำที่ใช้ตัวอักษรออกเสียงของนาโต้

การทำแผนที่มีดังนี้:

'A' -> 'Alfa'
'B' -> 'Bravo'
'C' -> 'Charlie'
'D' -> 'Delta'
'E' -> 'Echo'
'F' -> 'Foxtrot'
'G' -> 'Golf'
'H' -> 'Hotel'
'I' -> 'India'
'J' -> 'Juliett'
'K' -> 'Kilo'
'L' -> 'Lima'
'M' -> 'Mike'
'N' -> 'November'
'O' -> 'Oscar'
'P' -> 'Papa'
'Q' -> 'Quebec'
'R' -> 'Romeo'
'S' -> 'Sierra'
'T' -> 'Tango'
'U' -> 'Uniform'
'V' -> 'Victor'
'W' -> 'Whiskey'
'X' -> 'Xray'
'Y' -> 'Yankee'
'Z' -> 'Zulu'

ตัวอย่าง:

'Hello World' -> ['Hotel', 'Echo', 'Lima', 'Lima', 'Oscar', 'Whiskey', 'Oscar', 'Romeo', 'Lima', 'Delta']

อินพุตสามารถเป็นสตริงใด ๆ แต่จะประกอบด้วยตัวอักษรและช่องว่างเสมอ เคสไม่เกี่ยวข้องกับเอาต์พุต แต่อินพุตอาจมีตัวอักษรเป็นตัวพิมพ์ใหญ่ตัวพิมพ์เล็กหรือทั้งสองอย่าง ควรเว้นช่องว่างในผลลัพธ์

คุณสามารถส่งออกในรูปแบบที่สมเหตุสมผลใด ๆ แต่ต้องเป็นชุดการเรียกเข้าแบบ NATO แบบมีตัวคั่น


4
ยินดีต้อนรับสู่ PPCG! คำถามนี้ถูกถามไปแล้ว แต่มันอาจจะถูกปิดด้วยเหตุผลอื่น ๆ หลายประการ: 1) เว้นแต่จะมีเหตุผลที่ดีที่จะทำเช่นนั้นการขอคำตอบในลักษณะเฉพาะ (ฟังก์ชั่น) ในภาษาที่เฉพาะเจาะจงมักจะขมวดคิ้ว 2) ความท้าทายต้องอยู่ในตัวเอง: คุณควรอธิบายว่าสัทอักษรสัทศาสตร์ของนาโต้อยู่ภายในเนื้อหาของคำถามอย่างไร 3) ในรูปแบบปัจจุบันดูเหมือนว่าจะทำการบ้าน ถ้าเป็นเช่นนั้นคุณอาจพบความช่วยเหลือใน Stack Overflow โดยมีเงื่อนไขว่าคุณได้รวมสิ่งที่คุณได้ทำไปแล้วและอธิบายว่าคุณติดอยู่ที่ไหน
Arnauld

4
ฉันยินดีที่จะเปิดใหม่หากคะแนน @Annauld ที่ยกมาข้างต้นได้รับการแก้ไขเนื่องจากไม่มีข้อ จำกัด แหล่งที่มาหรือการตรวจสอบความถูกต้องของอินพุตของความท้าทายที่เชื่อมโยง
Shaggy

1
ฉันได้แก้ไขสิ่งนี้เพื่อให้สามารถเปิดได้อีกครั้งเนื่องจากไม่มีข้อ จำกัด สำหรับตัวอักษร การเปลี่ยนแปลงทั้งหมดของฉันมีความเหมาะสมหรือไม่ ตรวจสอบข้อ จำกัด อินพุตโดยเฉพาะ
Rɪᴋᴇʀ

10
นี่คือตัวอักษร ICAO ตัวอักษรของนาโต้ใช้AlphaและJulietแทน
Neil

2
Whiskyในตัวอย่างไม่เท่ากับWhiskeyในการทำแผนที่
30919

คำตอบ:


13

sfk , 78 59 57 ไบต์

+filt
+spell -nato
+xed _ph_f_ _et_ett_ _-__ "*: [keep]""

ลองออนไลน์!

เพียงใช้เครื่องมือที่เหมาะสม

เอาต์พุตคือการออกเสียงที่ถูกคั่นด้วยช่องว่างหนึ่งช่อง


6

ชุดประกอบ IBM PC DOS 8088 208 204 197 194 192 ไบต์

be80 00ad 8ac8 ac51 24df 8ad0 2c40 3c1b 7321 8af0 b024 b18b 9090 bf37 01f2 aefe
ce75 fab4 02cd 218b d7b4 09cd 21b2 20b4 02cd 2159 e2d0 c324 6c66 6124 7261 766f
2468 6172 6c69 6524 656c 7461 2463 686f 246f 7874 726f 7424 6f6c 6624 6f74 656c
246e 6469 6124 756c 6965 7474 2469 6c6f 2469 6d61 2469 6b65 246f 7665 6d62 6572
2473 6361 7224 6170 6124 7565 6265 6324 6f6d 656f 2469 6572 7261 2461 6e67 6f24
6e69 666f 726d 2469 6374 6f72 2468 6973 6b65 7924 7261 7924 616e 6b65 6524 756c
7524

ดาวน์โหลดไฟล์ปฏิบัติการ DOS NATO.COM:

ลองออฟไลน์! (ใน DOSBox เป็นต้น)

        TITLE NATO3
_TEXT   SEGMENT
        ASSUME CS:_TEXT,DS:_TEXT,ES:_TEXT,SS:_TEXT
        ORG     100H

START:
    MOV  SI, 80H            ; point SI to DOS PSP
    LODSW                   ; load arg length into AL, advance SI to 82H
    MOV  CL, AL             ; set up loop counter
SEARCH:
    LODSB                   ; load next char from DS:SI into AL, advance SI 
    PUSH CX                 ; save outer loop position
    AND  AL, 0DFH           ; uppercase the input letter
    MOV  DL, AL             ; save for output
    SUB  AL, 'A'-1          ; convert letter to one-based index (A=1, Z=26, etc)
    CMP  AL, 27             ; if greater than 26, not a valid char
    JNC  NOTFOUND           ; if not, move to next
    MOV  DH, AL             ; DH is loop counter
    MOV  AL, '$'            ; search for string delimiter
    MOV  CL, LNATO          ; repeat search through length of word data
    MOV  DI, OFFSET NATO    ; re-point SCASB to beginning of word data
SCANLOOP:
    REPNZ SCASB             ; search until delimiter in AL is found ES:DI, advance DI
    DEC  DH                 ; delimiter found, decrement counter
    JNZ  SCANLOOP           ; if counter reached 0, index has been found
    MOV  AH, 02H            ; display first char
    INT  21H
    MOV  DX, DI             ; put found string memory location to DX for display
    MOV  AH, 09H            ; display string function
    INT  21H
    MOV  DL, ' '            ; display a space between words
    MOV  AH, 02H
    INT  21H
NOTFOUND:
    POP  CX                 ; restore outer loop counter
    LOOP SEARCH             ; move to next char in input
    RET
NATO    DB  '$lfa$ravo$harlie$elta$cho$oxtrot$olf$otel$ndia$'
        DB  'uliett$ilo$ima$ike$ovember$scar$apa$uebec$omeo$'
        DB  'ierra$ango$niform$ictor$hiskey$ray$ankee$ulu$'
LNATO   EQU $-NATO

_TEXT ENDS
END START

ผลการทดสอบ:

A>NATO abc aaa
Alfa Bravo Charlie Alfa Alfa Alfa 
A>NATO abc DefG1HIJ
Alfa Bravo Charlie Delta Echo Foxtrot Golf Hotel India Juliett 
A>NATO Alfa Bravo!
Alfa Lima Foxtrot Alfa Bravo Romeo Alfa Victor Oscar 

อัปเดตเพื่อลบอักขระตัวแรกออกจากอาร์เรย์รายการคำ (แม้ว่าจะบันทึกเพียง 11 ไบต์เนื่องจากรหัสที่จำเป็นเพิ่มเติม)


คุณสามารถบันทึก 2 ไบต์ได้โดยหาวิธีปิดการใส่ NOP หรือใช้รุ่นอื่นที่ไม่ได้ทำ ฉันใช้ ML.EXE และไม่ได้รับการเติมเต็ม คุณสามารถบันทึกอีก 18 ไบต์หรือมากกว่านั้นได้โดยการลบ$ตัวคั่นและแยกคำด้วยการใช้ตัวพิมพ์ใหญ่เป็นตัวพิมพ์ใหญ่แทนตัวอักษรตัวแรก (และตอนแรกฉันหมายถึงตัวที่สอง (การบีบอัดในระดับที่สูงขึ้นอาจจะถึงก่อนที่ความยาวของรหัสที่จำเป็นในการคลายความมันจะมากกว่าความได้เปรียบของการบีบอัด แต่รูปแบบที่เรียบง่ายของตัวพิมพ์ใหญ่ - ตัวคั่น - ตัวคั่นจะเป็นการเริ่มต้นที่ดี)
Deadcode

1
ด้วยการใช้ MASM 5 ฉันได้ลองใช้ ALIGN และ EVEN ทุกรูปแบบและย้ายคำแนะนำไปรอบ ๆ และไม่ว่ามันจะชอบอะไรก่อนที่ REPNZ $ delimiter นั้นเป็นวิธีที่ประหยัดที่มีทั้งตัวคั่น array และตัวคั่นสตริงดังนั้นฉันจึงสามารถใช้ INT 21H: 09 และไม่ต้องเขียนโครงสร้างลูปเพื่อพิมพ์มันด้วย char ฉันชอบความคิดของคุณเกี่ยวกับการใช้ตัวพิมพ์ใหญ่เป็นตัวคั่นบางอย่างเช่น 'LfaRavoHarlie' ใช่ไหม ตามสเป็กกรณีที่ไม่เกี่ยวข้องดังนั้นการส่งออก ALfa หรือ CHarlie จะเป็นที่ยอมรับอย่างสมบูรณ์ ความคิดที่ยอดเยี่ยม! จะต้องเขียนโค้ดขึ้นมาและดูว่าขนาดแตกต่างกันอย่างไร
640KB

เห็นได้ชัดว่า MASM 9 เป็นรุ่นสุดท้ายที่มีตัวเลือก / AT (สำหรับ. MODEL TINY) และในการทดสอบด้วยรหัสของคุณมันไม่ได้ทำแผ่นรอง NOP การส่งออกกล่าวว่าML.EXE /? Microsoft (R) Macro Assembler Version 9.00.30729.01ใช่ 'LfaRavoHarlie' เป็นสิ่งที่ฉันหมายถึง :) ฉันจะทำ "OR AL, 20H" เพื่อให้มันเล็กลงอีกครั้งในผลลัพธ์ แต่มันก็ขึ้นอยู่กับคุณ
Deadcode

BTW ทำไมไม่รวมส่วนหัวและส่วนท้ายไว้ในมุมมองที่ยังไม่ได้ประกอบของคุณ MASM 9 จะไม่รวบรวมมันให้ฉันโดยปราศจากสิ่งนั้น ฉันหมายถึง.MODEL TINY .CODE ORG 100H START:จุดเริ่มต้นและEND STARTตอนท้าย คุณไม่ต้องการสิ่งนี้ในการรวบรวมด้วย MASM 5 หรือไม่?
Deadcode

โดยทั่วไปแล้วฉันไม่ได้รวมแผ่นสร้างต้นแบบ MASM เพราะมันไม่ได้เป็นส่วนหนึ่งของรหัสประกอบ (คุณสามารถรับรหัสไบต์เดียวกันได้หลายวิธีขึ้นอยู่กับรุ่นของ MASM และทั้งหมด) ฉันใช้ไวยากรณ์ "เก่า" เพราะฉันชอบทดสอบใน MASM 1.1 :) ฉันเชื่อว่าฉันพบปัญหา NOP และเป็นไปได้ว่ามีข้อผิดพลาด MASM ที่มีอย่างน้อยระหว่าง 1.1 และ 5 หากคุณวาง LNATO EQU ไว้เหนือรหัสหรือรหัสยาก 08BH ในสถานที่มันไม่ได้แทรก NOP สองตัว อย่างไรก็ตามเนื่องจาก LNATO EQU ต่ำกว่ารหัสจึงมีความแตกต่างในสิ่งที่มันทำระหว่าง pass1 และ pass2 โดยเว้นที่ว่างไว้ที่นั่น แปลก!
640KB

5

05AB1E , 102 96 95 ไบต์

álSA”AlfaІvo¼¯¤œ®È¨›trotŠˆƒ‹Š™ÈŸtt Kilo´àma—……ÍЗŽêpa¼°«Äoµ†Çâgo¸šÉµ Whiskey Xrayµ‹nkeeâ¸lu”#‡

เอาท์พุทเป็นรายการของคำศัพท์ NATO

ลองออนไลน์

คำอธิบาย:

á              # Only leave the letters of the (implicit) input
 l             # Convert it to lowercase
  S            # Split it to a list of characters
   A           # Push the alphabet
    ”...”      # Push all the NATO words in titlecase and space-delimited
         #     # Split the string by spaces
              # Transliterate; map all letters in the lowercase input with this
               # list at the same indices (and output the resulting list implicitly)

ดู 05AB1E นี้เคล็ดลับของฉัน (ส่วนวิธีการใช้พจนานุกรม? )จะเข้าใจว่าทำไมเป็น”AlfaІvo¼¯¤œ®È¨›trotŠˆƒ‹Š™ÈŸtt Kilo´àma—……ÍЗŽêpa¼°«Äoµ†Çâgo¸šÉµ Whiskey Xrayµ‹nkeeâ¸lu” "Alfa Bravo Charlie Delta Echo Foxtrot Golf Hotel India Juliett Kilo Lima Mike November Oscar Papa Quebec Romeo Sierra Tango Uniform Victor Whiskey Xray Yankee Zulu"เครดิตของสตริงพจนานุกรมที่ถูกบีบอัดนี้จะไปที่@ErikTheGolferในความคิดเห็นนี้ (พร้อมเพิ่มtไว้JuliettแทนJuliet)


อาจสามารถใช้การแก้ไขและการบีบอัดเพื่อลดจำนวนไบต์ของคำที่ไม่มีอยู่จริง (trot, tt Kilo, Whisky Xray) ตัวอย่าง Halfassed: ลองออนไลน์! ฉันเคยทำมาก่อน แต่มันก็เป็นคำที่มีขนาดใหญ่ในนี้มันจะประหยัดที่ดีที่สุด 1 ไบต์ถ้าคุณใช้เวลา
Magic Octopus Urn

4

เยลลี่ ,  80  77 ไบต์

ḟ⁶O%32ị“¡µQỤ(cɠṘwlṁ;Ɗœ<NẸ½ṗN¬ṙẋxḶb¤*O~ƃ¹.ß8Ḋ¡tJ|Ḷ<İİḂ^1eȷjċbY9TYƭ¹Ẉ¥¤K0¹f»Ḳ¤

ลองออนไลน์! (ส่วนท้ายของรูปแบบรายการโดยการเข้าร่วมกับช่องว่างเพื่อหลีกเลี่ยงการพิมพ์อย่างยอดเยี่ยมโดยนัยเมื่อทำงานเป็นโปรแกรมเต็มรูปแบบ)


3

JavaScript (ES6), 181 189 ไบต์

s=>s.match(/\w/g).map(c=>'IndiAlfABravOscaRomeOQuebeCharliEchODeltAGolFoxtroTangOHoteLimAJulietTKilOZulUniforMikENovembeRPapASierrAVictoRWhiskeYankeEXraY'.match(c.toUpperCase()+'.*?[A-Z]'))

เนื่องจากตัวพิมพ์ออกไม่สำคัญเราสามารถบันทึกไบต์ด้วยการเรียกใช้คำด้วยกัน:

... GolFoxtroTangO ...

ลองออนไลน์!


2

Python 3 , 250 191 ไบต์

ขอบคุณ -47 ไบต์สำหรับ @Jo King และอีก 2 คนขอบคุณ @Jonathan Allen

มันจะผ่านอักขระที่ไม่ใช่ช่องว่างทั้งหมดของอินพุตและสำหรับแต่ละอักขระจะเลือกวลีที่เกี่ยวข้องสำหรับตัวอักษรซึ่งสามารถลดลงได้เล็กน้อยเนื่องจากตัวอักษรตัวแรกของแต่ละวลีเป็นตัวอักขระ แยกสตริงแทนการจัดเก็บวลีเป็นอาร์เรย์ที่จะบันทึกไบต์จากที่ไม่จำเป็น'และ,s

lambda s:[c+"lfa ravo harlie elta cho oxtrot olf otel ndia uliett ilo ima ike ovember scar apa uebec omeo ierra ango niform ictor hiskey ray ankee ulu".split()[ord(c)%32-1]for c in s if' '<c]

ลองออนไลน์!

โซลูชันดั้งเดิม

lambda s:[c+['lfa','ravo','harlie','elta','cho','oxtrot','olf','otel','ndia','uliett','ilo','ima','ike','ovember','scar','apa','uebec','omeo','ierra','ango','niform','ictor','hiskey','ray','ankee','ulu'][ord(c)-65]for c in s.replace(" ", "").upper()]

ลองออนไลน์!


191 กับif' '<c
Jonathan Allan

2

สีแดง , 210 193 ไบต์

func[s][foreach c trim/all s[prin c print pick[:lfa:ravo:harlie:elta:cho:oxtrot:olf:otel:ndia:uliett:ilo:ima:ike:ovember:scar:apa:uebec:omeo:ierra:ango:niform:ictor:hiskey:ray:ankee:ulu]c% 32]]

ลองออนไลน์!

คำอธิบาย:

foreachiterates trim/allกว่าสตริงหลังจากที่ช่องว่างทั้งหมดจะถูกลบออกโดย prinพิมพ์ตัวอักษร (ไม่มีการขึ้นบรรทัดใหม่) printพิมพ์สัญลักษณ์picked จากรายการ get-word! s (สัญลักษณ์) โดยใช้อักขระที่แม็พกับช่วง 1..26 เป็นดัชนี



2

C # (Visual C # Interactive คอมไพเลอร์) , 218 ไบต์

n=>n.ToUpper().Select(x=>"AlfaBravoCharlieDeltaEchoFoxtrotGolfHotelIndiaJuliettKiloLimaMikeNovemberOscarPapaQuebecRomeoSierraTangoUniformVictorWhiskeyXrayYankeeZulu".SkipWhile(k=>x!=k).TakeWhile((k,l)=>l<1|k>96&k<123))

ลองออนไลน์!

รุ่นสำรองโดยใช้ Split (), 194 ไบต์

n=>n.ToUpper().Select(x=>x>64?x+"lfa,ravo,harlie,elta,cho,oxtrot,olf,otel,ndia,uliett,ilo,ima,ike,ovember,scar,apa,uebec,omeo,ierra,ango,niform,ictor,hiskey,ray,ankee,ulu".Split(',')[x%65]:x+"")

ลองออนไลน์!


2

C ++, 229 228 ไบต์

[](auto s){for(;auto t=*s?"LfaRavoHarlieEltaChoOxtrotOlfOtelNdiaUliettIloImaIkeOvemberScarApaUebecOmeoIerraAngoNiformIctorHiskeyRayAnkeeUlu":0;s++)if(int c=*s&31){for(cout<<*s;*t>96||--c;t++);for(;cout<<*t,*++t>96;);cout<<' ';}}

ลองออนไลน์!

Ungolfed:

[](const char *s)
{
    const char *table = "LfaRavoHarlieEltaChoOxtrotOlfOtelNdiaUliettIloImaIkeOvemberScarApaUebecOmeoIerraAngoNiformIctorHiskeyRayAnkeeUlu";
    for (; *s; s++)
    {
        char c = *s & 0x1F;
        if (c != 0)
        {
            cout << *s;
            const char *w = table;
            while (*w >= 'a' || --c)
                w++;
            do
                cout << *w;
            while (*++w >= 'a');
            cout << ' ';
        }
    }
}

เอาท์พุท:

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 

เวอร์ชันการล้างข้อมูลตัวพิมพ์ใหญ่ ( 234 ไบต์ ):

[](auto s){for(;auto t=*s?"LfaRavoHarlieEltaChoOxtrotOlfOtelNdiaUliettIloImaIkeOvemberScarApaUebecOmeoIerraAngoNiformIctorHiskeyRayAnkeeUlu":0;s++)if(int c=*s&31){for(cout<<*s;*t>96||--c;t++);for(;putchar(*t|32),*++t>96;);cout<<' ';}}

ลองออนไลน์!

เอาท์พุท:

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 

2

ภาษาเครื่อง 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 

1
เยี่ยมมากที่นั่น!
640KB

1

ถ่าน 99 ไบต์

EΦ↥S№αι⁺ι§⪪”&⌊%w⁸D⦃σν:…ⅈ$|@H¦χT⸿]ECrΣM^¿←←&⁵↘⁼s(JF8X´▷⧴⎚P0V÷AWχπ¶⌈≧\"dJ^ZU{M≔⁴|<¶⁹B⊞⊟1LPH⪪∨Y3`”j⌕αι

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด เอาต์พุตในกรณีที่เหมาะสม คำอธิบาย:

   S                    Input string
  ↥                     Uppercased
 Φ                      Filtered where
     α                  Predefined uppercase alphabet
    №                   Contains
      ι                 Current character
E                       Mapped over characters
        ι               Current character
       ⁺                Concatenated with
           ”...”        Compressed string
          ⪪             Split on
                j       Literal string `j`
         §              Indexed by
                 ⌕      Index of
                   ι    Current character
                  α     In uppercase alphabet
                        Implicitly print each word on its own line

1

Perl 6 , 176 170 166 ไบต์

*.comb>>.&{$_~:128[q`>$RbD[Orlo~Q1nX,OVq8x9'6%h'1.I$83ua7	vsD=s-{W}{>iQ:Js37py)hNN,i{Pt\~#f4<>`.ords].base(35).split('J')[.ord%32]}.words

ลองออนไลน์!

เอาต์พุตเป็นตัวพิมพ์ใหญ่ด้วยตัวอักษรตัวแรกในเคสดั้งเดิม บีบอัดสตริงซึ่งบันทึกเพียง 6 ไบต์บนข้อความธรรมดาที่เรียบง่าย:

*.comb>>.&{$_~ <lfa ravo harlie elta cho oxtrot olf otel ndia uliett ilo ima ike ovember scar apa uebec omeo ierra ango niform ictor hiskey ray ankee ulu>[.ord%32-1]if ' 'ne$_}

ลองออนไลน์!

คำอธิบาย:

*.comb>>.&{                 }         # Map each letter to
           $_~                        # The letter plus
              <...>[.ord%32]          # The letter indexed into the list of words
                             .words   # And remove the extra spaces

1

Japt, 108 106 ไบต์

¸®¬Ë+u cg`ovem¼rws¯r°pawue¼cÙ o±ØǯfmØtØkeyÙ°nkeewªuwlfaæ1ÃÉr¦e³ltawÖoxÉwolfÙ*lÙAawªieâ-¹µ±ke`qw

ลองมัน

Backticks ประกอบด้วยสตริงที่บีบอัด:

ovemberwscarwapawuebecwomeowierrawangowniformwictorwhiskeywraywankeewuluwlfawravowharlieweltawchowoxtrotwolfwotelwndiawuliettwilowimawike

1

PowerShell , 187 183 ไบต์

$args|% t*y|%{'AlfaBravoCharlieDeltaEchoFoxtrotGolfHotelIndiaJuliettKiloLimaMikeNovemberOscarPapaQuebecRomeoSierraTangoUniformVictorWhiskeyXrayYankeeZulu'-csplit'(?=[A-Z])'-like"$_*"}

ลองออนไลน์!

สคริปต์ทดสอบ:

$f = {
$args|% t*y|%{'AlfaBravoCharlieDeltaEchoFoxtrotGolfHotelIndiaJuliettKiloLimaMikeNovemberOscarPapaQuebecRomeoSierraTangoUniformVictorWhiskeyXrayYankeeZulu'-csplit'(?=[A-Z])'-like"$_*"}
}

@(
    ,('Hello World', 'Hotel', 'Echo', 'Lima', 'Lima', 'Oscar', 'Whiskey', 'Oscar', 'Romeo', 'Lima', 'Delta')
) | % {
    $s,$expected = $_
    $result = &$f $s
    "$result"-eq"$expected"
    "$result"
}

เอาท์พุท:

True
Hotel Echo Lima Lima Oscar Whiskey Oscar Romeo Lima Delta

1

PHP ,209 205 206 ไบต์

while($l=$argv[1][$x++])echo$l!=' '?$l.preg_split('/([A-Z][a-z]*)/',ALfaRavoHarlieEltaChoOxtrotOlfOtelNdiaUliettIloImaIkeOvemberScarApaUebecOmeoIerraAngoNiformIctorHiskeyRayAnkeeUlu,0,3)[31&ord($l)].' ':'';

ลองออนไลน์!

เอาท์พุท:

"Hello World" => "HOtel eCho lIma lIma oScar WHiskey oScar rOmeo lIma dElta"

หรือ195ไบต์โดยที่ช่องว่างไม่ได้ถูกลบออกทั้งหมด:

while($l=$argv[1][$x++])echo$l,preg_split('/([A-Z][a-z]*)/',ALfaRavoHarlieEltaChoOxtrotOlfOtelNdiaUliettIloImaIkeOvemberScarApaUebecOmeoIerraAngoNiformIctorHiskeyRayAnkeeUlu,0,3)[31&ord($l)].' ';

ลองออนไลน์!

เอาท์พุท:

"Hello World" => "HOtel eCho lIma lIma oScar   WHiskey oScar rOmeo lIma dElta"

เยี่ยมมาก แต่การแก้ไขล่าสุดของคุณมีข้อผิดพลาดแบบออฟไลน์ วิธีการหนึ่งที่จะแก้ไขได้คือการเปลี่ยน[31&ord($l)]กลับไปยัง[31&ord($l)-1]ต้นทุนไบต์ที่สอง ALfaแต่คุณยังสามารถแก้ไขได้ในเวลาเพียงหนึ่งไบต์โดยสะกดออกอย่างเต็มที่
Deadcode

อ๊ะ! จับที่ดีและการแก้ไขที่ฉลาดมาก ขอบคุณ @adadcode!
640KB

0

TSQL, 313 ไบต์

แข็งแรงเล่นกอล์ฟ:

DECLARE @ varchar(max)='Hello World' 

DECLARE @x INT=len(@)WHILE @x>0SELECT @=stuff(@,@x,1,substring(@,@x,1)+choose(ascii(substring(@,@x,1))%32,'lfa','eta','harlie','elta','cho','oxtrot','olf','otel','ndia','uliett','ilo','ima','ike','ovember','scar','apa','uebec','omeo','ierra','ango','niform','ictor','hiskey','ray','ankee','ulu')+';'),@x-=1PRINT @

Ungolfed:

DECLARE @ varchar(max)='Hello World' 

DECLARE @x INT=len(@)
WHILE @x>0
  SELECT @=stuff(@,@x,1,substring(@,@x,1)+choose(ascii(substring(@,@x,1))%32,
    'lfa','eta','harlie','elta','cho','oxtrot','olf','otel','ndia','uliett','ilo',
    'ima','ike','ovember','scar','apa','uebec','omeo','ierra','ango','niform',
    'ictor','hiskey','ray','ankee','ulu')+';'),
    @x-=1

PRINT @

ลองดู

เอาต์พุตสิ้นสุดด้วยเซมิโคลอน


0

PowerShell, 228 225 ไบต์

-3 ไบต์ต้องขอบคุณ @mazzy

"$args".ToLower()-replace' '|% T*y|%{$a+=$_+((-split"lfa ravo harlie elta cho oxtrot olf otel ndia uliett ilo ima ike ovember scar apa uebec omeo ierra ango niform ictor hiskey ray ankee ulu")[('a'..'z').IndexOf($_)])+' '};$a

ลองออนไลน์!

นี่อาจเป็นโค้ดที่น่าเกลียดที่สุดที่ฉันเคยเขียน นอกจากนี้สิ่งนี้สามารถทำให้สั้นลงได้อย่างมาก ในการป้องกันของฉันฉันยังคงฟื้นตัวจากการสอบครั้งสุดท้าย


-split'lfa ravo ...'สั้นกว่าเพราะ '\ s' เป็นตัวแยกตามค่าเริ่มต้น :)
mazzy

0

PHP, 212 ไบต์

while($c=ord($argn[$i++]))echo[_,Alpha,Bravo,Charlie,Delta,"Echo",Foxtrot,Golf,Hotel,India,Juliett,Kilo,Lima,Mike,November,Oscar,Papa,Quebec,Romeo,Sierra,Tango,Uniform,Victor,Whiskey,Xray,Yankee,Zulu][$c&31]," ";

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์

ให้คำเตือนใน PHP 7.2; ใส่องค์ประกอบอาร์เรย์ในเครื่องหมายคำพูดเพื่อแก้ไข

จะพิมพ์ขีดเส้นใต้สำหรับช่องว่าง



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.