Створіть абревіатуру


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 байт

ÍÕü¼À!õ

Спробуйте в Інтернеті!

Ось шістнадцятковий доказ для підтвердження кількості байтів:

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 байти завдяки Scarabee

Анонімна функція; повертає абревіатуру як вектор, c("N","A","T","O")який неявно друкується.

Колись, це не дуже погано в R! розбивається на -або (space), бере перший елемент кожного з них, а потім повертає те, що є великими літерами ( LETTERSце R, вбудований з великої літери), за порядком.


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

1
@Scarabee дякую вибачте, що на оновлення знадобилося 2 роки
Джузеппе


5

Javascript 21 байт

Бере рядок і виводить масив рядків, що містять символи абревіатури

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

Пояснення

Це просто глобальний збіг регулярних виразів для кордону слів, за яким йде велика літера.



4

Діялог APL, 29 23 байти

Тест на бонус: Мова програмування (APL).

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

Повертає масив символів (показує, як простір розділено на TIO).

Спробуйте в Інтернеті!


Старіший пост, 29 байт

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

Спробуйте в Інтернеті!

Як?

'(\w)\w+'⎕R - замінити кожен кластер алфавітних символів

    '\1' - з його першим персонажем

~⍨ - видаліть кожну оболонку

    (⎕AV~⎕A) - це не велика літера ASCII


3

Пітон, 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

має сенс; дякую за роз’яснення

Ви можете зберегти кілька байтів, перевіривши великі регістри, використовуючи символи як ints. c> 64 & c <91 має становити 6 байт.
jkelm

@jkelm Ніцца :) Я завжди забуваю про цей трюк!
TheLethalCoder

3

Джулія 0.6.0 (57 байт)

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

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

Напевно, легше зробити це за допомогою регексу, але я новачок у цьому


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

Гм, чому б не використовувати замість ṣ⁶?
Ерік Аутгольфер

Хе, бо я про це забув. Спасибі!
Джонатан Аллан

2

Perl 5 , 25 байт

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

Прикро, що grep -Pпідтримка змінної довжини виглядає позаду, але Perl не :(.

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

-1 байт завдяки @Dada !

Спробуйте в Інтернеті! - включає -lв себе запуск відразу всіх тестів.


Ви можете зробити надзвичайно набагато краще: Спробуйте це в Інтернеті! ;-)
Дада

@Dada Hah! Звичайно ... я не в банкоматі, але оновлю, коли повернусь. Спасибі! Я дуже розчарований, що не зміг отримати 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

Швидкий 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поштовим вводом та входом із пробілом, який додається на початку, що дуже корисно для отримання попереднього символу в рядку.

  • 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

Баш (греп), 29 28 байт

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

Порт моєї відповіді python але тому pgrep підтримує зміну довжини поглядів позаду, він помітно коротший (навіть облік витрат на python). Вставте тестові випадки у файл, який називається a, вихід - 1 символ на рядок.

-1 Завдяки Нілу


^| |-може бути коротший тест?
Ніл

@Neil, який працює тут, дякую. Пропустив його, оскільки він не працює в Python
Chris H

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?
Zacharý

1

Луа , 79 75 байт

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

Спробуй це!

Я застряг друк () перед остаточним завершенням у випробувальній версії, тому що в іншому випадку це безлад. Ця програма чудово дотримується вимог вводу / виводу та відповідності, але без цього додаткового нового рядка читати досить складно.

Введення подається у вигляді таблиці числа: рядок, збільшення числа на 1 кожен раз і починаючи з 1.

Пояснення:

Це для циклів через гматч кожного вхідного рядка. Пошук gmatch такий:

[% - | ] - Групуйте, шукайте - або пробіл

% u - Пошук великих літер

Потім для кожного матчу він виводить його за мінусом попереднього тире чи пробілу

Редагувати: 4 байти, що містять у своєму розпорядженні 4 байтами, видаливши декларацію "a" та додавши пробіл до вводу всередині циклу for for, а також змінивши додатковий вхід лише на 2, а не на 2,2 (що дає еквівалентні результати)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.