Encuentre la ejecución más larga de verdadero en una lista de booleanos. Devuelve la misma lista, con todas las demás falsas falsas.
De entrada y salida
Una lista; cualquier formato habitual (por ejemplo, una lista delimitada como una cadena).
Detalles
Verdadero y falso puede ser cualquier cosa que su lenguaje use típicamente para esos valores, o los enteros 1 y 0. Si usa caracteres individuales, la lista puede ser una concatenación (por ejemplo, 10001
).
Si hay un empate para la carrera más larga, mantén todas las carreras de empate verdaderas y falsifica todas las carreras más cortas.
Ejemplos
input ↦ output
1,0,1,0,1 ↦ 1,0,1,0,1
1,1,0,1,1,0,1 ↦ 1,1,0,1,1,0,0
1,1,0,1,1,1,0,1,1 ↦ 0,0,0,1,1,1,0,0,0
1,1,1 ↦ 1,1,1
0,0,1 ↦ 0,0,1
0,0 ↦ 0,0
1,1,1,0,0,0,1,1,1,1,0,1,0,0,1,1,0,1,1,1,1,0,0,1,0 ↦ 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0
(directamente desde /programming//q/37447114 )
code-golf
array-manipulation
msh210
fuente
fuente
Haskell,
59,58,55, 64 bytesNota divertida, esto funciona en cualquier lista de valores donde
falsy < truthy
. AsíFalse/True
,0/1
,'f'/'t'
, etc.Nota:
Como varias personas han señalado (incluyendo
@proud haskeller
y@nimi
), la versión anterior falló en una lista de todos los valores falsos. La adición de.([1<2]:)
ha solucionado esto, como lo sugiere@proud haskeller
. Dejo la explicación igual por ahora, porque creo que todavía tiene sentido. Si alguien comenta, solicitando una explicación de la edición, editaré.Explicación:
Primero desugaré sin el
group
, y luego lo volveré a agregar. Primero, encuentro que las palabras son más fáciles de ver que los símbolos, así que haré algunas sustituciones. (Tenga en cuenta que=<<
es 'elegante', por lo que se aplica de manera diferente para las listas y funciones. Llamo abind
la versión de=<<
para funciones).Los últimos detalles son los que
x <$ list
reemplazan cada elemento dellist
conx
y logroup list
dividelist
en trozos de elementos iguales. Por lo tantogroup [1, 1, 2, 3, 3, 3] == [[1, 1], [2], [3, 3, 3]]
.Para resumirlo todo, la función divide la lista de valores en grupos de solo verdadero y grupos de solo falso. Luego, para cada grupo, reemplace cada elemento con el resultado de la declaración
this is the biggest group
(el grupo más grandetrue
será el más grande) y concatene los grupos.Cuatro bytes guardados por
@Zgarb
fuente
(\y->(maximum g==y)<$y)
con((<$)=<<(==maximum g))
. Sin embargo, no lo he probado.f
por la función sin puntos((=<<)=<<(=<<)(<$).(==).maximum).group
. ¡Ahorra tres bytes y es completamente ilegible!b=(=<<);b b(b(<$).(==).maximum).group
es un byte más corto aún. Nunca he visto algo así antes en Haskell golf :)(:[t])
antes del máximo o algo similarRetina,
474336Pruébalo en línea! o prueba todos los casos de prueba
¡Gracias a msh210 por jugar al golf 4 bytes!
También muchas gracias a Martin por 7 bytes!
Explicación:
Reemplace todos los
0
s con!
s. Esto se hace para1
acortar los grupos de s, como ahora1!
y!1
tendrá un límite de palabra (\b
) entre ellos, que también coincide con el inicio o el final de la cadena.Esta es una opción de configuración que dice que después de aplicar la expresión regular después del toque de retroceso a la entrada, en cada coincidencia, traducir cada carácter ascii imprimible en un
0
carácter.Esta expresión regular coincide con grupos de
1
s rodeados por ceros, pero no puede coincidir con un1
seguido por sí mismo en ninguna parte de la cadena. Estos son los grupos no máximos que serán falsificados. Además, esto también coincide con los!
caracteres que agregamos para convertirlos nuevamente en0
s.fuente
MATL, 14 bytes
Pruébalo en línea!
Versión modificada con todos los casos de prueba.
Explicación
fuente
Python 2, 62 bytes
Pruébalo en Ideone .
Cómo funciona
s.split('0')
divide la cadena de entrada s en series de cero o más 1 'sPara cada ejecución t , verificamos si
t+'1'
es una subcadena de s .Si es así, la ejecución no es máxima,
t+'1'in s
devuelve True ,1-(t+'1'in s)
devuelve 1 - True = 0 y la ejecución se reemplaza con una ejecución de 0 's de la misma longitud.Si no es así, la ejecución es máxima,
t+'1'in s
devuelve False ,1-(t+'1'in s)
devuelve 1 - False = 1 y la ejecución se reemplaza con una ejecución de 1 's de la misma longitud, es decir, por sí misma.Finalmente,
'0'.join
restaura todos los 0 eliminados .fuente
J, 25 bytes
Este es un verbo monádico que toma y devuelve una matriz 0-1. Úselo así:
Explicación
fuente
;.
.Pyth,
26242321 bytesBanco de pruebas.
1/0
otrue/false
en entrada.true/false
en salida.Explicación
23 bytes anteriores
Banco de pruebas.
1/0
otrue/false
en entrada.1/0
en salida.24 bytes anteriores
Banco de pruebas.
1/0
otrue/false
en entrada.1/0
en salida.26 bytes anteriores
Banco de pruebas.
1/0
otrue/false
en entrada.1/0
en salida.fuente
Jr.b,N&YNrQ8)9qReSJJ
oJrm,hd*FdrQ8 9qReSJJ
. Ambas versiones guardan un byte. O ir aún más loco conJrXR1*FdrQ8 9qReSJJ
y guardar dos. ;-)Oracle SQL 12.1,
137135bytesSin golf
La entrada usa caracteres individuales. Ej: '1100111'
fuente
Mathematica ,
4641Trabaja en listas de
0
y1
. ¡Pensé que lo había hecho bastante bien hasta que miré las otras respuestas!Explicación para la versión de 46 caracteres; Actualizaré cuando no pueda mejorarlo más.
Se solicitó una explicación de este código.
Un equivalente sin código de golf (utilizando formularios de operador de la versión 10) es:
Esto significa una función compuesta de cinco pasos (subfunciones) aplicadas en orden de arriba a abajo.
Split
: se dividen en series de elementos idénticos: {1,1,0,1,1,0,1} ↦ {{1,1}, {0}, {1,1}, {0,0}}Map[# Tr@# &]
: Para cada sublista (Map
) multiplíquela (#
) por su suma (traza vectorialTr
): {1,1} ↦ {2, 2}# - Max[1, #] &
reste de cada elemento el valor máximo que aparece en cualquier lugar de la lista de listas, o uno, el que sea más alto. (El uno maneja el caso de todos los ceros).UnitStep
: igual a 0 para x <0 y 1 para x> = 0, aplicado a cada elemento.Apply[Join]
: une las sublistas en una sola lista. También podría hacerse conFlatten
oCatenate
, pero en forma abreviadaJoin@@
es más conciso.fuente
C,
135129 bytesProbar en línea
Sin golf
fuente
JavaScript (ES6), 56 bytes
Funciona comprobando todas las ejecuciones de 1s y reemplazando los caracteres con 0s a menos que la ejecución sea (igualmente) más larga, según se mide buscando en la cadena una ejecución más larga de 1s.
Solución recursiva anterior de 72 bytes:
No hace nada si no hay corridas de 1s (es decir, 1s como máximo). De lo contrario, resta uno
1
de cada uno1
o de cada uno de ellos, luego se llama recursivamente en las ejecuciones más cortas, luego agrega uno1
nuevamente en las ejecuciones (ahora igualmente más largas). El número de llamadas recursivas es uno menos que la duración de la ejecución más larga.fuente
Julia, 51 bytes
Pruébalo en línea!
Cómo funciona
replace
encuentra todas las ejecuciones de uno o más 1 's en la cadena de entrada s a través de la expresión regularr"1+"
y llama a lambdat->map(c->c-contains(s,"1"t),t)
para determinar la cadena de reemplazo.La lambda asigna
c->c-contains(s,"1"t)
todos los caracteres en la ejecución de unos t .Si
"1"t
(concatenación) es una subcadena de s , la ejecución no es máxima,contains
devuelve verdadero yc-contains(s,"1"t)
devuelve '1' - verdadero = '0' , reemplazando todos los 1 's en esa ejecución con 0 ' s.Si
"1"t
(concatenación) no es una subcadena de s , la ejecución es máxima,contains
devuelve falso yc-contains(s,"1"t)
devuelve '1' - falso = '1' , dejando la ejecución sin modificar.fuente
APL, 22 caracteres
En inglés (de derecha a izquierda en bloques):
fuente
Java 8, 205 bytes
Esta es una expresión lambda para a
Function<String,String>
:input / output es un lugar
String
donde verdadero está representado por 1 y falso está representado por 0. No hay caracteres delimitadores que separen los valores.código con explicación:
ver ideone para los casos de prueba
fuente
Clojure, 137 bytes
Primero divide la entrada en ceros y unos consecutivos y los asigna en "tuplas" del primer elemento de las particiones y el recuento de elementos. Luego repite el número necesario de ceros o unos, dependiendo de si esta es la secuencia de longitud máxima de unos o no.
Menos golfizado:
fuente
Perl 5, 68 bytes
67, más 1 para en
-pe
lugar de-e
Espera e imprime una cadena (concatenación) de 0s y 1s.
fuente