Напишите функцию / метод, который принимает строку и записывает это слово, используя фонетический алфавит НАТО. Заголовок необязательно


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

Ввод может быть любой строкой, но всегда будет состоять только из букв и пробелов. Регистр не имеет значения в выводе, но ввод может содержать буквы в верхнем, нижнем регистре или оба. Пробелы должны игнорироваться в выходных данных.

Вы можете выводить данные в любом приемлемом формате, но это должен быть ограниченный набор позывных НАТО.


4
Добро пожаловать в PPCG! Этот вопрос уже задавался. Но это, вероятно, было бы закрыто в любом случае по нескольким другим причинам: 1) Если нет веских оснований для этого, просьба ответить определенным образом (функция) на определенном языке обычно осуждается. 2) Задачи должны быть самодостаточными: вы должны объяснить, какой именно фонетический алфавит НАТО находится в теле вопроса. 3) В своем нынешнем виде это выглядит как домашнее задание. Если это так, вы можете найти справку по переполнению стека, при условии, что вы включите то, что вы уже сделали, и объясните, где вы застряли.
Арно

4
Я был бы за повторное открытие этого, если бы пункты @Arnauld, поднятые выше, были рассмотрены, так как он не имеет ограничения источника или проверки ввода связанной задачи.
Мохнатый

1
Я отредактировал это так, чтобы его можно было снова открывать, поскольку оно не имеет ограничений на символы. Все ли мои изменения уместны? Особенно проверьте входные ограничения.
19

10
Это алфавит ИКАО; алфавит НАТО использует Alphaи Julietвместо.
Нил

2
Whiskyв примере не равно Whiskeyв сопоставлении.
Маззи

Ответы:


13

сфк , 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 был дешевым способом иметь и разделитель массива, и разделитель строк, поэтому я мог использовать INT 21H: 09 и не должен был писать структуру цикла, чтобы печатать его как char за char. Мне нравится ваша идея об использовании прописных букв в качестве разделителей, что-то вроде «LfaRavoHarlie», да? Согласно спецификации, случай не имеет значения, поэтому вывод ALfa или CHarlie будет вполне приемлемым. Отличные идеи! Нужно будет его кодировать и посмотреть, какой размер в конце концов окажется.
640KB

Очевидно, MASM 9 была последней версией, в которой была опция / AT (для .MODEL TINY), и в моем тесте с вашим кодом она не выполняла заполнение NOP. ML.EXE /?Говорит выход Microsoft (R) Macro Assembler Version 9.00.30729.01. Да, «LfaRavoHarlie» - именно то, что я имел в виду. :) Я бы сделал "ИЛИ AL, 20H", чтобы снова сделать его строчным в выводе, но решать вам.
Deadcode

Кстати, почему бы не включить верхний и нижний колонтитулы в вашем разобранном виде? 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, оставляя это пространство там. Bizarre!
640KB

5

05AB1E , 102 96 95 байтов

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

Выходные данные - это список названий НАТО.

Попробуйте онлайн.

Объяснение:

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


Может быть в состоянии использовать интерполяцию и сжатие, чтобы уменьшить количество байтов несуществующих слов (рысь, тило кило, виски Xray). Пример половинного прохождения: попробуйте онлайн! Я делал это раньше, но это было для БОЛЬШОГО количества слов, в этом это сэкономило бы в лучшем случае 1 байт, если бы вы потратили время.
Волшебная Урна Осьминога

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

Попробуйте онлайн!



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

Попробуйте онлайн!

Объяснение:

foreachперебирает строку после того, как все пробелы удалены trim/all. prinпечатает символ (без новой строки). printпечатает символ, pickредактируемый из списка get-word! s (символов), используя символ, сопоставленный с диапазоном 1..26 в качестве индекса.



2

C # (интерактивный компилятор Visual C #) , 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 байт

Это напрямую основано на ответе Гуах , но я сбрил 26 байт, опуская $разделители из слов таблицы «НАТО» и дополнительных 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

Попытайся

Бэктикс содержит сжатую строку:

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

Упс! Хороший улов и очень умное исправление. Спасибо @deadcode!
640 КБ

0

TSQL, 313 байта

Golfed:

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; положить элементы массива в кавычки, чтобы исправить.

Напечатает подчеркивание для пробелов.



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.