Wygeneruj skrót

19

Jest to podobne do tworzenia akronimu , ale istnieje kilka kluczowych różnic, w tym metoda pobierania akronimu, a wyzwanie to obejmuje elastyczną produkcję.

Zadanie

Biorąc pod uwagę ciąg znaków (dozwolona jest lista znaków / długość 1 ciągów znaków) zawierający tylko drukowalne ASCII, wypisz na wejściu wszystkie wielkie litery poprzedzone spacją lub myślnikiem albo pierwszy znak na wejściu. Pusty ciąg znaków jest niezdefiniowanym zachowaniem.

Przypadki testowe:

Wyjście może być w formie "TEST", ["T","E","S","T"]albo cokolwiek innego działa dla Ciebie.

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

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Stephen
źródło
Piaskownica
Stephen
Czy możemy przyjmować dane wejściowe jako listę ciągów znaków (listę znaków)?
Pan Xcoder,
@ Mr.Xcoder tak.
Stephen
Czy możesz dodać przypadek testowy, który zawiera niektóre litery oddzielone jednym lub większą liczbą znaków, które nie są literami, cyframi, spacjami ani myślnikami. Adres e-mail, na przykład: [email protected].
Shaggy
1
@Shaggy dodaje, dzięki.
Stephen

Odpowiedzi:

8

V , 7 bajtów

ÍÕü¼À!õ

Wypróbuj online!

Oto zrzut heksowy, który potwierdza liczbę bajtów:

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

Wyjaśnienie:

Í       " 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

Jest to krótki wszystko dzięki wspaniałej V za kompresji regex .

DJMcMayhem
źródło
To dość krótkie 0.o
Stephen
@StepHen Dlaczego dziękuję! Myślę, że jest to dość zbliżone do optymalnego. :)
DJMcMayhem
2
Co rozumiesz przez granicę słów? Pytanie wydaje się sugerować, że tylko spacja i -są dozwolone.
Neil
8

R , 66 63 bajtów

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

Wypróbuj online!

-3 bajty dzięki Scarabee

Anonimowa funkcja; zwraca akronim jako wektor, c("N","A","T","O")który jest drukowany domyślnie.

Tym razem nie jest tak źle w R! dzieli na -lub (space)bierze pierwszy element każdego z nich, a następnie zwraca dowolne, które są wielkimi literami ( LETTERSjest to wbudowane R z dużymi literami), w kolejności.

Giuseppe
źródło
Myślę, że możesz zaoszczędzić kilka bajtów:function(s)(s=substr(strsplit(s,' |-')[[1]],1,1))[s%in%LETTERS]
Scarabee
1
@Scarabee dziękuję. przepraszam, aktualizacja zajęła 2 lata.
Giuseppe
6

Python 2 , 59 56 bajtów

-3 bajty dzięki Lynn

lambda s:[b for a,b in zip(' '+s,s)if'@'<b<'['>a in' -']

Wypróbuj online!

Pręt
źródło
Pożyczyłem twoją sztuczkę '@'<b<'[', bardzo fajne rozwiązanie +1
Mr. Xcoder
Nie zapomnij o porównywaniu łańcuchów! '@'<b<'['>a in' -'oszczędza 3 bajty.
Lynn
5

Javascript 21 bajtów

Pobiera dane wejściowe i wyświetla tablicę ciągów zawierających znaki akronimowe

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

Wyjaśnienie

To tylko globalne dopasowanie wyrażenia regularnego dla granicy słowa, po której następuje wielka litera.

asgalant
źródło
4

Retina , 21 17 bajtów

!`(?<=^| |-)[A-Z]

Wypróbuj online!

Wyjaśnienie

Wyświetla dopasowania wyrażenia regularnego (?<=^| |-)[A-Z]na wejściu, po jednym w wierszu ( !).

Business Cat
źródło
4

Dyalog APL, 29 23 bajtów

Dodatkowy przypadek testowy: język programowania (APL).

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

Zwraca tablicę znaków (pokazuje jako przestrzeń oddzieloną w TIO).

Wypróbuj online!


Starszy post, 29 bajtów

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

Wypróbuj online!

W jaki sposób?

'(\w)\w+'⎕R - zastąp każdą grupę znaków alfabetycznych

    '\1' - ze swoją pierwszą postacią

~⍨ - usuń każdy znak

    (⎕AV~⎕A) - to nie jest duża litera ASCII

Uriel
źródło
3

Python, 53 bajty

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

Wypróbuj online!

Proste wyrażenie regularne z wyczekiwaniem miejsca lub myślnika. Zamiast dopasowywać początek, wstaw spację.

Chris H.
źródło
Edytowane w łączu TIO z pakietem testowym MrXCoder.
Stephen
Dzięki @StepHen - pobiłeś mnie i zaoszczędziłeś mi wysiłku
Chris H
50
ujemna siedem,
3

C #, 84 78 bajtów

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

Zaoszczędź 6 bajtów dzięki @jkelm .

Wypróbuj online!

Pełna / sformatowana wersja:

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();
    }
}
TheLethalCoder
źródło
Dlaczego musisz uwzględnić using System.Linqw liczbie bajtów, jeśli using System.Collections.Genericjest zwolniony? Czy istnieje konsensus co do tego, które usingmożna policzyć?
@DaveParsons using System.Linq;jest potrzebny do kodu Linq w mojej odpowiedzi. Nie IEnumerbale<char>jest to jednak część odpowiedzi i jest to część kodu, którą należy using System.Collections.Generic;skompilować.
TheLethalCoder
ma sens; dzięki za wyjaśnienie.
Możesz zapisać kilka bajtów, sprawdzając wielkie litery, używając znaków jako ints. c> 64 i c <91 powinny dać ci 6 bajtów.
jkelm
@jkelm Nice :) Zawsze zapominam o tej sztuczce!
TheLethalCoder
3

Julia 0.6.0 (57 bajtów)

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

Objaśnienie: To mój pierwszy golf. Całkiem prosto. Podziel słowa, wydrukuj pierwszą pierwszą literę każdego z nich.

Prawdopodobnie łatwo to zrobić lepiej, używając wyrażenia regularnego, ale jestem nowy

Goysa
źródło
1
Witamy w PPCG! W tej chwili nie mam głosów, zagłosuję później.
Stephen
2
@StepHen Mam pokryte. : P
DJMcMayhem
2

C # (.NET Core) , 108 bajtów

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;}

Wypróbuj online!

jkelm
źródło
Nie sprawdzono, ale zmiana na iftrójskładnikową może zaoszczędzić bajty. Zaczyna się od indeksu 2zamiast 1, wystarczy zmienić, int i=1aby int i=0to naprawić. Poza tym nie sądzę, że możesz tutaj zrobić znacznie więcej.
TheLethalCoder
Trójka nie pomogłaby w tym przypadku, ponieważ byłaby taka sama liczba bajtów jak instrukcja if. Masz jednak rację, że muszę zmienić początkową wartość i
jkelm
Nie byłem do końca pewien, ale zazwyczaj są krótsze, więc zawsze warto to sprawdzić.
TheLethalCoder
2

Galaretka ,  11  10 bajtów

-1 bajt dzięki Erikowi Outgolfer ( dzieli się na spacje> _ <)

⁾- yḲḢ€fØA

Monadyczny link pobierający i zwracający listy znaków.
Jako pełny program przyjmuje ciąg znaków i wypisuje wynik.

Wypróbuj online! lub zobacz zestaw testowy .

W jaki sposób?

⁾- 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
Jonathan Allan
źródło
Umm, dlaczego nie użyć zamiast ṣ⁶?
Erik the Outgolfer
Heh, bo o tym zapomniałem. Dzięki!
Jonathan Allan
2

Perl 5 , 25 bajtów

24 bajtowy kod + 1 dla -n.

Irytujące, że grep -Pobsługuje spojrzenie o zmiennej długości, ale Perl nie :(.

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

-1 bajt dzięki @Dada !

Wypróbuj online! - obejmuje -luruchomienie wszystkich testów jednocześnie.

Dom Hastings
źródło
Możesz zrobić o wiele znacznie lepiej: wypróbuj online! ;-)
Dada
@Dada Hah! Oczywiście ... Nie mam bankomatu, ale zaktualizuję się, kiedy wrócę. Dzięki! Jestem bardzo rozczarowany, że nie mógł dostać s///albo $_=do neguje print...
Dom Hastings
Tak, szukałem singla, który s///by to rozwiązał, ale to nie jest oczywiste ... Jestem w pracy, może spróbuję później!
Dada
2

Brachylog , 25 23 22 bajtów

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

Wypróbuj online!

(-2 bajty dzięki @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
sundar - Przywróć Monikę
źródło
Możesz użyć zamiast " "zapisać dwa bajty
Fatalize
2

Japt , 19 16 14 bajtów

-2 bajty dzięki Shaggy

f/^| |-)\A/ mÌ

Wypróbuj online!

Oliver
źródło
Ponieważ używasz v2, myślę, że możesz zmienić "(^| |-)%A"na, /^| |-)\A/aby zapisać bajt
ETHproductions
1
mf\A->, aby zapisać 2 bajty.
Kudłaty
2

Swift 5 , 110 bajtów

-5 dzięki Cœur

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

Szczegółowe wyjaśnienie

  • import Foundation- Importuje Foundationniezbędny moduł zip(), główny element tego kodu.

  • func f(s:[String]){...}- Tworzy funkcję z parametrem s, czyli listą ciągów znaków reprezentujących znaki wejścia.

  • for i in zip(s,[" "]+s){...}- Iteruje za ipomocą zipu wejścia i wejścia z spacją dodaną na początku, co jest bardzo pomocne w uzyskaniu poprzedniego znaku w ciągu.

  • if - Sprawdza, czy:

    • i.0==i.0.uppercased() - Obecny znak jest pisany wielkimi literami,

    • &&"- ".contains(i.1) - oraz Jeśli poprzedni znak to spacja lub myślnik.

  • Jeśli powyższe warunki są spełnione, to:

    • print(i.0) - Znak jest drukowany, ponieważ jest częścią akronimu.
Pan Xcoder
źródło
-5 z import UIKitzamiast import Foundation.
Cœur
2

PowerShell , 43 bajty

''+($args|sls '(?<=^| |-)[A-Z]'-a -ca|% m*)

Wypróbuj online!

Rozwinięty:

''+($args|select-string '(?<=^| |-)[A-Z]' -allmatches -caseSensitive|% matches)
Veskah
źródło
1

Python 3 , 73 70 bajtów

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

Wypróbuj online!


Wyjaśnienie

  • lambda n:- Tworzy anonimową funkcję lambda z parametrem String n.

  • n[x]- Pobiera znak nw indeksie x.

  • for x in range(len(n))- Iteruje od 0do n, nazywając zmienną x.

  • if - Czeki:

    • '@'<n[x]<'[' - Jeśli znak jest pisany wielkimi literami,

    • and(' '+n)[x]in' -'- A jeśli poprzedza go spacja lub myślnik w ciągu utworzonym przez spację i n.

Pan Xcoder
źródło
2
Czy to źle, że czytałem to jako i supperi nie mam pojęcia, dlaczego?
TheLethalCoder
@TheLethalCoder To .isupper(), nie mam pojęcia, co czytasz: p
Pan Xcoder
1

Bash (grep), 29 28 bajtów

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

Port mojej odpowiedzi w Pythonie, ale ponieważ pgrepobsługuje zmienną długość lookhinds, jest zauważalnie krótszy (nawet biorąc pod uwagę obciążenie Pythona). Przyklej przypadki testowe do pliku o nazwie a, wyjście to 1 znak na linię.

-1 dzięki Neil

Chris H.
źródło
^| |-może być krótszy test?
Neil
@ Nee, który tu działa, dzięki. Brakowało go, ponieważ nie działa w Pythonie
Chris H
1

RProgN 2 , 18 bajtów

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

Wyjaśniono

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

Wypróbuj online!

ATaco
źródło
1

PHP, 62 bajty

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

Uruchom jako potok z -nRlub spróbuj online .

inne rozwiązania:

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
Tytus
źródło
1

C ++, 168 bajtów

#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;};

Dane wyjściowe wykonane za pomocą parametru

HatsuPointerKun
źródło
Czy byłoby możliwe całkowite usunięcie #include<string>i założenie, że argument sjest std::string?
Zacharý
1

Lua , 79 75 bajtów

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

Spróbuj!

Utknąłem print () przed końcowym końcem w wersji try it, ponieważ w przeciwnym razie jest to bałagan. Ten program doskonale spełnia wymagania I / O i dopasowania, ale bez tej nowej nowej linii jest dość trudny do odczytania.

Dane wejściowe są podawane w postaci tabeli liczb: ciąg, liczba za każdym razem zwiększana o 1 i rozpoczynająca się od 1.

Wyjaśnienie:

To dla pętli przez gmatch każdego ciągu wejściowego. Wyszukiwanie w gmatch wygląda następująco:

[% - | ] - Grupuj, wyszukaj - lub spację

% u - Wyszukaj wielką literę

Następnie dla każdego dopasowania wypisuje go minus poprzedni myślnik lub spację

Edycja: 4 bajty w golfie, usuwając deklarację „a” i dodając spację do wejścia wewnątrz pętli for, a także zmieniając wejście sub na tylko 2 zamiast 2,2 (co daje równoważne wyniki)

AI221
źródło
1

Pyth , 12 bajtów

Utworzono rok po pierwszej odpowiedzi.

rI#1hMcXQ\-d

Wypróbuj online!

Pyth , 21 bajtów

Wstępna odpowiedź.

:+dQ"(?<=[ -])[A-Z]"1

Wypróbuj online!

Pan Xcoder
źródło
-| jest o jeden bajt mniej niż[ -]
ATaco,
@ATaco To nie wydaje się działać
Pan Xcoder