A Instalação
Você recebe uma página da web simples com 11 elementos:
- 10
input
elementos com IDsi1
atravessei10
, em ordem - um
output
elemento com IDout
Os elementos de entrada têm value
atributos definidos na fonte HTML. O valor de qualquer entrada fornecida pode ser qualquer número inteiro de 0
até 10
inclusivo.
A página da Web está equipada com a biblioteca principal do jQuery 1.10.1 (como vista no violino) e executa um bloco de código assim que o DOM é carregado.
O desafio
Seis desafios específicos são apresentados abaixo. Em cada caso, o objetivo é calcular alguma função dos input
e colocar o resultado da computação no HTML interno do output
. Cada desafio deve ser resolvido independentemente dos outros. A solução para um desafio é o bloco de código que implementa a computação / saída (por exemplo, o código na janela "Javascript" no violino). O comprimento de uma solução é o comprimento (em bytes) desse bloco de código.
Tudo isso parece muito simples, se não por algumas restrições bastante interessantes.
Seu código pode ...
invocar a função jQuery
$()
e passar argumentosdefinir e usar variáveis
usar
this
leia qualquer propriedade de qualquer objeto jQuery (
.length
sendo o mais útil)defina funções / lambdas, que podem ser invocadas posteriormente, armazenadas em variáveis e passadas como argumentos. Funções podem aceitar argumentos e
return
valores, se necessário.invocar qualquer um dos métodos transversais do jQuery DOM
invocar qualquer um dos métodos de manipulação jQuery DOM , com excepção
width
,height
,innerWidth
,innerHeight
,outerWidth
,outerHeight
,offset
,position
,replaceAll
,replaceWith
,scrollLeft
,scrollTop
,css
,prop
,removeProp
, que não podem ser invocadasuse os operadores: criação de objeto
{}
; criação de matriz / referência de índice / referência de campo[]
, chamada de função / método()
, concatenação de strings+
e atribuição=
use literais de string
Seu código pode não ...
use quaisquer operadores, exceto os listados acima
usar qualquer literais que não são strings literais
invocar qualquer função / método que não aqueles especificamente excetuados acima
utilizar qualquer estrutura de controle ou palavra-chave (por exemplo
for
,while
,try
,if
,with
, etc.), com excepçãothis
,var
,let
, funções e lambdasmanipular o DOM de qualquer maneira que resulte na injeção de código (veja mais abaixo)
acessar qualquer variável não definida pelo usuário ou campo / propriedade não definida pelo usuário, exceto as listadas acima
Os 6 desafios
Calcule a soma de todos os
input
valores pares, colocando o resultado no HTML interno dooutput
.Calcule o máximo de todos os
input
valores, colocando o resultado no HTML interno dooutput
.Calcule o produto de todos os
input
valores<= 2
, colocando o resultado no HTML interno dooutput
. Se todos os valores de entrada forem> 2
, coloque0
no HTML interno do arquivooutput
.Calcule o valor modal (ou seja, o valor com maior frequência) de todos os
input
valores, colocando o resultado no HTML interno dooutput
. Se o valor modal não for exclusivo, coloque qualquer um dos valores modais no HTML interno dooutput
.Seja
I1
o valor da entradai1
,I2
seja o valor da entradai2
, etc. Se a sequência de valores de entradaI1
..I10
formar uma cerca comI1 < I2
, coloque"TRUE"
no HTML interno a saídaoutput
; caso contrário, coloque"FALSE"
no HTML interno da saída. Especificamente, a condição da cerca éI1 < I2 > I3 < I4 > I5 < I6 > I7 < I8 > I9 < I10
.Coloque uma lista separada por vírgula de todos os
input
valores, classificados em ordem crescente, no HTML interno dooutput
.
Pontuação
O vencedor do concurso é o programador que envia soluções corretas para o maior número de desafios. Em caso de empate, o vencedor é o programador com o menor comprimento total da solução (a soma dos comprimentos de todas as soluções). Portanto, essa é uma variante menor do código de golfe.
Anotações importantes
As soluções podem alterar o DOM (por exemplo inputs
, excluir , criar novos elementos que aparecem como detritos visuais), desde que o estado final do DOM contenha um output
elemento com ID out
e o valor calculado corretamente.
As soluções podem fazer uso de qualquer seletor jQuery avançado e CSS3, exceto os recursos que avaliam expressões ou executam código.
As soluções não podem modificar a fonte HTML do documento. Toda manipulação do DOM deve ocorrer no script através do jQuery.
As soluções não podem injetar código de qualquer tipo durante a travessia / manipulação do DOM. Isso inclui (mas não está limitado a) a gravação de script
elementos, a gravação de atributos de eventos contendo código ou a exploração do expression
(IE) ou calc
recursos do CSS3. Esse desafio é sobre o pensamento criativo usando conjuntos e árvores e o uso magistral do jQuery; não se trata de introduzir código no DOM ou executar execuções finais em torno das restrições do operador. Reservo-me o direito de desqualificar qualquer solução nessa base.
Todas as soluções são realizáveis e cada uma pode ser implementada em menos de 400 bytes. Suas soluções podem, obviamente, exceder 400 bytes ou ser muito menores que 400 bytes. Esta é apenas a minha garantia básica de que todos os 6 problemas são solucionáveis usando uma quantidade razoavelmente pequena de código.
Finalmente: em caso de dúvida, pergunte. :)
Exemplo
Considere o desafio hipotético: "Se 3 ou mais input
valores forem iguais a 5, coloque "TRUE"
no HTML interno do output
; caso contrário, coloque "FALSE"
no HTML interno do output
."
Uma solução válida é:
F = () => $('body').append( '<a>TRUE</a>' );
$('input').each( F );
F();
$('a:lt(3)').html( 'FALSE' );
$('#out').html( $('a:eq(' + $('input[value="5"]').length + ')') );
Que vença o melhor jQuerier! ;)
//La garantia soy yo
input
valores sempre serão (as representações de string de) números inteiros de0
até10
inclusivos. Eles devem ser classificados na ordem de seus valores ascendentes quando interpretados como números inteiros. Na verdade, isso produziria a mesma ordem que um tipo lexicográfico, com a exceção que10
viria imediatamente depois1
no último. Esse não deve ser o caso de uma espécie aqui.Respostas:
1. Soma das entradas pares,
10094 bytesComo funciona :
a=$();
: Criar um novo objetoa
e=$('*:odd')
: Obtenha todos os elementos ímpares da página e atribua-o ae
. Curiosamente, todos os elementos ímpares da página actualyl incluem todos os elementos pares de entrada (entre outras coisas);)(e=..).map(i=>...)
: Para cada um dos elementos no objetoe
, execute a função fornecida em que i é o índice do elemento atual.a=a.add(e.slice('0', e.eq(i).val()).clone())
: obtém o valor do i- ésimo elementoe
, retira muitos objetose
, clona-os e coloca-os ema
. Curiosamente, novamente, e tem mais de 10 elementos, portanto, funciona para todos os valores das caixas de entrada. Para elementos sem entrada eme
, apenas divide 0 elementose
.$(out).html(a.length)
:out
é um global criado pelos navegadores para cada elemento com um ID. Então colocamos o comprimento dea
no html do elemento de saída.Observe que $ () do jquery atua como um conjunto, mas estamos adicionando elementos DOM dos clones, portanto ele está acumulando e finalmente dando a soma de todos os valores de entrada pares.
2. Máximo de tudo,
7970 bytesComo funciona:
a=[];
: crie uma nova matriza
e=$('*')
: Consulte todos os elementos na página e armazene-os eme
(e=..).map(i=>...)
: Para cada um dos elementos no objetoe
, execute a função fornecida em que i é o índice do elemento atual.a[e.eq(i).val()]=e
: Obtenha o valor do i- ésimo elemento eme
(digamos V) e insirae
o V- ésimo índice dea
. Usamose
aqui apenas para salvar um byte. Caso contrário,a[e.eq(i).val()]=''
também funcionaria.$(a).map(_=>$(out).html(_))
: Isso basicamente consiste em colocar cada índicea
no html do elemento de saída, substituindo cada vez. Isso termina com o nó de saída com o valor que corresponde ao último índice,a
que corresponde ao valor mais alto nas entradas.3. Produto,
152 141 133132 bytes141 -> 133 redução graças a GOTO0 :)
4. Modal,
116 115102 bytes5. Cerca, 158 bytes
6. Valores separados por vírgula classificada,
133 8586 bytesComo isso funciona:
$('*').map(i=>...)
: Retire todos os elementos da página e execute o método para todos eles ondei
está o índice do elemento.$('[value='+i+']').map(_=>...)
: Para cada umi
, obtenha todos os elementos cujo valor sejai
e execute o método para cada um deles.$(out).append(i+'<a>,')
: Anexei
e uma tag de âncora,
ao elemento de saída de cada elemento cujo valor sejai
.$("a:last").remove()
: Remova a última marca de âncora para remover o final,
Isso funciona porque ele seleciona todos os elementos com valores de
i
0 a 19 (sendo 19 o número total de elementos na página) e anexai,
ao elemento de saída o número de vezes que um elemento com valori
aparece. Isso cuida de todos os elementos de entrada, ordenando-os em ordem crescente.Execute-os na página de violino JS fornecida no Firefox mais recente.
Comente se algo está violando as regras.
fonte
.parents()
pode ser uma maneira útil de calcular<
ou>
.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)
Desafio interessante! Aqui estão os primeiros a começar:
1. Soma,
122112 bytesPara cada entrada n, acrescente n
<a>
elementos ao enésimo<input>
elemento. Em seguida, conte os<a>
elementos em todos os<input>
elementos ímpares .2. Máximo,
9179 bytesPara cada entrada n, junte o primeiro n
<input>
elementos ao conjuntos
. Depois conte os elementos no conjunto.3. Produto, 157 bytes
Uma função recursiva que, dado um elemento com valor n, se chama com o próximo elemento n vezes e anexa um
<a>
ao próximo elemento. Depois conte os<a>
elementos em<output>
.Informe-me se houver algum erro ou violação de regra.
fonte
e.text
com$('#out').text
. Vou consertar amanhã se tiver tempo.