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.



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


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.


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


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.



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


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.


Editado en un enlace TIO con el conjunto de pruebas de MrXCoder.
Stephen

Gracias @StepHen - me ganaste y me ahorraste el esfuerzo
Chris H


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

¿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


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!


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

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.


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

Puede usar en lugar de " "guardar dos bytes
Fatalize


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.

-5 con en import UIKitlugar de import Foundation.
Coeur



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.


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


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


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

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


¿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)


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.