Su desafío: escriba una función que tome una cadena s
, un carácter c
y encuentre la longitud de la ejecución más larga de c
in s
. La duración de la carrera será l
.
reglas :
- Si
s
es de longitud 0 oc
está vacío,l
debe ser 0. - Si no hay instancias de
c
ins
,l
debe ser 0. - Lagunas estándares y reglas estándar de E / S se aplican.
- No importa en qué lugar se encuentre
s
la ejecución dec
s,l
debe ser lo mismo. - Cualquier carácter ASCII imprimible puede aparecer en
s
yc
.
Casos de prueba :
s,c --> l
"Hello, World!",'l' --> 2
"Foobar",'o' --> 2
"abcdef",'e' --> 1
"three spaces",' ' --> 3
"xxx xxxx xx",'x' --> 4
"xxxx xx xxx",'x' --> 4
"",'a' --> 0
"anything",'' --> 0
Ganador :
Al igual que con el código de golf, gana la respuesta más corta en cada idioma.
s
y unoc
que no está contenido en un no vacíos
en sus casos de prueba?s
/c
?c
puede estar vacio? En muchos idiomas, un personaje es solo un número entero con una semántica especial, y tampoco puedes tener un número entero vacío.Respuestas:
05AB1E , 5 bytes
Código:
Utiliza la codificación 05AB1E . Pruébalo en línea!
Explicación:
fuente
γ¢M
no está funcionando como pensé que lo haría, pensé que sería un byte 3.Mathematica, 35 bytes
Función pura que toma una lista de caracteres y otro carácter como entrada y devuelve un entero no negativo. Mejoré mi primer esfuerzo usando la observación de Adnan (¡sube el voto!) De que uno debería probar para igualar el carácter especial antes de dividir la matriz.
Thread[#==#2]
comprueba si cada carácter de entrada en el primer argumento es igual al carácter dado como el segundo argumento.Boole
convierte la resultanteTrue
s yFalse
S a1
s y0
s.Split
divide la lista en series de elementos consecutivos;Tr/@
suma cada sublista, yMax
encuentra el ganador. (Debido a cómoMax
funciona, si el primer argumento es la lista vacía, entonces esta función regresa-∞
. Entonces, ya sabes, no hagas eso).primer envío (51 bytes)
Split@#
divide la entrada en series de caracteres consecutivos, como{{"t"}, {"h"}, {"r"}, {"e", "e"}, {" ", " ", " "}, {"s"}, {"p"}, {"a"}, {"c"}, {"e"}, {"s"}}
en el cuarto caso de prueba./.a:{c_String..}:>
reemplaza cada subexpresióna
que es una lista de un carácter repetidoc
porLength@a
multiplicado porBoole[c==#2]
, que es1
si esc
igual al carácter de entrada y de lo0
contrario. LuegoMax
extrae la respuesta.fuente
Japt ,
20 1815 bytesPruébalo en línea!
Guardado 5 bytes gracias a obarakon y ETHproductions
fuente
fV+Vî+)
... Le dejaré resolver el resto :-)"If s is of length 0 or c is empty, l should be 0"
, aunque podría estar tomando eso demasiado literalmentes
que no contiene ninguna instancia dec
.Python , 38 bytes
Pruébalo en línea!
Dennis ahorró 3 bytes actualizando
c
a una cadena de caracteres duplicados en lugar de actualizar recursivamente un número para multiplicarc
por.fuente
f=lambda s,c:c in s and-~f(s,c+c[0])
guarda 6 bytes (3 si False no está permitido).05AB1E ,
116 bytes-5 bytes gracias a carusocomputing
Pruébalo en línea!
fuente
γvy²¢M
para 6 bytes, la misma idea.Haskell,
4339 bytesPruébalo en línea!
Ejecutar a través de la cadena y reemplazar el carácter actual con un contador que aumenta cada vez que es igual
c
o restablecer0
si no. Toma el máximo de la lista.Gracias a @xnor por 4 bytes.
fuente
sum[n+1|c==k]
.*fromEnum(c==k)
ambos, pointfree y lambda, pero siempre fue de 2 o 3 bytes más.C #
116115 bytesMi primer código golf
Editado porque el envío inicial era un fragmento y faltaba el espacio de nombres requerido para la expresión regular
Edite la reescritura completa n. ° 2 para admitir caracteres con significados especiales de expresiones regulares
usando System.Linq; s => c => System.Text.RegularExpressions.Regex.Replace (s, "[^" + c + "]", ++ c + ""). Split (c) .Max (x => x longitud);fuente
c
ys
está predefinido. Llamamos a esto un "fragmento de código" y no está permitido. Probablemente podría reestructurar su código como una función anónima o establecer esas variables para ingresar. Ambos de los cuales están permitidos.(s,c)=>
. Debe usarSystem.Text.RegularExpressions.Regex
o agregar una declaración de uso justo antes de su función.JavaScript (ES6),
545351 bytes-2 bytes gracias a @Neil
-1 byte gracias a @apsillers
Toma entrada en la sintaxis de curry:
f("foobar")("o")
.Fragmento de prueba
Otra opción usando
eval
yfor
(54 bytes)Respuesta anterior usando Regex (85 bytes)
fuente
x==c?i++:i=0
puede ser soloi=x==c&&i+1
porque unfalse
resultado en lax==c
comparación se tratará como0
para comparaciones numéricas e incrementos (y nunca será el valor de retorno, ya que cualquier número, incluido0
,j
siempre tendrá prioridad sobre el cerofalse
eni
)false
(ya que el desafío siempre requiere para que devuelva un número)s=>c=>[...s].map(x=>j=(x!=c?i=0:++i)>j?i:j,i=j=0)&&j
Parece ahorrar un par de bytes.f=s=>c=>[...s].map(x=>j=(i=x==c&&i+1)>j?i:j,i=j=0)&&j
, que es un byte más corto.JavaScript (Firefox 30-57),
7572 bytesFragmento compatible con ES6:
split
devuelve un montón de cadenas vacías y caracteres individuales, así como las ejecuciones, pero esto no afecta el resultado.fuente
Micro , 112 bytes
fuente
C (gcc) , 63 bytes
Pruébalo en línea!
fuente
Perl 6 ,
45 4342 bytesPruébalo
Pruébalo
Pruébalo
Expandido:
fuente
JavaScript, ES6, 52
Solución recursiva que trata la entrada de cadena como una matriz (nota: la entrada inicial sigue siendo una cadena) y consume caracteres de izquierda a derecha
C
:Rastrea la carrera actual
t
y la mejor globalT
.Explicación:
Ajuste
t
afalse
los no partidos funciona porque cada vez quet
se incrementa,false
se trata como0
(es decir,false + 1
es1
), yfalse
nunca se comparará rallador que cualquier valor en el mundial-maxT
.fuente
[C,...s]
sintaxis. Debería ayudarme aslice()
eliminar bytes de mis propias publicaciones.Jalea , 5 bytes
Este es un enlace / función diádica que toma una cadena y un carácter. Tenga en cuenta que no puede funcionar como un programa completo, ya que la entrada de los argumentos de la línea de comandos utiliza la sintaxis de Python, y Python, a diferencia de Jelly, no distingue las cadenas de un solo tono de los caracteres.
Pruébalo en línea!
Cómo funciona
fuente
Retina , 25 bytes
Pruébalo en línea!
El primer carácter es el carácter a comprobar.
fuente
APL (Dyalog) ,
1811 bytesRequiere intercambio
⊂
con la⊆
versión 16.0 o tener⎕ML←3
(predeterminado en muchos sistemas).Pruébalo en línea!
⎕=⎕
Booleano para igualdad entre dos entradas⊂⍨
autopartición (comenzar particiones donde un elemento distinto de cero es mayor que su predecesor)≢¨
cuenta cada uno0,
anteponer un cero (para los casos de entrada vacía)⌈/
máximo de esosVieja solución
Primero solicita s , luego c
Pruébalo en línea!
⎕
solicitud de s⊢
para eso(
…)⎕S 1
PCRE S earch para la duración de las ocurrencias de'+'
un símbolo más (que significa uno o más),¨
agregado a cada uno de los elementos de⎕
la c solicitada0,
anteponer un cero (para los casos de entrada vacía)⌈/
máximo de esosc debe darse como un vector de 1 elemento de una cadena cerrada si necesita escapar.
fuente
PHP,
7067 bytestres versiones:
toma datos de los argumentos de la línea de comandos ejecutarlos
-r
o probarlos en línea .fuente
PHP , 70 bytes
Pruébalo en línea!
PHP , 75 bytes
Pruébalo en línea!
PHP , 83 bytes
Pruébalo en línea!
+8 bytes para evitar
@
fuente
#
por supuesto).~
puede fallar porchr(207)
.++$n
! Querías decir ascii imprimible. ;)echo$r?max($r):0;
ahorra un byteJavaScript (ES6),
474038 bytes(Guardado 7 bytes gracias a @Neil, y 2 bytes gracias a @HermanLauenstein.)
Explicación:
Busca recursivamente una ejecución más larga hasta que no se encuentre ninguna.
Retazo:
Mostrar fragmento de código
fuente
f=(s,c)=>c&&s.includes(c)&&1+f(s,c+c[0])
?s=>g=c=>c&&s.includes(c)&&1+g(c+c[0])
.||0
, que aún es más corto que mi solución.f=
no es parte de la versión curry, porque solo la función interna es recursiva.Jalea,
109 bytesExplicación:
Pruébalo en línea!
fuente
Œgf€L€Ṁ
.Python 3 , 71 bytes
Pruébalo en línea!
fuente
Haskell , 66 bytes
Pruébalo en línea!
Una versión un poco más fácil de leer, sin puntos:
Agrupa la cadena por letra, luego filtra por aquellos grupos que contienen el carácter correcto, luego encuentra las longitudes, agrega 0 a la lista de longitudes en caso de que no aparezca y finalmente encuentra el valor máximo.
fuente
Mathematica, 109 bytes
entrada
fuente
Python 2 , 69 bytes
Pruébalo en línea!
fuente
CJam ,
20191816 bytesPruébalo en línea!
Explicación
fuente
Excel, 56 bytes
s
debe ser entrada aA1
.c
debe ser entrada aA2
.La fórmula debe ser una fórmula de matriz ( Ctrl+ Shift+Enter ) que agrega llaves
{ }
.Técnicamente, esto solo puede manejar donde la ejecución más larga es inferior a 1,048,576 (que es 2 ^ 20) porque así es como las filas que el Excel actual le permitirá tener en una hoja de trabajo. Como carga los más de un millón de valores en la memoria cada vez que recalcula, esta no es una fórmula rápida .
fuente
MATL , 15 bytes
Pruébalo en línea!
El algoritmo básico es muy simple (¡sin uso de división!), Pero tuve que tirar
0i0v
y0h
permitir los casos extremos. Aún así, pensé que el enfoque era bueno, y tal vez todavía pueda encontrar otra técnica para manejar los casos límite: el algoritmo encuentra bien la ejecución más larga en el medio de una cadena, pero no para caracteres individuales o cadenas vacías; Todavía estoy probando si puedo 'rellenar' las variables en mejores lugares para obtener mejores resultados.No funciona en vacío
c
. Por otra parte, supongo que cada cadena contiene una serie infinita de cadenas vacías entre cada carácter :)fuente
R ,
6658 bytes-8 bytes gracias a BLT y MickyT
devuelve una función anónima TIO tiene una diferencia de 1 byte porque
el
no funciona allí por razones inexplicables.Pruébalo en línea!
fuente
r=rle(el(strsplit(s,'')))
function(s,c)max((r=rle(el(strsplit(s,''))))$l*(r$v==c),0)
el
no funciona en TIO (no tengo idea de por qué) y simplemente lo copié y pegué desde el código de trabajo allí, así que tendré que recordar volver a poner eso en @MickyT ¡muy inteligente! ¡Gracias!Java 8,
6765 bytes-2 bytes gracias a @ OlivierGrégoire
Toma entrada
s
como achar[]
, yc
como achar
Explicación:
Pruébalo aquí
fuente
m=m>(t=x==c?t+1:0)?m:t;
es más corto que{t=x==c?t+1:0;m=m>t?m:t;}
.s->c->java.util.Arrays.stream(s.split("[^"+c+"]")).mapToInt(z->z.length()).max().orElse(0)
:;)Rubí, 40 bytes.
->s,c{s.split(%r{[^#{c}]}).max&.size||0}
Pruébalo en línea!
fuente