他の文字列での文字列の出現を確認します


8

チャレンジ

きっとあなたはタイトルを読んで、あなたの担当者を養成するためにやって来て、その子供たちのことを考えていましたが、もう一度考えてください!別の文字列の出現を数えるには、最短のコードで互いに挑戦し合う必要があります。たとえば、次の入力があるとします。

aaaabbbbsssffhd

文字列として、文字列

s

出力する必要があります

ルール

あなたが笑顔で「ねえ、私は----を使います」と言う直前にこれを読んでください:

  • 外部ライブラリや言語のAPIを使用しないでください。手動で実装する必要があります。つまり、言語の組み込み関数またはメソッドを使用して出現回数をカウントすることはできません。
  • ファイルI / Oなし
  • サーバー、ウェブサイトなどに接続しない
  • `aba`の場合、` aba`で始まり、最後の3文字を読んだ場合も `aba`であれば、1つだけカウントします*

@ProgramFOXに感謝します(最後のルール)!
* ヒント:発生をカウントするときに、カウントしたものを削除して、このルールに従わないようにすることができます

最後の2つのルールはルールベンダーのためだけのものだと思います!

受賞基準

前述のように、勝者は使用されるバイト数が少ないコードです。当選者は5日後に発表されます(2014年6月15日)。

私の小さな答え

ここでは、それは私のことを前提としてC ++の答え、だli変数がで出現箇所を確認するための文字列を保持しており、l中を探すための文字列ですf

未ゴルフ

int c = 0;
while (li.find(lf) != string::npos)
{
    int p = li.find(lf);
    int l = p + lf.length() - 1;
    for (p = p; p <= l; p++)
    {
        li[p] = static_cast<char>(8);
    }
    ++c;
}

もちろん、を使用std::stringするには、文字列ヘッダーファイルをインクルードする必要があります。

ゴルフ

int c=0;while(li.find(lf)!=string::npos){int p=li.find(lf);int l=p+lf.length()-1;for(p=p;p<=l;p++){li[p]=static_cast<char>(8);}++c;}

結果

変数cは、文字列が見つかった回数の値になります


                                                                          楽しい!

勝者

長い待機の後、@ Dennisの回答はGolfScriptで記述された3バイトのみで勝ちます


5
同じ文字を2回数える必要がありますか?たとえば、入力がababaandの場合、aba出力する1か、それとも2?3番目aは、1 番目の終わりとaba2番目の始まりの両方abaです。
ProgramFOX

1
言語のAPIは、インポートできるライブラリ(言語に付属)または組み込みデータ型のメソッドまたはコマンド自体を意味しますか?
seequ

2
sマッチングよりも長い文字列を処理する必要がありますか?そうでない場合:私は、5文字のJ・ソリューションを持っている:+/a=b
ɐɔıʇǝɥʇuʎs

2
入力は変数またはSTDINを経由しますか?
seequ

1
関数またはプログラム?
カイルカノス2014年

回答:


7

GolfScript、3バイト

/,(

文字列と部分文字列がスタックにあると仮定します。

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

使い方

/  # Split the string around occurrences of the substring.
,  # Get the length of the split array.
(  # Subtract 1.

印象的ですが、ちょっと質問があります。コードゴルフとコード問題の解決のためだけにGolfScriptを学びましたか。

1
私はそうしましたが、今では他のタスクに時々それを使用しています。ASCIIテーブルが必要ですか?golfscript <<< '127,32,-""+'Webブラウザを開くよりも高速です。
Dennis

@Dennis [win key] jqt [return] a. [return]はさらに高速です;)
ɐɔıʇǝɥʇuʎsJun

@Synthetica:まあ、それは単なる例でした。しかし、jqt興味深いですね。それは何ですか?
Dennis

それは、J(のように、それは、それらのグラフィカルコンソールの一つだと付属の標準Jコンソールの@Dennis iPython QTConsole
ɐɔıʇǝɥʇuʎs

7

JavaScript 32

ここでは特に興味深いことは何もありません...

(p=prompt)().split(p()).length-1

split 主な目的は、引数の区切り文字を使用して文字列から配列を作成することです。


split()「あなたの言語のAPI」の一部ではありませんか?
svidgen 2014年

2
それはそうですが、その目的は文字列の出現を数えることではありません...それで、承認されたAPIの制限はどこにありますか?
Michael M.

1
@Michael曖昧であることをお詫び申し上げます。これは許容されます。質問を編集して、「言語の組み込み関数またはオカレンスのカウント方法を使用できない」と言い換えました。そのため、質問、それを使用できます...

@ 404NotFound知っておくと良いことです...これも私の答えですか?:) ...(+1)
svidgen

1
これは、変数がすでに初期化されていることを前提としない唯一の答えなので、私の賛成票を獲得しました。varsが他のすべての回答と同様に初期化されていると想定した場合、a.split(b).length-119になります。たぶん@svidgenが質問の初期化を明確にするはずです。
ランデュネル2014年

2

J(7)

No use of external libraries小切手!, or your language's API.小切手...?言語APIが何であるかわかりません。You have to implement it manually小切手! No file I/O小切手! No connecting with a server, website, et cetera小切手!

+/a E.b

使い方:

E.is WindowedMatch:J Refsheetが're' E. 'reread'例として示します。これは与える1 0 1 0 0 0。次に、あとはこれを+/(基本的にsum)で追加するだけです。

これはの使用とyour language's built-in function or method for counting occurencesは見なされませんが、異議はあります。

編集:明確にするために:

   +/'aba'E.'ababa'
2

私は思ったababa- > aba1を返すことでしたか?
カイルカノス2014年

@KyleKanosそうでしたが、作者は@Synthetica Absolutley go for it!私が彼に尋ねたときに具体的に言ったので、それは大丈夫だと思います。
ɐɔıʇǝɥʇuʎs

1

C#-73

//a = "aba";
//b = "ababa";

Console.Write(b.Split(new string[]{a},StringSplitOptions.None).Length-1);

// output = "1"

それは間違っています!abaアババで2回出現しますaba ba ab aba

2
@Runemoro「の場合、それでababa始まりaba、最後の3文字を読んだ場合もaba、1つだけカウントします*」<<ルール内..
mnsr

ああ、読みませんでした...

1

Python 2.x- 49 23 22バイト

これは、変数入力が問題ないことを前提としています。どちらのストリングも任意の長さにすることができます。

@avallを短縮しました。

a='s'
b='aaaabbbbsssffhd'
print~-len(b.split(a))

49バイトバージョン。サブストリングのすべてのインスタンスをカウントします( 'aba'は 'ababa'に2回あります)。

a='s'
b='aaaabbbbsssffhd'
print sum(a==b[i:i+len(a)]for i in range(len(b)))

すべてのテストで働いていた私は...にそれを置く

そして言語のAPIは、言語の組み込みの方法を使用するのではなく、独自の関数またはメソッドを使用する必要があることを意味します(それがある場合、私はC ++プログラマーです;()

さて、2番目の方法は、言語自体の方法です。また、a='aa'bが同じ場合、最初の出力は3を出力します。それは大丈夫ですか?
seequ

はい、絶対に

また、a='aba'; b='ababa'ケースの場合は2を出力します。
seequ

0

Powershell 32

($args[0]-split$args[1]).count-1

このように動作します:

PS C:\MyFolder> .\ocurrences.ps1 ababa aba
1

説明:を使用-splitして、最初の引数を2番目の引数で分離し、分割の結果得られた配列のサイズを返します(マイナス1)


0

Applescript、106バイト

Applescriptは楽しいですが、ゴルフにはばかげた言葉です。

on run a
set AppleScript's text item delimiters to (a's item 1)
(count of (a's item 2)'s text items)-1
end

で実行osascript

$ osascript instr.scpt s aaaabbbbsssffhd
3
$ 

0

C#-66バイト

//s = "aba"
//t = "ababa"

Console.Write(t.Split(new[]{s},StringSplitOptions.None).Length-1);

//Output: 1

笑。それが基本的に私の答えです。通常、このサイトでは、既存の回答とは異なるものを思い付かない場合、追加のバイトをいくつか節約する方法について、既存の回答にヒントを与えることができます。
mnsr 14年

@malik聞いて、その時はコメントできなかった。そうでなければ私はあなたの答えについてコメントしました。あなたが望むなら、私は私の答えを取り下げるつもりです。
tsavinho 2014年

1
けっこうだ。どちらでもかまいません。ただお知らせしていました。
mnsr 14年

0

C 130 120

注:正しくない引数で呼び出されると、おそらくクラッシュします。

r;main(int c,char**a){char*p=*++a,*q,*t;while(*p){for(q=a[1],t=p;*q&&*q==*t;q++)t++;*q?p++:(p=t,r++);}printf("%d\n",r);}

Ungolfed(ちょっと):

int main(int argc, char *argv[]) {
    int result = 0;
    char *ptr = argv[1];
    while (*ptr) {
        char *tmp, *tmp2 = ptr;
        // str(n)cmp
        for (tmp = argv[2]; *tmp; tmp++, tmp2++)
            if (*tmp != *tmp2)
                break;
        if (*tmp) {
            ptr++;
        } else {
            result++;
            ptr += tmp;
        }
    }
    printf("%d\n", result);
}

strstrandの古いバージョンstrlen:103

l;main(int c,char**a){char*p=a[1];l=strlen(a[2]);while(c++,p>l)p=strstr(p,a[2])+l;printf("%d\n",c-5);}

0

Delphi XE3(113)

2つの文字列を取り、文字列から部分文字列を削除し、古い長さから新しい長さを差し引き、その後に部分文字列の長さを除算します。

function c(a,b:string):integer;begin c:=(Length(a)-Length(StringReplace(a,b,'',[rfReplaceAll])))div Length(b)end;

テスト:

c( 'aaaabbbbsssffhd'、 's')= 3
c( 'aaaabbbbsssffhd'、 'a')= 4
c( 'ababa'、 'aba')= 1
c( 'ababa'、 'c')= 0


0

ルア(48)

そこで、今回はluaで別の回答を送信できると思いました。これは非常に可能性が高く、これは非常に新しいものです。

print((a.len(a)-a.len(a.gsub(a,b,"")))/b.len(b))

0

Fortran 90:101

暗黙の型付けの標準的な乱用は、任意の長さの配列aおよびbで機能しますが、を期待する必要がありlen(a) < len(b)ます。

function i();i=0;k=len(trim(b))-1;do j=1,len(trim(a))-k;if(a(j:j+k)==b(1:1+k))i=i+1;enddo;endfunction

この関数を機能させるにはcontain、完全なプログラム内で編集する必要があります。aおよびbstdinから受信され、同じ行(コンマまたはスペースで区切られている)または別の行に入力できます。gfortran -o main main.f90他のコンパイル済みプログラムと同じようにコンパイルして実行します。

program main
   character(len=256)::a,b
   read*,a,b
   print*,i()
 contains
   function i()
     i=0
     k=len(trim(b))-1
     do j=1,len(trim(a))-k
        if(a(j:j+k)==b(1:1+k))i=i+1
     end do
   end function
end program main

テスト:

>ababa aba
2

ループに4文字(,k+1)を追加すると、上記の結果を1に戻すことができdoます

> aaaabbbbbsssffhd s
3

0

Mathematica 26 23

デニスのアルゴリズムのように動作しますが、より幅広です:

Length@StringCases[a,b]

Szabolicsによって削られた3つの文字。


Length@StringCases[a,b]短いです。StringCount他の組み込みString*関数のいずれも許可する必要があるかどうかが明確でないため、この問題は明確に指定されていません。これらはすべて、同じ基本コードに基づいています。
Szabolcs 14年

ありがとう。忘れてたStringCases。言語のAPIでOPが何を意味するのかは不明でした。
DavidC 2014年

Mathematica 10の新しい合成演算子を使用すると、関数をと書くことさえできLength@*StringCasesます。これはLength@StringCases[##]&、関数を作成するだけで実際にはそれをaand に適用しない場合よりも短くなりbます。
Szabolcs 2014年

0

C ++ 225

int n,k,m;
int main()
{
string s1,s2;
cin>>s1;
cin>>s2;
int x=s1.size(),y=s2.size();
if(x>=y)
{
for(int i=0;i<x;i++)
{
k=0,m=0;
for(int j=0;j<y;j++)
{
if(s2[j]==s1[i+m])
{
    k++,m++;
}
else break;
}
if(k==y)
{
n++;
i+=(y-1);
}
}
}
cout<<n<<endl;
return 0;
}

0

ジャワ(38)

System.out.print(a.split(b).length-1);

(質問は完全なプログラムまたは機能を必要としませんでした。)



0

K /コナ 6

+/y~'x

どこxの文字列とあるyサブストリングが。~は否定演算子です。を使用すると'、のすべての要素に適用されxます。0一致しない1場合と一致する場合に戻ります。要素ごとに適用されるので、y~'xはベクトルであり+/、は結果を合計して出現回数の合計を与えます。

残念ながら、この方法でyはが1文字である必要があります。それ以外の場合は、複数文字の文字列を単一の文字列と比較し、結果としてになりlength errorます。

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