再帰的な頭字語を見つける


10

前書き

再帰的頭字語は、例えば、含まれているか、それ自体を意味する頭字語である。 Fishための再帰的頭字語であり得るFish is shiny heroことも頭字語自体が含まれて注意してください。別の例はHi-> Hi iglooです。またはppcg paints->ppcg paints cool galaxies pouring acid into night time stars

したがって、基本的に、各単語の最初の文字が最初の単語を表す場合、文は再帰的な頭字語です。


チャレンジ

スペース文字で区切られた1つ以上の単語の文字列を受け取り、再帰的な頭字語を出力するか、それが不可能な場合は空の文字列を出力するプログラムを作成します。例えば、のような文字列のための再帰的頭字語を作ることは不可能であるppcg elephantあなたが取ることによって開始するためpppcg、次に取った後、頭字語にそれを追加することeからelephant。しかし、頭字語は現在「pe ..」と綴り、「pp ..」と矛盾するため、今では矛盾があります。これは、たとえばにも当てはまりhiます。あなたはhfrom をとりますhiが、文はこれで終わり、スペルアウトする文字はなくなり、一致しないhiものだけが残ります。hhi。(文字列には、頭字語の文字数以上の単語が必要です)

入力と出力は大文字と小文字を区別しません


制限事項

  • プログラムに入力されたものはすべて有効な英単語になります。ただし、有効な英語の単語も出力する必要があります(データベースを使用するか、26文字ごとに単語を保存できます)。
  • 標準の抜け穴とデフォルトのIOルールが適用されます

テストケース

hi igloo -> hi
ppcg paints -> (impossible)
ppcg paints cool giraffes -> ppcg
ppcg paints cool galaxies pouring acid into night time stars -> ppcgpaints
ppcg paints cool galaxies pouring acid into night time -> ppcg
ppcg questions professional pool challengers greatly -> (impossible)
I -> I

得点

これはなので、バイト単位の最小のソースコードが優先されます。


1
Q、q [kyoo]名詞、複数のQまたはq、qまたはq。英語のアルファベットの17番目の文字、子音。クイック、無罪、イラクなど、Qまたはqの文字で表される音声。Qの形をしたもの
l4m2

3
また、ppcgは辞書に載っているとは思いません
l4m2 '26

1
さて、それらのテストケースの1つは、期待したとおりにはなりませんでした。私たちのどちらも間違いを犯していないことを確認するためppcg paints cool galaxies pouring acid into night timeに、頭字語にすると「ppcgpaint」になりますが、出力はppcg部分的にしか一致していなくてもかまいません。
カミルドラカリ2018年

1
現在のすべてのソリューションは最初のオプション(「頭字語を見つける」)を採用しており、「文を見つける」オプションははるかに複雑です(そのため、最初のオプションと競合する方法はありません。まず、単語リストが必要です)。この課題からそれを削除し、それを独自の質問にすることをお勧めします。
–PaŭloEbermann、2018

2
@PaŭloEbermann申し分なく、私はそれを削除しました
FireCubez 2018年

回答:


5

Japt、13バイト

¸
mά
VøUÎ ©V

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



1
これはppcg paints cool galaxies pouring acid into night time starsテストケースで失敗します
カミルドラカリ2018年

これはそのテストケースで機能するバージョンですが、ゴルフではありません
カミルドラカリ

私の以前の13バイトのソリューションは正しかったDx \
Luis felipe De jesus Munoz

現在のバージョンは頭字語に最初の単語が含まれていることを確認するだけなので、いくつかの新しい問題が発生します
カミルドラカリ

5

05AB1E、16バイト

ð¡©ηʒJ®€нJηså}θJ

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


1
前回の編集ð¡#はなくに変更されたのはなぜですか?私が考慮していないいくつかの特別なテストケース?
Kevin Cruijssen、2018年

@KevinCruijssen:#空の文字列ではなく入力を出力する単一の単語の入力では失敗するからです。
Emigna 2018年

ああそうでした。以前に似たような質問をしたことを覚えています。私はまだ。と#同じように動作するはずだと思いð¡ます。スペースで文字列を分割する場所を考えることができるユースケースはありますが、スペースが含まれていない場合は、(文字列ではなく)文字列のままにする必要があります。リストに包まれました)?これを読んでいる他の人々; #参考:スペースのない文字列で(スペースで分割)を使用すると、文字列はそのままになります(つまり"test" -> "test")。ð¡スペースのない文字列で(スペースで分割)を使用すると、文字列がリスト(つまり"test" -> ["test"])でラップされます。
Kevin Cruijssen、2018年

@KevinCruijssen:これは主に(主な機能である)#としても使用されているためだと思いますquit if true#falseが返された場合、チェックされた値がスタックに残されたリストにラップされることを望まないでしょう。
Emigna 2018年

1
@KamilDrakari:今でも動作します。
Emigna 2018年

2

Haskell、51 48バイト

編集:@xnorのおかげで-3バイト。

(\w->[r|p<-scanl1(++)w,map(!!0)w==p,r<-p]).words

頭字語を検索します。

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

\w->            .words -- let 'w' be the input list split into words
   p<-scanl1(++)w      -- loop 'p' through the list starting with the first word
                       --  and appending the next words one by one, e.g.
                       --  "Fish","is","shiny","hero" -> "Fish","Fishis","Fishisshiny","Fishisshinyhero"
     ,map(!!0)w==p     -- if the word made out of the first characters of the
                       --  words of 'w' equal 'p'
  [r|   r<-p]          -- return the letters of 'p' - if the check before
                       --  never evaluates to True then no letters, i.e. the
                       --  the empty string is returned

を使用していないためx、作曲(\w-> ...).wordsは短くなります。
xnor 2018年

2

Perl 6の50の42 58 49バイト

nwellnhofのおかげで-9バイト

{~first {m:g/<<./.join~~/^$^a/},[R,] [\~] .words}

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

最初のオプション。私はord文字列の最初の文字の序数値のみを返すのに対しchrs、序列のリストを受け取って文字列を返すという事実を利用しています。または、ムーンハートの答えからの正規表現はより短い:(です。参考のために、前の回答だった.words>>.ord.chrsの代わりに、[~] m:g/<<./

説明:

{~first {m:g/<<./.join~~/^$^a/},[R,] [\~] .words}
{                                               } # Anonymous code block
  first  # Find the first 
                                [R,] [\~] .words  # Of the reverse of the triangular joined words
         {                    }  # That matches:
          m:g/   /   # Match all from the original string
              <<.    # Single letters after a word boundary
                  .join    # Joined
                       ~~/^$^a/   # And starts with the given word
 ~  # And stringify Nil to an empty string

今は「IMPOSSIBLE」を出力する必要はありません
FireCubez 2018年

@Jo King正規表現はできますが、私の人生では、すべての演算子について考えることはできません。x演算子が存在することを忘れてしまいます。たとえば:P
moonheart08 '26

1

Retina 0.8.2、60バイト

^
$'¶
\G(\w)\w* ?
$1
+`^(.+)(\w.*¶\1 )
$1 $2
!`^(.+)(?=¶\1 )

オンラインでお試しください!再帰的な頭字語があれば検索します。説明:

^
$'¶

入力を複製します。

\G(\w)\w* ?
$1

最初の行の単語を頭文字に減らします。

+`^(.+)(\w.*¶\1 )
$1 $2

可能であれば、元の単語と一致するようにスペースを挿入します。

!`^(.+)(?=¶\1 )

1行目が2行目の接頭辞であれば出力します。


ppcg paintsの場合、出力は無効ppです。最初の単語のすべてではなく、一部しか綴らないため何も出力されません
FireCubez

@FireCubez申し訳ありませんが、私は古いバージョンの質問に取り組んでいました。
Neil、

1

Perl 6、56バイト

$!=[~] m:g{<<.};say $! if m:g{<<\w+}.map({$_ eq $!}).any

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

以前は正規表現は混乱し、私には使えませんでした。突然私はそれらを完全に理解します。私に何が起こったのか:P

選択肢1を満たす。


悲しいことに、私はまだ正規表現が単に狂気である段階にいます。残念ながら、これはppcgpaintsテストに失敗します。それ以外$!∈.wordsの場合は、if条件のようなものを提案したでしょう
Jo King


1

Rust、155、オンラインお試しください!

選択:問題1:頭字語を見つける

type S=String;fn f(t:&str)->S{let l=t.to_lowercase();let w=l.split(' ').fold(S::new(),|a,b|a+&b[..1])+" ";if (l+" ").contains(w.as_str()){w}else{S::new()}}

ほんの少し:

fn f(t: &str) -> String {
    let l = t.to_lowercase();
    let w = l.split(' ').fold(String::new(), |a, b| a + &b[0..1]) + " ";
    if (l + " ").contains(w.as_str()) {
        w
    } else {
        String::new()
    }
}

または、入力がすべて小文字であると仮定できる場合は、130だけです。

type S=String;fn f(l:S)->S{let w=l.split(' ').fold(S::new(),|a,b|a+&b[..1])+" ";if (l+" ").contains(&w.as_str()){w}else{S::new()}}

このプログラムは2つの選択肢のどちらを行いますか?
FireCubez 2018年

@FireCubezが更新されました。
Hannes Karppila、2018年

1

ゼリー、9バイト

Ḳµ;\fZḢWƊ

可能であれば、再帰的な省略形を出力する完全なプログラム。

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

どうやって?

Ḳµ;\fZḢWƊ - Main Link: list of characters
Ḳ         - split at space (let's call this v)
 µ        - start a new monadic chain (i.e. f(v)):
   \      - cumulative reduce v with:
  ;       -   concatenation -> [v(1), v(1);v(2), v(1);v(2);v(3); ...]
        Ɗ - last three links as a monad (i.e. f(v)):
     Z    -   transpose -> [[v(1)[1], v(2)[1], ...],[v(1)[1],v(2)[2],...],...]
      Ḣ   -   head -> [v(1)[1], v(2)[1], ...] ... i.e. 'the potential abbreviation'
       W  -   wrap in a list -> ['the potential abbreviation']
    f     - filter discard those from the left list that are not in the right list
          - implicit print -- a list of length 0 prints nothing
          -                   while a list of a single item prints that item

「最初の単語を印刷する」とはどういう意味ですか?頭字語が存在する場合、それを見つける必要がありますが、それは可能ですか?
FireCubez 2018年

「ppcgペイントは空ではなく酸を注ぐクールな銀河」に失敗し、「ppcgペイント」または「ppcgpaints」を印刷する必要がある
FireCubez

ああ、私は隣接する単語の要件を逃しました:(
Jonathan Allan

この要件を満たすように修正しました。
ジョナサンアラン

1

JavaScript [ES6]、74バイト

s=>s.split` `.map(w=>(b+='('+w,e+=')?',t+=w[0]),b=e=t='')&&t.match(b+e)[0]

照合する正規表現を作成します。コードの例を参照してください。

すべてのテストケース:

let f=

s=>s.split` `.map(w=>(b+='('+w,e+=')?',t+=w[0]),b=e=t='')&&t.match(b+e)[0]

console.log(f('hi igloo'))
// 'hi'.match('(hi(igloo)?)?')[0] == 'hi'

console.log(f('ppcg paints'))
// 'pp'.match('(ppcg(paints)?)?')[0] == ''

console.log(f('ppcg paints cool giraffes'))
// 'ppcg'.match('(ppcg(paints(cool(giraffes)?)?)?)?')[0] == 'ppcg'

console.log(f('ppcg paints cool galaxies pouring acid into night time stars'))
// 'ppcgpaints'.match('(ppcg(paints(cool(galaxies(pouring(acid(into(night(time(stars)?)?)?)?)?)?)?)?)?)?')[0] == 'ppcgpaints'

console.log(f('ppcg paints cool galaxies pouring acid into night time'))
// 'ppcgpaint'.match('(ppcg(paints(cool(galaxies(pouring(acid(into(night(time)?)?)?)?)?)?)?)?)?')[0] == 'ppcg'

console.log(f('ppcg questions professional pool challengers greatly'))
// 'pqppcg'.match('(ppcg(questions(professional(pool(challengers(greatly)?)?)?)?)?)?')[0] == ''

console.log(f('I'))
// 'I'.match('(I)?')[0] == 'I'

console.log(f('increase i'))
// 'ii'.match('(increase(i)?)?')[0] == ''

console.log(f('i increase'))
// 'ii'.match('(i(increase)?)?')[0] == 'i'


フェールオンincrease i
l4m2

@ l4m2、修正されました。
リックヒッチコック

0

Python 2、106バイト

最初のオプション-再帰的な頭字語を見つける。
結果をリストで返します。

I=input().split()
print[' '.join(I[:i])for i in range(1,-~len(I))if[j[0]for j in I]==list(''.join(I[:i]))]

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

Python 2、120バイト

最初のオプション-再帰的な頭字語を見つける。

def F(I,a=[],r=''):
 for j in I.split():
  a+=j,
  if list(''.join(a))==[i[0]for i in I.split()]:r=' '.join(a)
 return r

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


@JoKingのリクエストに従って「IMPOSSIBLE」を出力する必要はありません。バイトカウントが減少する可能性があります
FireCubez

「I」のような単一の文字は機能しません。その単一の文字が出力されるはずです
FireCubez

@FireCubezの修正
デッドポッサム

0

JavaScript、71バイト

アプローチ1

l=s=>{p=s.split(' ');k=p.reduce((r,x)=>r+x[0],'');return k==p[0]?k:''}

非ゴルフ:

l=s=>{
    p = s.split(' ');
    k = p.reduce((r,x)=>r+x[0],'');
    return k==p[0] ? k : '';
}
  • 文字列をスペースで分割します。
  • 各単語の最初の文字を取り、新しい文字列を作成します。
  • 最初の単語と比較してください。



0

Scala、76バイト

単純なケースのソリューション(空白のない頭字語)

def^(s:String)={val l=s.split(" ");if(l(0)==l.map(_(0)).mkString)l(0)else""} 

Scala、144バイト 100バイト(コメントのASCIIのみによるソリューションを参照)

def^(s:String)={val l=s.split(" ");l.scanLeft(List[String]())(_:::List(_)).find(_.mkString==l.map(_(0)).mkString).map(_.mkString).getOrElse("")}

REPLでテストする

scala> def^(s:String)={val l=s.split(" ");if(l(0)==l.map(_(0)).mkString)l(0)else""}
$up: (s: String)String

scala> ^("hi igloo")
res12: String = hi

scala> ^("ppcg paints cool giraffes")
res13: String = ppcg

scala> ^("ppcg paints Xcool giraffes")
res14: String = ""

scala> ^("ppcg paints cool galaxies pouring acid into night time stars")
res15: String = ""

scala>

scala> def^(s:String)={val l=s.split(" ");l.scanLeft(List[String]())(_:::List(_)).find(_.mkString==l.map(_(0)).mkString).map(_.mkString).getOrElse("")}
$up: (s: String)String

scala> ^("hi igloo")
res16: String = hi

scala> ^("ppcg paints cool giraffes")
res17: String = ppcg

scala> ^("ppcg paints Xcool giraffes")
res18: String = ""

scala> ^("ppcg paints cool galaxies pouring acid into night time stars")
res19: String = ppcgpaints


:::と置き換えることができます++か?また、List[String]-> Seq[Any]
ASCIIのみ


@ASCIIのみ、クール!このソリューションはPythonに勝ります。:)
Yウィット博士、

いつかコードを追加することを考えていますか?IMOソリューションが表示されずにバイトカウントを表示するのは少し変です
ASCIIのみ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.