Periksa kemunculan string di string lain

8

Tantangan

Saya yakin Anda membaca judulnya, dan datang ke peternakan perwakilan Anda, memikirkan hal-hal anak-anaknya, tetapi pikirkan lagi! Anda harus saling menantang dalam kode terpendek untuk menghitung kemunculan string di string lain. Misalnya, diberi input berikut:

aaaabbbbsssffhd

sebagai string, dan string

s

harus keluar

3

Aturan

Tepat sebelum Anda tersenyum dan berkata, "Hei, saya akan menggunakan ----," baca ini:

  • Tidak menggunakan perpustakaan eksternal, atau API bahasa Anda. Anda harus mengimplementasikannya secara manual. Yang berarti Anda tidak dapat menggunakan fungsi atau metode bawaan bahasa Anda untuk menghitung kejadian
  • Tidak ada file I / O
  • Tidak terhubung dengan server, situs web, dan lain-lain
  • Dalam kasus `ababa`, yang dimulai dengan` aba` dan jika Anda membaca 3 huruf terakhir itu juga `aba`, Anda hanya menghitung satu *

Terima kasih @ProgramFOX untuk itu (aturan terakhir)!
* Petunjuk : Saat menghitung kejadian, Anda dapat menghapus yang Anda hitung untuk menghindari pelanggaran aturan ini

Saya pikir 2 aturan terakhir hanya untuk pembengkok aturan!

Kriteria Kemenangan

Seperti yang dinyatakan sebelumnya, pemenangnya adalah kode dengan byte yang lebih sedikit digunakan. Pemenang akan diumumkan lima hari kemudian (15 Juni 2014)

Jawaban Kecil Saya

Inilah jawaban C ++ saya, yang mengasumsikan bahwa livariabel tersebut menyimpan string untuk memeriksa kejadian, dan lmerupakan string yang harus dicari f:

Tidak disatukan

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;
}

Tentu saja, untuk menggunakan std::string, Anda harus memasukkan file header string!

Golf

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;}

Hasil

Variabel cakan menjadi nilai berapa kali string ditemukan


                                                                          Nikmati!

Pemenang

Setelah menunggu lama, jawaban @Dennis menang hanya dengan 3 byte, ditulis dalam GolfScript

Komunitas
sumber
5
Haruskah kita menghitung karakter yang sama dua kali? Misalnya, jika inputnya adalah ababadan aba, haruskah kita output 1atau 2? Yang ketiga aadalah akhir dari yang pertama abadan awal dari yang kedua aba.
ProgramFOX
1
Apakah API bahasa berarti pustaka yang dapat diimpor (yang disertai dengan bahasa) atau metode yang dibangun pada tipe data atau perintah sendiri?
seequ
2
Apakah perlu berurusan dengan string lebih lama daripada suntuk pencocokan? Jika tidak: Saya punya solusi J 5 Char:+/a=b
ɐɔıʇǝɥʇuʎs
2
Apakah input datang melalui variabel atau STDIN?
seequ
1
Fungsi atau program?
Kyle Kanos

Jawaban:

7

GolfScript, 3 byte

/,(

Asumsikan string dan substring ada di tumpukan.

Cobalah online.

Bagaimana itu bekerja

/  # Split the string around occurrences of the substring.
,  # Get the length of the split array.
(  # Subtract 1.
Dennis
sumber
Mengesankan .. Tapi saya punya pertanyaan kecil, apakah Anda belajar GolfScript hanya untuk kode golf dan memecahkan masalah kode?
1
Ya, tapi saya menggunakannya sesekali untuk tugas lain sekarang. Perlu tabel ASCII? golfscript <<< '127,32,-""+'lebih cepat daripada membuka browser web.
Dennis
@Dennis [win key] jqt [return] a. [return]bahkan lebih cepat;)
ɐɔıʇǝɥʇuʎs
@ Sintetica: Yah, itu hanya sebuah contoh. Tapi jqtkedengarannya menarik. Apa itu?
Dennis
@ Dennis Ini adalah konsol J standar yang datang dengan J (ini adalah salah satu konsol grafis, seperti iPython QTConsole)
Junıʎu 10s
7

JavaScript 32

Tidak ada yang benar-benar menarik di sini ...

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

split Tujuan utamanya adalah membuat array dari string menggunakan pembatas dalam argumen.

Michael M.
sumber
split()bukan bagian dari "API bahasa Anda"?
svidgen
2
tapi tujuannya bukan untuk menghitung kemunculan string ... jadi di mana batas API resmi?
Michael M.
1
@Michael Saya minta maaf karena tidak jelas, ini dapat diterima .. Saya mengedit pertanyaan untuk diulangi menjadi "Anda tidak dapat menggunakan fungsi atau metode bawaan bahasa Anda untuk menghitung kejadian", jadi jika itu tidak dimaksudkan untuk tujuan pertanyaan, Anda dapat menggunakannya ...
@ 404NotFound Bagus untuk tahu ... ini juga jawaban saya? :) ... (+1)
svidgen
1
Ini adalah satu-satunya jawaban yang tidak berasumsi bahwa vars sudah diinisialisasi, jadi Anda punya upvote saya. Jika Anda mengasumsikan vars diinisialisasi seperti semua jawaban lainnya, Anda akan mendapatkan a.split(b).length-119. Mungkin @svidgen harus menjelaskan inisialisasi dalam pertanyaan.
Randandel
2

J (7)

No use of external librariesMemeriksa! , or your language's API.Memeriksa...? Saya tidak tahu apa itu API bahasa. You have to implement it manuallyMemeriksa! No file I/OMemeriksa! No connecting with a server, website, et ceteraMemeriksa!

+/a E.b

Bagaimana itu bekerja:

E.adalah WindowedMatch: J Refsheet memberi 're' E. 'reread'contoh. Ini memberi 1 0 1 0 0 0. Kemudian, satu-satunya yang tersisa untuk dilakukan adalah menambahkan ini dengan +/(pada dasarnya sum).

Saya tidak berpikir ini dianggap sebagai penggunaan your language's built-in function or method for counting occurences, tapi itu bisa diperdebatkan.

EDIT: Hanya untuk memperjelas:

   +/'aba'E.'ababa'
2
ɐɔıʇǝɥʇu
sumber
Saya pikir ababa-> abaadalah mengembalikan 1?
Kyle Kanos
@KyleKanos Itu, tapi penulis secara khusus mengatakan @Synthetica Absolutley go for it!ketika saya bertanya kepadanya, jadi saya kira tidak apa-apa.
ɐɔıʇǝɥʇu
1

C # - 73

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

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

// output = "1"
mnsr
sumber
Itu salah! abamuncul dua kali dalam ababa: aba ba ab aba.
2
@Runemoro "Dalam kasus ababa, di mana dimulai dengan abadan jika Anda membaca 3 huruf terakhir itu juga aba, Anda hanya menghitung satu *" << Dalam aturan ..
mnsr
Oh, tidak membaca ...
1

Python 2.x - 49 23 22 byte

Ini dengan asumsi input variabel tidak apa-apa. Kedua string bisa panjang.

Shortav @ singkat.

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

Versi 49 bytes, menghitung setiap instance dari substring ('aba' ada di 'ababa' dua kali).

a='s'
b='aaaabbbbsssffhd'
print sum(a==b[i:i+len(a)]for i in range(len(b)))
seequ
sumber
Bekerja dengan setiap tes yang saya masukkan ...
Dan API bahasa berarti Anda harus menggunakan fungsi atau metode Anda sendiri, tidak menggunakan cara
Ya, yang kedua adalah metode bahasa itu sendiri. Juga, yang pertama menghasilkan 3 jika a='aa'dan b adalah sama. Apakah itu tidak apa apa?
seequ
Ya, tentu saja
Juga, output 2 untuk a='aba'; b='ababa'kasing.
seequ
0

Powershell 32

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

Bekerja seperti ini:

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

Penjelasan: Menggunakan -splituntuk memisahkan argumen pertama dengan argumen kedua, mengembalikan ukuran array yang dihasilkan dari split (minus 1)

DarkAjax
sumber
0

Applescript, 106 byte

Applescript adalah bahasa yang asyik, tapi konyol untuk bermain golf.

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

Jalankan dengan osascript:

$ osascript instr.scpt s aaaabbbbsssffhd
3
$ 
Trauma Digital
sumber
0

C # - 66 Bytes

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

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

//Output: 1
tsavinho
sumber
lol. Itu pada dasarnya jawaban saya. Biasanya di situs ini, jika Anda tidak dapat menemukan sesuatu yang berbeda dari jawaban yang ada, Anda dapat memberikan petunjuk untuk jawaban yang ada tentang bagaimana cara menyimpan beberapa byte tambahan.
mnsr
@malik Dengar, saya tidak bisa berkomentar saat itu. Kalau tidak, saya akan mengomentari jawaban Anda. Saya bersedia mengambil jawaban saya, jika Anda mau.
tsavinho
1
Cukup adil. Saya juga tidak keberatan. Aku baru saja memberitahumu.
mnsr
0

C 130 120

Catatan: mungkin akan macet jika dipanggil dengan argumen yang salah.

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);}

Tidak digabungkan (agak):

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);
}

Versi lama dengan strstrdan 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);}
aragaer
sumber
0

Delphi XE3 (113)

Mengambil 2 string, menghilangkan substring dari string dan mengurangi panjang baru dari panjang yang lama diikuti oleh pembagian panjang substring.

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

Pengujian:

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

Teun Pronk
sumber
0

Lua (48)

Jadi saya pikir saya bisa mengirimkan jawaban lain, kali ini di lua. Sangat mungkin ini bisa ditingkatkan banyak, saya sangat baru dalam hal ini.

print((a.len(a)-a.len(a.gsub(a,b,"")))/b.len(b))
Teun Pronk
sumber
0

Fortran 90: 101

Penyalahgunaan standar pengetikan implisit, berfungsi untuk array panjang apa pun a dan b, meskipun orang harus mengharapkan itu 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

Fungsi ini harus contain diedit dalam program lengkap agar berfungsi. adan bditerima dari stdin dan dapat dimasukkan pada baris yang sama (baik dipisahkan oleh koma atau spasi) atau pada baris yang berbeda. Kompilasi via gfortran -o main main.f90dan eksekusi seperti yang Anda lakukan pada program kompilasi lainnya.

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

Tes:

>ababa aba
2

Saya bisa membuat pengembalian di atas 1 jika saya menambahkan 4 karakter ( ,k+1) untuk doloop

> aaaabbbbbsssffhd s
3
Kyle Kanos
sumber
0

Mathematica 26 23

Bekerja seperti algoritma Dennis, tetapi wordier:

Length@StringCases[a,b]

Tiga karakter dicukur oleh Szabolics.

DavidC
sumber
Length@StringCases[a,b]lebih pendek. Masalah ini tidak ditentukan dengan baik karena jika kita tidak diizinkan untuk menggunakan StringCount, tidak jelas apakah ada String*fungsi builtin lain yang diizinkan atau tidak ... semuanya didasarkan pada kode dasar yang sama.
Szabolcs
Terima kasih. Saya lupa tentang StringCases. Tidak jelas bagi saya apa arti OP oleh API bahasa.
DavidC
Menggunakan operator komposisi baru di Mathematica 10 , kita bahkan bisa menuliskan fungsi sebagai Length@*StringCases. Ini lebih pendek daripada Length@StringCases[##]&jika kita hanya menulis fungsi tetapi tidak benar-benar menerapkannya ke adan b.
Szabolcs
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;
}
bacchusbeale
sumber
0

Jawa (38)

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

(Pertanyaan tidak memerlukan program atau fungsi yang lengkap.)

Ypnypn
sumber
0

Cobra - 25

print a.split(b).length-1
Suram
sumber
0

K / Kona 6

+/y~'x

di mana xstring dan ysubstring. ~adalah operator negate, dengan ', diterapkan pada setiap elemen di x; itu akan kembali 0jika tidak cocok dan 1jika cocok. Karena itu diterapkan elemen-bijaksana, hasilnya y~'xadalah vektor, +/kemudian menjumlahkan hasilnya memberikan jumlah total kejadian.

Sayangnya, metode ini mensyaratkan yhanya satu karakter, jika tidak kita akan membandingkan string multi-karakter dengan string karakter tunggal, yang menghasilkan a length error.

Kyle Kanos
sumber