頭字語を生成する


19

これは、頭字語の作成と似ていますが、頭字語の取得方法や、柔軟な出力を含むこの課題など、いくつかの重要な違いがあります。

仕事

印刷可能なASCIIのみを含む文字列(chars / length 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

@ Mr.Xcoderはい。
スティーブン

文字、数字、スペース、ダッシュ以外の1つ以上の文字で区切られた文字を含むテストケースを追加できますか。たとえば、電子メールアドレスMy-Name@Some-Domain.TLD
シャギー

1
@Shaggyが追加しました、ありがとう。
スティーブン

回答:


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どうもありがとう!これは最適に近いと思います。:)
DJMcMayhem

2
単語の境界とはどういう意味ですか?質問は、スペースのみ-が許可されていることを示唆するようです。
ニール

8

R66 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

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に感謝します-あなたは私を打ち負かし、私を救ってくれました
クリス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が可算であるというコンセンサスはありますか?

@DaveParsons using System.Linq;は私の回答のLinqコードに必要です。ただし、これIEnumerbale<char>は答えの一部ではなくusing System.Collections.Generic;、コンパイルする必要があるコードの一部です。
TheLethalCoder

理にかなっています。説明をありがとう。

intとして文字を使用して大文字をチェックすることにより、数バイトを節約できます。c> 64&c <91で6バイトがネットになります。
-jkelm

@jkelm Nice :)私はいつもそのトリックを忘れています!
TheLethalCoder

3

ジュリア0.6.0(57バイト)

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

説明:これは私の最初のコードゴルフです。かなり簡単です。単語を分割し、それぞれの最初の1文字を印刷します。

おそらく正規表現を使用した方が簡単ですが、これは初めてです


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を3進数に変更するとバイトを節約できます。このインデックスで始まる2代わりに1、ちょうど変更int i=1int i=0それを修正します。それ以外に、ここでできることはこれ以上あるとは思いません。
TheLethalCoder

ここでは、ifステートメントと同じバイトカウントになるため、3要素は役に立ちません。ただし、初期i値を変更する必要があるという点であなたは正しいです
-jkelm

私は完全に確信していませんでしたが、彼らは通常より短くなりますので、常にチェックする価値があります。
TheLethalCoder

2

ゼリー 11  10 バイト

エリック・ザ・アウトゴルファーのおかげで-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

ええと、代わりに使用しないのはなぜṣ⁶ですか?
エリックアウトゴルファー

へえ、私はそれを忘れていたので。ありがとう!
ジョナサンアラン

2

Perl 5、25バイト

24バイトコード+ 1の場合-n

grep -P可変長の後読みをサポートしているが、Perlはサポートしていません。

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

@Dadaのおかげで-1バイト!

オンラインでお試しください!- -lすべてのテストを一度に実行することを含みます。


あなたは非常にはるかに優れた方法で行うことができます:オンラインで試してみてください!;-)
ダダ

@ダダハ!もちろん...私はATMですが、戻ってきたら更新します。ありがとう!私は非常に私は得ることができなかった失望しているs///か、$_=否定するprint...
ドムヘイスティングス

ええ、私はs///これを解決するためのシングルを探していましたが、それは明らかではありません...私は仕事中です、多分私はそれを後でもう一度試してみます!
ダダ


2

Brachylog25 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バイトを保存するために使用することができます
6


2

Swift 5、110バイト

-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入力の文字を表すStringのリストであるパラメーターを使用して関数を作成します。

  • for i in zip(s,[" "]+s){...}- i入力のzipと、先頭にスペースを追加した入力を繰り返し処理します。これは、文字列の前の文字を取得するのに非常に役立ちます。

  • if -次のことを確認します:

    • i.0==i.0.uppercased() -現在の文字は大文字です。

    • &&"- ".contains(i.1) -および前の文字がスペースまたはダッシュの場合。

  • 上記の条件が満たされる場合:

    • print(i.0) -文字は頭字語の一部であるため、印刷されます。

-5のimport UIKit代わりにimport Foundation
キュー



1

Pythonの373の 70バイト

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

オンラインでお試しください!


説明

  • lambda n:-Stringパラメーターを使用して匿名のラムダ関数を作成しますn

  • n[x]-atの文字を取得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

Bash(grep)、29 28バイト

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

私のPythonの答えの移植ですが、pgrep可変長のルックビハインドをサポートしているため、著しく短くなっています(Pythonのオーバーヘッドを考慮しても)。テストケースをというファイルに貼り付けますa。出力は1行に1文字です。

-1 ニールに感謝


^| |-短いテストかもしれませんか?
ニール

ここで動作する@Neil、ありがとう。Pythonで動作しないため見逃した
クリス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>引数を完全に削除して仮定することsは可能std::stringですか?
ザカリー

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から始まります。

説明:

各入力文字列のgmatchによるループ用です。gmatch検索は次のとおりです。

[%-| ]-グループ化、検索-またはスペース

%u-大文字を検索します

次に、一致するたびに、前のダッシュまたはスペースを差し引いて出力します

編集:「a」の宣言を削除してforループ内の入力にスペースを追加し、サブ入力を2,2ではなく2に変更することで4バイトをゴルフしました(同等の結果が得られます)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.