Genera un acronimo


19

Questo è simile a Fare un acronimo , ma ci sono diverse differenze chiave, incluso il metodo per recuperare l'acronimo, e questa sfida include un output flessibile.

Compito

Data una stringa (è consentito un elenco di caratteri / stringhe di lunghezza 1) contenente solo ASCII stampabile, visualizza tutte le lettere maiuscole nell'input che sono precedute da uno spazio o un trattino o sono il primo carattere nell'input. La stringa vuota è un comportamento indefinito.

Casi test:

Uscita può essere nel formato "TEST", ["T","E","S","T"]o qualunque altro funziona per voi.

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

Questo è , quindi vince la risposta più breve in byte.



Possiamo prendere l'input come un elenco di stringhe (elenco di caratteri)?
— Mr. Xcoder,

@ Mr.Xcoder sì.
— Stephen,

Potresti aggiungere un caso di test che include alcune lettere separate da uno o più caratteri che non sono lettere, numeri, spazi o trattini. Un indirizzo e-mail, per esempio: My-Name@Some-Domain.TLD.
— Shaggy,

1
@Shaggy ha aggiunto, grazie.
— Stephen,

Risposte:


8

V , 7 byte

ÍÕü¼À!õ

Provalo online!

Ecco un hexdump per provare il conteggio dei byte:

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

Spiegazione:

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

Questo è breve tutto grazie alla meravigliosa del V compressione regex .


Questo è abbastanza corto 0.o
— Stephen

@StepHen Perché grazie! Penso che questo sia abbastanza vicino all'ottimale. :)
— DJMcMayhem

2
Cosa intendi con una parola limite? La domanda sembra suggerire che solo lo spazio e -sono ammessi.
— Neil,

8

R , 66 63 byte

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

Provalo online!

-3 byte grazie a Scarabee

Una funzione anonima; restituisce l'acronimo come un vettore c("N","A","T","O")che è implicitamente stampato.

Per una volta, questo non è male in R! si divide su -o (space), prende il primo elemento di ciascuno di questi, e quindi restituisce quelli che sono maiuscoli ( LETTERSè una R incorporata con le lettere maiuscole), in ordine.


Penso che puoi risparmiare qualche byte:function(s)(s=substr(strsplit(s,' |-')[[1]],1,1))[s%in%LETTERS]
— Scarabee,

1
@Scarabee grazie. mi dispiace ci sono voluti 2 anni per l'aggiornamento.
— Giuseppe,

6

Python 2 , 59 56 byte

-3 byte grazie a Lynn

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

Provalo online!


Ho preso in prestito il tuo trucco '@'<b<'[', soluzione molto bella +1
— Mr. Xcoder

Non dimenticare di concatenare il confronto! '@'<b<'['>a in' -'salva 3 byte.
— Lynn,

5

Javascript 21 byte

Accetta un input di stringa e genera un array di stringhe contenenti i caratteri di acronimo

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

Spiegazione

È solo una corrispondenza regex globale per parola-limite seguita da una lettera maiuscola.



4

Dyalog APL, 29 23 byte

Caso di prova bonus: un linguaggio di programmazione (APL).

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

Restituisce un array di caratteri (viene mostrato come spazio separato su TIO).

Provalo online!


Posta precedente, 29 byte

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

Provalo online!

Come?

'(\w)\w+'⎕R - Sostituisci ogni gruppo di caratteri alfabetici

    '\1' - con il suo primo personaggio

~⍨ - rimuovi tutti i caratteri

    (⎕AV~⎕A) - questa non è una maiuscola ASCII


3

Python, 53 byte

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

Provalo online!

Una semplice espressione regolare con un lookahead per spazio o trattino. Piuttosto che abbinare l'inizio, anteporre uno spazio.


Modificato in un collegamento TIO con la suite di test di MrXCoder.
— Stephen,

Grazie @StepHen - mi hai battuto e mi hai risparmiato lo sforzo
— Chris H


3

C #, 84 78 byte

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 byte salvati grazie a @jkelm .

Provalo online!

Versione completa / formattata:

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

Perché è necessario includere using System.Linqnel conteggio byte se using System.Collections.Genericè esente? Esiste un consenso su quali usingsono numerabili?

@DaveParsons using System.Linq;è necessario per il codice Linq nella mia risposta. Tuttavia, IEnumerbale<char>non fa parte della risposta e questa è la parte del codice che deve using System.Collections.Generic;essere compilata.
— TheLethalCoder

ha senso; grazie per il chiarimento.

È possibile salvare alcuni byte controllando le maiuscole utilizzando i caratteri come ints. c> 64 & c <91 dovrebbe essere al netto di 6 byte.
— jkelm,

@jkelm Nice :) Mi dimentico sempre di quel trucco!
— TheLethalCoder

3

Julia 0.6.0 (57 byte)

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

Spiegazione: Questo è il mio primo codice-golf. Abbastanza diretto. Dividi le parole, stampa la prima lettera superiore di ciascuna.

Probabilmente è facile fare di meglio usando regex ma io sono nuovo in questo


1
Benvenuti in PPCG! Sono fuori dai voti in questo momento, voterò più avanti.
— Stephen,

2
@StepHen ho coperto. : 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;}

Provalo online!


Non ho controllato ma la modifica ifin ternario potrebbe farti risparmiare byte. Questo inizia a indice 2invece di 1, basta cambiare int i=1per int i=0risolvere il problema. A parte questo, non credo che ci sia molto altro che puoi fare qui.
— TheLethalCoder

Un ternario non aiuterebbe qui, poiché sarebbe lo stesso conteggio di byte di un'istruzione if. Tuttavia, hai ragione nel
— dire

Non ne ero del tutto sicuro, ma di solito escono più brevi, quindi vale sempre la pena controllarlo.
— TheLethalCoder

2

Gelatina ,  11  10 byte

-1 byte grazie a Erik the Outgolfer (si Ḳdivide in spazi> _ <)

⁾- yḲḢ€fØA

Un collegamento monadico che prende e restituisce elenchi di personaggi.
Come programma completo accetta una stringa e stampa il risultato.

Provalo online! o vedere una suite di test .

Come?

⁾- 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, perché non usare al Ḳposto di ṣ⁶?
— Erik the Outgolfer,

Eh, perché me ne sono dimenticato. Grazie!
— Jonathan Allan,

2

Perl 5 , 25 byte

24 byte codice + 1 per -n.

Fastidioso che grep -Psupporta look-behind a lunghezza variabile ma Perl no :(.

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

-1 byte grazie a @Dada !

Provalo online! - include -ll'esecuzione di tutti i test contemporaneamente.


Puoi fare molto molto meglio: provalo online! ;-)
— Dada,

@Dada Hah! Certo ... sono fuori dal bancomat ma aggiornerò quando torno. Grazie! Sono abbastanza deluso di non poter ottenere s///o $_=negare il print...
— Dom Hastings,

Sì, stavo cercando un singolo s///per risolverlo, ma non è ovvio ... Sono al lavoro, forse ci riproverò più tardi!
— Dada,


2

Brachylog , 25 23 22 byte

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

Provalo online!

(-2 byte grazie 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

Puoi usare Ṣinvece di " "salvare due byte
— Fatalizza il


2

Swift 5 , 110 byte

-5 grazie 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)}}}

Spiegazione dettagliata

  • import Foundation- Importa il modulo per Foundationcui è vitale zip(), il pezzo principale di questo codice.

  • func f(s:[String]){...}- Crea una funzione con un parametro s, ovvero un elenco di stringhe, che rappresenta i caratteri dell'input.

  • for i in zip(s,[" "]+s){...}- Scorre iattraverso la zip dell'input e dell'input con uno spazio aggiunto all'inizio, che è molto utile per ottenere il carattere precedente nella stringa.

  • if - Verifica se:

    • i.0==i.0.uppercased() - Il carattere corrente è maiuscolo,

    • &&"- ".contains(i.1) - e se il carattere precedente è uno spazio o un trattino.

  • Se le condizioni di cui sopra sono soddisfatte, quindi:

    • print(i.0) - Il personaggio è stampato, perché fa parte dell'acronimo.

-5 con import UIKitinvece di import Foundation.
— Cœur

2

PowerShell , 43 byte

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

Provalo online!

srotolato:

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


1

Python 3 , 73 70 byte

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

Provalo online!


Spiegazione

  • lambda n:- Crea una funzione lambda anonima con un parametro String n.

  • n[x]- Ottiene il carattere di nall'indice x.

  • for x in range(len(n))- Passa 0alla lunghezza di n, denominando la variabile x.

  • if - Controlli:

    • '@'<n[x]<'[' - Se il carattere è maiuscolo,

    • and(' '+n)[x]in' -'- E se è preceduto da uno spazio o un trattino nella stringa formata da uno spazio e n.


2
È un male che io lo legga come i supper, e non ho idea del perché?
— TheLethalCoder

@TheLethalCoder È .isupper(), non ho idea di cosa leggi: p
— Mr. Xcoder,





1

Bash (grep), 29 28 byte

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

Una porta della mia risposta Python ma perché pgrepsupporta lookbehinds di lunghezza variabile è notevolmente più breve (anche tenendo conto del sovraccarico di Python). Incolla i casi di test in un file chiamato a, l'output è di 1 carattere per riga.

-1 Grazie a Neil


^| |-potrebbe essere un test più breve?
— Neil,

@Neil che funziona qui, grazie. Perso perché non funziona in Python
— Chris H,

1

RProgN 2 , 18 byte

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

spiegato

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

Provalo online!


1

PHP, 62 byte

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

Esegui come pipe -nRo provalo online .

altre soluzioni:

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 byte

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

Uscita eseguita tramite il parametro


Sarebbe possibile rimuovere completamente #include<string>e supporre che l'argomento ssia un std::string?
— Zacharý,

1

Lua , 79 75 byte

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

Provalo!

Ho bloccato una stampa () prima della fine finale nella versione di prova perché altrimenti è un casino. Questo programma aderisce perfettamente ai requisiti di I / O e di corrispondenza, ma senza quella nuova riga in più è piuttosto difficile da leggere.

L'input viene dato sotto forma di una tabella di numeri: stringa, numero che aumenta di 1 ogni volta e inizia da 1.

Spiegazione:

Per i cicli attraverso un gmatch di ogni stringa di input. La ricerca di gmatch è la seguente:

[% - | ] - Raggruppa, cerca un - o uno spazio

% u - Cerca un carattere maiuscolo

Quindi per ogni partita, lo stampa meno il trattino o lo spazio precedente

Modifica: golfato 4 byte rimuovendo la dichiarazione di 'a' e aggiungendo lo spazio all'ingresso all'interno del ciclo for in, nonché cambiando l'ingresso secondario a solo 2 anziché 2,2 (che producono risultati equivalenti)


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.