Создать акроним


19

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

задача

Если задана строка (допускается список строк с символами / длиной 1), содержащая только печатный ASCII, выведите на вход все заглавные буквы, которым предшествует пробел или тире, или которые являются первым символом на входе. Пустая строка - неопределенное поведение.

Тестовые случаи:

Выход может быть в формате "TEST", ["T","E","S","T"]или все остальное работает для вас.

Self-contained Underwater Breathing Apparatus
SUBA

a Programming Language
PL

NATO Atlantic TREATY Organization
NATO

DEFCON 2
D

hello, world!


light-Emitting dioDe
E

What Does the Fox Say?
WDFS


3D mov-Ies
I

laugh-Out Lou-D
OLD

Best friends FOREVE-r
BF

--


<space>


--  --a -  - --


--  -- -  - -- A
A

Step-Hen@Gmail-Mail Mail.CoM m
SHMM

Это , поэтому выигрывает самый короткий ответ в байтах.



Можем ли мы принять ввод как список строк (список символов)?
г-н Xcoder

@ Mr.Xcoder да.
Стивен

Не могли бы вы добавить тестовый набор, включающий несколько букв, разделенных одним или несколькими символами, которые не являются буквами, цифрами, пробелами или тире. Адрес электронной почты, например: My-Name@Some-Domain.TLD.
Лохматый

1
@ Shaggy добавил, спасибо.
Стивен

Ответы:


8

V , 7 байт

ÍÕü¼À!õ

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

Вот hexdump, чтобы доказать количество байтов:

00000000: cdd5 fcbc c021 f5                        .....!.

Объяснение:

Í       " Search and replace all occurrences on all lines:
        " (Search for)
 Õ      "   A non-uppercase letter [^A-Z]
  ü     "   OR
      õ "   An uppercase letter
    À!  "   Not preceded by...
   ¼    "   A word-boundary
        " (implicitly) And replace it with:
        "   Nothing

Это коротко все благодаря замечательной V в сжатии регулярных выражений .


Это довольно короткое 0.o
Стивен

@StepHen Почему спасибо! Я думаю, что это довольно близко к оптимальному. :)
DJMcMayhem

2
Что вы подразумеваете под границей слова? Кажется, вопрос предполагает, что только пространство и -разрешено.
Нил

8

R , 66 63 байта

function(s)(s=substr(strsplit(s,' |-')[[1]],1,1))[s%in%LETTERS]

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

-3 байта благодаря Скараби

Анонимная функция; возвращает аббревиатуру как вектор, c("N","A","T","O")который неявно печатается.

На этот раз это не так уж плохо в R! разделяется на -или (space), берет первый элемент каждого из них, а затем возвращает LETTERSпо порядку те, которые являются заглавными ( это R, встроенный с заглавными буквами).


Я думаю, что вы можете сохранить несколько байтов:function(s)(s=substr(strsplit(s,' |-')[[1]],1,1))[s%in%LETTERS]
Scarabee

1
@ Скараби спасибо. извините потребовалось 2 года, чтобы обновить.
Джузеппе


5

Javascript 21 байт

Принимает строковый ввод и выводит массив строк, содержащих символы аббревиатуры

x=>x.match(/\b[A-Z]/g)

объяснение

Это просто глобальное регулярное выражение для границы слова, за которой следует заглавная буква.



4

Дьялог АПЛ, 29 23 байта

Бонусный тестовый пример: язык программирования (APL).

'(?<=^| |-)[A-Z]'⎕S'&'⊢

Возвращает массив символов (отображается как пространство, разделенное на TIO).

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


Предыдущий пост, 29 байт

{(⎕AV~⎕A)~⍨'(\w)\w+'⎕R'\1'⊢⍵}

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

Как?

'(\w)\w+'⎕R - заменить каждый кластер букв алфавита

    '\1' - со своим первым персонажем

~⍨ - удалить каждый символ

    (⎕AV~⎕A) - это не прописная буква ASCII


3

Python, 53 байта

import re
lambda s:re.findall("(?<=[ -])[A-Z]"," "+s)

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

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


Отредактировано в ссылке TIO с набором тестов MrXCoder.
Стивен

Спасибо @StepHen - вы победили меня и спасли меня от усилий
Крис Х


3

C #, 84 78 байт

using System.Linq;s=>s.Where((c,i)=>c>64&c<91&(i>0?s[i-1]==32|s[i-1]==45:1>0))

Сохранено 6 байт благодаря @jkelm .

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

Полная / Отформатированная версия:

using System.Collections.Generic;
using System.Linq;

class P
{
    static void Main()
    {
        System.Func<string, IEnumerable<char>> f = s => s.Where((c, i) => c > 64 & c < 91 & (i > 0 ? s[i-1] == 32 | s[i-1] == 45: 1 > 0));

        System.Console.WriteLine(string.Concat(f("Self-contained Underwater Breathing Apparatus")));
        System.Console.WriteLine(string.Concat(f("a Programming Language")));
        System.Console.WriteLine(string.Concat(f("NATO Atlantic TREATY Organization")));
        System.Console.WriteLine(string.Concat(f("DEFCON 2")));
        System.Console.WriteLine(string.Concat(f("hello, world!")));
        System.Console.WriteLine(string.Concat(f("light-Emitting dioDe")));
        System.Console.WriteLine(string.Concat(f("What Does the Fox Say?")));
        System.Console.WriteLine(string.Concat(f("3D mov-Ies")));
        System.Console.WriteLine(string.Concat(f("laugh-Out Lou-D")));
        System.Console.WriteLine(string.Concat(f("Best friends FOREVE-r")));
        System.Console.WriteLine(string.Concat(f(" ")));
        System.Console.WriteLine(string.Concat(f("--  --a -  - --")));
        System.Console.WriteLine(string.Concat(f("--  -- -  - -- A")));

        System.Console.ReadLine();
    }
}

Почему вы должны включить using System.Linqв число байтов, если using System.Collections.Genericэто освобождено? Есть ли какой-то консенсус, на который usingможно рассчитывать?

@DaveParsons using System.Linq;необходим для кода Linq в моем ответе. Однако IEnumerbale<char>это не часть ответа, а та часть кода, которую необходимо using System.Collections.Generic;скомпилировать.
TheLethalCoder

имеет смысл; Спасибо за разъяснение.

Вы можете сохранить несколько байтов, проверив верхний регистр, используя символы в качестве целых. c> 64 и c <91 должны дать вам 6 байтов.
17

@jkelm Хорошо :) Я всегда забываю об этом трюке!
TheLethalCoder

3

Юлия 0.6.0 (57 байт)

s=split(s,r" |-");for w∈s isupper(w[1])&&print(w[1])end

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

Наверное, легко сделать лучше с помощью регулярных выражений, но я новичок в этом


1
Добро пожаловать в PPCG! У меня сейчас нет голосов, я проголосую позже.
Стивен

2
@ StepHen Я получил покрытый : P
DJMcMayhem


2

C # (.NET Core) , 108 байт

n=>{var j="";n=' '+n;for(int i=0;++i<n.Length;)if(" -".IndexOf(n[i-1])>=0&n[i]>64&n[i]<91)j+=n[i];return j;}

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


Не проверено, но изменение на ifтроичное может сэкономить байты. Это начинается с индекса, 2а не 1просто изменить int i=1его, int i=0чтобы исправить это. Кроме этого, я не думаю, что здесь можно сделать намного больше.
TheLethalCoder

Троица не помогла бы здесь, так как это будет то же число байтов, что и в операторе if. Тем не менее, вы правы в том, что мне нужно изменить начальное значение i
jkelm

Я не был полностью уверен, но они обычно выходят короче, поэтому всегда стоит проверить.
TheLethalCoder

2

Желе ,  11  10 байт

-1 байт благодаря Эрику Аутгольферу ( разделяется на пробелы> _ <)

⁾- yḲḢ€fØA

Монадическая ссылка, берущая и возвращающая списки символов.
Так как полная программа принимает строку и печатает результат.

Попробуйте онлайн! или посмотрите набор тестов .

Как?

⁾- yḲḢ€fØA - Link: list of characters, x       e.g. "Pro-Am Code-golf Association"
   y       - translate x with:
⁾-         -   literal list of characters ['-',' '] "Pro Am Code golf Association"
    Ḳ      - split at spaces               ["Pro","Am","Code","golf","Association"]
     Ḣ€    - head each (1st character of each)      "PACgA"
        ØA - yield uppercase alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
       f   - filter keep                            "PACA"
           - if running as a full program: implicit print

Хм, почему бы не использовать вместо ṣ⁶?
Эрик Outgolfer

Хех, потому что я забыл об этом. Благодарность!
Джонатан Аллан

2

Perl 5 , 25 байт

24-байтовый код + 1 для -n.

Раздражает, что grep -Pподдержка переменной длины, но Perl этого не делает :(.

print/(?:^| |-)([A-Z])/g

-1 байт благодаря @Dada !

Попробуйте онлайн! - включает -lв себя запускать все тесты одновременно.


Вы можете сделать это намного лучше - попробуйте онлайн! ;-)
Дада

@ Дада Ха! Конечно ... У меня нет банкомата, но я обновлю, когда вернусь. Благодарность! Я очень разочарован, я не мог получить s///или $_=отрицать print...
Дом Гастингс

Да, я искал сингл, s///чтобы решить это, но это не очевидно ... Я на работе, может быть, я попробую еще раз позже!
Дада


2

Брахилог , 25 23 22 байта

,Ṣ↻s₂ᶠ{h∈" -"&t.∧Ạụ∋}ˢ

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

(-2 байта благодаря @Fatalize.)

,Ṣ↻                      % prepend a space to input
   s₂ᶠ                   % get all substrings of length 2 from that, to get prefix-character pairs
      {              }ˢ  % get the successful outputs from this predicate: 
       h∈" -"              % the prefix is - or space
               &t.∧        % then the character is the output of this predicate if:
                  Ạụ∋        % the alphabet uppercased contains the character

Вы можете использовать вместо того, " "чтобы сохранить два байта
Fatalize


2

Swift 5 , 110 байт

-5 благодаря Cœur

import UIKit
func f(s:[String]){for i in zip(s,[" "]+s){if i.0.isUppercase()&&"- ".contains(i.1){print(i.0)}}}

Детальное объяснение

  • import Foundation- Импортирует модуль, Foundationкоторый является жизненно важным для zip()основной части этого кода.

  • func f(s:[String]){...}- Создает функцию с параметром s, который представляет собой список строк, представляющих символы ввода.

  • for i in zip(s,[" "]+s){...}- Выполняется итерация с iпомощью zip ввода и ввода с добавлением пробела в начале, что очень полезно для получения предыдущего символа в строке.

  • if - Проверяет, есть ли:

    • i.0==i.0.uppercased() - текущий символ в верхнем регистре,

    • &&"- ".contains(i.1) - и если предыдущий символ - пробел или тире.

  • Если вышеуказанные условия выполнены, то:

    • print(i.0) - Персонаж напечатан, потому что он является частью аббревиатуры.

-5 с import UIKitвместо import Foundation.
Cœur



1

Python 3 , 73 70 байт

lambda n:[n[x]for x in range(len(n))if'@'<n[x]<'['and(' '+n)[x]in' -']

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


объяснение

  • lambda n:- Создает анонимную лямбда-функцию с параметром String n.

  • n[x]- Получает символ nв индексе x.

  • for x in range(len(n))- Итерирует от 0до длины n, присваивая имя переменной x.

  • if - Проверки:

    • '@'<n[x]<'[' - Если символ в верхнем регистре,

    • and(' '+n)[x]in' -'- И если ему предшествует пробел или тире в строке, образованной пробелом и n.


2
Это плохо, что я прочитал это как i supper, и я понятия не имею, почему?
TheLethalCoder

@TheLethalCoder Это .isupper(), я понятия не имею, что вы читаете: p
Мистер Xcoder





1

Bash (grep), 29 28 байт

grep -oP'(?<=^| |-)[A-Z]' a

Порт моего ответа на Python, но поскольку он pgrepподдерживает переменную длину, он заметно короче (даже учитывая накладные расходы Python). Вставьте контрольные примеры в файл с именем a, выводится 1 символ на строку.

-1 Спасибо Нейлу


^| |-может быть более короткий тест?
Нил

@ Нейл, который работает здесь, спасибо. Пропустил это, потому что это не работает в Питоне
Крис Х

1

RProgN 2 , 18 байт

`-` rû#ùr.'[a-z]'-

Разъяснения

`-` rû#ùr.'[a-z]'-
`-`                     # Push "-" literal, and " " literal.
    r                   # replace, Replaces all "-"s with " "s.
     û                  # Split, defaultly by spaces.
      #ù                # Push the head function literally.
        r               # Replace each element of the split string by the head function, which gets each first character.
         .              # Concatenate, which collapses the stack back to a string.
          '[a-z]'-      # Push the string "[a-z]" literally, then remove it from the string underneith, giving us our output. 

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


1

PHP, 62 байта

for(;~$c=$argn[$i++];$p=$c!="-"&$c!=" ")$c<A|$c>Z|$p?:print$c;

Запустите как трубу с -nRили попробуйте онлайн .

другие решения:

foreach(preg_split("#[ -]#",$argn)as$s)$s[0]>Z|$s<A?:print$s[0];  # 64 bytes
preg_match_all("#(?<=\s|-)[A-Z]#"," $argn",$m);echo join($m[0]);  # 64 bytes
preg_match_all("#(?<=\s|-)\p{Lu}#"," $argn",$m);echo join($m[0]); # 65 bytes

1

C ++, 168 байт

#include<string>
auto a=[](auto&s){auto r=s.substr(0,1);if(r[0]<65||r[0]>90)r="";for(int i=1;i<s.size();++i)if(s[i]>64&&s[i]<91&&(s[i-1]==32||s[i-1]==45))r+=s[i];s=r;};

Вывод осуществляется через параметр


Можно ли полностью удалить #include<string>и предположить, что аргумент sявляется std::string?
Захари

1

Луа , 79 75 байт

for i=1,#t do for i in(" "..t[i]):gmatch"[%-| ]%u"do print(i:sub(2))end end

Попытайся!

Я вставил print () перед окончательным завершением в пробной версии, потому что иначе это беспорядок. Эта программа идеально соответствует требованиям ввода-вывода и сопоставления, но без этой дополнительной новой строки ее довольно сложно прочитать.

Входные данные даны в виде таблицы чисел: строка, число увеличивается на 1 каждый раз и начинается с 1.

Объяснение:

Это для циклов через gmatch каждой входной строки. Поиск gmatch выглядит следующим образом:

[% - | ] - группа, поиск - или пробел

% u - поиск заглавных букв

Затем для каждого совпадения выводится минус предыдущий тире или пробел

Редактировать: обработать 4 байта, убрав объявление «а» и добавив пробел к входу внутри цикла for, а также изменив вспомогательный вход только на 2 вместо 2,2 (что дает эквивалентные результаты)


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