La puesta en marcha
Se le proporciona una página web simple con 11 elementos:
- 10
input
elementos con ID ai1
travési10
, en orden - un
output
elemento con IDout
Los elementos de entrada tienen value
atributos definidos en la fuente HTML. El valor de cualquier entrada dada puede ser cualquier número entero desde 0
hasta 10
inclusivo.
La página web está equipada con la biblioteca central jQuery 1.10.1 (como se ve en el violín) y ejecuta un bloque de código tan pronto como se carga el DOM.
El reto
Seis desafíos específicos se presentan a continuación. En cada caso, el objetivo es calcular alguna función de la input
sy colocar el resultado del cálculo en el HTML interno de output
. Cada desafío debe resolverse independientemente de los demás. La solución a un desafío es el bloque de código que implementa el cálculo / salida (por ejemplo, el código en la ventana "Javascript" en el violín). La longitud de una solución es la longitud (en bytes) de este bloque de código.
Todo esto parecería muy simple, si no fuera por algunas restricciones bastante interesantes.
Tu código puede ...
invoque la función jQuery
$()
y pase argumentosdefinir y usar variables
utilizar
this
leer cualquier propiedad de cualquier objeto jQuery (
.length
siendo el más útil)definir funciones / lambdas, que posteriormente pueden invocarse, almacenarse en variables y pasarse como argumentos. Las funciones pueden aceptar argumentos y
return
valores si es necesario.invocar cualquiera de los métodos transversales de jQuery DOM
invocar cualquiera de los métodos de manipulación jQuery DOM , exceptuando
width
,height
,innerWidth
,innerHeight
,outerWidth
,outerHeight
,offset
,position
,replaceAll
,replaceWith
,scrollLeft
,scrollTop
,css
,prop
,removeProp
, que puede no ser invocadausar los operadores: creación de objetos
{}
; creación de matriz / referencia de índice / referencia de campo[]
, invocación de función / método()
, concatenación de cadenas+
y asignación=
usar literales de cadena
Su código no puede ...
use cualquier operador excepto los enumerados anteriormente
utilizar cualquier literales que no son literales de cadena
invocar cualquier función / método que no sean los específicamente exceptuados anteriormente
utilizar cualquier estructura de control o una palabra clave (por ejemplo
for
,while
,try
,if
,with
, etc.), con excepción dethis
,var
,let
, funciones y lambdasmanipule el DOM de cualquier manera que resulte en la inyección de código (vea más abajo)
acceder a cualquier variable no definida por el usuario o campo / propiedad no definido por el usuario, excepto los enumerados anteriormente
Los 6 desafíos
Calcule la suma de todos los
input
valores que son pares, colocando el resultado en el HTML interno deoutput
.Calcule el máximo de todos los
input
valores, colocando el resultado en el HTML interno deoutput
.Calcule el producto de todos los
input
valores<= 2
, colocando el resultado en el HTML interno deoutput
. Si todos los valores de entrada son> 2
, colóquelos0
en el HTML interno deoutput
.Calcule el valor modal (es decir, el valor con mayor frecuencia) de todos los
input
valores, colocando el resultado en el HTML interno deoutput
. Si el valor modal no es único, coloque cualquiera de los valores modales en el HTML interno deoutput
.Sea
I1
el valor de entradai1
,I2
sea el valor de entradai2
, etc. Si la secuencia de valores de entradaI1
...I10
forma una cerca conI1 < I2
, coloque"TRUE"
en el HTML interno fuera deloutput
; de lo contrario, colóquelo"FALSE"
en el HTML interno de la salida. Específicamente, la condición de la cerca esI1 < I2 > I3 < I4 > I5 < I6 > I7 < I8 > I9 < I10
.Coloque una lista separada por comas de todos los
input
valores, ordenados en orden ascendente, en el HTML interno deoutput
.
Puntuación
El ganador del concurso es el programador que presenta soluciones correctas para la mayor cantidad de desafíos. En caso de empate, el ganador es el programador con la menor longitud total de la solución (la suma de las longitudes de todas las soluciones). Por lo tanto, esta es una variante menor del código de golf.
Notas importantes
Las soluciones pueden destrozar el DOM (por ejemplo inputs
, eliminar , crear nuevos elementos que aparecen como detritos visuales) siempre que el estado final del DOM contenga un output
elemento con ID out
y el valor calculado correctamente.
Las soluciones pueden hacer uso de cualquier selector avanzado de jQuery y CSS3, a excepción de las características que evalúan expresiones o ejecutan código.
Las soluciones no pueden modificar la fuente HTML del documento. Toda manipulación DOM debe ocurrir en el script a través de jQuery.
Las soluciones no pueden inyectar código de ningún tipo durante el recorrido / manipulación DOM. Esto incluye (pero no se limita a) escribir script
elementos, escribir atributos de eventos que contengan código o explotar el expression
(IE) o las calc
características de CSS3. Este desafío es sobre el pensamiento creativo usando conjuntos y árboles, y el uso magistral de jQuery; no se trata de infiltrar código en el DOM o realizar ejecuciones finales en torno a las restricciones del operador. Me reservo el derecho de descalificar cualquier solución sobre esta base.
Todas las soluciones son realizables y cada una puede implementarse en menos de 400 bytes. Por supuesto, sus soluciones pueden superar los 400 bytes o ser mucho más cortas que 400 bytes. Esta es solo mi garantía básica de que los 6 problemas se pueden resolver utilizando una cantidad de código razonablemente pequeña.
Finalmente: en caso de duda, por favor pregunte. :)
Ejemplo
Considere el desafío hipotético: "Si 3 o más input
valores equivalen a 5, colóquelos "TRUE"
en el HTML interno del output
; de lo contrario, colóquelos "FALSE"
en el HTML interno del output
".
Una solución válida es:
F = () => $('body').append( '<a>TRUE</a>' );
$('input').each( F );
F();
$('a:lt(3)').html( 'FALSE' );
$('#out').html( $('a:eq(' + $('input[value="5"]').length + ')') );
¡Que gane el mejor jQuerier! ;)
//La garantia soy yo
input
valores serán siempre (las representaciones de cadena de números enteros) desde0
a10
ambos inclusive. Deben clasificarse en orden de sus valores ascendentes cuando se interpretan como enteros. En realidad, esto produciría el mismo orden que un tipo lexicográfico, con la excepción que10
vendría inmediatamente después1
en este último. Ese no debería ser el caso para un tipo aquí.Respuestas:
1. Suma de entradas pares,
10094 bytesCómo funciona :
a=$();
: Crear un nuevo objetoa
e=$('*:odd')
: Obtenga todos los elementos impares en la página y asígnelose
. Curiosamente, todos los elementos impares de la página actualyl incluyen todos los elementos de entrada pares (entre otras cosas);)(e=..).map(i=>...)
: Para cada uno de los elementos en el objetoe
, ejecute la función dada donde i es el índice del elemento actual.a=a.add(e.slice('0', e.eq(i).val()).clone())
: obtenga el valor del i- ésimo elementoe
, divida muchos objetose
, clónelos y agreguea
. Curiosamente, una vez más, e tiene más de 10 elementos, por lo que funciona para todos los valores de los cuadros de entrada. Para elementos que no son de entradae
, solo corta 0 elementos dee
.$(out).html(a.length)
:out
es un global creado por los navegadores para cada elemento con una identificación. Así que solo ponemos la longituda
en el html del elemento de salida.Tenga en cuenta que $ () de jquery actúa como un conjunto, pero estamos agregando elementos DOM de clones, por lo que se acumula y finalmente da la suma de todos los valores de entrada pares.
2. Máx. De todos,
7970 bytesCómo funciona:
a=[];
: crea una nueva matriza
e=$('*')
: Consulta todos los elementos de la página y guárdalos ene
(e=..).map(i=>...)
: Para cada uno de los elementos en el objetoe
, ejecute la función dada donde i es el índice del elemento actual.a[e.eq(i).val()]=e
: Obtenga el valor del elemento i th ene
(digamos V) y póngaloe
en el índice V th dea
. Usamose
aquí solo para guardar un byte. Dea[e.eq(i).val()]=''
lo contrario, también funcionaría.$(a).map(_=>$(out).html(_))
: Esto es básicamente poner cada índice dea
en el html del elemento de salida, anulando cada vez. Esto termina con el nodo de salida que tiene el valor que corresponde al último índice dela
cual corresponde al valor más alto en las entradas.3. Producto,
152 141 133132 bytes141 -> 133 reducción gracias a GOTO0 :)
4. Modal,
116 115102 bytes5. Valla, 158 bytes
6. Valores separados por comas ordenados,
133 8586 bytesCómo funciona esto:
$('*').map(i=>...)
: Saque todos los elementos de la página y ejecute el método para todos ellos dondei
está el índice del elemento.$('[value='+i+']').map(_=>...)
: Para cada unoi
, obtenga todos los elementos cuyo valor seai
y ejecute el método para cada uno de ellos.$(out).append(i+'<a>,')
: Anexari
y una etiqueta de anclaje con,
el elemento de salida para cada elemento cuyo valor esi
.$("a:last").remove()
: Elimine la última etiqueta de anclaje para eliminar el final,
Esto funciona ya que selecciona todos los elementos con valores
i
= 0 a 19 (19 es el número total de elementos en la página) y agregai,
al elemento de salida la cantidad de veces quei
aparece un elemento con valor . Esto se encarga de todos los elementos de entrada, ordenándolos en orden creciente.Ejecútelos en la página de violín JS dada en un último Firefox.
Por favor comente si algo está violando las reglas.
fuente
.parents()
puede ser una forma útil de calcular<
o>
.f=i=>$('[value='+i+']').map(_=>p=g());p=$();f('1',g=_=>$(i1));f('2');f('2',g=_=>p.add(p.clone()));f('0',g=_=>$());$(out).html(p.length)
Interesante desafío! Aquí están los primeros en comenzar:
1. Suma,
122112 bytesPara cada entrada n, agregue n
<a>
elementos al enésimo<input>
elemento. Luego cuente los<a>
elementos en cada<input>
elemento impar .2. Máximo,
9179 bytesPara cada entrada n, une los primeros n
<input>
elementos con el conjuntos
. Luego cuente los elementos en el conjunto.3. Producto, 157 bytes
Una función recursiva que, dado un elemento con valor n, se llama a sí mismo con el siguiente elemento n veces y agrega un an
<a>
al siguiente elemento. Luego cuente los<a>
elementos en<output>
.Avíseme si hay algún error o incumplimiento de la regla.
fuente
e.text
con$('#out').text
. Lo arreglaré mañana si tengo tiempo.