Générer un acronyme

19

Ceci est similaire à la création d'un acronyme , mais il existe plusieurs différences clés, y compris la méthode de récupération de l'acronyme, et ce défi, y compris la sortie flexible.

Tâche

Étant donné une chaîne (la liste des caractères / chaînes de longueur 1 est autorisée) contenant uniquement de l'ASCII imprimable, sortez toutes les lettres majuscules dans l'entrée qui sont soit précédées d'un espace ou d'un tiret, soit le premier caractère de l'entrée. Une chaîne vide est un comportement non défini.

Cas de test:

La sortie peut être au format "TEST", ["T","E","S","T"]ou quel que soit le reste fonctionne pour vous.

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

C'est le , donc la réponse la plus courte en octets l'emporte.

Stephen
la source
Sandbox
Stephen
Pouvons-nous prendre la saisie comme une liste de chaînes (liste de caractères)?
M. Xcoder
@ Mr.Xcoder oui.
Stephen
Pourriez-vous ajouter un cas de test qui comprend des lettres séparées par un ou plusieurs caractères qui ne sont pas des lettres, des chiffres, des espaces ou des tirets. Une adresse e-mail, par exemple: [email protected].
Shaggy
1
@Shaggy ajouté, merci.
Stephen

Réponses:

8

V , 7 octets

ÍÕü¼À!õ

Essayez-le en ligne!

Voici un hexdump pour prouver le nombre d'octets:

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

Explication:

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

C'est court tout cela grâce à la merveilleuse V compression regex .

DJMcMayhem
la source
C'est assez court 0.o
Stephen
@StepHen Pourquoi merci! Je pense que c'est assez proche de l'optimal. :)
DJMcMayhem
2
Qu'entendez-vous par une limite de mot? La question semble suggérer que seuls les espaces et -sont autorisés.
Neil
8

R , 66 63 octets

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

Essayez-le en ligne!

-3 octets grâce à Scarabee

Une fonction anonyme; renvoie l'acronyme comme un vecteur c("N","A","T","O")qui est implicitement imprimé.

Pour une fois, ce n'est pas trop mal en R! se divise sur -ou (space), prend le premier élément de chacun de ceux-ci, puis retourne ceux qui sont en majuscules ( LETTERSest un R intégré avec les majuscules), dans l'ordre.

Giuseppe
la source
Je pense que vous pouvez économiser quelques octets:function(s)(s=substr(strsplit(s,' |-')[[1]],1,1))[s%in%LETTERS]
Scarabee
1
@Scarabee merci. désolé, la mise à jour a pris 2 ans.
Giuseppe
6

Python 2 , 59 56 octets

-3 octets grâce à Lynn

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

Essayez-le en ligne!

Barre
la source
J'ai emprunté votre astuce '@'<b<'[', très belle solution +1
M. Xcoder
N'oubliez pas le chaînage de comparaison! '@'<b<'['>a in' -'enregistre 3 octets.
Lynn
5

Javascript 21 octets

Prend une entrée de chaîne et génère un tableau de chaînes contenant les caractères acronymes

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

Explication

C'est juste une correspondance d'expression rationnelle globale pour la limite de mot suivie d'une lettre majuscule.

impitoyable
la source
4

Rétine , 21 17 octets

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

Essayez-le en ligne!

Explication

Sort les correspondances de l'expression régulière (?<=^| |-)[A-Z]dans l'entrée, une par ligne ( !).

Chat d'affaires
la source
4

Dyalog APL, 29 23 octets

Cas de test bonus: Un langage de programmation (APL).

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

Renvoie un tableau de caractères (s'affiche sous forme d'espace séparé sur TIO).

Essayez-le en ligne!


Message plus ancien, 29 octets

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

Essayez-le en ligne!

Comment?

'(\w)\w+'⎕R - remplacer chaque groupe de caractères alphabétiques

    '\1' - avec son premier caractère

~⍨ - supprimer tous les caractères

    (⎕AV~⎕A) - ce n'est pas une majuscule ASCII

Uriel
la source
3

Python, 53 octets

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

Essayez-le en ligne!

Une expression régulière simple avec un regard vers l'espace ou un tiret. Plutôt que de faire correspondre le début, ajoutez un espace au début.

Chris H
la source
Modifié dans un lien TIO avec la suite de tests de MrXCoder.
Stephen
Merci @StepHen - tu m'as battu et tu m'as sauvé l'effort
Chris H
50
négatif sept
3

C #, 84 78 octets

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 octets enregistrés grâce à @jkelm .

Essayez-le en ligne!

Version complète / formatée:

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
la source
Pourquoi devez-vous inclure using System.Linqle nombre d'octets si vous êtes using System.Collections.Genericexempté? Y a-t-il un consensus sur ceux qui usingsont dénombrables?
@DaveParsons using System.Linq;est nécessaire pour le code Linq dans ma réponse. Cependant, IEnumerbale<char>ne fait pas partie de la réponse et c'est la partie du code qui doit using System.Collections.Generic;être compilée.
TheLethalCoder
logique; Merci pour la clarification.
Vous pouvez économiser quelques octets en vérifiant les majuscules en utilisant les caractères comme des entiers. c> 64 & c <91 devrait vous rapporter 6 octets.
jkelm
@jkelm Nice :) J'oublie toujours cette astuce!
TheLethalCoder
3

Julia 0.6.0 (57 octets)

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

Explication: Ceci est mon premier code-golf. Assez simple. Séparez les mots, imprimez la première lettre supérieure de chacun.

Probablement facile de faire mieux en utilisant regex mais je suis nouveau dans ce domaine

Goysa
la source
1
Bienvenue chez PPCG! Je n'ai plus de votes en ce moment, je voterai plus tard.
Stephen
2
@StepHen J'ai couvertchoc. : P
DJMcMayhem
2

C # (.NET Core) , 108 octets

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

Essayez-le en ligne!

jkelm
la source
Je n'ai pas vérifié, mais le fait de passer ifà un ternaire peut vous faire économiser des octets. Cela commence à l' index au 2lieu de 1, il suffit de changer int i=1pour int i=0le fixer. À part cela, je ne pense pas que vous puissiez faire beaucoup plus ici.
TheLethalCoder
Un ternaire n'aiderait pas ici, car ce serait le même nombre d'octets qu'une instruction if. Cependant, vous avez raison, je dois changer la valeur initiale de i
jkelm
Je n'étais pas tout à fait sûr mais ils sortent généralement plus court donc ça vaut toujours la peine d'être vérifié.
TheLethalCoder
2

Gelée ,  11  10 octets

-1 octet grâce à Erik l'Outgolfer ( se divise aux espaces> _ <)

⁾- yḲḢ€fØA

Un lien monadique prenant et renvoyant des listes de personnages.
Comme un programme complet accepte une chaîne et imprime le résultat.

Essayez-le en ligne! ou consultez une suite de tests .

Comment?

⁾- 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
la source
Umm, pourquoi ne pas utiliser au lieu de ṣ⁶?
Erik the Outgolfer
Hé, parce que je l'ai oublié. Merci!
Jonathan Allan
2

Perl 5 , 25 octets

Code 24 octets + 1 pour -n.

Gênant qui prend en grep -Pcharge la longueur variable, mais Perl ne le fait pas :(.

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

-1 octet grâce à @Dada !

Essayez-le en ligne! - comprend -lpour exécuter tous les tests à la fois.

Dom Hastings
la source
Vous pouvez faire beaucoup mieux: essayez-le en ligne! ;-)
Dada
@Dada Hah! Bien sûr ... je suis hors ATM mais je mettrai à jour quand je reviens. Merci! Je suis assez déçu de ne pas avoir pu s///ni $_=annuler le print...
Dom Hastings
Ouais, je cherchais un single s///pour résoudre ce problème mais ce n'est pas évident ... Je suis au boulot, je vais peut-être essayer de nouveau plus tard!
Dada
2

Brachylog , 25 23 22 octets

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

Essayez-le en ligne!

(-2 octets grâce à @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 - Rétablir Monica
la source
Vous pouvez utiliser au lieu de " "pour enregistrer deux octets
Fatalize
2

Japt , 19 16 14 octets

-2 octets grâce à Shaggy

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

Essayez-le en ligne!

Oliver
la source
Puisque vous utilisez v2, je pense que vous pouvez changer "(^| |-)%A"pour /^| |-)\A/enregistrer un octet
ETHproductions
1
mf\A-> pour économiser 2 octets.
Shaggy
2

Swift 5 , 110 octets

-5 grâce à Cœur

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

Explication détaillée

  • import Foundation- Importe le module Foundationqui est vital pour zip(), la pièce principale de ce code.

  • func f(s:[String]){...}- Crée une fonction avec un paramètre s, c'est-à-dire une liste de chaînes, représentant les caractères de l'entrée.

  • for i in zip(s,[" "]+s){...}- Itère avec ile zip de l'entrée et l'entrée avec un espace ajouté au début, ce qui est très utile pour obtenir le caractère précédent dans la chaîne.

  • if - Vérifie si:

    • i.0==i.0.uppercased() - Le caractère actuel est en majuscule,

    • &&"- ".contains(i.1) - et Si le caractère précédent est un espace ou un tiret.

  • Si les conditions ci-dessus sont remplies, alors:

    • print(i.0) - Le caractère est imprimé, car il fait partie de l'acronyme.
M. Xcoder
la source
-5 avec import UIKitau lieu de import Foundation.
Cœur
2

PowerShell , 43 octets

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

Essayez-le en ligne!

Déroulé:

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

Python 3 , 73 70 octets

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

Essayez-le en ligne!


Explication

  • lambda n:- Crée une fonction lambda anonyme avec un paramètre String n.

  • n[x]- Obtient le caractère de nat index x.

  • for x in range(len(n))- Itère de 0à la longueur de n, en nommant la variable x.

  • if - Chèques:

    • '@'<n[x]<'[' - Si le caractère est en majuscule,

    • and(' '+n)[x]in' -'- Et s'il est précédé d'un espace ou d'un tiret dans la Chaîne formée par un espace et n.

M. Xcoder
la source
2
Est-ce mauvais que je lise cela comme i supper, et je n'ai aucune idée pourquoi?
TheLethalCoder
@TheLethalCoder C'est .isupper(), je n'ai aucune idée de ce que vous lisez: p
M. Xcoder
1

Bash (grep), 29 28 octets

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

Un port de ma réponse en python, mais parce qu'il pgrepprend en charge les regards de longueur variable, il est sensiblement plus court (même en tenant compte de la surcharge de python). Collez les cas de test dans un fichier appelé a, la sortie est de 1 caractère par ligne.

-1 Merci à Neil

Chris H
la source
^| |-pourrait être un test plus court?
Neil
@Neil qui fonctionne ici, merci. Manqué parce que cela ne fonctionne pas en Python
Chris H
1

RProgN 2 , 18 octets

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

Expliqué

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

Essayez-le en ligne!

ATaco
la source
1

PHP, 62 octets

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

Exécutez en tant que pipe avec -nRou essayez-le en ligne .

autres solutions:

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
la source
1

C ++, 168 octets

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

Sortie effectuée via le paramètre

HatsuPointerKun
la source
Serait-il possible de supprimer complètement #include<string>et de supposer que l'argument sest un std::string?
Zacharý
1

Lua , 79 75 octets

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

Essayez!

J'ai collé un print () avant la fin finale dans la version d'essai car sinon c'est un gâchis. Ce programme respecte parfaitement les exigences d'E / S et de correspondance, mais sans cette nouvelle ligne supplémentaire, il est assez difficile à lire.

L'entrée est donnée sous la forme d'un tableau de nombres: chaîne, nombre incrémenté de 1 à chaque fois et commençant à 1.

Explication:

Il permet de boucler un gmatch de chaque chaîne d'entrée. La recherche gmatch est la suivante:

[% - | ] - Groupe, recherchez un - ou un espace

% u - Recherche un caractère majuscule

Ensuite, pour chaque match, il l'imprime moins le tiret ou l'espace précédent

Edit: Golfed 4 octets en supprimant la déclaration de 'a' et en ajoutant l'espace à l'entrée à l'intérieur de la boucle for, ainsi qu'en changeant l'entrée secondaire à seulement 2 au lieu de 2,2 (qui produisent des résultats équivalents)

AI221
la source