親文字列内のアナグラムを検出する


9

親文字列とクエリ文字列の2つの文字列が与えられた場合、タスクはクエリ文字列の回数、またはクエリ文字列のアナグラムを決定することです。大文字と小文字を区別した検索で、親文字列に表示されます。

行動の例

入力1

AdnBndAndBdaBn
dAn

出力1

4

説明 サブストリングは以下の太字で強調表示されています。

Adn BndAndBdaBn

AdnB ndA ndBdaBn

AdnBn dAn dBdaBn

AdnBnd および BdaBn

検索はすべての検索で大文字と小文字を区別する必要があることに注意してください。

入力2

AbrAcadAbRa
cAda

出力2

2

これは、標準のASCIIでのみ機能する必要があります。これはコードゴルフであるため、最短の文字数で承認されます。また、ゴルフ版ではなく、ゴルフ版ではないコードを投稿してください。


2
重要なテストケース:abacacaba aac
Martin Ender

親文字列は常にクエリ文字列よりも長くなりますか?
オプティマイザ、

非常に良い点です!はい@オプティマイザー、親文字列は常にクエリ文字列よりも長くなります。
WallyWest

@WallyWest追加のテストケースはどうですか?単一の順列の重複する発生をカウントする必要がありますか?
マーティンエンダー、2015年

1
最新のコメントに対してテストケースとその正しい解決策を提供できますか?
isaacg

回答:


5

Pyth、11 10バイト

lfqSzST.:w

@Jakubeのおかげで1バイトのゴルフ。

デモンストレーション。

クエリ文字列を受け取り、その後に新しい行の親文字列を続けます。

未ゴルフ:

z = input()
len(filter(lambda T: sorted(z) == sorted(T), substrings(input())

1バイトを保存し、ソリューションの最後の文字を削除するだけです;-)
Jakube

@Jakubeああ、もちろん素晴らしい。
isaacg 2015年

3

CJam、13バイト

le!lf{\/,(}:+

(重複が許可されている場合は12バイト)

l$_,lew:$\e=

入力は次のようになります。

dAn
AdnBndAndBdaBn

すなわち

<query string>
<parent string>

重複するシナリオで3バイトを節約してくれたDennisに感謝

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


1
あなたは同じバイト数と重複処理することができます:ll1$,ew:$\$e=
デニス

@デニスそれは本当にいいです。12バイト:l$_,lew:$\e=しかし、OPがオーバーラップは許可されていないと言っているので、これが有効かどうかはわかりません。現在の値を減らすことができるかどうか見てみましょう。
オプティマイザ、

2

JavaScript ES6、95バイト

f=(p,q,n=0,s=a=>[...a].sort().join(''))=>[...p].map((_,i)=>n+=s(p.substr(i,q.length))==s(q))&&n

これは、次のような2つの引数を取る関数ですf(parent,query)

クエリ文字列の長さの親文字列のすべての部分文字列を調べ、それらを並べ替えます。ソートされたクエリ文字列と同じ場合は、が増分されますn。文字列の並べ替えは、配列に変換し、並べ替えて、文字列に戻す必要があるため、煩わしいものです。以下のゴルフされていないテスト可能なコード。

var f = function(p, q) {
  var n = 0
  var s = function(a) {
    return a.split('').sort().join('')
  }
  
  p.split('').map(function(_, i) {
    n += s(p.substr(i, q.length)) == s(q)
  })
  return n
}

// testing code below
document.getElementById('go').onclick = function() {
  var parent = document.getElementById('parent').value,
    query = document.getElementById('query').value;
  document.getElementById('output').innerHTML = f(parent, query);
}
<label>Parent: <input id="parent" value="AdnBndAndBdaBn"/></label><br />
<label>Query:  <input id="query" value="dAn"/></label><br />
<button id="go">Go</button><br />
<samp id="output">&mdash;</samp> anagrams found


2

Haskell、77 68バイト

import Data.List
p#s=sum[1|x<-tails p,sort s==sort(take(length s)x)]

使用法:

*Main> "AdnBndAndBdaBn" # "dAn"
4
*Main> "AbrAcadAbRa" # "cAda"
2
*Main> "abacacaba"# "aac"
2

仕組み:親文字列はp、クエリ文字列はsです。

tails最初の要素を順次削除して、そのパラメータのリストを作成しますtails "abcd" -> ["abcd","bcd","cd","d",""]xこのリストのすべての要素について1、ソートされた最初のn要素(nはの長さs)がソートされsたと等しい場合にaをとります。1sを合計します。

編集:tails明示的な再帰の代わりに


2

Python、61バイト

s=sorted
f=lambda a,b:a>''and(s(b)==s(a[:len(b)]))+f(a[1:],b)

これは再帰的なアルゴリズムです。並べ替えられた親文字列の最初の文字が、並べ替えられたクエリ文字列と同じかどうかをチェックします。次に、最初の文字が削除された親文字列で再帰します。親文字列が空になると終了します。


2

Python 2、76 70バイト

このラムダ関数は、ソートされた各サブストリングをターゲットのサブストリングと繰り返し比較します。一致がカウントされ、返されます。

lambda a,d:sum(sorted(d[n:n+len(a)])==sorted(a)for n in range(len(d)))

ゴルフではないコード:

f = lambda substr, text: sum(
    sorted(text[n:n+len(substr)]) == sorted(substr)
    for n in range(len(text))
    )

def test(tests):
    for t in tests.split():
        substr, text  = t.split(',')
        print t, f(substr, text)

tests = '''ba,abcba dAn,AdnBndAndBdaBn aac,abacacaba'''
test(tests)

そしてテスト出力:

ba,abcba 2
dAn,AdnBndAndBdaBn 4
aac,abacacaba 2

ZOUNDS!私はそれを見たことがない。いくつかのバイトを編集して保存します。ジャクベありがとう。
ロジックナイト

2

Python 2、124 118バイト

ここで試してください

これは匿名のラムダ関数です。それはおそらくさらにゴルフすることができます。

import re,itertools as i
lambda p,q:sum(len(re.findall('(?='+''.join(i)+')',p))for i in set(i.permutations(q,len(q))))

未ゴルフ:

from itertools import*
import re
def f(p,q):
    c=0
    for i in set(permutations(q,len(q))):
        c+=len(re.findall('(?='+''.join(i)+')',p))
    print c

reは必要ありません。順列ごとにstring.count(substring)を実行するだけです
sirpercival

2
@sirpercivalいいえ、string.coundは、のように、重複する出現をカウントしませんf('aaa','aa')
ジャクベ2015年

ああ、いい電話!私はそれを忘れました。
sirpercival

1
import re,itertools as i6文字を節約します。(私はそれが機能することを前に知りませんでした。)
randomra
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.