Jetzt, da ich von Code Golf süchtig bin, ist es wahrscheinlich an der Zeit, ein paar Golfsprachen zu lernen.
Da ich fast ausschließlich in JavaScript spiele, scheint Japt die logische Sprache zu sein. Ich werde bei der nächsten Gelegenheit in die Dokumentation eintauchen, aber in der Zwischenzeit posten Sie bitte alle Tipps, die Sie für Japt haben, in den Antworten unten.
Als Anfänger in Japt- und Golfsprachen im Allgemeinen wäre es eine große Hilfe, wenn Sie Ihre Tipps nach Möglichkeit in JavaScript "übersetzen" könnten, um mich mit den Dingen vertraut zu machen.
Antworten:
Verschieben von JavaScript nach Japt
Wie Sie vielleicht wissen, ist Japt einfach eine verkürzte, erweiterte Version von JavaScript. Ich habe Japt erstellt, weil ich es satt hatte, lange Eigenschaftsnamen wie
String.fromCharCode(x)
und zu verwendenMath.floor(x)
und umständlich Dinge wie das Erstellen einer Reihe zu tun. Hier ist das absolute Minimum, das Sie wissen müssen, wenn Sie von JavaScript zu Japt wechseln:U
,V
,W
,X
,Y
, undZ
; Das vollständige Array wird in gespeichertN
. Das Ergebnis des letzten Ausdrucks wird automatisch gedruckt.a
-z
(undà
-ÿ
) für Zahlen, Zeichenfolgen und Arrays hinzu. Wenn Sie einen dieser Buchstaben verwenden, füllt Japt das.
und aus(
.Uc
in Japt ist äquivalent zuU.c(
in JavaScript, was je nach Art von ceil, charCodeAt oder concat bedeuten kannU
. Hier kommt der größte Teil von Japts Kraft her. Eine vollständige Liste dieser Methoden finden Sie in den Abschnitten "_____ Funktionen" der Japt-Dokumentation (beim Interpreter ).)
und)
repräsentiert))
. Dies liegt daran, dass ich beim ersten Entwerfen von Japt so viele Bytes wie möglich speichern wollte, und so dachte ich zuerst, dies zu tun. (ObwohlUs w n
es besser aussieht alsUs)w)n)
, IMHO.)ABC{...}
, wobei esABC
sich um eine beliebige Folge von Variablen handeln kann. Funktionen funktionieren größtenteils wie in JS. Der Hauptunterschied besteht darin, dass der letzte Ausdruck automatisch zurückgegeben wird (anstattreturn
Klammern in ES6 zu verwenden oder zu verwenden ).'
bezeichnet eine einzelne Zeichenkette (dh'a
ist dasselbe wie"a"
),#
nimmt den nächsten Zeichencode und wird zu dieser Zahl (#e
ist dasselbe wie101
).$
bleibt während des Transpilationsprozesses gleich. Sie können dies zumfor
Beispiel verwenden, um Schleifen zu implementieren , da Japt diese nicht hat, aber ich würde vorschlagen, andere Methoden zu verwenden (zum Beispielm
für Zeichenfolgen und Arrays odero
für Zahlen).""
,0-9
,(
,+
,=
, usw. - gleich bleiben , wenn transpiled (zum größten Teil jedenfalls).Und das ist alles, was Sie wissen müssen, um einfachen Japt-Code zu schreiben. Das Erreichen einer maximalen Golfkraft in Japt erfordert mehr Kenntnisse, die jedoch in anderen Antworten zu finden sind.
Hier ist ein einfaches Beispiel. Angenommen, Sie möchten eine Zeichenfolge aus ASCII-Zeichen verwenden und diese durch den hexadezimalen Zeichencode ersetzen. So könnten Sie das in JavaScript tun:
Nun zu Japt konvertieren.
.split("")
in JS ist gleichbedeutend mitq""
in Japt oder sogar kürzerq
..join("")
ist auch gerechtq
, der Unterschied ist, dass das Objekt ein Array anstelle einer Zeichenfolge ist..map(
istm
,.charCodeAt(
istc
und.toString(
ists
. So könnte unser Japt-Code aussehen:In Japt
m
funktioniert dies jedoch sowohl für Zeichenfolgen als auch für Arrays, sodass wir beideq
s entfernen können :Online testen! Wie Sie im Feld "JS-Code" sehen können, gilt dies direkt für:
Wenn Sie lernen, mit Japt zu arbeiten, werden Sie sich immer weniger darauf konzentrieren, JavaScript hin und her zu konvertieren und in Japt als eigene Sprache zu programmieren. Hier ist eine Erklärung, bei der der JavaScript-Teil vollständig weggelassen wird:
quelle
Um_c s16
?¡Xc s16
:?String-Arrays komprimieren
Einführung
Wenn Ihr Code ein Array von Zeichenfolgen enthält, ist es am offensichtlichsten, wenn Sie jede Zeichenfolge
Oc
einzeln durchlaufen . In diesem Tipp wird mit dem Array gearbeitet["lollipop","marshmallow","nougat","oreo"]
, das anfänglich 42 Byte wiegt. Durchlaufen jeder ZeichenfolgeOc
gibt uns:Das sind jetzt 33 Bytes, eine ordentliche Ersparnis.
Schritt 1
Aber wir können es besser machen. Wenn wir das Array zu einer durch Zeilenumbrüche getrennten Zeichenfolge zusammenfügen, können wir die Klammern, Kommas und überflüssigen Backticks entfernen und nach Zeilenumbrüchen aufteilen, um unser Array zu erhalten. Wenn wir das auf unser Beispielarray anwenden, erhalten wir Folgendes:
Bis zu 26 Bytes jetzt.
Schritt 2
Aber wir können es noch besser machen! Wir könnten einen Kleinbuchstaben verwenden, um die Zeichenfolgen anstelle einer neuen Zeile abzugrenzen, die möglicherweise in die Komprimierung einbezogen wird.
z
wird in keiner unserer Saiten verwendet, also lasst uns das mal sehen, wie wir uns verstehen.Ah, Nüsse - keine Besserung da; unsere Byteanzahl ist um eins gestiegen! Es könnte ein weiterer Brief, den Sie verwenden können , aber je nach Zeichenketten, könnte es durchaus ein paar zu versuchen - in unserem Beispiel gibt es 11:
b,c,d,f,j,k,q,v,x,y,z
. Jeder Versuch wäre ziemlich mühsam, wo dieses handliche Werkzeug ist Spiel. Geben Sie Ihre durch Zeilenumbrüche getrennten Zeichenfolgen ein, und es wird versucht, die Zeichenfolgen mit jedem Buchstaben abzugrenzen, der in keiner der Zeichenfolgen enthalten ist, und Folgendes ausgegeben:Das Durchlaufen unserer Beispielzeichenfolgen zeigt, dass
b
die besten Ergebnisse erzielt werden:Und da haben Sie es, wir haben nur 24 Bytes.
Schritt 3
Aber wir können es noch besser machen! Wenn die Reihenfolge der Zeichenfolgen in Ihrem Array keine Rolle spielt, gibt es möglicherweise eine andere Permutation in Kombination mit einem anderen Begrenzer, die sogar noch kürzer ausfallen könnte. Es wird jedoch viel mühsamer sein, jede Möglichkeit auszuprobieren. Mit unseren 4 Saiten können Sie 24 verschiedene Permutationen ausprobieren. Mit jedem der 11 möglichen Buchstaben wird das zu 264! Hier kommt dieses Tool ins Spiel. Geben Sie erneut Ihre durch Zeilenumbrüche getrennten Zeichenfolgen ein, und es wird jede Kombination aus jeder Permutation und jedem Begrenzungsbuchstaben ausprobiert, wobei Folgendes ausgegeben wird:
Das Durchlaufen unserer Beispielzeichenfolgen zeigt, dass
"nougat","oreo","lollipop","marshmallow"
mitb
als Trennzeichen die besten Ergebnisse erzielt werden, mit einer letzten Bytezahl von nur 23:Bonus-Tipp: Integer-Array-Komprimierung
Sie können dasselbe Prinzip auf Arrays von ganzen Zahlen anwenden, indem Sie zuerst jedes in eine höhere Basis konvertieren. Unter Verwendung dieses Beispiels 36-Byte-Array:
Wir können das auf 29 Bytes reduzieren, indem wir es zuerst in ein Array von Basis-32-Strings konvertieren und dann durch das erste Komprimierungsprogramm ausführen:
Oder nur 27 Bytes mit dem zweiten Programm:
Sie können möglicherweise ein weiteres Byte oder 2 zusätzlich dazu speichern, indem Sie die Ganzzahlkonvertierung in eine Methode verschieben, die Sie bereits auf dem Array ausführen.
Anmerkungen
q<letter>(<space>)
Kosten von 1 oder 2 zusätzlichen Bytes zu berücksichtigen·
. Sie können möglicherweise eine der Unicode - Verknüpfungen verwenden , um ein Byte zurückzugewinnen. Dies hängt von Ihrem Trennzeichen ab (qÊ
ist dasselbe wieql<space>
, zum Beispiel).Credits
quelle
Saiten komprimieren
Japt verwendet (derzeit) die Shoco- Bibliothek zur Komprimierung von Strings. Sie können eine beliebige Zeichenfolge mit komprimieren
Oc
, sofern sie Kleinbuchstaben enthält:Diese Ausgabe
HÁM, WŽld!
(Ž
naja , das ist technisch ein nicht druckbares Zeichen). Sie können dies dekomprimieren, indem Sie es in Backticks einwickeln:Online testen!
Alternativ können Sie die
Od
Funktion verwenden, um eine beliebige Zeichenfolge zu dekomprimieren. Dies ist normalerweise nicht nützlich, hat aber seine Absichten ...quelle
HÁM, WŽld!
oder müsste es in Backticks eingeschlossen werden? Ich vermute letzteres.Zahlen mit Char-Codes kürzen
In Japt können Sie
#
, gefolgt von einem Zeichen, einen Zeichencode erstellen. Dies ist nützlich, wenn Sie längere Nummern kürzen möchten.Wie bei @ETHproductions erwähnt, funktioniert dies nur bei dreistelligen Durchläufen im Bereich von 100 bis 255, sofern Sie nicht bereit sind, auf UTF-8 zu wechseln.
Beispiele:
123
kann auf gekürzt werden#{
101
kann auf gekürzt werden#e
Sie können diese sogar miteinander verketten:
123101
kann auf gekürzt werden#{#e
Sie können
String.fromCharCode(123)
JavaScript oder123d
Japt verwenden, um den entsprechenden Charakter zu finden.String.fromCharCode(123)
kehrt zurück{
quelle
String.fromCharCode()
ist eine dieser (vielen!) unangenehmen langen JS-Methoden, die Ihre Byteanzahl auffüllen können. Vermutlich wären dies ganze Zahlen? dh, wenn ich die ganze Zahl123
in einer Lösung brauche , könnte ich verwenden#{
, um ein Byte zu speichern.-Q
Flag in Ihr Eingabefenster einfügen, können Sie den Ausgabetyp besser anzeigen: Anführungszeichen für Zeichenfolgen , Arrays usw.String.fromCharCode(123)
Werke in JavaScript, aber Sie tun können ,123d
in Japt das gleiche Ergebnis zu erhalten ;-) Auch das funktioniert nur auf dreistellige Läufe im Bereich100
-255
(es sei denn , Sie sind bereit , auf UTF-8 wechseln)Kurztipp: Array leeren
[]
Japt hat eine Konstante für ein leeres Array:
A
. Um jedoch darauf zugreifen zu können, müssen Sie;
Ihrem Programm ein Semikolon voranstellen , um die alternativen Konstanten von JaptA
zu verwenden10
. Andernfalls wird dies der Fall sein . Die Verwendung von;A
bietet also tatsächlich eine Einsparung von 0 Byte[]
, wird dies aber tun Sie sparen Bytes , wenn Sie Ihre Array müssen eine Variable zuweisen ( zum BeispielA=[]
).Wenn Ihr Programm jedoch (und nur dann) keine Eingaben vornimmt, können Sie mit der
N
Variablen, die das Array der Eingaben darstellt, mit nur 1 Byte auf das leere Array zugreifen. Ohne Eingaben wäre es leer. Probieren Sie es hier aus .Dies hat auch den zusätzlichen Vorteil, dass Sie die Standardkonstantenwerte in Ihrem Programm verwenden können. In einigen Fällen können Sie
;A
dank der Verknüpfungen fürs1
und auch dann noch Byte sparen , wenn Ihr Programm Eingaben vornimmts2
.quelle
N
, nette Idee.JavaScript auswerten
Mit Japt können Sie rohes JavaScript ausführen, indem Sie es umschließen
$...$
.Beispielsweise,
$alert("hello world")$
Dies kann durch Ausnutzen von Japts Auto-Closing
$
und verkürzt werden)
.$alert("hello world")$
kann auf gekürzt werden$alert("hello world"
JavaScript komprimieren
Sie können JavaScript auch mit komprimieren
Ox
.Wenn es eine JavaScript-Funktion gibt, die Sie beispielsweise verwenden möchten,
screen.width
können Sie den String"screen.width"
mitOc
komprimieren und dann das Ergebnis zwischen Ox` ... `einfügenBeachten Sie, dass Sie in Japt keine schließenden Anführungszeichen benötigen, wenn nichts anderes folgt.
quelle
Ox
den String auswerten. Andernfalls würden Sie nur den Text ausgeben"screen.width"
. BeispielKenne die Flaggen
Nach dem neuesten Metakonsens (Dezember 2017) werden Befehlszeilenflags nicht mehr zu Bytes gezählt. Es ist wirklich eine gute Nachricht für Japt, da es viele Flags für eine zusätzliche Behandlung der Eingabe / Ausgabe gibt.
Alle verfügbaren Flags in Japt werden nachfolgend in der Reihenfolge der Auswertung beschrieben . Die Flags in derselben Gruppe sind einander exklusiv. Beachten Sie, dass die Flags in verschiedenen Gruppen in Kombination verwendet werden können, was ungefähr so aussieht :)
mdefæ
Das gesamte Programm wird auf das erste Argument abgebildet (
U
).Wenn mehrere Argumente vorhanden sind, werden sie unverändert übergeben (dh nicht paarweise zugeordnet). Ansonsten ist das zweite Argument der Index und das dritte ist genau wie das gesamte Array
U.m
. WennU
es sich um eine Zahl handelt, wird sie in einen Bereich konvertiert. Wenn string, wird es in ein Array von Zeichen konvertiert und die Ergebnisse werden zusammengefügt.-m
: Gilt das oben und sonst nichts.-d
: Gibt zurück,true
wenn ein Ergebnis wahr ist,false
ansonsten.-e
: Gibt zurück,true
wenn alle Ergebnisse wahr sind,false
andernfalls.-f
: Gibt das Array von Elementen zurück,U
deren Ergebnisse wahr sind.-æ
: Wendet-f
das erste Element an und gibt es zurück.gh
Übernimmt ein Element am angegebenen Index.
-g
: Nimmt das erste Element (Index 0).-gX
: Nimmt das Element am IndexX
(kann eine beliebige positive Ganzzahl sein).-h
: Nimmt das letzte Element.!¡
Konvertieren Sie das Ergebnis in einen Booleschen Wert.
-!
: Booleschen Wert nicht anwenden.-¡
: Wende den Booleschen Wert nicht zweimal an (gibt die Wahrheit zurück).N
Wandle das Ergebnis in eine Zahl um. Das unäre Plus wird verwendet.
PRSQ
In irgendeinen String konvertieren.
-P
: Verbinden Sie das Array mit""
.-R
: Verbinden Sie das Array mit"\n"
.-S
: Verbinden Sie das Array mit" "
.-Q
: ApplyJSON.stringify
(kann ein beliebiges Objekt sein, nicht nur ein Array). Beispiel .x
Wendet die Funktion
x
auf den Ausgang an. (Es ist buchstäblichx
nicht "eine einzelne Kleinbuchstabenfunktion".)quelle
Unicode-Verknüpfungen
Es gibt viele gemeinsamen Strukturen in Japt , die einfach nicht in einem einzigen ASCII - Zeichen gespeichert werden, wie zum Beispiel
qS
,p2
,mX{
,}
, etc. Also , dies zu umgehen, Japt hat „Unicode - Verknüpfungen“, die Zeichen im Bereich sind\xA1
-\xDE
(¡
-Þ
), die sich auf diese gemeinsamen Strukturen ausweiten. Eine vollständige Liste finden Sie in den Interpreter-Dokumenten .Darüber hinaus
@
steht fürXYZ{
und_
steht fürZ{Z
, für den Aufbau von Funktionen. Lassen Sie uns unser Beispielprogramm anhand einer anderen Antwort betrachten :Erstens können wir ersetzen
X{X
durch_
, was uns gibt:Dann können wir ersetzen
m_
mit®
Speichern ein weiteres Byte:Oder wir könnten ersetzen
X{
durch@
, was uns gibt:Dies ermöglicht es uns dann, die
¡
Verknüpfung zu verwenden, um zwei Bytes zu speichern:Einer dieser beiden Pfade kann 1 Byte mehr als der andere verkürzt werden. Können Sie herausfinden, welche?
quelle
®c s16
für 6 Bytes - gewinne ich ein Cookie ?!®c sG
?csG
.Nutzen Sie die voreingestellten Variablen
Variablen
A
-S
sind auf gemeinsame Werte voreingestellt, die mehr als ein Byte benötigen, um in Japt dargestellt zu werden:A
-G
sind10
-16
.H
ist32
,I
ist64
,J
ist-1
,L
ist100
.K
ist definiert alsnew Date()
, was Sie auf verschiedene Arten manipulieren können.M
undO
sind Objekte mit verschiedenen nützlichen Funktionen. Weitere Informationen finden Sie in den Dokumenten.P
ist die leere Zeichenfolge,Q
ein Anführungszeichen,R
ein Zeilenumbruch undS
ein Leerzeichen.T
ist auf eingestellt0
, damit Sie es bei Bedarf als Akku verwenden können.Wenn das erste Zeichen im Programm ein Semikolon ist
;
,A-L
werden Sie wie folgt zurückgesetzt:A
ist das leere Array[]
.B
ist"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
.C
ist"abcdefghijklmnopqrstuvwxyz"
.D
ist"QWERTYUIOP\nASDFGHJKL\nZXCVBNM"
.E
ist"[a-z]"
, undF
ist"[A-Za-z]"
(nützlich, bevor ich diese als reguläre Ausdrücke hinzufügte)G
ist36
,H
ist65
undI
ist91
(nützlich für Alphabetbereiche).J
ist ein einzelnes Komma;L
, eine einzelne Periode.Heute nur
A
,B
,C
, undD
aus dieser Liste sind wirklich nützlich. Ich plane, ein besseres System hinzuzufügen, das bis zu 256 Zwei-Byte-Variablen zulässt, die auf diese Werte voreingestellt werden, und vieles mehr.quelle
Verwenden Sie Auto-Funktionen
Sie wahrscheinlich bereits wissen , dass
@
und_
sind Abkürzungen fürXYZ{
undZ{Z
jeweils (in den abgedeckten Unicode - Shortcuts Antwort). Aber manchmal kann man Funktionen noch kürzer machen.Angenommen, Sie hatten ein Array von Zeichen und wollten jedes Zeichen seinem Zeichencode zuordnen. Sie können dies mit einer der folgenden Methoden tun:
Aber es gibt einen besseren Weg. Wenn eine Methode oder ein Operator das erste Element nach einer anderen Methode oder einem anderen Operator ist
(
, wird es in eine Zeichenfolge umgewandelt. Diese beiden Zeilen sind also äquivalent:Aber wie hilft das bei unseren Funktionen? Nun, die meisten Methoden, die Funktionen akzeptieren, interpretieren eine Zeichenfolge, die eine Methode oder einen Operator darstellt, als Funktion. Was bedeutet, dass Sie dies auch tun können:
Ich nenne diese "Auto-Funktionen". Es gibt verschiedene Sorten:
m@Xc}
→mc
m@Xc1}
→mc1
m@X+1}
→m+1
m@1+X}
→m!+1
m@2pX}
→m!p2
Hoffentlich kommst du auf die Idee. Um die Argumente auszutauschen, müssen Sie der Methode oder dem Operator lediglich das Präfix voranstellen
!
.quelle
m@2pXÃ
→m!p2<space>
→m!²
.Implizite Variablenzuweisung
Wenn Sie in Japt eine neue Zeile beginnen, wird das Ergebnis der vorherigen Zeile automatisch einer der Eingangsvariablen (
U
-Z
) zugewiesen , wobei die erste ZeileU
die zweiteV
ist und so weiter.Nehmen wir ein Beispiel: Angenommen, Sie möchten zwei Arrays erstellen, von denen eines die Zahlen 1 bis 10 und das andere die Quadrate enthält. Der lange Weg dazu würde so aussehen:
Mit der automatischen Variablenzuweisung kann dies jedoch verkürzt werden auf:
Wir haben dort 4 Bytes gespeichert. In diesem Fall können wir jedoch ein weiteres Byte speichern, da das Array von 1-10 bestimmten Szenarien zugewiesen ist
U
undU
weggelassen werden kann :Vorsicht
Beachten Sie bei diesem Tipp, dass Sie keine Eingabevariablen überschreiben, die Sie später in Ihrem Programm benötigen. Dies kann vermieden werden, indem am Anfang eine oder mehrere Leerzeilen stehen. Im folgenden Beispiel werden die 2 Arrays den Variablen
V
&W
anstelle vonU
& zugewiesenV
:quelle
Kennen Sie das Javascript
Da jeder Japt-Code als transpilierter JS ausgeführt wird, hilft ein gutes Verständnis der JS-Operatoren und der eingebauten Methoden beim Golfen von Japt-Code-Teilen.
Relevante JS-Tipps
U
und wertet es anschließend ausV.m
. (Ein Zeilenumbruch aktiviert die implizite Zuweisung zuU
in der ersten Zeile.)0
über'0
).Relevante integrierte JS-Funktionen
Sehen Sie sich genau an, welche Parameter an Funktionsargumente übergeben werden.
Array.prototype.map
Array.a/b/m/x/y/í
,Number.o/õ
,String.m/y/í
Array.prototype.reduce
Array.r/å
,String.å
; denn daså
vierte Argument wird nicht übergeben.Array.prototype.some
Array.d
Array.prototype.every
Array.e
Bei String-Methoden ist es gut zu wissen, wie sich das Verhalten beim Übergeben eines Strings oder einer Regex mit oder ohne
g
Flag unterscheidet.String.prototype.match
String.f/o
String.prototype.search
String.â
String.prototype.replace
String.e/k/r
e/r
Übergabe von Funktionen als zweites Argument ist in Ordnung, und es wird dringend empfohlen, die Funktionsparameter zu verstehen.quelle
Verwenden Sie bei Bedarf mehrere Zeilen
Für die meisten nicht allzu harten Herausforderungen können Sie die Lösung in nur einer Zeile von Japt als Folge der Anwendung integrierter Funktionen ausdrücken. Für komplexere Anwendungen müssen jedoch Schleifenkonstrukte, Rekursionen oder die Wiederverwendung großer Codestücke verwendet werden. Hier kommt die mehrzeilige Programmierung ins Spiel.
Verschlussklammern entfernen
Aufgabe : Paaren Sie bei einem gegebenen Array von Zahlen jedes Element mit dem quadratischen Index und sortieren Sie es nach der Summe.
[5,1,17,9,3] => [[5,0],[1,1],[17,4],[9,9],[3,16]] => [[1,1],[5,0],[9,9],[3,16],[17,4]]
Einzeilige Lösung ist
íUm@Yp2})ñx
,})
kostet aber zwei Bytes (und es gibt keine Ein-Byte-Verknüpfung). Sie können das entfernen,})
indem Sie das Ende einfachñx
in die nächste Zeile verschieben. Der Code sieht also so aus:und das transpilierte JS wird:
Sie sehen deutlich, dass dies dasselbe bewirkt wie die einzeilige Lösung, indem Sie lediglich das Zwischenergebnis zurückgeben
U
.Verwenden Sie implizite Argumente
Die Rekursionsfunktion verwendet
ß
all ofUVWXYZ
als impliziten Parameter, falls nicht angegeben.U
ist natürlich die Haupteingabe, aber Sie können jede verwendenVWXYZ
, um andere Werte zu verfolgen, die Sie benötigen. Sie können beispielsweise Folgendes tun:Wenn Sie alternativ nur eine temporäre Variable benötigen, können Sie die Inline-Zuweisung
(T=...)
als Variable verwendenT
(0) nur selten unverändert verwendet wird.Eine lange Funktion wiederverwenden
Aus diesem Grund glaube ich nicht, dass ich eine gute Beispielaufgabe finden kann. Ich werde daher auf die einzige Lösung verweisen, für die dieser Tipp verwendet wurde , und nur einige allgemeine Ideen skizzieren.
{
,@
oder_
macht die Arbeit. Alternativ können Sie(T=@...})
die Funktionszuweisung auch in eine komplexere Zeile einbetten.V
ist eine Funktion, und wir möchtenV(U)
JS aufrufen .VU
funktioniert nicht, da es einfach bedeutetV,U
.V(U
tut es auch nicht; es istV,(U)
. Auch die Funktionsmethoden sind wenig hilfreich. Der beste Weg, den wir gefunden haben, ist:[U]xV
(Karte und Summe), wenn das Ergebnis eine Zahl istUmV
ifU
ist ein einzelnes Zeichen undV
gibt eine Zeichenfolge zurück, oder$V($U
oder[U]mV g
allgemein.UmV
.V
Verwenden Sie, um die erste befriedigende Ganzzahl zu findenVa
.quelle
Spaß mit Auto-Funktionen
Als Follow-up zu den allgemeinen Tipp der ETH zu Auto-Funktionen finden Sie in diesem Tipp einige spezifische Beispiele für Tricks zum Speichern von Bytes, die Sie mit diesen Tricks erzielen können. Ich werde sie ergänzen, wenn ich über mehr nachdenke.
Ruft die größte Ganzzahl in einem Array ab.
Angenommen, wir haben das Array
[3,1,4,2]
der Variablen zugewiesenU
und wollen die größte Zahl daraus abrufen. Wir könnten es in 4 Bytes tun, indem wir das Array sortieren und dann das letzte Element einfügen:Der Nachteil dabei ist, dass wir das ursprüngliche Array geändert haben.
U
ist jetzt[1,2,3]
was nicht immer wünschenswert sein mag. Glücklicherweise gibt es eine Möglichkeit, das Array zu ändern, die ebenfalls ein Byte kürzer ist:Was wir dort gemacht haben, ist das Array mit der
w
Methode zu verkleinern , die, wenn sie für eine Ganzzahl verwendet wird, das Größere der Ganzzahl und des Argumentes der Methode2w5
zurückgibt (z5
. B. return ). Das obige ist also das Äquivalent vonUrÈwY
oderUrXY{XwY}
. Beachten Sie jedoch, dass dieser Tipp nicht funktioniert, wenn alle Ganzzahlen im Array negativ sind.quelle
Wann nicht verwenden
í
í
ist eine nützliche Funktion, diezip
zwei Arrays oder Strings paarweise zusammenfügt (oder paarweise ) und optional jedes Paar durch eine Funktion abbildet. Bei ungeraden Arrays oder Strings treten jedoch derzeit einige kleinere Probleme auf:undefined
.Dies kann es beispielsweise schwierig machen, zwei ungerade Zeichenfolgen zu vergleichen und das Zeichen mit dem höheren Codepunkt von jedem Paar zu nehmen. Selbst wenn Sie wissen, dass
U
dies die längere sein wird, dauert es immer noch zu viele Bytes, um diese einfache Aufgabe zu lösen:Sie könnten stattdessen eine Eingabe als Array mit zwei Zeichenfolgen annehmen, das Array mit transponieren
y
und dann jede Zeile dem richtigen Ergebnis zuordnen:Dies hat den Vorteil, dass die kürzere Saite immer mit Leerzeichen aufgefüllt wird, was es zu einem Kinderspiel macht, die gesamte Saite zu durchlaufen.
Beispiele aus der Praxis: 1 , 2
quelle
Generieren Sie den ASCII-Bereich
Während Japt (noch) kein eingebautes Format für den ASCII-Bereich hat, können Sie ein Array von Zeichen in nur 5 Bytes erzeugen:
Versuch es
Wie es funktioniert
95o
Erstellt den Bereich[0,95)
mit jedem Element, das die Auto-Funktion durchläuftd
, die bei Verwendung für eine Zahl das Zeichen an diesem Codepunkt zurückgibt. Übergeben Sied
in diesem Fall eine Zahl als Argument an die MethodeH
Übergeben Sie die Japt-Konstante für 32, und diese wird vor der Konvertierung zur ursprünglichen Zahl hinzugefügt.Eine äquivalente Lösung in JavaScript wäre:
Zufällige Charaktere
Verwenden Sie
ö
stattdessen, um ein zufälliges Zeichen im ASCII-Bereich zu erhalten. Dabei wird eine Zufallszahl aus dem Bereich zurückgegeben[0,X)
. DabeiX
handelt es sich um die Zahl, auf der es ausgeführt wird.Um ein Array mit mehreren zufälligen Zeichen zu erhalten, übergeben Sie die Anzahl der Zeichen, die Sie als Argument für benötigen
ö
. Folgendes gibt 10 Zeichen zurück:quelle
Unnötige Strukturspäne entfernen
Durch strukturelle Zeichen, ich meine
{}
,()
,$
, auch"
und`
. Sie können diese Zeichen normalerweise immer dann entfernen, wenn sie direkt am Ende eines Programms auftreten (zUmX{Xc +"; "} -> UmX{Xc +";
. B. ).Darüber hinaus können Sie Parens oder Leerzeichen entfernen, wenn sie an den folgenden Stellen erscheinen:
;
(oder das Ende des Programms);{
(und durch Erweiterung@
) oder[
oder links von]
oder}
.Kommas werden auch sehr selten benötigt, um Argumente zu trennen. Wenn du
AB
zum Beispiel schreibst, weiß Japt, dass du es ernst meinstA
undB
getrennt. Sie brauchen wirklich nur ein Komma, um zwei numerische Literale zu trennen, wie zUs2,5
.Schließlich, wenn es eine ist
U
zu Beginn eines Programms oder nach einem{
oder;
, gefolgt von einem Methodenaufruf (Kleinbuchstabe oder verwandte Unicode Verknüpfung) oder in einem binären Operator ohne+
und-
(*
,&
,==
, etc.), können Sie entfernen dieU
ein sparen Byte und Japt wird es für Sie einfügen.quelle
U
eine Unterbrechung möglich ist, auch wenn das Programm noch nicht gestartet ist.{
oder;
. Gibt es noch andere, die dir bekannt sind? (Es ist schon eine Weile her, seit ich dieses Feature codiert habe: P)Ändern Sie das letzte Element in einem Array
In manchen Fällen müssen Sie möglicherweise das letzte Element in einem Array ändern. Hier finden Sie eine kurze Erläuterung dazu. Wir werden mit dem Array arbeiten
[2,4,8,32]
der Eingabevariablen zugewiesen ist,U
und die letzte Ganzzahl (32
) durch 2 teilen .Der naheliegende Weg, dies zu erreichen, wäre mit dieser 9-Byte-Lösung ( Demo ):
hnx
Setzt das Element am Indexn
aufx
.gn
Gibt das Element am Index zurückn
.J
ist die Japt-Konstante für-1
, die es uns dank Japts Unterstützung für den negativen Index ermöglicht, mit dem letzten Element in einem Array zu arbeiten. Praktisch, wenn Sie die Größe des Arrays nicht kennen./2
ist einfach Division durch 2.So die oben setzt das Element mit dem Index
-1
in dem Array auf das Element mit dem Index-1
in dem Array durch 2 geteilt oder in JavaScript:U[3]=U[3]/2
. Wenn Sie es so ausschreiben, scheint es eine viel zu umständliche Methode zu sein. Zum Glück gibt es einen kürzeren Weg; Wir könnten das letzte Element aus dem Array entfernen, es ändern und es zurück in das Array verschieben. Jede dieser Operationen einzeln auszuführen würde mehr als 9 Bytes in Anspruch nehmen, aber wir können sie alle auf einmal für nur 7 Bytes ausführen, was eine Einsparung von 2 Bytes bedeutet ( Demo )Übersetzt in JS entspricht dies:
quelle