生成首字母缩写词


19

这类似于“ 制作首字母缩写词”,但是有几个主要区别,包括获取首字母缩写词的方法以及此挑战包括灵活的输出。

任务

给定仅包含可打印ASCII的字符串(允许包含字符/长度为1的字符串的列表),请在输入中输出所有大写字母,其后跟一个空格或破折号,或者是输入中的第一个字符。空字符串是未定义的行为。

测试用例:

输出可以在格式"TEST"["T","E","S","T"]或其他任何适合你。

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

这是,因此最短答案以字节为单位。



我们可以将输入作为字符串列表(字符列表)吗?
Xcoder先生17年

@ Mr.Xcoder是的。
斯蒂芬,

您能否添加一个包含一些字母的测试用例,这些字母由一个或多个不是字母,数字,空格或破折号的字符分隔。电子邮件地址,例如:My-Name@Some-Domain.TLD
毛茸茸的

1
@Shaggy添加了,谢谢。
斯蒂芬,

Answers:


8

V,7个字节

ÍÕü¼À!õ

在线尝试!

这是一个十六进制转储来证明字节数:

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

说明:

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

这很短,这要归功于V出色的regex压缩



@StepHen为什么谢谢你!我认为这非常接近最佳。:)
DJMcMayhem

2
单词边界是什么意思?这个问题似乎暗示只有空格和-被允许。
尼尔

8

R66 63字节

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

在线尝试!

-3个字节,感谢Scarabee

匿名函数;返回首字母缩写词作为c("N","A","T","O")隐式打印的向量。

一次,这在R中还不错!在-或上分割(space),取每个元素的第一个元素,然后LETTERS按顺序返回所有为大写字母(是带有大写字母的内置R)。


我认为您可以节省一些字节:function(s)(s=substr(strsplit(s,' |-')[[1]],1,1))[s%in%LETTERS]
Scarabee '17

1
@Scarabee谢谢。抱歉,花了2年时间进行更新。
朱塞佩


5

Javascript 21字节

接受字符串输入并输出包含首字母缩写字符的字符串数组

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

说明

这只是单词边界后跟大写字母的全球正则表达式匹配项。



4

Dyalog APL,29 23字节

奖励测试用例:一种编程语言(APL)。

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

返回一个字符数组(在TIO上显示为空格)。

在线尝试!


较早的帖子,29个字节

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

在线尝试!

怎么样?

'(\w)\w+'⎕R -替换每组字母字符

    '\1' -第一个字符

~⍨ -删除每个字符

    (⎕AV~⎕A) -不是ASCII大写


3

Python,53个字节

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

在线尝试!

一个简单的正则表达式,带有空格或破折号。与其匹配开始,不如添加一个空格。


使用MrXCoder的测试套件在TIO链接中进行了编辑。
斯蒂芬,

谢谢@StepHen-您击败了我,节省了我的精力
Chris H

50

3

C#,84 78个字节

using System.Linq;s=>s.Where((c,i)=>c>64&c<91&(i>0?s[i-1]==32|s[i-1]==45:1>0))

@jkelm节省了6个字节。

在线尝试!

完整/格式化版本:

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

using System.Linq如果using System.Collections.Generic要豁免,为什么还要在字节数中包括?关于哪些using是可数的,是否存在一些共识?

using System.Linq;我的答案中的Linq代码需要@DaveParsons 。然而,IEnumerbale<char>这不是答案的一部分,而这是需要using System.Collections.Generic;编译的代码的一部分。
TheLethalCoder

说得通; 感谢您的澄清。

您可以通过使用char作为整数检查大写形式来节省一些字节。c> 64&c <91应该为您提供6个字节。
jkelm '17

@jkelm尼斯:)我总是忘了那个把戏!
TheLethalCoder

3

朱莉娅0.6.0(57字节)

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

说明:这是我的第一个代码高尔夫球。非常简单。拆分单词,打印每个单词的第一个大写字母。

使用正则表达式可能容易做得更好,但是我对此并不陌生


1
欢迎来到PPCG!我目前没有投票,稍后再投票。
斯蒂芬,

2
@StepHen我已经覆盖了。:P
DJMcMayhem


2

C#(.NET Core),108字节

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

在线尝试!


尚未检查,但将更if改为三进制可能会节省您的字节。它始于index 2而不是1,只需更改int i=1即可对其int i=0进行修复。除此之外,我不认为您可以在这里做更多的事情。
TheLethalCoder

三进制在这里无济于事,因为它与if语句的字节数相同。但是,您是正确的,因为我需要更改初始i值
jkelm '17

我不确定,但是它们通常会变短,因此始终值得检查。
TheLethalCoder

2

果冻 11  10字节

-1个字节,感谢Outgolfer的Erik在空格> _ <处分割)

⁾- yḲḢ€fØA

用于获取和返回字符列表的单子链接。
完整的程序接受一个字符串并打印结果。

在线尝试!或查看测试套件

怎么样?

⁾- 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

嗯,为什么不使用代替ṣ⁶
暴民埃里克(Erik the Outgolfer)'17年

嘿,因为我忘记了。谢谢!
乔纳森·艾伦

2

Perl 5,25个字节

24个字节的代码+ 1个-n

令人讨厌的grep -P支持可变长度后视,但Perl不支持:(。

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

-1个字节感谢@Dada

在线尝试!-包括-l一次运行所有测试。


您可以做得更好:可以在线尝试!;-)
Dada

@达达哈!当然...我在ATM上,但是回来后会更新。谢谢!我很失望,我无法获得s///$_=否定print...
Dom Hastings

是的,我正在寻找一个s///解决这个问题的方法,但这并不明显……我正在工作,也许以后再尝试!
达达


2

Brachylog25 23 22字节

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

在线尝试!

(-2个字节,感谢@Falalize。)

,Ṣ↻                      % 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

您可以使用而不是" "保存两个字节
Fatalize


2

迅捷5,110字节

-5感谢Cœur

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

详细说明

  • import Foundation-导入对该代码Foundation至关重要的模块zip()

  • func f(s:[String]){...}-创建一个带有参数的函数,该函数s是一个字符串列表,代表输入的字符。

  • for i in zip(s,[" "]+s){...}- i通过输入的zip 进行迭代,并在输入的开头添加空格,这对于获取String中的前一个字符非常有帮助。

  • if -检查是否:

    • i.0==i.0.uppercased() -当前字符为大写,

    • &&"- ".contains(i.1) -并且如果前一个字符是空格或破折号。

  • 如果满足以上条件,则:

    • print(i.0) -字符被打印,因为它是首字母缩写词的一部分。

-5用import UIKit代替import Foundation
心教堂



1

Python 3中73 70个字节

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

在线尝试!


说明

  • lambda n:-创建带有String参数的匿名lambda函数n

  • n[x]-获取nindex处的字符x

  • for x in range(len(n))-从迭代0到长度n,命名变量x

  • if -检查:

    • '@'<n[x]<'[' -如果字符是大写,

    • and(' '+n)[x]in' -'-并且如果在字符串前面加空格或破折号(由空格和组成)n


2
我读成i supper,这很不好,不知道为什么吗?
TheLethalCoder

@TheLethalCoder它是.isupper(),我不知道您读了什么:p
Xcoder先生17年





1

Bash(grep),29个 28个字节

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

我的python答案的端口,但是因为pgrep支持可变长度的lookbehind,所以它明显更短(即使考虑到python的开销)。将测试用例放在一个名为的文件中a,每行输出1个字符。

-1感谢Neil


^| |-可能是一个较短的测试?
尼尔

@尼尔在这里工作,谢谢。错过了它,因为它在Python中不起作用
Chris H

1

RProgN 2,18字节

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

讲解

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

在线尝试!


1

PHP,62字节

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

与管道一起运行-nR在线尝试

其他解决方案:

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个字节

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

通过参数完成输出


是否有可能完全删除#include<string>并假定参数sstd::string
扎卡里

1

Lua79 75字节

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

尝试一下!

我在尝试版本的最后一刻之前插入了一个print(),因为否则情况一团糟。该程序完全符合I / O和匹配的要求,但是如果没有多余的新行,则很难阅读。

输入以number:string表的形式给出,数字每次从1开始递增1。

说明:

它用于遍历每个输入字符串的gmatch。gmatch搜索如下:

[%-| ]-分组,搜索-或空格

%u-搜索大写字符

然后,对于每个匹配项,将其打印出来减去前面的破折号或空格

编辑:通过删除'a'声明并在for循环中的输入中添加空格,以及将子输入更改为2而不是2,2(产生等效结果),获得了4个字节的空位


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.