Erzeugen Sie ein Akronym

19

Dies ähnelt dem Erstellen eines Akronyms , es gibt jedoch einige wesentliche Unterschiede, einschließlich der Methode zum Abrufen des Akronyms und dieser Herausforderung, einschließlich der flexiblen Ausgabe.

Aufgabe

Bei einer Zeichenfolge (Liste mit Zeichen / Länge 1 ist zulässig), die nur druckbares ASCII enthält, alle Großbuchstaben in der Eingabe ausgeben, denen entweder ein Leerzeichen oder ein Bindestrich vorangestellt ist, oder die das erste Zeichen in der Eingabe sind. Leere Zeichenfolge ist undefiniertes Verhalten.

Testfälle:

Die Ausgabe kann im Format sein "TEST", ["T","E","S","T"]für Sie, oder was auch immer funktioniert.

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

Das ist , also gewinnt die kürzeste Antwort in Bytes.

Stephen
quelle
Sandbox
Stephen
Können wir Eingaben als Liste von Zeichenfolgen (Liste von Zeichen) annehmen?
Mr. Xcoder
@ Mr.Xcoder ja.
Stephen
Könnten Sie einen Testfall hinzufügen, der einige Buchstaben enthält, die durch ein oder mehrere Zeichen getrennt sind, bei denen es sich nicht um Buchstaben, Zahlen, Leerzeichen oder Bindestriche handelt? Eine E-Mail - Adresse, zum Beispiel: [email protected].
Shaggy
1
@ Shaggy hinzugefügt, danke.
Stephen

Antworten:

8

V , 7 Bytes

ÍÕü¼À!õ

Probieren Sie es online!

Hier ist ein Hexdump, um die Byteanzahl zu beweisen:

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

Erläuterung:

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

Dies ist alles dank der wunderbaren Regex-Komprimierung von V kurz .

DJMcMayhem
quelle
Das ist ziemlich kurz 0.o
Stephen
@StepHen Warum danke! Ich denke das ist ziemlich nah am Optimum. :)
DJMcMayhem
2
Was meinst du mit einer Wortgrenze? Die Frage scheint darauf hinzudeuten, dass nur Platz und -erlaubt sind.
Neil
8

R , 66 63 Bytes

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

Probieren Sie es online!

-3 Bytes dank Scarabee

Eine anonyme Funktion; Gibt das Akronym als Vektor zurück, c("N","A","T","O")der implizit gedruckt wird.

Für einmal ist das in R nicht so schlimm! teilt -oder auf (space), nimmt das erste Element von jedem dieser Elemente und gibt dann die Großbuchstaben zurück ( LETTERSist ein R mit Großbuchstaben), in der Reihenfolge.

Giuseppe
quelle
Ich denke, Sie können ein paar Bytes sparen: function(s)(s=substr(strsplit(s,' |-')[[1]],1,1))[s%in%LETTERS]
Scarabee
1
@Scarabee danke. Entschuldigung, das Update hat 2 Jahre gedauert.
Giuseppe
6

Python 2 , 59 56 Bytes

-3 Bytes dank Lynn

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

Probieren Sie es online!

Stange
quelle
Ich habe deinen Trick ausgeliehen '@'<b<'[', sehr schöne Lösung +1
Mr. Xcoder
Vergessen Sie nicht die Verkettung von Vergleichen! '@'<b<'['>a in' -'Spart 3 Bytes.
Lynn
5

Javascript 21 Bytes

Übernimmt eine Zeichenfolgeeingabe und gibt ein Array von Zeichenfolgen aus, die die Akronymzeichen enthalten

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

Erläuterung

Es ist nur eine globale Regex-Übereinstimmung für die Wortgrenze, gefolgt von einem Großbuchstaben.

asgallant
quelle
4

Netzhaut , 21 17 Bytes

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

Probieren Sie es online!

Erläuterung

Gibt die Übereinstimmungen des regulären Ausdrucks (?<=^| |-)[A-Z]in der Eingabe aus, eine pro Zeile ( !).

Geschäfts-Katze
quelle
4

Dyalog APL, 29 23 Bytes

Bonus Testfall: Eine Programmiersprache (APL).

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

Gibt ein Array von Zeichen zurück (wird als Leerzeichen in TIO angezeigt).

Probieren Sie es online!


Älterer Beitrag, 29 Bytes

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

Probieren Sie es online!

Wie?

'(\w)\w+'⎕R - Ersetzen Sie jede Gruppe alphabetischer Zeichen

    '\1' - mit seinem ersten Zeichen

~⍨ - Entfernen Sie alle Zeichen

    (⎕AV~⎕A) - Das ist kein ASCII-Großbuchstabe

Uriel
quelle
3

Python, 53 Bytes

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

Probieren Sie es online!

Ein einfacher regulärer Ausdruck mit einem Lookahead für Leerzeichen oder Bindestrich. Stellen Sie ein Leerzeichen voran, anstatt es mit dem Start abzugleichen.

Chris H
quelle
Bearbeitet in einem TIO-Link mit der Testsuite von MrXCoder.
Stephen
Dank @StepHen - Sie schlugen mich zu ihm und rettete mich die Mühe
Chris H
50
negative sieben
3

C # 84 78 Bytes

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 Bytes dank @jkelm eingespart .

Probieren Sie es online!

Voll / Formatierte Version:

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
quelle
Warum müssen Sie using System.Linqin die Byteanzahl einbeziehen, wenn dies using System.Collections.Genericausgenommen ist? Gibt es einen Konsens darüber, welche usingabzählbar sind?
@ DaveParsons using System.Linq;wird für den Linq-Code in meiner Antwort benötigt. Ist IEnumerbale<char>jedoch nicht Teil der Antwort und das ist der Teil des Codes, using System.Collections.Generic;der kompiliert werden muss.
TheLethalCoder
macht Sinn; Danke für die Klarstellung.
Sie können einige Bytes einsparen, indem Sie Großbuchstaben als Ints verwenden. c> 64 & c <91 sollten Sie 6 Bytes net.
Jkelm
@jkelm Schön :) Ich vergesse immer diesen Trick!
TheLethalCoder
3

Julia 0.6.0 (57 Bytes)

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

Erklärung: Dies ist mein erster Code-Golf. Ziemlich einfach. Teilen Sie die Wörter, und drucken Sie jeweils den ersten oberen Buchstaben.

Wahrscheinlich einfach, mit Regex besser umzugehen, aber ich bin neu in diesem Bereich

Goysa
quelle
1
Willkommen bei PPCG! Ich habe momentan keine Stimmen mehr, das stimme ich später noch zu.
Stephen
2
@StepHen Ich habe mich verdeckt. : P
DJMcMayhem
2

C # (.NET Core) , 108 Byte

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

Probieren Sie es online!

jkelm
quelle
Wurde nicht überprüft, aber durch Ändern von ifin ternär werden möglicherweise Byte gespart. Dies beginnt bei Index 2statt 1, ändern Sie einfach int i=1auf , int i=0es zu beheben. Ansonsten kann man hier wohl nicht viel mehr machen.
TheLethalCoder
Ein Ternär würde hier nicht helfen, da es die gleiche Anzahl von Bytes wie eine if-Anweisung wäre. Sie haben jedoch Recht, dass ich den anfänglichen i-Wert ändern muss
Jkelm
Ich war mir nicht ganz sicher, aber normalerweise kommen sie kürzer heraus, es ist also immer einen Scheck wert.
TheLethalCoder
2

Jelly ,  11 bis  10 Bytes

-1 Byte dank Erik dem Outgolfer ( teilt sich in Leerzeichen> _ <)

⁾- yḲḢ€fØA

Eine monadische Verknüpfung, die Listen von Zeichen aufnimmt und zurückgibt.
Als volles Programm akzeptiert ein String und druckt das Ergebnis.

Probieren Sie es online! oder sehen Sie sich eine Testsuite an .

Wie?

⁾- 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
quelle
Ähm, warum nicht statt verwenden ṣ⁶?
Erik der Outgolfer
Heh, weil ich es vergessen habe. Vielen Dank!
Jonathan Allan
2

Perl 5 , 25 Bytes

24 Byte Code + 1 für -n.

Ärgerlich, dass grep -PUnterstützung für Look- Behind mit variabler Länge, aber Perl nicht :(.

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

-1 Byte danke an @Dada !

Probieren Sie es online! - Beinhaltet -ldas gleichzeitige Ausführen aller Tests.

Dom Hastings
quelle
Sie können es extrem viel besser machen: Probieren Sie es online aus! ;-)
Dada
@Dada Hah! Natürlich ... ich bin nicht am Geldautomaten, aber ich aktualisiere, wenn ich zurück bin. Vielen Dank! Ich bin ziemlich enttäuscht, dass ich das nicht bekommen s///oder $_=negieren konnteprint ...
Dom Hastings
Ja, ich habe nach einer Single gesucht, um das s///zu lösen, aber es ist nicht offensichtlich ... Ich bin auf der Arbeit, vielleicht versuche ich es später noch einmal!
Dada
2

Brachylog , 25 23 22 Bytes

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

Probieren Sie es online!

(-2 Bytes dank @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 - Setzen Sie Monica wieder ein
quelle
Sie können anstelle von " "zwei Bytes speichern
Fatalize
2

Japt , 19 16 14 Bytes

-2 Bytes dank Shaggy

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

Probieren Sie es online!

Oliver
quelle
Da Sie v2 verwenden, glaube ich , können Sie ändern , "(^| |-)%A"um /^| |-)\A/ein Byte zu speichern
ETHproductions
1
mf\A-> um 2 Bytes zu sparen.
Shaggy
2

Swift 5 , 110 Bytes

-5 danke an Cœur

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

Ausführliche Erklärung

  • import Foundation- Importiert das Modul Foundation, das für zip()den Hauptteil dieses Codes von entscheidender Bedeutung ist.

  • func f(s:[String]){...}- Erstellt eine Funktion mit einem Parameter s, dh einer Liste von Zeichenfolgen, die die Zeichen der Eingabe darstellen.

  • for i in zip(s,[" "]+s){...}- Iteriert mit idurch die Zip- Datei der Eingabe und der Eingabe mit einem Leerzeichen am Anfang, das ist sehr hilfreich ist, um das vorherige Zeichen in der Zeichenfolge abzurufen.

  • if - Überprüft, ob:

    • i.0==i.0.uppercased() - Das aktuelle Zeichen ist in Großbuchstaben geschrieben.

    • &&"- ".contains(i.1) - und Wenn das vorherige Zeichen ein Leerzeichen oder ein Bindestrich ist.

  • Wenn die obigen Bedingungen erfüllt sind, dann:

    • print(i.0) - Das Zeichen wird gedruckt, da es Teil des Akronyms ist.
Mr. Xcoder
quelle
-5 mit import UIKitstatt import Foundation.
Cœur
2

PowerShell , 43 Byte

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

Probieren Sie es online!

Abgerollt:

''+($args|select-string '(?<=^| |-)[A-Z]' -allmatches -caseSensitive|% matches)
Veskah
quelle
1

Python 3 , 73-70 Bytes

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

Probieren Sie es online!


Erläuterung

  • lambda n: - Erzeugt eine anonyme Lambda-Funktion mit einem String-Parameter n .

  • n[x]- Erhält den Charakter von nat index x.

  • for x in range(len(n))- Iteriert von 0bis zur Länge nund benennt die Variable x.

  • if - Schecks:

    • '@'<n[x]<'[' - Wenn das Zeichen in Großbuchstaben geschrieben ist,

    • and(' '+n)[x]in' -'- und wenn davor ein Leerzeichen oder ein Bindestrich in der Zeichenfolge steht, die durch ein Leerzeichen und gebildet wird n.

Mr. Xcoder
quelle
2
Ist es schlimm, dass ich das so lese i supper, und ich habe keine Ahnung warum?
TheLethalCoder
@TheLethalCoder Es ist .isupper(), ich habe keine Ahnung, was Sie lesen: p
Mr. Xcoder
1

Bash (grep), 29 28 Bytes

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

Ein Port meiner Python-Antwort, aber da er pgrepLookbehinds mit variabler Länge unterstützt, ist er merklich kürzer (sogar unter Berücksichtigung des Overheads von Python). Stecken Sie die Testfälle in eine Datei mit dem Namena . Die Ausgabe beträgt 1 Zeichen pro Zeile.

-1 Danke an Neil

Chris H
quelle
^| |-könnte ein kürzerer Test sein?
Neil
@Neil das funktioniert hier, danke. Ich habe es verpasst, weil es in Python nicht funktioniert
Chris H
1

RProgN 2 , 18 Bytes

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

Erklärt

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

Probieren Sie es online!

Ein Taco
quelle
1

PHP, 62 Bytes

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

Laufen Sie als Pipe mit -nRoder versuchen Sie es online .

andere Lösungen:

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
Titus
quelle
1

C ++, 168 Bytes

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

Ausgabe erfolgt über den Parameter

HatsuPointerKun
quelle
Wäre es möglich, #include<string>das Argument sa vollständig zu entfernen und anzunehmen std::string?
Zacharý
1

Lua , 79 75 Bytes

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

Versuch es!

Ich habe ein print () vor dem endgültigen Ende in der try it-Version geklebt, weil es sonst ein Durcheinander ist. Dieses Programm entspricht perfekt den Anforderungen von I / O und Matching, aber ohne diese zusätzliche neue Zeile ist es ziemlich schwer zu lesen.

Die Eingabe erfolgt in Form einer Zahlentabelle: Zeichenfolge, die jeweils um 1 erhöht wird und bei 1 beginnt.

Erläuterung:

Es for durchläuft eine Übereinstimmung jeder Eingabezeichenfolge. Die Gmatch-Suche sieht wie folgt aus:

[% - | ] - Gruppe, Suche nach einem - oder einem Leerzeichen

% u - Suche nach einem Großbuchstaben

Dann wird es für jede Übereinstimmung ohne den vorangegangenen Gedankenstrich oder das vorangegangene Leerzeichen gedruckt

Bearbeiten: 4 Bytes wurden abgelegt, indem die Deklaration von 'a' entfernt und der Eingabe innerhalb der for-Schleife ein Leerzeichen hinzugefügt wurde. Außerdem wurde die Sub-Eingabe auf nur 2 anstatt auf 2,2 geändert (was zu äquivalenten Ergebnissen führt).

AI221
quelle