약어 생성


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

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.



문자열 목록 (문자 목록)으로 입력을받을 수 있습니까?
Mr. Xcoder

@ Mr.Xcoder 예.
Stephen

문자, 숫자, 공백 또는 대시가 아닌 하나 이상의 문자로 구분 된 일부 문자를 포함하는 테스트 사례를 추가 할 수 있습니까? 예를 들어 전자 메일 주소 : My-Name@Some-Domain.TLD.
얽히고 설킨

1
@Shaggy 님, 감사합니다.
Stephen

답변:


8

V , 7 바이트

ÍÕü¼À!õ

온라인으로 사용해보십시오!

다음은 바이트 수를 증명하는 16 진 덤프입니다.

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의 훌륭한 정규식 압축 덕분에 짧습니다 .


꽤 짧은 0.o
Stephen

@StepHen 왜 감사합니다! 나는 이것이 최적에 가깝다고 생각합니다. :)
DJMcMayhem

2
단어 경계 란 무엇을 의미합니까? 이 질문은 공간과 -허용 되는 것만 제안하는 것 같습니다 .
Neil

8

R , 66 63 바이트

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

온라인으로 사용해보십시오!

Scarabee 덕분에 -3 바이트

익명의 기능; c("N","A","T","O")암시 적으로 인쇄 되는 벡터로 약어를 반환합니다 .

한 번은 R에서 그렇게 나쁘지 않습니다! -또는에 분할하고 (space)각 요소의 첫 번째 요소를 취한 다음 대문자 인 대문자 (대문자 LETTERS와 함께 내장 된 R) 를 반환합니다 .


몇 바이트를 절약 할 수 있다고 생각합니다.function(s)(s=substr(strsplit(s,' |-')[[1]],1,1))[s%in%LETTERS]
Scarabee

1
@Scarabee 감사합니다. 업데이트하는 데 2 ​​년이 걸렸습니다.
주세페


5

자바 스크립트 21 바이트

문자열 입력을 받아서 약어 문자를 포함하는 문자열 배열을 출력합니다

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

설명

그것은 단어 경계와 대문자가 뒤 따르는 글로벌 정규 표현식입니다.



4

Dyalog APL, 29 23 바이트

보너스 테스트 사례 : APL (Programming Language).

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

문자 배열을 리턴합니다 (TIO에서 공백으로 구분됨).

온라인으로 사용해보십시오!


이전 게시물, 29 바이트

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

온라인으로 사용해보십시오!

어떻게?

'(\w)\w+'⎕R -알파벳 문자의 각 클러스터를 교체

    '\1' -첫 번째 캐릭터

~⍨ -모든 문자를 제거

    (⎕AV~⎕A) -ASCII 대문자가 아닙니다


3

파이썬, 53 바이트

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

온라인으로 사용해보십시오!

공백 또는 대시에 대한 미리보기가있는 간단한 정규식입니다. 시작과 일치하는 대신 공백을 추가하십시오.


MrXCoder의 테스트 스위트를 사용하여 TIO 링크에서 편집했습니다.
Stephen

@StepHen에게 감사드립니다 – 당신은 저를 이기고 노력을 구했습니다
Chris H


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

말이된다; 설명해 주셔서 감사합니다.

문자를 정수로 사용하여 대문자를 확인하면 몇 바이트를 절약 할 수 있습니다. c> 64 & c <91은 6 바이트를 가져와야합니다.
jkelm

@ jkelm Nice :) 나는 항상 그 트릭을 잊어 버립니다!
TheLethalCoder

3

Julia 0.6.0 (57 바이트)

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

설명 : 이것이 나의 첫 번째 코드 골프입니다. 꽤 직설적 인. 단어를 나누고 각각의 첫 번째 대문자를 인쇄하십시오.

아마 정규식을 사용하여 더 잘 할 수는 있지만 이것에 익숙하지 않습니다.


1
PPCG에 오신 것을 환영합니다! 나는 지금 투표에서 벗어났습니다. 나중에 투표 할 것입니다.
Stephen

2
@StepHen 내가 취재했습니다. : P
DJMcMayhem


2

C # (. NET 코어) , 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않았지만를 삼항으로 변경 하면 바이트가 절약 될 수 있습니다. 인덱스이 시작 2대신은 1, 단지 변경 int i=1하는 int i=0문제를 해결할 수 있습니다. 그 외에는 여기서 할 수있는 일이 훨씬 더 많다고 생각하지 않습니다.
TheLethalCoder

삼항은 if 문과 동일한 바이트 수이므로 여기에서는 도움이되지 않습니다. 그러나 초기 i 값을 변경해야한다는 점에서 정확합니다.
jkelm

나는 완전히 확신하지는 못했지만 일반적으로 더 짧아지기 때문에 항상 확인할 가치가 있습니다.
TheLethalCoder

2

젤리 ,  11  10 바이트

Outgolfer Erik 덕분에 -1 바이트 ( > _ <공간에서 분할)

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

음, 대신에 사용 하지 ṣ⁶않겠습니까?
Outgolfer Erik

내가 잊어 버렸기 때문에 감사!
Jonathan Allan

2

펄 5 , 25 바이트

24 바이트 코드 + 1 -n .

grep -P가변 길이 look-behind 를 지원하지만 Perl은 지원하지 않는 성가신 :(.

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

@Dada 덕분에 -1 바이트 !

온라인으로 사용해보십시오! - -l모든 테스트를 한 번에 실행합니다.


훨씬 더 나은 방법으로 할 수 있습니다 : 온라인으로 사용해보십시오! ;-)
Dada

@ 다다! 물론 ... 나는 ATM을 사용하지만 돌아올 때 업데이트 할 것입니다. 감사! 내가 얻지 못 s///하거나 $_=부정 할 수 없어서 정말 실망 했습니다 print...
Dom Hastings

그래, 나는 s///이것을 해결하기 위해 하나 를 찾고 있었지만 분명하지 않다 ... 나는 일하고있다. 아마도 나중에 다시 시도 할 것이다!
Dada


2

Brachylog , 25 23 22 바이트

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

온라인으로 사용해보십시오!

(@Fatalize 덕분에 2 바이트)

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

대신 " "2 바이트를 절약 할 수 있습니다
Fatalize


2

스위프트 5 , 110 바이트

Cœur 덕분에 -5

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입력의 지퍼와 시작 부분에 공백이 추가 된 입력을 반복 하여 문자열의 이전 문자를 얻는 데 매우 유용합니다.

  • if -다음을 확인합니다 :

    • i.0==i.0.uppercased() -현재 문자는 대문자입니다.

    • &&"- ".contains(i.1) -및 이전 문자가 공백 또는 대시 인 경우.

  • 위의 조건이 충족되면 다음을 수행하십시오.

    • print(i.0) -약어의 일부이므로 문자가 인쇄됩니다.

import UIKit대신 -5를 사용하십시오 import Foundation.
Cœur



1

파이썬 3 , 73 70 바이트

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

온라인으로 사용해보십시오!


설명

  • lambda n:-String 매개 변수를 사용하여 익명의 람다 함수를 만듭니다 n.

  • n[x]-의 문자를 가져옵니다 n인덱스를 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
Mr. Xcoder





1

배쉬 (grep), 29 28 바이트

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

파이썬 답변의 포트이지만 pgrep가변 길이 lookbehinds를 지원 하기 때문에 눈에 띄게 짧습니다 (파이썬의 오버 헤드를 고려하더라도). 테스트 케이스를 파일에 붙여 넣습니다.a . 출력은 한 줄에 1 자입니다.

-1 Neil 에게 감사합니다


^| |-더 짧은 테스트일까요?
Neil

@Neil은 여기서 작동합니다. 감사합니다. 파이썬에서 작동하지 않기 때문에
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>인수가 가정 sA는 std::string?
Zacharý

1

루아 , 79 75 바이트

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

시도 해봐!

try it 버전의 마지막 끝 전에 print ()를 붙였습니다. 그렇지 않으면 엉망입니다. 이 프로그램은 I / O 및 일치 요구 사항을 완벽하게 준수하지만 추가 줄이 없으면 읽기가 어렵습니다.

입력은 number : string, 매번 1 씩 증가하고 1부터 시작하는 테이블 형식으로 제공됩니다.

설명:

각 입력 문자열의 일치 항목을 반복합니다. 일치 검색은 다음과 같습니다.

[%-| ]-그룹,-또는 공백 검색

% u-대문자 검색

그런 다음 각 일치에 대해 앞의 대시 또는 공백을 뺀 값을 인쇄합니다.

편집 : 'a'의 선언을 제거하고 for 루프 인의 입력에 공백을 추가하고 하위 입력을 2,2가 아닌 2로 변경하여 동등한 결과를 생성하여 4 바이트를 골프로 만들었습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.