Viết một hàm / phương thức lấy một chuỗi và đánh vần từ đó bằng cách sử dụng Bảng chữ cái ngữ âm của NATO. Titlecase tùy chọn


17

Viết một chương trình lấy một chuỗi và đánh vần từ đó bằng cách sử dụng Bảng chữ cái ngữ âm của NATO.

Ánh xạ như sau:

'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'

Thí dụ:

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

Đầu vào có thể là bất kỳ chuỗi nào, nhưng sẽ luôn chỉ bao gồm các chữ cái và dấu cách. Case không liên quan ở đầu ra, nhưng đầu vào có thể chứa các chữ cái in hoa, viết thường hoặc cả hai. Không gian nên được bỏ qua trong đầu ra.

Bạn có thể xuất ra ở bất kỳ định dạng hợp lý nào, nhưng nó phải là một tập hợp các tên gọi NATO được phân tách.


4
Chào mừng đến với PPCG! Câu hỏi này đã được hỏi. Nhưng dù sao thì nó cũng có thể đã bị đóng vì một số lý do khác: 1) Trừ khi có lý do chính đáng để làm như vậy, yêu cầu trả lời theo một cách cụ thể (một chức năng) trong một ngôn ngữ cụ thể thường được tán thành. 2) Các thách thức phải khép kín: bạn nên giải thích chính xác bảng chữ cái ngữ âm của NATO nằm trong phần chính của câu hỏi. 3) Ở dạng hiện tại, nó trông giống như một bài tập về nhà. Nếu đúng như vậy, bạn có thể tìm thấy trợ giúp về Stack Overflow, miễn là bạn bao gồm những gì bạn đã làm cho đến nay và giải thích nơi bạn bị mắc kẹt.
Arnauld

4
Tôi sẽ ủng hộ việc mở lại điều này nếu các điểm @Arnauld nêu trên được giải quyết vì nó không có hạn chế nguồn hoặc xác thực đầu vào của thách thức được liên kết.
Xù xì

1
Tôi đã chỉnh sửa nó để có thể mở lại được, vì nó không có giới hạn về ký tự. Là tất cả những thay đổi của tôi thích hợp? Đặc biệt là kiểm tra các hạn chế đầu vào.
R

10
Đây là bảng chữ cái ICAO; bảng chữ cái NATO sử dụng AlphaJulietthay vào đó.
Neil

2
Whiskytrong ví dụ không bằng Whiskeytrong ánh xạ.
mê mẩn

Câu trả lời:


13

sfk , 78 59 57 byte

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

Hãy thử trực tuyến!

Chỉ cần sử dụng đúng công cụ.

Đầu ra là ngữ âm cách nhau bởi một hoặc nhiều khoảng trắng.


6

Lắp ráp IBM PC DOS 8088, 208 204 197 194 192 byte

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

Tải xuống tệp thực thi DOS NATO.COM:

Dùng thử nhé! (trong DOSBox, v.v.)

        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

Đầu ra thử nghiệm:

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 

Đã cập nhật để xóa char đầu tiên khỏi mảng danh sách từ (mặc dù chỉ lưu 11 byte do mã yêu cầu bổ sung).


Bạn có thể lưu 2 byte bằng cách tìm ra cách tắt bộ đệm NOP hoặc sử dụng một phiên bản khác không làm được. Tôi đã sử dụng ML.EXE và nó không thực hiện phần đệm. Bạn có thể lưu thêm 18 byte hoặc hơn bằng cách xóa các $dấu phân cách và phân tách các từ bằng cách viết hoa chữ cái đầu tiên của chúng (và trước tiên tôi có nghĩa là thứ hai, vì bạn đã bỏ qua chữ cái đầu tiên). (Mức nén cao hơn có thể đạt được trước độ dài mã cần giải nén, nó sẽ vượt trội hơn lợi thế của nén, nhưng sơ đồ đơn giản của ký tự viết hoa sẽ là một khởi đầu tốt.)
Deadcode

1
Sử dụng MASM 5, tôi đã thử tất cả các biến thể của ALIGN và EVEN, và di chuyển các hướng dẫn xung quanh và bất kể nó thực sự thích gì trước khi REPNZ. Dấu phân cách $ là một cách rẻ tiền để có cả phân cách mảng và phân cách chuỗi để tôi có thể sử dụng INT 21H: 09 và không phải viết cấu trúc vòng lặp để in char bằng char. Tôi thích ý tưởng của bạn về việc sử dụng thủ đô làm dấu phân cách, một cái gì đó như 'LfaRavoHarlie', vâng? Theo thông số kỹ thuật, trường hợp không liên quan nên việc xuất ALfa hoặc CHarlie sẽ hoàn toàn chấp nhận được. Ý tưởng tuyệt vời! Sẽ cần phải mã hóa nó và xem kích thước khác biệt cuối cùng là gì.
640KB

Rõ ràng MASM 9 là phiên bản cuối cùng có tùy chọn / AT (cho .MODEL TINY), và trong thử nghiệm của tôi với mã của bạn, nó đã không thực hiện phần đệm NOP. Đầu ML.EXE /?ra nói Microsoft (R) Macro Assembler Version 9.00.30729.01. Đúng, "LfaRavoHarlie" chính xác là những gì tôi muốn nói. :) Tôi sẽ thực hiện "HOẶC AL, 20H" để làm cho chữ thường trở lại trong đầu ra, nhưng điều đó tùy thuộc vào bạn.
Deadcode

BTW, tại sao không bao gồm đầu trang và chân trang trong chế độ xem chưa được chỉnh sửa của bạn? MASM 9 sẽ không biên dịch nó cho tôi mà không có điều đó. Tôi có nghĩa là .MODEL TINY .CODE ORG 100H START:ở đầu và END STARTcuối. Bạn không cần điều này để biên dịch nó với MASM 5?
Deadcode

Tôi thường không bao gồm bản tóm tắt MASM vì nó không phải là một phần của mã được lắp ráp (bạn có thể nhận được cùng một mã byte theo nhiều cách tùy thuộc vào phiên bản MASM của bạn và tất cả). Tôi sử dụng cú pháp "cũ" vì tôi muốn kiểm tra nó trên MASM 1.1. :) Tôi tin rằng tôi đã tìm thấy sự cố NOP và có khả năng đó là lỗi MASM tồn tại ít nhất trong khoảng từ 1.1 đến 5. Nếu bạn đặt LNATO THIẾT BỊ bên trên mã hoặc mã cứng 08BH, nó sẽ không chèn hai NOP. Tuy nhiên, vì LNATO THIẾT BỊ nằm dưới mã, nên có sự khác biệt về những gì nó làm giữa pass1 và pass2, để lại khoảng trống đó. Kỳ quái!
640KB

5

05AB1E , 102 96 95 byte

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

Đầu ra là một danh sách các từ NATO theo tiêu đề.

Hãy thử trực tuyến.

Giải trình:

á              # 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)

Xem mẹo 05AB1E này của tôi (phần Làm thế nào để sử dụng từ điển? ) Để hiểu tại sao ”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". Tín dụng của chuỗi từ điển nén này được gửi tới @ErikTheGolfer trong bình luận này (có thêm ttừ Juliettthay thế Juliet).


Có thể sử dụng phép nội suy và nén để giảm số byte của các từ không tồn tại (trot, tt Kilo, Whiskey Xray). Ví dụ nửa vời: Hãy thử trực tuyến! Tôi đã làm điều đó trước đây, nhưng nó là cho một lượng từ LỚN, trong đó nó sẽ tiết kiệm tối đa 1 byte nếu bạn dành thời gian.
Bạch tuộc ma thuật Urn

4

Thạch ,  80  77 byte

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

Hãy thử trực tuyến! (Chân trang định dạng danh sách bằng cách nối với khoảng trắng để tránh in ấn ngầm khi chạy dưới dạng chương trình đầy đủ)


3

JavaScript (ES6), 181 189 byte

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

Vì trường hợp đầu ra không thành vấn đề, chúng tôi có thể lưu byte bằng cách chạy các từ cùng nhau:

... GolFoxtroTangO ...

Hãy thử trực tuyến!


2

Python 3 , 250 191 byte

-47 byte nhờ @Jo King, -2 nhiều hơn nhờ @Jonathan Allen

Nó đi qua tất cả các ký tự không phải khoảng trắng của đầu vào, và đối với mỗi ký tự, nó chọn cụm từ có liên quan cho chữ cái, có thể giảm một chút vì chữ cái đầu tiên của mỗi cụm từ là chính ký tự đó. Chia tách một chuỗi thay vì lưu trữ các cụm từ dưới dạng một mảng để lưu byte từ các 's và s không cần thiết ,.

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]

Hãy thử trực tuyến!

Giải pháp ban đầu

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()]

Hãy thử trực tuyến!


191 vớiif' '<c
Jonathan Allan

2

Màu đỏ , 210 193 byte

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]]

Hãy thử trực tuyến!

Giải trình:

foreachlặp qua chuỗi sau khi tất cả các khoảng trắng được loại bỏ bởi trim/all. prinin ký tự (không có dòng mới). printin một ký hiệu, picked từ danh sách get-word! s (ký hiệu) bằng cách sử dụng ký tự được ánh xạ tới phạm vi 1..26 làm chỉ mục.


2

Sạch , 218 byte

import StdEnv
$s=[takeWhile((<=)c)(dropWhile((<)c)['ZuluYankeeXrayWhiskeyVictorUniformTangoSierraRomeoQuebecPapaOscarNovemberMikeLimaKiloJuliettIndiaHotelGolfFoxtrotEchoDeltaCharlieBravoAlfa'])\\c<-map toUpper s|c>' ']

Hãy thử trực tuyến!


2

C # (Trình biên dịch tương tác Visual C #) , 218 byte

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

Hãy thử trực tuyến!

Phiên bản thay thế sử dụng Split (), 194 byte

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+"")

Hãy thử trực tuyến!


2

C ++, 229 228 byte

[](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<<' ';}}

Hãy thử trực tuyến!

Ung dung:

[](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 << ' ';
        }
    }
}

Đầu ra:

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 

Phiên bản viết hoa sạch ( 234 byte ):

[](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<<' ';}}

Hãy thử trực tuyến!

Đầu ra:

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

Ngôn ngữ máy IBM PC DOS 8088, 165 byte

Điều này trực tiếp dựa trên câu trả lời của gwaugh , nhưng tôi đã loại bỏ 26 byte bằng cách bỏ qua các $dấu phân cách khỏi bảng từ "NATO" và thêm 1 byte bằng cách không bỏ qua ký tự đầu tiên của chuỗi tham số dòng lệnh (sẽ luôn luôn là /hoặc và do đó sẽ bị bỏ qua bởi chương trình nào). Chương trình cuối cùng có cùng độ dài để có thể xử lý bảng theo định dạng này (trong đó các từ chỉ được phân tách bằng các ký tự in hoa, phục vụ mục đích kép cũng là chữ cái thứ hai của mỗi từ) hoặc 2 byte lâu hơn nếu viết hoa đầu ra được giữ nguyên như trước. Bảng nhỏ hơn 26 byte.

Trong kết xuất chương trình sau đây, ghép nối :được sử dụng để hiển thị từng chuỗi byte liên tiếp tương ứng với một lệnh:

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@

Tải xuống tệp thực thi DOS NATO.COM:
Với viết hoa không bị lỗi (165 byte)
Với viết hoa sạch (167 byte)
Phiên bản tiền thưởng viết hoa chữ cái đầu tiên của mỗi từ giống như đầu vào (167 byte)

Chưa được lắp ráp:

    .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

Đầu vào mẫu:

>NATO The quick brown fox jumped over the lazy dog.
>NATO Jackdaws love my big sphinx of quartz.

Đầu ra (phiên bản 165 byte):

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 

Phiên bản viết hoa sạch (167 byte):

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 

Phiên bản viết hoa sạch có cùng viết hoa với đầu vào (167 byte):

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
Làm việc tốt đấy!
640KB

1

Than , 99 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Đầu ra trong trường hợp thích hợp. Giải trình:

   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 byte

*.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

Hãy thử trực tuyến!

Đầu ra trong chữ hoa với chữ cái đầu tiên trong trường hợp ban đầu. Nén chuỗi, chỉ lưu 6 byte trên văn bản đơn giản hơn:

*.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$_}

Hãy thử trực tuyến!

Giải trình:

*.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 byte

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

Thử nó

Backticks chứa chuỗi nén:

ovemberwscarwapawuebecwomeowierrawangowniformwictorwhiskeywraywankeewuluwlfawravowharlieweltawchowoxtrotwolfwotelwndiawuliettwilowimawike

1

PowerShell , 187 183 byte

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

Hãy thử trực tuyến!

Kịch bản thử nghiệm:

$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"
}

Đầu ra:

True
Hotel Echo Lima Lima Oscar Whiskey Oscar Romeo Lima Delta

1

PHP ,209 205 206 byte

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

Hãy thử trực tuyến!

Đầu ra:

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

Hoặc 195 byte, với khoảng trắng không bị xóa hoàn toàn:

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

Hãy thử trực tuyến!

Đầu ra:

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

Đẹp, nhưng chỉnh sửa mới nhất của bạn đã giới thiệu một lỗi do một. Một cách để sửa nó là thay đổi [31&ord($l)]trở lại [31&ord($l)-1], tốn hai byte, nhưng bạn cũng có thể sửa nó chỉ trong một byte bằng cách đánh vần đầy đủ ALfa.
Deadcode

Rất tiếc! Bắt tốt và sửa chữa rất thông minh. Thx @deadcode!
640KB

0

TSQL, 313 byte

Chơi gôn

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 @

Ung dung:

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 @

Dùng thử

Đầu ra kết thúc bằng dấu chấm phẩy


0

PowerShell, 228 225 byte

-3 byte nhờ @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

Hãy thử trực tuyến!

Đây hoàn toàn có thể là đoạn mã xấu nhất tôi từng viết. Ngoài ra, điều này chắc chắn có thể nhận được ngắn hơn rất nhiều. Để phòng thủ, tôi vẫn đang hồi phục sau kì thi cuối kỳ.


-split'lfa ravo ...'ngắn hơn vì '\ s' là bộ chia theo mặc định :)
mazzy

0

PHP, 212 byte

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]," ";

Chạy như ống với -nRhoặc thử trực tuyến .

Đưa ra các cảnh báo trong PHP 7.2; đặt các yếu tố mảng trong dấu ngoặc kép để sửa chữa.

Sẽ in một dấu gạch dưới cho không gian.



0

JavaScript, 179 byte

s=>s.match(/\w/g).map(c=>c+'LfaRavoHarlieEltaChoOxtrotOlfOtelNdiaUliettIloImaIkeOvemberScarApaUebecOmeoIerraAngoNiformIctorHiskeyRayAnkeeUlu'.match(/.[a-z]+/g)[parseInt(c,36)-10])

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.