Introducción
Quiero encontrar la subcadena con más 1
's en una secuencia de 0
' sy 1
's.
Entrada
Su programa tiene dos entradas , la secuencia y la longitud de la subcadena.
La secuencia es cualquier número de0
'sy 1
' s:
01001010101101111011101001010100010101101010101010101101101010010110110110
La longitud de la subcadena es cualquier número entero positivo distinto de cero:
5
Salida
Su programa debería generar el índice de inicio de la primera subcadena de la longitud dada que contiene la mayoría de 1
's. Con la entrada anterior, la salida es:
10
El primer carácter de la cadena comienza en un índice de 0
.
Puntuación
¡El código más corto gana!
Reglas
- Su programa siempre debe generar el índice correcto para cualquier entrada válida.
- Puede elegir su método de entrada / salida de cualquier respuesta con puntaje positivo en las opciones predeterminadas . Por favor, especifique el método que elija en su respuesta.
1
, se genera la primera subcadena que encontró. Identifica las subcadenas con el índice del primer carácter de esa subcadena. ¿Eso ayuda?Respuestas:
Dyalog APL, 11
Pruébalo aquíUso:
Explicación
Esta es una función diádica (que significa binario) que toma la longitud de la subcadena desde la izquierda y la secuencia desde la derecha. Su estructura es la siguiente:
Explicación por explosión:
Como ejemplo, tomemos
4
y0 1 1 0 1 1 1 0
como entradas. Primero les aplicamos la función+/
y obtenemos2 3 3 3 3
. Luego,+
y⌈/
aplicado a esta matriz se da3
y se2 3 3 3 3 ⍳ 3
evalúa2
, ya que3
primero ocurre como el segundo elemento. Restamos1
y obtenemos1
como resultado final.fuente
m
unidades, dondem
está máximo.Rubí, 42
Toma entrada llamándolo, por ejemplo
f['01001010101101111011101001010100010101101010101010101101101010010110110110',5]
Esto compara las subcadenas usando su valor ASCII total y devuelve el índice del máximo. No estoy seguro de si
max_by
la especificación de Ruby requiere que sea estable, pero parece estar en la implementación de C.fuente
Pitón 2, 56
Acepta una serie de enteros, luego la longitud.
fuente
[int(s) for s in "010010...0"]
f(ss, 999)
devolverá 0 (en lugar de Ninguno). ¿Puedes arreglar eso? Esto posiblemente viola la regla 1.ss
?None
nunca es una salida deseada en ningún caso ya que la respuesta es un número entero.Lote - 222
Batch es obviamente el lenguaje perfecto para este tipo de operación.
Sin golf / disecado:
Configuración inicial. La variable
s
es la cadena de entrada, yl
será la longitud de la cadena de entrada, menos la longitud de la subcadena (inicializada en negativo%2
donde%2
es la longitud de la subcadena dada).Obtenga la longitud de la entrada como
l
, usando una solución de longitud de cadena de Batch pura: esto altera la variable ques
contiene la cadena de entrada, por lo que luego la configuramos nuevamente.El valor de
x
se utiliza para verificar qué subcadena tenía el mayor número de 1. Inicie un ciclo desde 0 hasta la longitud de la cadena, menos la longitud de la subcadena (variablel
). Obtener la subcadena que comienza desde el punto actual en el bucle (%%a
),c
se establece como la cadena de entrada que comienza en%%a
y toma%2
(la longitud de la subcadena dada) caracteres. Ninguna0
s se elimina dec
, luegoc
se compara el valor dex
-111
es decir, es un número mayor que,11
por lo que podemos usar la 'cadena' para hacer una comparación mayor que.y
luego se establece en la ubicación actual en la cadena, que finalmente se genera.Ejemplo de uso de OP:
fuente
C # (expresión regular), 196
La expresión regular real no es tan larga, pero todas las pelusas necesarias para que un programa de C # compile el doble del tamaño del código.
La expresión regular real, estableciendo la longitud en 5:
(?=((?<o>1)|0){5})
: Mire hacia adelante para leer 5 caracteres sin consumir y coloque todos1
en "stack"o
.(?=[10]{5})(?!((?<-o>1)|0){5})
: En una posición que tiene 5 caracteres adelante, no hay suficiente elemento en la "pila"o
para aparecer, es decir, la subcadena tiene estrictamente más1
de lo que tenemos en la posición actual.(?!.+(?=[10]{5})(?!((?<-o>1)|0){5}))
: No se puede encontrar una posición como la descrita anteriormente para el resto de la cadena, es decir, todas las posiciones tienen un número menor o igual de1
's.Tomar el primer resultado da la respuesta, ya que todas las subcadenas que tiene delante tienen alguna subcadena por delante con más
1
's, y hemos comprobado que cualquier índice más grande que el índice actual tiene un número menor o igual de1
' s.(Y aprendo algo bueno: la "pila" se restaura al retroceder).
fuente
Pyth , 12
Esto define una función
g
, que requiere una lista de números y un número como entrada. P.ejPuedes probarlo aquí: Pyth Compiler / Executor
Explicación:
Alternativa:
fuente
ho/<>zNQ\0Uz
Lamentablemente, contar con una cadena no convierte automáticamente lo que está buscando en una cadena :(J,
1514 caracteresfuente
Matlab (42)
Dejar
s
denotar la cadena yn
la longitud de la subcadena. El resultado esr
.Calcule la convolución de
s
con una secuencia den
unos, luego encuentre el máximo. La convolución se realiza fácilmente conconv
, y lamax
función devuelve la posición del primer máximo. Es necesario restar1
al índice resultante, porque la indexación de Matlab comienza en1
, no0
.Golfizado:
fuente
Haskell,
6462 BytesUso:
fuente
n#l=...
p
. Además, creo que0
es redundante (aunque los paréntesis no lo son, y es posible que necesite un espacio en lugar de eso0
).JavaScript (ES6) 73
Una función que devuelve el valor solicitado. El bucle for escanea la cadena de entrada manteniendo un total acumulado, guardando la posición del valor máximo.
Sin golf
Prueba en la consola FireFox / FireBug
Salida
10
fuente
x
yr
. Esto debería reducir 4 bytes, siendo la longitud final de 69 bytes. Además, probablemente pueda reemplazarlo&&
con&
. Pero agradable con el~~
truco!t > x
. Necesita iniciar r: intenteF("00000")
. Se necesita && para emular yif
(x=t, r=i-n+1)
sit
era menor o igual quex
. ¡Es un buen uso de la evaluación perezosa! Desearía que se pudiera cortar en alguna parte, pero supongo que hiciste todo el trabajo.PHP (96)
for($a=$b=$c=0;(($d=@substr_count($s,1,$a,$n))>$c&&($b=$a)&&($c=$d))||$a++<strlen($s););echo $b;
http://3v4l.org/J4vqa
variables
$s
y$n
deben definirse en la línea de comando a la cadena de búsqueda y la longitud de la subcadena, respectivamente.Esto también funcionaría en cualquier lenguaje tipo C con funciones apropiadas para
substr_count()
ystrlen()
.fuente
Mathematica,
3836Ejemplo:
Salida:
fuente
C # (Linq), 148 bytes
Formateado:
Toma datos como parámetros del método.
Que hace:
fuente
Scala - 70 bytes
Pero con nombres de funciones siempre que zipWithIndex supongo que Scala no es la mejor opción para el golf de código.
fuente
C,
245185Formateado:
Uso:
fuente
CJam,
2521 bytesPruébalo aquí.
Toma la entrada como un entero para la longitud de la subcadena, y una matriz de ceros y unos como la secuencia:
Explicación
El resultado se imprime automáticamente al final del programa.
Tenga en cuenta que también estoy considerando segmentos que comienzan más cerca del final que la longitud de subcadena deseada, pero está bien, porque son subcadenas de la última subcadena válida y, por lo tanto, nunca tendrán más
1
s que esa última subcadena válida.fuente
Java 329 bytes
iba a implementar un .matches (regex), pero habría sido casi idéntico a las soluciones de python anteriores, así que probé una ventana deslizante. nuevo aquí, así que si alguien tiene algún indicador, me alegra escucharlo.
}
fuente
i
en la tercera línea. La mayor parte del espacio en blanco se puede eliminar. UsoSystem.out.print(
(no se necesita nueva línea). En lugar deInteger.valueOf(
, puedes usarnew Integer(
.