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.



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: My-Name@Some-Domain.TLD.
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 .


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.


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!


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.



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


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.


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


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

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


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!


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

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.


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

Vous pouvez utiliser au lieu de " "pour enregistrer deux octets
Fatalize


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.

-5 avec import UIKitau lieu de import Foundation.
Cœur



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.


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


^| |-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!


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

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


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)


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.