Kiểm tra sự xuất hiện của chuỗi trong chuỗi khác


8

Thử thách

Tôi chắc rằng bạn đã đọc tiêu đề và đến trang trại của bạn, nghĩ về những thứ của trẻ em, nhưng hãy suy nghĩ lại! Bạn phải thách thức nhau trong mã ngắn nhất để đếm số lần xuất hiện của chuỗi trong chuỗi khác. Ví dụ, đưa ra đầu vào sau:

aaaabbbbsssffhd

dưới dạng chuỗi và chuỗi

S

nên đầu ra

3

Quy tắc

Ngay trước khi bạn mỉm cười và nói, "Này, tôi sẽ sử dụng ----," hãy đọc nó:

  • Không sử dụng các thư viện bên ngoài hoặc API ngôn ngữ của bạn. Bạn phải thực hiện nó bằng tay. Điều đó có nghĩa là bạn không thể sử dụng chức năng hoặc phương thức tích hợp sẵn trong ngôn ngữ của mình để đếm số lần xuất hiện
  • Không có tập tin I / O
  • Không kết nối với máy chủ, trang web, et cetera
  • Trong trường hợp `ababa`, nơi nó bắt đầu bằng` aba` và nếu bạn đọc 3 chữ cái cuối cùng thì đó cũng là` aba`, bạn chỉ đếm được một *

Cảm ơn bạn @ProgramFOX vì điều đó (quy tắc cuối cùng)!
* Gợi ý : Khi bạn đếm số lần xuất hiện, bạn có thể xóa những lần bạn đã đếm để tránh không tuân theo quy tắc này

Tôi nghĩ rằng 2 quy tắc cuối cùng chỉ dành cho người uốn cong quy tắc!

Tiêu chí chiến thắng

Như đã nói trước đây, người chiến thắng là mã có ít byte được sử dụng. Người chiến thắng sẽ được công bố năm ngày sau (15 tháng 6 năm 2014)

Câu trả lời nhỏ của tôi

Đây là câu trả lời C ++ của tôi, trong đó nó giả sử rằng libiến giữ chuỗi để kiểm tra các lần xuất hiện và llà chuỗi cần tìm trong f:

Ung dung

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

Tất nhiên, để sử dụng std::string, bạn phải bao gồm tệp tiêu đề chuỗi!

Chơi gôn

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

Kết quả

Biến csẽ là giá trị của số lần tìm thấy chuỗi


                                                                          Thưởng thức!

Người chiến thắng

Sau một chờ đợi lâu dài @Dennis thắng với câu trả lời chỉ có 3 byte, viết bằng GolfScript


5
Chúng ta có nên tính cùng một nhân vật hai lần? Ví dụ, nếu đầu vào là ababaaba, chúng ta nên đầu ra 1hay 2? Thứ ba alà cả kết thúc của thứ nhất abavà bắt đầu thứ hai aba.
Chương trìnhFOX

1
API của ngôn ngữ có nghĩa là các thư viện có thể được nhập (đi kèm với ngôn ngữ) hoặc các phương thức của kiểu dữ liệu dựng sẵn hoặc chính các lệnh không?
xem

2
Có cần phải xử lý chuỗi dài hơn so svới kết hợp? Nếu không: Tôi có giải pháp 5 char J:+/a=b
15:30

2
Đầu vào có thông qua các biến hoặc STDIN không?
xem

1
Chức năng hay chương trình?
Kyle Kanos

Câu trả lời:


7

GolfScript, 3 byte

/,(

Giả sử chuỗi và chuỗi con nằm trên ngăn xếp.

Hãy thử trực tuyến.

Làm thế nào nó hoạt động

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

Ấn tượng .. Nhưng tôi có một câu hỏi nhỏ, bạn có học GolfScript chỉ để chơi golf và giải quyết các vấn đề về mã không?

1
Tôi đã làm, nhưng đôi khi tôi sử dụng nó cho các nhiệm vụ khác. Cần một bảng ASCII? golfscript <<< '127,32,-""+'nhanh hơn mở trình duyệt web.
Dennis

@Dennis [win key] jqt [return] a. [return]thậm chí còn nhanh hơn;)
ıʇǝɥʇuʎs

@Synthetica: Vâng, đó chỉ là một ví dụ. Nhưng jqtnghe có vẻ thú vị. Nó là gì?
Dennis

@Dennis Đó là bảng điều khiển J tiêu chuẩn đi kèm với J (đó là một trong những bảng điều khiển đồ họa, giống như iPython QTConsole)
ɐɔIuʎs

7

JavaScript 32

Không có gì thực sự thú vị ở đây ...

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

split Mục đích chính là tạo một mảng từ một chuỗi bằng cách sử dụng dấu phân cách trong đối số.


split()không phải là một phần của "API ngôn ngữ của bạn"?
Svidgen

2
đó là nhưng mục đích của nó không phải là đếm số lần xuất hiện của một chuỗi ... vậy giới hạn của các API được ủy quyền nằm ở đâu?
Michael M.

1
@Michael Tôi xin lỗi vì mơ hồ, điều này có thể chấp nhận được .. Tôi đã chỉnh sửa câu hỏi để viết lại thành "bạn không thể sử dụng chức năng hoặc phương thức tích hợp sẵn trong ngôn ngữ của mình để đếm số lần xuất hiện", vì vậy nếu nó không nhằm mục đích câu hỏi, bạn có thể sử dụng nó ...

@ 404NotFound Rất tốt để biết ... đây cũng là câu trả lời của tôi? :) ... (+1)
svidgen

1
Đây là câu trả lời duy nhất không cho rằng các vars đã được khởi tạo, vì vậy bạn đã có upvote của tôi. Nếu bạn giả sử các vars được khởi tạo giống như tất cả các câu trả lời khác, bạn sẽ nhận được a.split(b).length-119. Có lẽ @svidgen nên làm rõ việc khởi tạo trong câu hỏi.
randunel

2

J (7)

No use of external librariesKiểm tra! , or your language's API.Kiểm tra...? Tôi không biết API ngôn ngữ là gì. You have to implement it manuallyKiểm tra! No file I/OKiểm tra! No connecting with a server, website, et ceteraKiểm tra!

+/a E.b

Làm thế nào nó hoạt động:

E.WindowedMatch: Bảng tính J đưa ra 're' E. 'reread'làm ví dụ. Điều này cho 1 0 1 0 0 0. Sau đó, điều duy nhất còn lại phải làm chỉ đơn giản là thêm cái này với +/(về cơ bản sum).

Tôi không nghĩ rằng điều này được tính là sử dụng your language's built-in function or method for counting occurences, nhưng điều đó không thể tranh cãi.

EDIT: Chỉ cần rõ ràng:

   +/'aba'E.'ababa'
2

Tôi nghĩ ababa-> abalà để trở về 1?
Kyle Kanos

@KyleKanos Đó là, nhưng tác giả đặc biệt nói @Synthetica Absolutley go for it!khi tôi hỏi anh ta, vì vậy tôi cho rằng nó ổn.
ɐɔıʇǝɥʇuʎs

1

C # - 73

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

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

// output = "1"

Nó sai! abaxuất hiện hai lần trong ababa : aba ba ab aba.

2
@Runemoro "Trong trường hợp ababa, nó bắt đầu bằng abavà nếu bạn đọc 3 chữ cái cuối cùng thì bạn cũng abachỉ đếm một *" << Trong các quy tắc ..
mnsr

Ồ, không đọc ...

1

Python 2.x - 49 23 22 byte

Đây là giả định đầu vào biến là được. Cả hai chuỗi có thể có độ dài bất kỳ.

Rút gọn @avall.

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

Phiên bản 49 byte, đếm mọi phiên bản của chuỗi con ('aba' nằm trong 'ababa' hai lần).

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

Làm việc với mọi thử nghiệm tôi đặt nó vào ...

Và API của ngôn ngữ có nghĩa là bạn phải sử dụng chức năng hoặc phương thức của riêng bạn, không sử dụng cách tích hợp sẵn của ngôn ngữ để làm điều đó (nếu có, tôi là một lập trình viên C ++; ()

Vâng, thứ hai hoàn toàn là phương pháp riêng của ngôn ngữ cho nó. Ngoài ra, cái đầu tiên xuất 3 nếu a='aa'và b là như nhau. Được không
xem

Có, hoàn toàn

Ngoài ra, nó xuất ra 2 cho a='aba'; b='ababa'trường hợp.
xem

0

Quyền hạn 32

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

Hoạt động như thế này:

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

Giải thích: Sử dụng -splitđể tách đối số thứ nhất bằng đối số thứ hai, trả về kích thước của mảng kết quả từ phần tách (trừ 1)


0

Bản thảo, 106 byte

Applescript là một ngôn ngữ vui vẻ, nhưng ngớ ngẩn để chơi 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

Chạy với osascript:

$ osascript instr.scpt s aaaabbbbsssffhd
3
$ 

0

C # - 66 byte

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

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

//Output: 1

cười lớn. Về cơ bản đó là câu trả lời của tôi. Thông thường trên trang web này, nếu bạn không thể đưa ra một cái gì đó khác với câu trả lời hiện có, bạn có thể đưa ra gợi ý cho câu trả lời hiện có về cách lưu thêm một vài byte.
mnsr

@malik Nghe này, lúc đó tôi không thể bình luận. Nếu không, tôi đã nhận xét về câu trả lời của bạn. Tôi sẵn sàng gỡ câu trả lời của tôi xuống, nếu bạn muốn.
tsavinho

1
Đủ công bằng. Tôi cũng không phiền đâu. Tôi chỉ cho bạn biết.
mnsr

0

C 130 120

Lưu ý: có thể sẽ sụp đổ nếu được gọi với các đối số không chính xác.

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 (kinda):

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

Phiên bản cũ với strstrstrlen: 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)

Lấy 2 chuỗi, loại bỏ chuỗi con khỏi chuỗi và tạo độ dài mới từ độ dài cũ, sau đó là phân chia độ dài chuỗi con.

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

Kiểm tra:

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


0

Lua (48)

Vì vậy, tôi nghĩ rằng tôi chỉ có thể gửi câu trả lời khác, lần này là trong lua. Rất có thể điều này có thể được cải thiện rất nhiều, tôi rất mới với điều này.

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

0

Pháo đài 90: 101

Lạm dụng tiêu chuẩn của gõ ngầm, hoạt động cho bất kỳ mảng dài ab, mặc dù người ta nên mong đợi điều đó 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

Chức năng này phải được contained trong một chương trình đầy đủ để làm việc. abđược nhận từ stdin và có thể được nhập trên cùng một dòng (được phân tách bằng dấu phẩy hoặc dấu cách) hoặc trên các dòng khác nhau. Biên dịch qua gfortran -o main main.f90và thực hiện như bất kỳ chương trình biên dịch nào khác.

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

Các xét nghiệm:

>ababa aba
2

Tôi có thể thực hiện trả về 1 nếu tôi thêm 4 ký tự ( ,k+1) cho dovòng lặp

> aaaabbbbbsssffhd s
3

0

Toán học 26 23

Hoạt động như thuật toán của Dennis, nhưng wordier:

Length@StringCases[a,b]

Ba ký tự cạo ra bởi Szabolics.


Length@StringCases[a,b]ngắn hơn Vấn đề này không được chỉ định rõ vì nếu chúng tôi không được phép sử dụng StringCount, không rõ liệu có bất kỳ String*chức năng dựng sẵn nào khác được phép hay không ... tất cả đều dựa trên cùng một mã cơ bản.
Szabolcs

Cảm ơn. Tôi quên mất StringCases. Tôi không rõ OP có nghĩa là gì bởi API của ngôn ngữ.
DavidC

Sử dụng toán tử thành phần mới trong Mathicala 10 , chúng ta thậm chí có thể viết một hàm là Length@*StringCases. Điều này ngắn hơn so với việc Length@StringCases[##]&chúng ta chỉ viết một hàm nhưng không thực sự áp dụng nó cho ab.
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;
}

0

Java (38)

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

(Câu hỏi không yêu cầu chương trình hoặc chức năng hoàn chỉnh.)



0

K / Kona 6

+/y~'x

nơi xlà chuỗi và ychuỗi con. ~là toán tử phủ định, với ', nó được áp dụng cho mọi phần tử trong x; nó sẽ trở lại 0nếu nó không khớp và 1nếu nó khớp. Vì nó được áp dụng phần tử khôn ngoan, kết quả của y~'xlà một vectơ, +/sau đó tính tổng kết quả cho tổng số lần xuất hiện.

Thật không may, phương pháp này yêu cầu ychỉ có một ký tự, nếu không chúng ta sẽ so sánh một chuỗi nhiều ký tự với một chuỗi ký tự đơn, dẫn đến một length error.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.