Die Einrichtung
Sie erhalten eine einfache Webseite mit 11 Elementen:
- 10
input
Elemente mit IDsi1
durchi10
, in der Reihenfolge - ein
output
Element mit IDout
Die Eingabeelemente haben value
Attribute, die in der HTML-Quelle definiert sind. Der Wert einer bestimmten Eingabe kann eine beliebige Ganzzahl von 0
bis 10
einschließlich sein.
Die Webseite ist mit der Kernbibliothek jQuery 1.10.1 (wie in der Geige dargestellt) ausgestattet und führt einen Codeblock aus, sobald das DOM geladen wird.
Die Herausforderung
Im Folgenden werden sechs spezifische Herausforderungen vorgestellt. In jedem Fall besteht das Ziel darin, eine Funktion des input
s zu berechnen und das Berechnungsergebnis in den inneren HTML- Code des s zu platzieren output
. Jede Herausforderung sollte unabhängig von den anderen gelöst werden. Die Lösung für eine Herausforderung ist der Codeblock, der die Berechnung / Ausgabe implementiert (z. B. der Code im Fenster "Javascript" in der Geige). Die Länge einer Lösung ist die Länge (in Bytes) dieses Codeblocks.
All dies scheint sehr einfach zu sein, wenn nicht einige interessante Einschränkungen.
Ihr Code kann ...
Rufen Sie die jQuery-Funktion auf
$()
und übergeben Sie ArgumenteVariablen definieren und verwenden
verwenden
this
Lesen Sie eine beliebige Eigenschaft eines jQuery-Objekts (wobei
.length
dies die nützlichste ist).Definieren Sie Funktionen / Lambdas, die anschließend aufgerufen, in Variablen gespeichert und als Argumente übergeben werden können. Funktionen können
return
bei Bedarf Argumente und Werte akzeptieren .Rufen Sie eine der jQuery DOM-Traversal-Methoden auf
Aufrufe jeden der jQuery DOM Manipulationsmethoden , mit der Ausnahme
width
,height
,innerWidth
,innerHeight
,outerWidth
,outerHeight
,offset
,position
,replaceAll
,replaceWith
,scrollLeft
,scrollTop
,css
,prop
,removeProp
, die möglicherweise nicht aufgerufenVerwenden Sie die Operatoren: Objekterstellung
{}
; Array-Erstellung / Indexreferenz / Feldreferenz[]
, Funktions- / Methodenaufruf()
, Verkettung von Zeichenfolgen+
und Zuweisung=
Verwenden Sie String-Literale
Ihr Code kann nicht ...
Verwenden Sie alle Operatoren außer den oben aufgeführten
Verwenden Sie alle Literale, die keine String-Literale sind
Rufen Sie eine andere Funktion / Methode als die oben ausdrücklich genannten auf
verwenden , jede Steuerstruktur oder ein Schlüsselwort (z
for
,while
,try
,if
,with
, etc.), mit Ausnahme vonthis
,var
,let
, Funktionen und Lambdasmanipuliert das DOM in irgendeiner Art und Weise , dass die Ergebnisse in der Injektion von Code (mehr unten)
Zugriff auf alle nicht benutzerdefinierten Variablen oder nicht benutzerdefinierten Felder / Eigenschaften mit Ausnahme der oben aufgeführten
Die 6 Herausforderungen
Berechnen Sie die Summe aller
input
geraden Werte und platzieren Sie das Ergebnis im inneren HTML desoutput
.Berechnen Sie das Maximum aller
input
Werte und platzieren Sie das Ergebnis im inneren HTML desoutput
.Berechnen Sie das Produkt aller
input
Werte<= 2
und platzieren Sie das Ergebnis im inneren HTML desoutput
. Wenn alle Eingabewerte vorhanden sind> 2
, platzieren Sie sie0
im inneren HTML-Code desoutput
.Berechnen Sie den Modalwert (dh den Wert mit der größten Häufigkeit) aller
input
Werte und platzieren Sie das Ergebnis im inneren HTML desoutput
. Wenn der Modalwert nicht eindeutig ist, platzieren Sie einen der Modalwerte im inneren HTML desoutput
.Lassen Sie
I1
den Wert eingegeben wirdi1
,I2
wird der Wert des Eingangsi2
, usw. Wenn die Sequenzwerte von EingangI1
..I10
einen bilden Zaun mitI1 < I2
, Platz"TRUE"
in den inneren HTML aus demoutput
; Andernfalls"FALSE"
in den inneren HTML-Code der Ausgabe einfügen. Insbesondere ist der ZaunzustandI1 < I2 > I3 < I4 > I5 < I6 > I7 < I8 > I9 < I10
.Fügen Sie eine durch Kommas getrennte Liste aller
input
Werte in aufsteigender Reihenfolge in den inneren HTML-Code von einoutput
.
Wertung
Der Gewinner des Wettbewerbs ist der Programmierer, der korrekte Lösungen für die meisten Herausforderungen einreicht. Bei einem Unentschieden gewinnt der Programmierer mit der niedrigsten Gesamtlösungslänge (der Summe der Längen aller Lösungen). Daher ist dies eine geringfügige Variante des Code-Golfs.
Wichtige Notizen
Lösungen können das DOM beschädigen (z. B. löschen inputs
, neue Elemente erstellen, die als visueller Abfall erscheinen), solange der Endzustand des DOM ein output
Element mit der ID out
und dem korrekt berechneten Wert enthält.
Lösungen können erweiterte jQuery-Selektoren und CSS3 verwenden, mit Ausnahme von Funktionen, die Ausdrücke auswerten oder Code ausführen.
Lösungen können die HTML-Quelle des Dokuments möglicherweise nicht ändern. Alle DOM-Manipulationen müssen im Skript über jQuery erfolgen.
Lösungen dürfen während der DOM-Durchquerung / Manipulation keinerlei Code einfügen. Dies umfasst (ohne darauf beschränkt zu sein) das Ausschreiben von script
Elementen, das Ausschreiben von Ereignisattributen, die Code enthalten, oder das Ausnutzen des expression
(IE) oder der calc
Funktionen von CSS3. Bei dieser Herausforderung geht es um kreatives Denken mit Sets und Bäumen sowie um den meisterhaften Einsatz von jQuery. Es geht nicht darum, Code in das DOM zu schleichen oder die Operator-Einschränkungen zu umgehen. Ich behalte mir das Recht vor, Lösungen auf dieser Grundlage zu disqualifizieren.
Alle Lösungen sind realisierbar und können in weniger als 400 Bytes implementiert werden. Ihre Lösungen können natürlich 400 Byte überschreiten oder weit kürzer als 400 Byte sein. Dies ist nur meine grundlegende Garantie dafür, dass alle 6 Probleme mit einer relativ kleinen Menge Code lösbar sind.
Zum Schluss: Im Zweifelsfall bitte fragen. :) :)
Beispiel
Betrachten Sie die hypothetische Herausforderung: "Wenn 3 oder mehr input
Werte gleich 5 sind, platzieren Sie sie "TRUE"
in den inneren HTML-Code von output
; andernfalls platzieren Sie sie "FALSE"
in den inneren HTML-Code von output
."
Eine gültige Lösung ist:
F = () => $('body').append( '<a>TRUE</a>' );
$('input').each( F );
F();
$('a:lt(3)').html( 'FALSE' );
$('#out').html( $('a:eq(' + $('input[value="5"]').length + ')') );
Möge der beste jQuerier gewinnen! ;)
//La garantia soy yo
input
Werte sind immer (die Zeichenfolgendarstellungen von) Ganzzahlen von0
bis10
einschließlich. Sie sollten in der Reihenfolge ihrer aufsteigenden Werte sortiert werden, wenn sie als Ganzzahlen interpretiert werden. Dies würde tatsächlich die gleiche Reihenfolge wie eine lexikografische Sortierung erzeugen, mit der Ausnahme, dass in letzterer10
unmittelbar danach kommen würde1
. Das sollte hier bei einer Sorte nicht der Fall sein.Antworten:
1. Summe der geraden Eingänge,
10094 BytesWie es funktioniert :
a=$();
: Erstellen Sie ein neues Objekta
e=$('*:odd')
: Holen Sie sich alle ungeraden Elemente auf der Seite und weisen Sie es zue
. Interessanterweise enthalten alle ungeraden Elemente der Seitenaktualisierung (unter anderem) alle geraden Eingabeelemente;)(e=..).map(i=>...)
:e
Führen Sie für jedes Element im Objekt die angegebene Funktion aus, wobei i der Index des aktuellen Elements ist.a=a.add(e.slice('0', e.eq(i).val()).clone())
: Holen Sie sich den Wert des i- ten Elements ine
, schneiden Sie so viele Objekte ause
, klonen Sie sie und fügen Sie sie hinzua
. Interessanterweise hat e wieder mehr als 10 Elemente, sodass es für alle Werte der Eingabefelder funktioniert. Für nicht eingegebene Elemente ine
werden nur 0 Elemente aus geschnittene
.$(out).html(a.length)
:out
ist eine globale Liste, die von Browsern für jedes Element mit einer ID erstellt wird. Also setzen wir einfach die Länge vona
in das HTML des Ausgabeelements.Beachten Sie, dass $ () von jquery als Menge fungiert, aber wir fügen Klon-DOM-Elemente hinzu, sodass es sich ansammelt und schließlich die Summe aller geraden Eingabewerte ergibt.
2. Maximal
7970 BytesWie es funktioniert:
a=[];
: Erstelle ein neues Arraya
e=$('*')
: Fragen Sie alle Elemente auf der Seite ab und speichern Sie sie ine
(e=..).map(i=>...)
:e
Führen Sie für jedes Element im Objekt die angegebene Funktion aus, wobei i der Index des aktuellen Elements ist.a[e.eq(i).val()]=e
: Holen Sie sich den Wert des i- ten Elements ine
(sagen Sie V) und geben Siee
den V- ten Index von eina
. Wir verwendene
hier nur, um ein Byte zu speichern. Sonsta[e.eq(i).val()]=''
würde auch funktionieren.$(a).map(_=>$(out).html(_))
: Dies bedeutet im Grunde, dass jeder Index vona
in das HTML des Ausgabeelements eingefügt wird und jedes Mal überschrieben wird. Dies endet damit, dass der Ausgabeknoten den Wert hat, der dem letzten Indexa
entspricht, dessen höchster Wert in den Eingaben entspricht.3. Produkt,
152 141 133132 Bytes141 -> 133 Reduktion dank GOTO0 :)
4. Modal,
116 115102 Bytes5. Zaun, 158 Bytes
6. Sortierte durch Kommas getrennte Werte,
133 8586 BytesSo funktioniert das:
$('*').map(i=>...)
: Nehmen Sie alle Elemente von der Seite heraus und führen Sie die Methode für alle aus, wobeii
sich der Index des Elements befindet.$('[value='+i+']').map(_=>...)
: Holen Sie sich für jedesi
Element alle Elemente, deren Wert ist,i
und führen Sie die Methode für jedes Element aus.$(out).append(i+'<a>,')
: Fügen Sie für jedes Element, dessen Wert ist,i
ein Anker-Tag,
an das Ausgabeelement ani
.$("a:last").remove()
: Entfernen Sie das letzte Ankertag, um das nachfolgende zu entfernen,
Dies funktioniert, indem alle Elemente mit den Werten
i
= 0 bis 19 ausgewählt werden (19 ist die Gesamtzahl der Elemente auf der Seite) undi,
an das Ausgabeelement angehängt wird, wie oft ein Element mit dem Werti
angezeigt wird. Dies kümmert sich um alle Eingabeelemente und sortiert sie in aufsteigender Reihenfolge.Führen Sie sie auf der angegebenen JS-Geigen-Seite in einem aktuellen Firefox aus.
Bitte kommentieren Sie, wenn etwas gegen Regeln verstößt.
quelle
.parents()
dies eine nützliche Methode zum Berechnen<
oder sein kann>
.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)
Interessante Herausforderung! Hier sind die ersten, die uns anfangen:
1. Summe
122112 BytesFügen Sie für jede Eingabe n n
<a>
Elemente an das n-te<input>
Element an. Zählen Sie dann die<a>
Elemente in jedem ungeraden<input>
Element.2. Maximal
9179 BytesVerbinden Sie für jede Eingabe n die ersten n
<input>
Elemente mit der Menges
. Dann zählen Sie die Elemente in der Menge.3. Produkt, 157 Bytes
Eine rekursive Funktion, die sich bei einem gegebenen Element mit dem Wert n n-mal mit dem nächsten Element aufruft und ein
<a>
an das nächste Element anfügt . Dann zählen Sie die<a>
Elemente in<output>
.Lassen Sie mich wissen, wenn es Fehler oder Regelverstöße gibt.
quelle
e.text
mit$('#out').text
. Ich werde es morgen reparieren, wenn ich Zeit habe.