Inspirado y en memoria de mi querido amigo y colega,
Dan Baronet , 1956 - 2016. RIP
Encontró la solución APL más corta posible para esta tarea:
Tarea
Dada una lista booleana, cuente el número de valores de verdad finales.
Casos de ejemplo
{}
→ 0
{0}
→ 0
{1}
→ 1
{0, 1, 1, 0, 0}
→ 0
{1, 1, 1, 0, 1}
→ 1
{1, 1, 0, 1, 1}
→ 2
{0, 0, 1, 1, 1}
→ 3
{1, 1, 1, 1, 1, 1}
→ 6
01100
?Respuestas:
Dyalog APL,
62 bytesPruébelo en TryAPL .
Cómo funciona
⊥ (uptack, dyadic: decode) realiza la conversión de base. Si el operando izquierdo es un vector, realiza una conversión de base mixta , lo cual es perfecto para esta tarea.
Para un vector base b = b n , ⋯, b 0 y un vector de dígitos a = a n , ⋯, un 0 , b ⊥ un convierte una a la base mixta b , es decir, calcula b 0 ⋯ b n-1 una n + ⋯ + b 0 b 1 a 2 + b 0 a 1 + a 0 .
Ahora, ⍨ (tilde dieresis, conmutar) modifica el operador a la izquierda de la siguiente manera. En un contexto monádico, llama al operador con argumentos iguales de izquierda y derecha.
Por ejemplo, ⊥⍨ a se define como a ⊥ a , que calcula a 0 ⋯ a n + ⋯ + a 0 a 1 a 2 + a 0 a 1 + a 0 , la suma de todos los productos acumulativos de derecha a izquierda .
Para k finales, los k productos más a la derecha son 1 y todos los demás son 0 , por lo que su suma es igual a k .
fuente
b⊥b
y⊥⍨b
renunciar a infinita velocidad de marcha.JavaScript (ES6), 21 bytes
Casos de prueba
Mostrar fragmento de código
fuente
f(l)+1
devuelve un valor> 2
?l.pop()?(l.pop()?(l.pop()?(...etc...)+1:0)+1:0)+1:0
.Jalea , 4 bytes
Pruébalo en línea! o Verificar todos los casos de prueba.
Para el caso donde la lista está vacía, hay algunas observaciones curiosas. Primero, la codificación de longitud de ejecución de la lista vacía
[]
devuelve otra lista vacía[]
. Luego, recuperando el último elemento de ese uso deṪ
retornos de cola en0
lugar de un par[value, count]
que son los elementos regulares de una matriz codificada de longitud de ejecución. Luego, el productoP
regresa0
cuando se le solicita0
cuál es el resultado esperado.Explicación
fuente
ŒgṪS
¡también funciona!Ṫ
Jelly se implementa como:lambda z: iterable(z).pop() if iterable(z) else 0
.iterable
cuando se le llama en una lista solo devuelve la lista, y la lista vacía es, por supuesto, falsa.Brachylog ,
765 bytesPruébalo en línea!
Explicación
Dado que
@] - Suffix
comienza desde el sufijo más grande hasta el más pequeño, primero encontrará la carrera más larga.fuente
CJam (8 bytes)
Conjunto de pruebas en línea
Disección
fuente
Haskell,
2625 bytesUso:
Versión sin puntos (26 bytes):
Usando una lista entera en lugar de una lista bool (21 bytes, gracias a Christian Sievers):
Uso:
Versión sin puntos (25 bytes)
fuente
foldl
funciona la ideaa%b=b*(a+1)
Retina ,
75 bytesPruébalo en línea! (La primera línea habilita un conjunto de pruebas separado por salto de línea).
Definir el formato de entrada para Retina no es del todo inequívoco. Dado que Retina no tiene ningún concepto de ningún tipo, excepto cadenas (y tampoco ningún valor que pueda usarse para nuestra definición habitual de verdad y falsedad), generalmente uso
0
y1
(o algo positivo en general) para corresponder a verdad y falsedad, ya que representan cero o algunos partidos, respectivamente.Con las representaciones de un solo carácter, tampoco necesitamos un separador para la lista (que, en cierto modo, es más la representación de la lista más natural para un lenguaje que solo tiene cadenas). Adám confirmó que este es un formato de entrada aceptable.
En cuanto a la expresión regular en sí, coincide de
r
ight a izquierda y\G
ancla cada coincidencia a la anterior. Por lo tanto, esto cuenta cuántos1
s podemos igualar desde el final de la cadena.fuente
05AB1E ,
121065 bytesGuardado 1 byte gracias a carusocomputing .
Pruébalo en línea!
Explicación
fuente
0¡¤g
es de cuatro bytes.J0¡¤g
también es aún más corto;).Î
manejar la entrada vacía, pero aún es un byte guardado gracias :)Python, 31 bytes
fuente
Jalea , 4 bytes
TryItOnline! o todas las pruebas
¿Cómo?
fuente
MATL , 4 bytes
Pruébalo en línea!
fuente
Mathematica,
2524 bytesfuente
FromDigits[b=Boole@#,MixedRadix@b]&
(35 bytes).Pyth, 6 bytes
Pruébalo aquí!
Agrega un 0, invierte y encuentra el índice del primer 0
fuente
C90 (gcc), 46 bytes
La entrada es a través de argumentos de línea de comandos (un número entero por argumento), la salida a través del código de salida .
Pruébalo en línea!
Cómo funciona
r es una variable global. Su tipo predeterminado es int y, al ser global, su valor predeterminado es 0 .
El argumento de la función c por defecto también es int . Retendrá el número entero n + 1 para matrices de n booleanos; El primer argumento de main es siempre la ruta del ejecutable.
El argumento de la función v se declara como
int**
. El tipo real de v seráchar**
, pero dado que solo examinaremos el bit menos significativo de cada argumento para distinguir los caracteres 0 (punto de código 48 ) y 1 (punto de código 49 ), esto no importará en little-endian maquinas.El ciclo while disminuye c y lo compara con 0 . Una vez que c alcanza 0 , saldremos del bucle. Esto es necesario solo si la matriz no contiene 0 's.
Siempre que
0<--c
devuelva 1 , tomamos el argumento de línea de comando c th (v[c]
) y extraemos su primer carácter desreferenciando el puntero (*
). Tomamos el AND bit a bit del Booleano0<--c
y el punto de código del carácter (y los tres bytes de basura que lo siguen), por lo que la condición devolverá 0 una vez que se encuentre un 0 , rompiendo el bucle.En el caso restante, mientras que los argumentos de la línea de comando son 1 ,
r++
incrementa r en 1 , contando así el número de 1 's posteriores .Finalmente,
c=r
almacena el valor calculado de r en c . Con la configuración predeterminada, el compilador optimiza y elimina la asignación; En realidad genera lamovl %eax, -4(%rbp)
instrucción. Comoret
devuelve el valor del registro EAX, esto genera la salida deseada.Tenga en cuenta que este código no funciona con C99, que devuelve 0 desde main si se alcanza el final de main .
fuente
argc
al menos1
(conargv[0]
contener el nombre del archivo)? Podría guardar un byte con en--c&&
lugar de0<--c&
. ¿Se toma el código de salida de gccargc
? Ordenado.*v[c]
es el punto de código de 1 o 0 , por lo que es 49 o 48 y, por lo tanto, siempre es verdadero.k, 6 bytes
Esta composición de funciones se traduce en
sum mins reverse
inq
, el hermano más legible del lenguaje, donde min es un mínimo continuo.fuente
J,
93 bytesEsta es una conversión reflexiva de base mixta. Porque esto es lo mismo que la conversión de base mixta. De nuevo.
Casos de prueba
fuente
R,
40 3925 bytesSolución completamente reelaborada gracias a @Dason
Lea la entrada de stdin, invierta el vector y, si el primer elemento de
!=0
, emite la primera longitud de la codificación de longitud de ejecución (rle
), de lo contrario0
.fuente
ifelse(r$v,r$l,0)[1]
. (Vectorizado si, y luego tomar el primer elemento.)Haskell, 24 bytes
Itera sobre la lista, agregando uno para cada elemento, reiniciando
0
después de que golpea aFalse
.16 bytes con entrada 0/1:
Si se garantizara que la lista no está vacía, podríamos obtener 14 bytes:
Esto calcula el producto acumulativo desde la parte posterior, luego los suma. El producto acumulativo permanece 1 hasta que se alcanza un 0, y luego se convierte en 0. Entonces, los 1 corresponden a los 1 finales.
fuente
Pyke,
106 bytesPruébalo aquí!
fuente
C # 6,
10372 bytesEl uso de la lista no genérica supera la lista genérica por 1 byte lol
-31 bytes gracias a Scott
fuente
int
s, puede salirse con la suyaint a(int[] l)=>l.Reverse().TakeWhile(i=>i>0).Sum();
Func<bool[], int>
para 57 bytes, es decirusing System.Linq;l=>l.Reverse().TakeWhile(x=>x).Count();
Python, 37 bytes
fuente
GUIÓN, CORRER PRECIPITADAMENTE, PRECIPITARSE, IR DE PRISA , 16 bytes
No es la solución DASH más corta posible, pero la solución DASH más corta posible me está molestando. Estoy publicando este enfoque novedoso en su lugar.
Uso:
Explicación
fuente
Scala, 25 bytes
Sin golf:
Invierte la lista, agrega un 0 y encuentra el primer índice de 0, que es el número de elementos antes del primer 0
fuente
Lote, 57 bytes
Toma datos como parámetros de línea de comandos. Funciona multiplicando el acumulador por el valor actual antes de agregarlo, para que los ceros en la línea de comando restablezcan el conteo. Tenga en cuenta que
%%n
no es lo mismo que la variablen
o%n%
.fuente
GolfSharp, 14 bytes
fuente
Java 7, 62 bytes
Ungolfed y código de prueba:
Pruébalo aquí.
Salida:
fuente
Perl 5.10, 22 bytes
21 bytes + 1 byte para
-a
bandera. Dado que se realizó la expresión basada en expresiones regulares ...: pLos valores de entrada para la matriz deben estar separados por un espacio.
Pruébalo en línea!
fuente
perl -E '$_++while pop;say' 0 1 1 0 1 1 1
pero esto no genera nada0
(¡aunque no estoy seguro si eso es un problema!)Perl, 22 bytes
21 bytes de código + 1 byte para
-p
bandera.Para ejecutarlo:
(En realidad, el formato de la entrada no importa mucho:
0110111
,0 1 1 0 1 1 1
,[0,1,1,0,1,1,1]
etc haría todo el trabajo)Versión de 18 bytes de @Dom Hastings pero requiere suministrar la entrada como una cadena de 0 y 1, lo cual no está permitido:
fuente
;
truco :) Si el formato es una cadena continua:perl -pE '/1*$/;$_=length$&' <<< '0110111'
para 18, no estoy seguro de si eso está doblando las reglas o no ...PHP, 50 bytes
Extrañamente, mi primer intento con una expresión regular resultó más corto que mi intento con matrices ...
Use como:
fuente
Ruby
3732 bytesCrea una función anónima que encuentra la instancia más a la derecha de un valor falso y cuenta el tamaño de la submatriz a partir de ese valor.
Se usa
!0
como falso, ya que 0 son valores verdaderos en Ruby.rindex
encuentra el último índice de un valor en una matriz.Uso :
Devuelve 1
Si se me permitiera pasar una cadena de 0 y 1 como parámetros de línea de comando (que no es cómo Ruby representa listas de booleanos), podría reducirlo a 24:
Esto usa expresiones regulares e imprime la longitud de la cadena devuelta por la expresión regular
/(1*)\z/
, donde\z
es el final de la cadena.$*[0]
es el primer argumento pasado y es una cadena de 0s y 1s.Uso:
Devuelve 1.
fuente