Generar un acrónimo

19

Esto es similar a Hacer un acrónimo , pero hay varias diferencias clave, incluido el método de obtención del acrónimo, y este desafío incluye una salida flexible.

Tarea

Dada una cadena (se permite la lista de caracteres / cadenas de longitud 1) que contiene solo ASCII imprimible, muestra todas las letras mayúsculas en la entrada que están precedidas por un espacio o un guión, o son el primer carácter en la entrada. La cadena vacía es un comportamiento indefinido.

Casos de prueba:

La salida puede estar en el formato de "TEST", ["T","E","S","T"]o lo que más funciona para usted.

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

Este es el , por lo que la respuesta más corta en bytes gana.

Stephen
fuente
Sandbox
Stephen
¿Podemos tomar la entrada como una lista de cadenas (lista de caracteres)?
Sr. Xcoder
@ Mr.Xcoder sí.
Stephen
¿Podría agregar un caso de prueba que incluya algunas letras separadas por uno o más caracteres que no sean letras, números, espacios o guiones? Una dirección de correo electrónico, por ejemplo: [email protected].
Shaggy
1
@Shaggy agregó, gracias.
Stephen

Respuestas:

8

V , 7 bytes

ÍÕü¼À!õ

Pruébalo en línea!

Aquí hay un hexdump para probar el conteo de bytes:

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

Explicación:

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

Este es corta todo gracias a una maravilla de V de compresión de expresiones regulares .

DJMcMayhem
fuente
Eso es bastante corto 0.o
Stephen
@StepHen ¡Por qué gracias! Creo que esto está bastante cerca de lo óptimo. :)
DJMcMayhem
2
¿Qué quieres decir con un límite de palabra? La pregunta parece sugerir que solo -se permiten espacios y espacios .
Neil
8

R , 66 63 bytes

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

Pruébalo en línea!

-3 bytes gracias a Scarabee

Una función anónima; devuelve el acrónimo como un vector c("N","A","T","O")que se imprime implícitamente.

Por una vez, esto no es tan malo en R! se divide en -o (space), toma el primer elemento de cada uno de ellos y luego devuelve los que sean mayúsculas ( LETTERSes una R incorporada con las letras mayúsculas), en orden.

Giuseppe
fuente
Creo que puede guardar algunos bytes:function(s)(s=substr(strsplit(s,' |-')[[1]],1,1))[s%in%LETTERS]
Scarabee
1
@Scarabee gracias. lo siento, tardó 2 años en actualizarse.
Giuseppe
6

Python 2 , 59 56 bytes

-3 bytes gracias a Lynn

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

Pruébalo en línea!

varilla
fuente
Pedí prestado tu truco '@'<b<'[', muy buena solución +1
Sr. Xcoder
¡No te olvides del encadenamiento de comparación! '@'<b<'['>a in' -'ahorra 3 bytes.
Lynn
5

Javascript 21 bytes

Toma una entrada de cadena y genera una serie de cadenas que contienen los caracteres de acrónimo

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

Explicación

Es solo una coincidencia global de expresiones regulares para el límite de palabras seguido de una letra mayúscula.

asgallant
fuente
4

Retina , 21 17 bytes

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

Pruébalo en línea!

Explicación

Emite las coincidencias de la expresión regular (?<=^| |-)[A-Z]en la entrada, una por línea ( !).

Gato de negocios
fuente
4

Dyalog APL, 29 23 bytes

Caso de prueba de bonificación: Un lenguaje de programación (APL).

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

Devuelve una matriz de caracteres (se muestra como espacio separado en TIO).

Pruébalo en línea!


Publicación anterior, 29 bytes

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

Pruébalo en línea!

¿Cómo?

'(\w)\w+'⎕R - Reemplace cada grupo de caracteres alfabéticos

    '\1' - con su primer personaje

~⍨ - eliminar cada char

    (⎕AV~⎕A) - eso no es una mayúscula ASCII

Uriel
fuente
3

Python, 53 bytes

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

Pruébalo en línea!

Una expresión regular simple con anticipación por espacio o guión. En lugar de hacer coincidir el inicio, anteponga un espacio.

Chris H
fuente
Editado en un enlace TIO con el conjunto de pruebas de MrXCoder.
Stephen
Gracias @StepHen - me ganaste y me ahorraste el esfuerzo
Chris H
50
negativo siete
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))

Guardado 6 bytes gracias a @jkelm .

Pruébalo en línea!

Versión completa / formateada:

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
fuente
¿Por qué tiene que incluir using System.Linqen el recuento de bytes si using System.Collections.Genericestá exento? ¿Hay algún consenso sobre cuáles usingson contables?
@DaveParsons using System.Linq;es necesario para el código Linq en mi respuesta. Sin embargo, IEnumerbale<char>no es parte de la respuesta y esa es la parte del código que debe using System.Collections.Generic;compilarse.
TheLethalCoder
tiene sentido; gracias por la aclaración.
Puede guardar algunos bytes marcando en mayúsculas usando los caracteres como ints. c> 64 & c <91 debería generarle 6 bytes.
jkelm
@jkelm Nice :) ¡Siempre me olvido de ese truco!
TheLethalCoder
3

Julia 0.6.0 (57 bytes)

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

Explicación: Este es mi primer código de golf. Muy claro. Divide las palabras, imprime la primera letra superior de cada una.

Probablemente sea mejor hacerlo mejor utilizando expresiones regulares, pero soy nuevo en esto

Goysa
fuente
1
Bienvenido a PPCG! Estoy sin votos en este momento, voy a votar esto más tarde.
Stephen
2
@StepHen Tengo cubierto mi escuela. : P
DJMcMayhem
2

C # (.NET Core) , 108 bytes

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

Pruébalo en línea!

jkelm
fuente
No lo he verificado, pero cambiarlo ifa ternario puede ahorrarle bytes. Esto comienza en el índice en 2lugar de 1, simplemente cambie int i=1a int i=0para solucionarlo. Aparte de eso, no creo que haya mucho más que puedas hacer aquí.
TheLethalCoder
Un ternario no ayudaría aquí, ya que sería el mismo conteo de bytes que una declaración if. Sin embargo, tienes razón en que necesito cambiar el valor inicial de i
jkelm
No estaba del todo seguro, pero generalmente son más cortos, por lo que siempre vale la pena comprobarlo.
TheLethalCoder
2

Jalea ,  11  10 bytes

-1 byte gracias a Erik the Outgolfer (se divide en espacios> _ <)

⁾- yḲḢ€fØA

Un enlace monádico que toma y devuelve listas de personajes.
Como programa completo acepta una cadena e imprime el resultado.

Pruébalo en línea! o ver un conjunto de pruebas .

¿Cómo?

⁾- 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
fuente
Umm, ¿por qué no usar en lugar de ṣ⁶?
Erik the Outgolfer
Je, porque lo olvidé. ¡Gracias!
Jonathan Allan
2

Perl 5 , 25 bytes

Código de 24 bytes + 1 para -n.

Molesto que grep -Padmite mirar hacia atrás de longitud variable pero Perl no :(.

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

-1 byte gracias a @Dada !

Pruébalo en línea! - Incluye -lejecutar todas las pruebas a la vez.

Dom Hastings
fuente
Puede hacerlo mucho mejor: ¡ Pruébelo en línea! ;-)
Dada
@Dada Hah! Por supuesto ... estoy fuera de cajero automático, pero actualizaré cuando regrese. ¡Gracias! Estoy bastante decepcionado por no haber podido s///o $_=negar el print...
Dom Hastings
Sí, estaba buscando un sencillo s///para resolver esto, pero no es obvio ... Estoy en el trabajo, ¡tal vez lo intente más tarde!
Dada
2

Brachylog , 25 23 22 bytes

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

Pruébalo en línea!

(-2 bytes gracias a @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 - Restablece a Monica
fuente
Puede usar en lugar de " "guardar dos bytes
Fatalize
2

Japt , 19 16 14 bytes

-2 bytes gracias a Shaggy

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

Pruébalo en línea!

Oliver
fuente
Dado que está utilizando v2, creo que se puede cambiar "(^| |-)%A"a /^| |-)\A/ahorrar un byte
ETHproductions
1
mf\A-> para guardar 2 bytes.
Shaggy
2

Swift 5 , 110 bytes

-5 gracias a Cœur

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

Explicación detallada

  • import Foundation- Importa el módulo Foundationque es vital para zip(), la pieza principal de este código.

  • func f(s:[String]){...}- Crea una función con un parámetro s, que es una lista de cadenas, que representa los caracteres de la entrada.

  • for i in zip(s,[" "]+s){...}- Itera con iel zip de la entrada y la entrada con un espacio agregado al principio, lo cual es muy útil para obtener el carácter anterior en la Cadena.

  • if - Comprueba si:

    • i.0==i.0.uppercased() - El caracter actual es mayúscula,

    • &&"- ".contains(i.1) - y Si el personaje anterior es un espacio o un guión.

  • Si se cumplen las condiciones anteriores, entonces:

    • print(i.0) - El carácter se imprime porque es parte del acrónimo.
Sr. Xcoder
fuente
-5 con en import UIKitlugar de import Foundation.
Coeur
2

PowerShell , 43 bytes

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

Pruébalo en línea!

Desenrollado:

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

Python 3 , 73 70 bytes

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

Pruébalo en línea!


Explicación

  • lambda n: - Crea una función lambda anónima con un parámetro String n .

  • n[x] - Obtiene el carácter de n en el índice x.

  • for x in range(len(n))- Repite desde 0hasta la longitud den , nombrando la variable x.

  • if - Cheques:

    • '@'<n[x]<'[' - Si el personaje es mayúscula,

    • and(' '+n)[x]in' -'- Y si está precedido por un espacio o un guión en la cadena formada por un espacio y n.

Sr. Xcoder
fuente
2
¿Es malo que haya leído eso i suppery no tengo idea de por qué?
TheLethalCoder
@TheLethalCoder Es .isupper(), no tengo idea de lo que lees: p
Sr. Xcoder
1

Bash (grep), 29 28 bytes

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

Un puerto de mi respuesta de Python, pero debido a que pgrepadmite búsquedas de longitud variable, es notablemente más corto (incluso teniendo en cuenta la sobrecarga de Python). Pegue los casos de prueba en un archivo llamadoa , la salida es de 1 carácter por línea.

-1 Gracias a Neil

Chris H
fuente
^| |-podría ser una prueba más corta?
Neil
@Neil que funciona aquí, gracias. Lo perdí porque no funciona en Python
Chris H
1

RProgN 2 , 18 bytes

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

Explicado

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

Pruébalo en línea!

Un taco
fuente
1

PHP, 62 bytes

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

Ejecutar como tubería -nRo probarlo en línea .

otras soluciones:

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

Salida realizada a través del parámetro

HatsuPointerKun
fuente
¿Sería posible eliminar por completo #include<string>y asumir que el argumento ses a 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

¡Intentalo!

Pegué una impresión () antes del final final en la versión de prueba porque de lo contrario es un desastre. Este programa cumple perfectamente con los requisitos de E / S y coincidencia, pero sin esa nueva línea adicional es bastante difícil de leer.

La entrada se da en forma de una tabla de números: cadena, número que aumenta en 1 cada vez y comienza en 1.

Explicación:

Para bucles a través de un juego de cada cadena de entrada. La búsqueda de gmatch es la siguiente:

[% - | ] - Agrupar, buscar un - o un espacio

% u: busca un carácter en mayúscula

Luego, para cada partido, lo imprime menos el guión o espacio anterior

Editar: Golfó 4 bytes eliminando la declaración de 'a' y agregando el espacio a la entrada dentro del bucle for, así como cambiando la entrada secundaria a solo 2 en lugar de 2,2 (que producen resultados equivalentes)

AI221
fuente
1

Pyth , 12 bytes

Creado un año después de la respuesta inicial.

rI#1hMcXQ\-d

Pruébalo en línea!

Pyth , 21 bytes

Respuesta inicial

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

Pruébalo en línea!

Sr. Xcoder
fuente
-| es un byte menos que[ -]
ATaco
@ATaco Eso no parece funcionar
Sr. Xcoder