Überprüfen Sie, ob eine Zeichenfolge in einer anderen Zeichenfolge vorkommt

8

Herausforderung

Ich bin sicher, Sie haben den Titel gelesen und sind hereingekommen, um Ihren Repräsentanten zu bewirtschaften. Sie müssen sich im kürzesten Code gegenseitig herausfordern, um das Auftreten einer Zeichenfolge in einer anderen zu zählen. Zum Beispiel bei folgender Eingabe:

aaaabbbbsssffhd

als Zeichenfolge und die Zeichenfolge

s

sollte ausgeben

3

Regeln

Kurz bevor Sie lächeln und sagen: "Hey, ich werde ---- verwenden", lesen Sie Folgendes:

  • Keine Verwendung externer Bibliotheken oder der API Ihrer Sprache. Sie müssen es manuell implementieren. Dies bedeutet, dass Sie die integrierte Funktion oder Methode Ihrer Sprache nicht zum Zählen von Vorkommen verwenden können
  • Keine Datei-E / A.
  • Keine Verbindung mit einem Server, einer Website usw.
  • In einem Fall von "abeba", wo es mit "aba" beginnt und wenn Sie die letzten 3 Buchstaben lesen, ist es auch "aba", zählen Sie nur einen *

Danke @ProgramFOX dafür (die letzte Regel)!
* Hinweis : Wenn Sie Vorkommen zählen, können Sie diejenigen entfernen, die Sie gezählt haben, um zu vermeiden, dass diese Regel missachtet wird

Ich denke, die letzten 2 Regeln sind nur für Regelbieger!

Gewinnkriterium

Wie bereits erwähnt, ist der Gewinner der Code mit den weniger verwendeten Bytes. Der Gewinner wird fünf Tage später (15. Juni 2014) bekannt gegeben.

Meine kleine Antwort

Hier ist meine C ++ - Antwort, in der davon ausgegangen wird, dass die liVariable die Zeichenfolge zum Überprüfen von Vorkommen enthält und ldie Zeichenfolge ist, nach der gesucht werden muss f:

Ungolfed

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

Um zu verwenden std::string, müssen Sie natürlich die String-Header-Datei einschließen!

Golf gespielt

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

Ergebnis

Die Variable cgibt an, wie oft die Zeichenfolge gefunden wurde


                                                                          Genießen!

Gewinner

Nach langem Warten gewinnt die @ Tennis- Antwort mit nur 3 Bytes, geschrieben in GolfScript

Gemeinschaft
quelle
5
Sollten wir das gleiche Zeichen zweimal zählen? Zum Beispiel, wenn die Eingabe ababaund ist aba, sollten wir ausgeben 1oder 2? Der dritte aist sowohl das Ende des ersten abaals auch der Anfang des zweiten aba.
ProgramFOX
1
Bedeutet die API der Sprache Bibliotheken, die importiert werden können (die mit der Sprache geliefert werden), oder Methoden für integrierte Datentypen oder Befehle selbst?
siehe
2
Muss es länger mit Strings als smit Matching umgehen ? Wenn nicht: Ich habe eine 5- +/a=b
Zeichen-
2
Kommt die Eingabe über Variablen oder STDIN?
siehe
1
Funktion oder Programm?
Kyle Kanos

Antworten:

7

GolfScript, 3 Bytes

/,(

Angenommen, Zeichenfolge und Teilzeichenfolge befinden sich auf dem Stapel.

Probieren Sie es online aus.

Wie es funktioniert

/  # Split the string around occurrences of the substring.
,  # Get the length of the split array.
(  # Subtract 1.
Dennis
quelle
Beeindruckend. Aber ich habe eine kleine Frage: Haben Sie GolfScript nur für Code-Golf und zum Lösen von Code-Problemen gelernt?
1
Ich habe es getan, aber ich benutze es jetzt gelegentlich für andere Aufgaben. Benötigen Sie eine ASCII-Tabelle? golfscript <<< '127,32,-""+'ist schneller als das Öffnen eines Webbrowsers.
Dennis
@ Tennis [win key] jqt [return] a. [return]ist noch schneller;)
10ıʇǝɥʇuʎs
@ Synthetica: Nun, es war nur ein Beispiel. Klingt jqtaber interessant. Was ist es?
Dennis
@ Tennis Es ist die Standard-J-Konsole, die mit J geliefert wird (es ist eine dieser grafischen Konsolen wie die iPython QTConsole)
ɐɔıʇǝɥʇuʎs
7

JavaScript 32

Nichts wirklich interessantes hier ...

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

split Hauptzweck ist das Erstellen eines Arrays aus einer Zeichenfolge mit dem Trennzeichen in argument.

Michael M.
quelle
split()ist nicht Teil der "API Ihrer Sprache"?
Svidgen
2
Es dient jedoch nicht dazu, das Auftreten einer Zeichenfolge zu zählen. Wo liegt also die Grenze für autorisierte APIs?
Michael M.
1
@Michael Ich entschuldige mich dafür, dass ich vage bin. Dies ist akzeptabel. Ich habe die Frage so bearbeitet, dass sie in "Sie können die integrierte Funktion oder Methode Ihrer Sprache zum Zählen von Vorkommen nicht verwenden" umformuliert wird Frage, Sie können es verwenden ...
@ 404NotFound Gut zu wissen ... das ist dann auch meine Antwort? :) ... (+1)
svidgen
1
Dies ist die einzige Antwort, die nicht davon ausgeht, dass die Vars bereits initialisiert wurden. Sie haben also meine Zustimmung erhalten. Wenn Sie angenommen hätten, dass die Variablen wie alle anderen Antworten initialisiert wurden, hätten Sie a.split(b).length-119 erhalten. Vielleicht sollte @svidgen die Initialisierung in der Frage klären.
Randunel
2

J (7)

No use of external librariesPrüfen! , or your language's API.Prüfen...? Ich weiß nicht, was eine Sprach-API ist. You have to implement it manuallyPrüfen! No file I/OPrüfen! No connecting with a server, website, et ceteraPrüfen!

+/a E.b

Wie es funktioniert:

E.ist WindowedMatch: das J Refsheet gibt 're' E. 'reread'als Beispiel. Das gibt 1 0 1 0 0 0. Dann müssen Sie dies nur noch +/(im Grunde genommen sum) hinzufügen .

Ich denke nicht, dass dies als Verwendung gilt your language's built-in function or method for counting occurences, aber das ist umstritten.

EDIT: Nur um klar zu sein:

   +/'aba'E.'ababa'
2
ɐɔıʇǝɥʇuʎs
quelle
Ich dachte ababa-> abasollte 1 zurückgeben?
Kyle Kanos
@ KyleKanos Es war, aber der Autor sagte ausdrücklich, @Synthetica Absolutley go for it!als ich ihn fragte, also denke ich, dass es in Ordnung ist.
10ıʇǝɥʇuʎs
1

C # - 73

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

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

// output = "1"
mnsr
quelle
Es ist falsch! abaerscheint zweimal in abeba : aba ba ab aba.
2
@ Runemoro "In einem Fall ababa, in dem es beginnt abaund wenn Sie die letzten 3 Buchstaben lesen aba, zählen Sie auch nur einen *" << In den Regeln ..
mnsr
Oh, habe nicht gelesen ...
1

Python 2.x - 49 23 22 Bytes

Dies setzt voraus, dass die variable Eingabe in Ordnung ist. Beide Saiten können beliebig lang sein.

@Avall verkürzt.

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

49-Byte-Version, zählt jede Instanz des Teilstrings ('aba' steht zweimal in 'abeba').

a='s'
b='aaaabbbbsssffhd'
print sum(a==b[i:i+len(a)]for i in range(len(b)))
seequ
quelle
Arbeitete mit jedem Test, den ich es in ...
Und die API der Sprache bedeutet, dass Sie Ihre eigene Funktion oder Methode verwenden müssen, nicht die integrierte Methode der Sprache, um dies zu tun (falls vorhanden, bin ich ein C ++ - Programmierer; ()
Nun, die zweite ist absolut die sprachliche Methode dafür. Außerdem gibt der erste 3 aus, wenn a='aa'und b gleich sind. Ist das in Ordnung?
siehe
Ja, absolut
Außerdem werden 2 für den a='aba'; b='ababa'Fall ausgegeben.
siehe
0

Powershell 32

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

Funktioniert so:

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

Erläuterung: Wird verwendet -split, um das erste Argument durch das zweite zu trennen. Gibt die Größe des Arrays zurück, das sich aus der Aufteilung ergibt (minus 1).

DarkAjax
quelle
0

Applescript, 106 Bytes

Applescript ist eine lustige, aber alberne Sprache zum Golfen.

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

Laufen Sie mit osascript:

$ osascript instr.scpt s aaaabbbbsssffhd
3
$ 
Digitales Trauma
quelle
0

C # - 66 Bytes

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

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

//Output: 1
Tsavinho
quelle
lol. Das ist im Grunde meine Antwort. Wenn Sie auf dieser Site nichts anderes als eine vorhandene Antwort finden können, können Sie der vorhandenen Antwort normalerweise Hinweise geben, wie Sie ein paar zusätzliche Bytes sparen können.
Mnnsr
@malik Hören Sie, ich konnte zu diesem Zeitpunkt noch keinen Kommentar abgeben. Ansonsten hätte ich Ihre Antwort kommentiert. Ich bin bereit, meine Antwort zu notieren, wenn Sie wollen.
Tsavinho
1
Meinetwegen. Es macht mir so oder so nichts aus. Ich habe dich nur wissen lassen.
Mnnsr
0

C 130 120

Hinweis: Wird wahrscheinlich abstürzen, wenn mit falschen Argumenten aufgerufen wird.

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

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

Alte Version mit strstrund 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
quelle
0

Delphi XE3 (113)

Nimmt 2 Zeichenfolgen, entfernt Teilzeichenfolgen von Zeichenfolgen und subtrahiert neue Länge von alter Länge, gefolgt von einer Division der Teilzeichenfolgenlänge.

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

Testen:

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

Teun Pronk
quelle
0

Lua (48)

Also dachte ich, ich könnte einfach eine andere Antwort einreichen, diesmal in Lua. Es ist sehr wahrscheinlich, dass dies sehr verbessert werden könnte, ich bin sehr neu in diesem Bereich.

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

Fortran 90: 101

Standardmissbrauch der impliziten Typisierung, funktioniert für Arrays beliebiger Länge aund bobwohl man das erwarten sollte 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

Diese Funktion muss containin einem vollständigen Programm ausgeführt werden, damit sie funktioniert. aund bwerden von stdin empfangen und können entweder in derselben Zeile (entweder durch Komma oder durch Leerzeichen getrennt) oder in verschiedenen Zeilen eingegeben werden. Kompilieren Sie über gfortran -o main main.f90und führen Sie es wie jedes andere kompilierte Programm aus.

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

Tests:

>ababa aba
2

Ich könnte die obige Rückgabe 1 machen, wenn ich 4 Zeichen ( ,k+1) für die doSchleife hinzufüge

> aaaabbbbbsssffhd s
3
Kyle Kanos
quelle
0

Mathematica 26 23

Funktioniert wie Dennis 'Algorithmus, ist aber wortreicher:

Length@StringCases[a,b]

Drei Zeichen von Szabolics rasiert.

DavidC
quelle
Length@StringCases[a,b]ist kürzer. Dieses Problem ist nicht genau spezifiziert, da StringCountes nicht klar ist, ob eine der anderen integrierten String*Funktionen zulässig sein sollte, wenn wir sie nicht verwenden dürfen. Sie basieren alle auf demselben zugrunde liegenden Code.
Szabolcs
Vielen Dank. Ich habe es vergessen StringCases. Mir war nicht klar, was das OP mit der API der Sprache meinte.
DavidC
Mit dem neuen Kompositionsoperator in Mathematica 10 können wir sogar einfach eine Funktion als schreiben Length@*StringCases. Dies ist kürzer, als Length@StringCases[##]&wenn wir nur eine Funktion schreiben würden, sie aber nicht auf aund anwenden würden 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
quelle
0

Java (38)

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

(Die Frage erforderte kein vollständiges Programm oder eine vollständige Funktion.)

Ypnypn
quelle
0

Cobra - 25

print a.split(b).length-1
Οurous
quelle
0

K / Kona 6

+/y~'x

Wo xist der String und yder Teilstring? ~ist der Negationsoperator, mit 'wird er auf jedes Element in angewendet x; Es wird zurückgegeben, 0wenn es nicht übereinstimmt und 1wenn es übereinstimmt. Da es elementweise angewendet wird, ist das Ergebnis von y~'xein Vektor, der +/dann das Ergebnis summiert und die Gesamtzahl der Vorkommen ergibt.

Leider erfordert diese Methode, dass yes sich nur um ein Zeichen handelt. Andernfalls vergleichen wir eine Zeichenfolge mit mehreren Zeichen mit einer einzelnen Zeichenfolge, was zu a führt length error.

Kyle Kanos
quelle