Verifique las ocurrencias de la cadena en otra cadena

8

Desafío

Estoy seguro de que leíste el título y entraste a trabajar con tu representante, pensando en cosas de niños, ¡pero piénsalo de nuevo! Deben desafiarse entre sí en el código más corto para contar las ocurrencias de una cadena en otra. Por ejemplo, dada la siguiente entrada:

aaaabbbbsssffhd

como una cuerda, y la cuerda

s

debería salir

3

Reglas

Justo antes de sonreír y decir: "Oye, usaré ----", lee esto:

  • No se utilizan bibliotecas externas ni la API de su idioma. Tienes que implementarlo manualmente. Lo que significa que no puede usar la función o método incorporado de su idioma para contar las ocurrencias
  • Sin E / S de archivo
  • No conectarse con un servidor, sitio web, etc.
  • En el caso de `ababa`, donde comienza con` aba` y si lee las últimas 3 letras también es `aba`, solo cuenta una *

¡Gracias @ProgramFOX por eso (la última regla)!
* Sugerencia : cuando cuente las ocurrencias, puede eliminar las que contó para evitar desobedecer esta regla

¡Creo que las últimas 2 reglas son solo para dobladores de reglas!

Criterio ganador

Como se indicó anteriormente, el ganador es el código con menos bytes utilizados. El ganador será anunciado cinco días después (15 de junio de 2014)

Mi pequeña respuesta

Aquí está mi respuesta de C ++, donde se supone que la livariable contiene la cadena para verificar las ocurrencias, y les la cadena a buscar en f:

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

¡Por supuesto, para usar std::string, debe incluir el archivo de encabezado de cadena!

Golfed

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

Resultado

La variable cva a ser el valor de cuántas veces se encontró la cadena


                                                                          ¡Disfrutar!

Ganador

Después de una larga espera, la respuesta de @Dennis gana con solo 3 bytes, escrita en GolfScript

Comunidad
fuente
55
¿Deberíamos contar el mismo personaje dos veces? Por ejemplo, si la entrada es ababay aba, ¿deberíamos sacar 1o 2? El tercero aes tanto el final del primero abacomo el comienzo del segundo aba.
ProgramFOX
1
¿La API del lenguaje significa bibliotecas que pueden importarse (que vienen con el idioma) o métodos de tipos de datos o comandos incorporados?
seequ
2
¿Tiene que lidiar con cadenas más largas que spara emparejar? Si no: tengo una solución de 5 char J:+/a=b
10ıʇǝɥʇuʎs
2
¿La entrada viene a través de variables o STDIN?
seequ
1
Función o programa?
Kyle Kanos

Respuestas:

7

GolfScript, 3 bytes

/,(

Asume que la cadena y la subcadena están en la pila.

Pruébalo en línea.

Cómo funciona

/  # Split the string around occurrences of the substring.
,  # Get the length of the split array.
(  # Subtract 1.
Dennis
fuente
Impresionante ... Pero tengo una pequeña pregunta, ¿aprendiste GolfScript solo para golf de código y para resolver problemas de código?
1
Lo hice, pero lo uso ocasionalmente para otras tareas por ahora. ¿Necesita una tabla ASCII? golfscript <<< '127,32,-""+'es más rápido que abrir un navegador web.
Dennis
@Dennis [win key] jqt [return] a. [return]es aún más rápido;)
10ıʇǝɥʇuʎs
@ Synthetica: Bueno, fue solo un ejemplo. Pero jqtsuena interesante. ¿Qué es?
Dennis
@Dennis Es la consola J estándar que viene con J (es una de esas consolas gráficas, como la iPython QTConsole)
ɐɔıʇǝɥʇuʎs
7

JavaScript 32

Nada realmente interesante aquí ...

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

split El objetivo principal es crear una matriz a partir de una cadena utilizando el delimitador en el argumento.

Michael M.
fuente
split()no es parte de "la API de tu idioma"?
svidgen
2
es pero su propósito no es contar las ocurrencias de una cadena ... entonces, ¿dónde está el límite de API autorizadas?
Michael M.
1
@Michael Pido disculpas por ser vago, esto es aceptable. Edité la pregunta para reformularla a "no puedes usar la función o el método incorporado de tu idioma para contar las ocurrencias", por lo que si no está destinado a los fines del pregunta, puedes usarlo ...
@ 404NotFound Es bueno saberlo ... ¿esta también es mi respuesta? :) ... (+1)
svidgen
1
Esta es la única respuesta que no asume que los vars ya se han inicializado, así que tienes mi voto a favor. Si asumió que los vars se inicializaron como todas las demás respuestas, habría obtenido a.split(b).length-119. Quizás @svidgen debería aclarar la inicialización en la pregunta.
randunel
2

J (7)

No use of external libraries¡Cheque! , or your language's API.Cheque...? No sé qué es un lenguaje API. You have to implement it manually¡Cheque! No file I/O¡Cheque! No connecting with a server, website, et cetera¡Cheque!

+/a E.b

Cómo funciona:

E.es WindowedMatch: la hoja de referencia J da 're' E. 'reread'como ejemplo. Esto da 1 0 1 0 0 0. Entonces, lo único que queda por hacer es simplemente agregar esto con +/(básicamente sum).

No creo que esto cuente con el uso your language's built-in function or method for counting occurences, pero eso es discutible.

EDITAR: Solo para ser claro:

   +/'aba'E.'ababa'
2
ɐɔıʇǝɥʇuʎs
fuente
Pensé ababa-> abaera devolver 1?
Kyle Kanos
@KyleKanos Lo fue, pero el autor dijo específicamente @Synthetica Absolutley go for it!cuando le pregunté, así que supongo que está bien.
10ıʇǝɥʇuʎs
1

C # - 73

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

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

// output = "1"
mnsr
fuente
¡Está incorrecto! abaaparece dos veces en Abeba: aba ba ab aba.
2
@Runemoro "En un caso de ababa, donde comienza con abay si lee las últimas 3 letras también es aba, solo cuenta una *" << En las reglas ..
mnsr
Oh, no leí ...
1

Python 2.x - 49 23 22 bytes

Esto supone que la entrada variable está bien. Ambas cadenas pueden ser de cualquier longitud.

Acortado @avall.

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

Versión de 49 bytes, cuenta cada instancia de la subcadena ('aba' está en 'ababa' dos veces).

a='s'
b='aaaabbbbsssffhd'
print sum(a==b[i:i+len(a)]for i in range(len(b)))
seequ
fuente
Trabajé con cada prueba en la que lo puse ...
Y la API del lenguaje significa que debe usar su propia función o método, no usar la forma integrada del lenguaje para hacerlo (si tiene uno, soy un programador de C ++; ()
Bueno, el segundo absolutamente es el método propio del lenguaje para ello. Además, el primero genera 3 si a='aa'yb es igual. Esta bien?
seequ
Sí, absolutamente
Además, genera 2 para el a='aba'; b='ababa'caso.
seequ
0

Powershell 32

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

Funciona así:

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

Explicación: Utiliza -splitpara separar el primer argumento por el segundo, devuelve el tamaño de la matriz resultante de la división (menos 1)

DarkAjax
fuente
0

Applescript, 106 bytes

Applescript es un lenguaje divertido pero tonto para jugar al 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

Correr con osascript:

$ osascript instr.scpt s aaaabbbbsssffhd
3
$ 
Trauma digital
fuente
0

C # - 66 bytes

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

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

//Output: 1
tsavinho
fuente
jajaja Esa es básicamente mi respuesta. Por lo general, en este sitio, si no puede encontrar algo diferente a una respuesta existente, puede dar pistas sobre la respuesta existente sobre cómo guardar unos pocos bytes adicionales.
mnsr
@malik Escucha, no pude comentar en ese momento. De lo contrario, habría comentado tu respuesta. Estoy dispuesto a tomar mi respuesta, si quieres.
tsavinho
1
Lo suficientemente justo. No me importa de ninguna manera. Solo te lo estaba haciendo saber.
mnsr
0

C 130 120

Nota: probablemente se bloqueará si se llama con argumentos incorrectos.

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

Sin golf (un poco):

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ón antigua con strstry 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
fuente
0

Delphi XE3 (113)

Toma 2 cadenas, elimina la subcadena de la cadena y resta la nueva longitud de la longitud anterior seguida de una división de la longitud de la subcadena.

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

Pruebas:

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

Teun Pronk
fuente
0

Lua (48)

Así que pensé que podría enviar otra respuesta, esta vez en lua. Es muy posible que esto pueda mejorarse mucho, soy muy nuevo en esto.

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

Fortran 90: 101

El abuso estándar de tipeo implícito, funciona para cualquier matriz de longitud ay b, aunque uno debería esperar eso 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

Esta función debe ser containeditada dentro de un programa completo para funcionar. ay bse reciben de stdin y se pueden ingresar en la misma línea (separados por comas o espacios) o en diferentes líneas. Compile a través de gfortran -o main main.f90y ejecute como lo haría con cualquier otro programa compilado.

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

Pruebas:

>ababa aba
2

Podría hacer que el anterior devuelva 1 si agrego 4 caracteres ( ,k+1) para el dobucle

> aaaabbbbbsssffhd s
3
Kyle Kanos
fuente
0

Mathematica 26 23

Funciona como el algoritmo de Dennis, pero más prolijo:

Length@StringCases[a,b]

Tres caracteres rasurados por Szabolics.

DavidC
fuente
Length@StringCases[a,b]Es más corto. Este problema no está bien especificado porque si no se nos permite usar StringCount, no está claro si alguna de las otras String*funciones integradas debería permitirse tampoco ... todas están basadas en el mismo código subyacente.
Szabolcs
Gracias. Me había olvidado de StringCases. No estaba claro para mí qué significaba el OP por la API del lenguaje.
DavidC
Usando el nuevo operador de composición en Mathematica 10 , incluso podríamos simplemente escribir una función como Length@*StringCases. Esto es más corto que Length@StringCases[##]&si tuviéramos que simplemente escribir una función pero no aplicarla realmente a ay 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
fuente
0

Java (38)

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

(La pregunta no requería un programa o función completa).

Ypnypn
fuente
0

Cobra - 25

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

K / Kona 6

+/y~'x

donde xestá la cadena y yla subcadena. ~es el operador negativo, con ', se aplica a cada elemento en x; regresará 0si no coincide y 1si coincide. Dado que se aplica por elementos, el resultado de y~'xes un vector, +/luego suma el resultado dando el número total de ocurrencias.

Desafortunadamente, este método requiere que ysea ​​solo un carácter; de lo contrario, compararemos una cadena de caracteres múltiples con una cadena de caracteres única, lo que dará como resultado a length error.

Kyle Kanos
fuente