Introducción
Cada año, Dyalog Ltd. celebra una competencia estudiantil. El desafío es escribir un buen código APL. Esta es una edición de código de golf agnóstico del octavo problema de este año.
Tengo permiso explícito para publicar este desafío aquí del autor original de la competencia. No dude en verificar siguiendo el enlace proporcionado y contactando al autor.
Problema
Dada una lista booleana *, "apague" todas las Verdades después de la primera Verdad.
No hay verdades? ¡No hay problema! Simplemente devuelva la lista sin modificar.
Ejemplos
[falsy,truthy,falsy,truthy,falsy,falsy,truthy]
→ [falsy,truthy,falsy,falsy,falsy,falsy,falsy]
[]
→ []
[falsy,falsy,falsy,falsy]
→ [falsy,falsy,falsy,falsy]
* Todas tus verdades deben ser idénticas, y todas tus falsedades deben ser idénticas. Esto incluye salida.
Respuestas:
Python 2 , 35 bytes
Pruébalo en línea! La entrada y la salida son líneas de verdadero / falso.
Basado en la solución de Dennis . Redefine la variable
True
que seráFalse
después de queTrue
se encuentre una entrada. De esa manera, cualquier entrada adicional deTrue
se evaluaráFalse
e imprimirá como tal.La redefinición es
True&=b<1
, es decirTrue = True & (b<1)
. Cuando la entradab
esTrue
, entonces(b<1)
es False (sinceTrue==1
), entonces seTrue
convierte enFalse
.fuente
True, False = False, True
.APL , 2 bytes
Evalúa la función "escanear con menos de". Pruébalo en línea!
Explicación
En APL, el operador
\
(exploración) reduce cada prefijo no vacío de una matriz desde la derecha utilizando la función proporcionada. Por ejemplo, dada la matriz0 1 0
, calcula0
(prefijo de longitud 1),0<1
(prefijo de longitud 2) y0<(1<0)
(prefijo de longitud 2) y coloca los resultados en una nueva matriz; los paréntesis se asocian a la derecha. Reducir<
desde la derecha da como resultado1
exactamente cuándo el último elemento de la matriz es1
y el resto son0
, por lo que el prefijo correspondiente al extremo izquierdo1
se reduce a1
y los demás a0
.fuente
Aceto ,
1917 bytes no competitivosNueva versión (17 bytes):
Esta nueva versión toma los caracteres de uno en uno y se ejecuta mejor con la
-F
opción. Funciona de manera similar, pero no idéntica a la solución anterior:Respuesta anterior (19 bytes):
(No compite porque tuve que corregir dos errores en el intérprete)
Diría que esta es la primera respuesta de Aceto que resalta lo que puede hacer relativamente bien. Las "listas" son flujos de entrada, con una entrada por línea, "1" para verdadero y "0" para falso, con una cadena vacía que significa el final de la lista.
Los programas de Aceto se ejecutan en una curva de Hilbert, comenzando en la parte inferior izquierda y terminando en la parte inferior derecha. Primero,
r
colocamos una cadena, lad
duplicamos y la negamos (!
), convirtiendo las cadenas vacías en Verdadero, todo lo demás en Falso. Luego hay un espejo horizontal condicional (|
): si el elemento superior de la pila es verdadero, refleje horizontalmente. Esto sucede cuando la cadena estaba vacía. Si hacemos el reflejo, aterrizamos en elX
, que mata al intérprete.De lo contrario, convertimos la copia restante en la pila a un
i
nteger y hacemos otro espejo horizontal condicional: esta vez, debido a que 1 es verdadero y 0 es falso, reflejamos si vemos el (primer) valor verdadero. Si no reflejamos (entonces vimos un 0),p
desciframos lo que está en la pila (ya que la pila está vacía, un cero) yO
saltamos al rigin de la curva, donde comenzamos, comenzando todo el proceso nuevamente.De lo contrario, cuando vimos un 1, reflejamos y aterrizamos en el
u
, que invierte la dirección en que nos movemos en la curva de Hilbert.1p
imprime un 1, y ahora continuamos de la misma maneraO
que hubiéramos ido si hubiéramos visto un 0, pero dado que estamos en "modo inverso", nuestro origen está en la parte inferior derecha , así que saltamos allí.Ahora
r
colocamos otra cuerda y la negamos. Si la cadena estaba vacía, y por lo tanto el elemento de la pila superior es Truthy,`
será no escapar el comando siguiente (X
), lo que nos dejamos.En caso contrario (si la cadena no estaba vacía), que sí escapar del
X
e ignorarlo. En ese caso, vamos a la izquierda (<
),p
rint 0 (porque la pila está vacía) y volvemos alO
rigin.fuente
Java8,
2419 bytesEspero que esto sea legal; Tengo la impresión de que la entrada / salida no tiene que evaluarse como verdadero / falso en el lenguaje. Toma un largo como entrada y da uno como salida, con unos verdaderos y ceros falsos en la representación binaria. Por ejemplo, el binario 00101 es 5 y devolvería el binario 00100 que es 4.
Cinco bytes gracias a @puhlen
fuente
Long::highestOneBit
que produce el resultado idéntico con una sintaxis más cortajava.lang
paquete se importa de forma predeterminada. De la especificación de idioma "Una unidad de compilación tiene acceso automáticamente a todos los tipos declarados en su paquete y también importa automáticamente todos los tipos públicos declarados en el paquete predefinido java.lang".Retina , 6 bytes
Pruébalo en línea!
La entrada es una lista de
0
s (para Falso)1
ys (para Verdadero).Coincide con todos
1
y reemplaza cada uno excepto el primero (1>
) con a0
.fuente
V , 7 bytes
Pruébalo en línea!
Mi primera presentación de V! \ o /
Cómo funciona
fuente
r0
con<C-x>
para disminuir los y guardar un byte.Haskell , 25 bytes
Función anónima que toma y devuelve una lista de
Bool
s.Usar como
(foldr(\x l->x:map(x<)l)[])[False,True,False,False]
.Pruébalo en línea!
Cómo funciona
x
es el elemento que debe anteponerse a la sublistal
.False
se compara menosTrue
, por lomap(x<)l
que convertirá cualquierTrue
s enl
enFalse
six
esTrue
.fuente
Jalea , 4 bytes
Pruébalo en línea!
Aquí hay un algoritmo bastante diferente a la mayoría de las otras soluciones de lenguaje de golf (aunque después de que lo publiqué, noté que la solución R también usa este algoritmo), y lo relaciono con el actual poseedor del récord Jelly.
Explicación
Mientras todos los elementos a la izquierda de un elemento sean 0, la suma acumulativa hasta un elemento será igual al elemento mismo. A la derecha del primer 1, los dos son diferentes (porque ahora estamos agregando el total distinto de cero de los elementos a la izquierda). Por lo tanto,
+\=
nos da una lista que contiene 1 (es decir, verdadero) e incluye el primer elemento de verdad. Finalmente, lógico Y con la lista original nos dará un 1 solo para el primer elemento de verdad.fuente
JavaScript (ES6),
3326 bytesI / O está en matrices de 0s y 1s.
fuente
05AB1E , 6 bytes
Código:
Explicación:
Utiliza la codificación 05AB1E . Pruébalo en línea!
fuente
1k>sƶ-_
es otra, peor sin embargo. Sinlift
embargo, la idea puede tener potencial.Simulador de máquina de Turing , 39 bytes.
Pruébalo en línea!
fuente
brainfuck , 55 bytes
Pruébalo en línea!
fuente
Jalea , 4 bytes
Un puerto de mi respuesta 05AB1E.
Explicación (argumento α ):
Pruébalo en línea!
fuente
R , 24 bytes
Pruébalo en línea!
Ejemplo:
Para la entrada
FALSE TRUE TRUE FALSE
cumsum(T<-scan(,F))==T
devuelveTRUE TRUE FALSE FALSE
. La F en el escaneo asegura la entrada lógica.FALSE TRUE TRUE FALSE
yTRUE TRUE FALSE FALSE
esFALSE TRUE FALSE FALSE
. Un single&
hace una comparación por elementos.fuente
Octava, 23 bytes
Pruébalo en línea!
Primera diferencia del máximo acumulativo de la lista.
fuente
J , 3 bytes
Define un verbo monádico. Este es un puerto trivial de mi respuesta APL . Pruébalo en línea!
fuente
Python, 58 bytes
Si
x[i]
es falso, la salida es falsa; de lo contrario, da si el elemento es o no la primera aparición en la matriz de sí mismo.fuente
PHP, 37 bytes
fuente
Perl 5, 20 bytes
Truthy is
1
y falsey is''
(una cadena vacía).Explicación:
map
recorre los elementos de la lista@_
, los argumentos pasados a la subrutina, configurando cada elemento en $ _ localmente y devolviendo una matriz de los valores de retorno que calcula de cada elemento.$_&&!$x++
salidas$_
si$_
es falsey y!$x++
si es verdad. (Tenga en cuenta que && está en cortocircuito, por!$x++
lo que no se ejecuta hasta que se alcanza el primer valor verdadero).$x++
vuelve0
(que es falsey) la primera vez que se ejecuta y luego se incrementa cada vez (y así sigue siendo verdad). Se!
niega$x++
, por lo que devuelve la verdad la primera vez que se encuentra y se desvanece a partir de entonces.fuente
sub{...}
).Pyth - 9 bytes
Pruébalo aquí
fuente
m&!~|Z
.Python 2 ,
4536 bytesLa entrada y la salida son un booleano ( verdadero o falso ) por línea.
Pruébalo en línea!
fuente
C #, 77 bytes
Compila a a
Func<bool[], bool[]>
. Nada realmente inteligente, solo una solución directa.fuente
sed ,
1619 bytes15código fuentede18 bytes + 1 byte para el indicador -r (o el indicador -E para BSD sed).Pruébalo en línea!
Editar: Gracias Riley por señalar un error.
fuente
Jalea , 4 bytes
Pruébalo en línea!
¿Cómo?
Esto hace lo que se le pidió en un sentido bastante literal:
fuente
c (con gcc incorporado), 40
Un enfoque ligeramente diferente:
Esto puede considerarse inválido, en cuyo caso lo marcaré felizmente como no competitivo.
Las "matrices" de entrada y salida son enteros sin signo de 32 bits; esto limita el tamaño de la lista de entrada a ser exactamente 32; esto puede ser un descalificador. Si la entrada tiene menos de 32 bits, puede rellenarse con cero bits al final.
Pruébalo en línea .
fuente
Lote,
8573 bytesToma datos como argumentos de línea de comando. Por ejemplo:
1.bat 0 1 0 1 0 0 1
Versión previa
fuente
Brain-Flak , 230 bytes
Lo explicaré pronto, pero mi mamá me preparó unas papas fritas.Pruébalo en línea!
Gracias especiales
¡Un agradecimiento especial a Wheat Wizard y Riley por ayudarme mucho con el código!
fuente
Python 3,
696664605453 bytesToma una serie de
false
sytrue
s. Esta es una lista de comprensión defalse
s excepto si el valor de la iteración actual estrue
y es el primerotrue
en la entrada.Esto parece un poco largo (y es mi primer lambda), así que si puedes encontrar una forma de jugarlo, ¡sería muy apreciado!
fuente
0 for
0for
.Brain-Flak ,
146144 bytesPruébalo en línea!
fuente
Perl 5 , 12 bytes
Código de 10 bytes + 2 para
-pl
.Pruébalo en línea!
fuente