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 li
variable contiene la cadena para verificar las ocurrencias, y l
es 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 c
va 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
ababa
yaba
, ¿deberíamos sacar1
o2
? El terceroa
es tanto el final del primeroaba
como el comienzo del segundoaba
.s
para emparejar? Si no: tengo una solución de 5 char J:+/a=b
Respuestas:
GolfScript, 3 bytes
Asume que la cadena y la subcadena están en la pila.
Pruébalo en línea.
Cómo funciona
fuente
golfscript <<< '127,32,-""+'
es más rápido que abrir un navegador web.[win key] jqt [return] a. [return]
es aún más rápido;)jqt
suena interesante. ¿Qué es?iPython QTConsole
)JavaScript 32
Nada realmente interesante aquí ...
split
El objetivo principal es crear una matriz a partir de una cadena utilizando el delimitador en el argumento.fuente
split()
no es parte de "la API de tu idioma"?a.split(b).length-1
19. Quizás @svidgen debería aclarar la inicialización en la pregunta.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!Cómo funciona:
E.
esWindowedMatch
: la hoja de referencia J da're' E. 'reread'
como ejemplo. Esto da1 0 1 0 0 0
. Entonces, lo único que queda por hacer es simplemente agregar esto con+/
(básicamentesum
).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:
fuente
ababa
->aba
era devolver 1?@Synthetica Absolutley go for it!
cuando le pregunté, así que supongo que está bien.C # - 73
fuente
aba
aparece dos veces en Abeba:aba ba
ab aba
.ababa
, donde comienza conaba
y si lee las últimas 3 letras también esaba
, solo cuenta una *" << En las reglas ..Python 2.x -
49 2322 bytesEsto supone que la entrada variable está bien. Ambas cadenas pueden ser de cualquier longitud.
Acortado @avall.
Versión de 49 bytes, cuenta cada instancia de la subcadena ('aba' está en 'ababa' dos veces).
fuente
a='aa'
yb es igual. Esta bien?a='aba'; b='ababa'
caso.Powershell 32
Funciona así:
Explicación: Utiliza
-split
para separar el primer argumento por el segundo, devuelve el tamaño de la matriz resultante de la división (menos 1)fuente
Applescript, 106 bytes
Applescript es un lenguaje divertido pero tonto para jugar al golf.
Correr con
osascript
:fuente
C # - 66 bytes
fuente
C
130120Nota: probablemente se bloqueará si se llama con argumentos incorrectos.
Sin golf (un poco):
Versión antigua con
strstr
ystrlen
: 103fuente
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.
Pruebas:
fuente
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.
fuente
Fortran 90: 101
El abuso estándar de tipeo implícito, funciona para cualquier matriz de longitud
a
yb
, aunque uno debería esperar esolen(a) < len(b)
.Esta función debe ser
contain
editada dentro de un programa completo para funcionar.a
yb
se 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 degfortran -o main main.f90
y ejecute como lo haría con cualquier otro programa compilado.Pruebas:
Podría hacer que el anterior devuelva 1 si agrego 4 caracteres (
,k+1
) para eldo
buclefuente
Mathematica
2623Funciona como el algoritmo de Dennis, pero más prolijo:
Tres caracteres rasurados por Szabolics.
fuente
Length@StringCases[a,b]
Es más corto. Este problema no está bien especificado porque si no se nos permite usarStringCount
, no está claro si alguna de las otrasString*
funciones integradas debería permitirse tampoco ... todas están basadas en el mismo código subyacente.StringCases
. No estaba claro para mí qué significaba el OP por la API del lenguaje.Length@*StringCases
. Esto es más corto queLength@StringCases[##]&
si tuviéramos que simplemente escribir una función pero no aplicarla realmente aa
yb
.C ++ 225
fuente
Java (38)
(La pregunta no requería un programa o función completa).
fuente
Cobra - 25
fuente
K / Kona 6
donde
x
está la cadena yy
la subcadena.~
es el operador negativo, con'
, se aplica a cada elemento enx
; regresará0
si no coincide y1
si coincide. Dado que se aplica por elementos, el resultado dey~'x
es un vector,+/
luego suma el resultado dando el número total de ocurrencias.Desafortunadamente, este método requiere que
y
sea 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 alength error
.fuente