Maintenant que je suis complètement accro au Code Golf, il est probablement temps que j'essaye de prendre quelques langues de golf.
Étant donné que je joue presque exclusivement en JavaScript, Japt semble être le langage logique pour commencer. Je plongerai dans la documentation à la prochaine occasion, mais en attendant, veuillez publier tous les conseils que vous avez pour Japt dans les réponses ci-dessous.
Comme je suis un débutant dans les langues Japt et le golf en général, si vous pouviez "traduire" vos conseils en JavaScript, si possible, ce serait une grande aide pour m'aider à comprendre les choses.
Réponses:
Passer de JavaScript à Japt
Comme vous le savez peut-être, Japt est simplement une version raccourcie et étendue de JavaScript. J'ai créé Japt parce que j'étais fatigué des longs noms de propriété, comme
String.fromCharCode(x)
etMath.floor(x)
, et de la fastidieuse de faire des choses telles que la création d'une plage. Voici le strict minimum que vous devez savoir lorsque vous passez de JavaScript à Japt:U
,V
,W
,X
,Y
, etZ
; le tableau complet est stocké dansN
. Le résultat de la dernière expression est automatiquement imprimé.a
-z
(età
-ÿ
) sur les nombres, les chaînes et les tableaux. Lorsque vous utilisez l'une de ces lettres, Japt remplit le.
et(
;Uc
dans Japt est équivalent àU.c(
dans JavaScript, ce qui pourrait signifier ceil, charCodeAt ou concat, selon le type deU
. C'est de là que vient la majeure partie du pouvoir de Japt; vous pouvez trouver la liste complète de ces méthodes dans les sections "_____ fonctions" des documents Japt (à l' interpréteur ).)
et)
représente))
. En effet, lorsque j'ai conçu Japt pour la première fois, je voulais économiser autant d'octets que possible, et c'est comme ça que j'ai pensé à faire cela pour la première fois. (Bien queUs w n
cela semble mieux queUs)w)n)
, à mon humble avis.)ABC{...}
, où leABC
peut être n'importe quelle chaîne de variables. Les fonctions fonctionnent pour la plupart comme dans JS, la principale différence étant que la dernière expression est automatiquement renvoyée (plutôt que d'avoir à utiliserreturn
ou à créer des parenthèses ES6).'
désigne une seule chaîne de caractères (c'est-à'a
- dire est la même que"a"
), et#
prend le code de caractère suivant et devient ce nombre (#e
est le même que101
).$
reste le même pendant le processus de transpilation. Vous pouvez l'utiliser pour implémenter desfor
boucles, par exemple, car Japt n'en a pas, mais je suggérerais d'utiliser d'autres méthodes (commem
sur les chaînes et les tableaux, ouo
sur les nombres).""
,0-9
,(
,+
,=
, etc. - restent les mêmes quand transpiled (pour la plupart, de toute façon).Et c'est tout ce que vous devez savoir pour écrire du code Japt de base. Atteindre la puissance de golf maximale dans Japt nécessite plus de connaissances, mais cela peut être trouvé dans d'autres réponses.
Voici un exemple de base. Supposons que vous souhaitiez prendre une chaîne de caractères ASCII et remplacer chacun par son code de caractère hexadécimal. Voici comment procéder en JavaScript:
Maintenant, convertissez-vous en Japt.
.split("")
dans JS est équivalent àq""
dans Japt, ou même plus court, justeq
..join("")
est également justeq
, la différence étant que l'objet est un tableau au lieu d'une chaîne..map(
estm
,.charCodeAt(
estc
et.toString(
ests
. Notre code Japt pourrait donc ressembler à:Dans Japt, cependant,
m
fonctionne aussi bien sur les chaînes que sur les tableaux, nous pouvons donc supprimer les deuxq
s:Testez-le en ligne! Comme vous pouvez le voir dans la case "Code JS", cela se transforme directement en:
Au fur et à mesure que vous apprenez à travailler avec Japt, vous vous concentrerez de moins en moins sur la conversion aller-retour à partir de JavaScript et pourrez coder dans Japt comme son propre langage. Voici une explication en laissant de côté la partie JavaScript:
la source
Um_c s16
?¡Xc s16
:?Compression de tableaux de chaînes
introduction
Si vous avez un tableau de chaînes dans votre code, le moyen le plus évident de le compresser serait d' exécuter chaque chaîne
Oc
individuellement. Pour les besoins de cette astuce, nous allons travailler avec le tableau["lollipop","marshmallow","nougat","oreo"]
, qui pèse initialement 42 octets. L'exécution de chaque chaîneOc
nous donne:C'est maintenant 33 octets, une économie décente.
Étape 1
Mais nous pouvons faire mieux. Si nous joignons le tableau à une chaîne séparée par des sauts de ligne, nous pouvons nous débarrasser des crochets, des virgules et des raccourcis superflus et nous séparer sur le saut de ligne pour obtenir notre tableau. Appliquer cela à notre exemple de tableau nous donne ce qui suit:
Jusqu'à 26 octets maintenant.
Étape 2
Mais , on peut encore faire mieux! Nous pourrions utiliser une lettre minuscule pour délimiter les chaînes au lieu d'une nouvelle ligne, qui pourrait être incluse dans la compression.
z
n'est utilisé dans aucune de nos chaînes, alors allons-y et voyons comment nous allons.Ah, les noix - aucune amélioration là-bas; notre nombre d'octets a augmenté de un! Il pourrait y avoir une autre lettre que vous pouvez utiliser , mais, en fonction de vos chaînes, il pourrait y avoir un assez grand nombre pour essayer - dans notre exemple , il y a 11:
b,c,d,f,j,k,q,v,x,y,z
. Essayer chacun serait assez fastidieux, c'est là que cet outil pratique entre en jeu; alimentez-le avec vos chaînes séparées par des sauts de ligne et il essaiera de délimiter les chaînes avec chaque lettre qui n'est contenue dans aucune d'entre elles et affichera:L'exécution de nos exemples de chaînes montre que cela
b
donne les meilleurs résultats:Et voilà, nous sommes à seulement 24 octets.
Étape 3
Mais nous pouvons faire encore mieux! Si l'ordre des chaînes dans votre tableau n'a pas d'importance, il y a peut-être une permutation différente combinée à un délimiteur différent qui pourrait fonctionner encore plus court. Essayer chaque possibilité sera cependant beaucoup plus fastidieux. Avec nos 4 cordes, il y a 24 permutations différentes à essayer. Avec chacune des 11 lettres possibles cela devient 264! C'est là que cet outil entre en jeu. Encore une fois, alimentez-le avec vos chaînes séparées par une nouvelle ligne et il essaiera toutes les combinaisons de chaque permutation et de chaque lettre de délimitation, produisant:
L'exécution de nos exemples de chaînes montre que
"nougat","oreo","lollipop","marshmallow"
avecb
comme délimiteur donne les meilleurs résultats, avec un nombre d'octets final de seulement 23:Astuce bonus: Compression de tableau entier
Vous pouvez appliquer le même principe aux tableaux d'entiers en convertissant d'abord chacun en une base plus élevée. En utilisant cet exemple, tableau de 36 octets:
Nous pouvons réduire cela à 29 octets en le convertissant d'abord en un tableau de chaînes de base 32, puis en l'exécutant via le premier programme de compression:
Ou aussi peu que 27 octets en utilisant le deuxième programme:
Vous pouvez peut-être enregistrer un autre octet ou 2 en plus en déplaçant la conversion d'entier dans une méthode que vous exécutez déjà sur le tableau.
Remarques
q<letter>(<space>)
coûts de 1 ou 2 octets supplémentaires·
. Cependant, vous pouvez peut-être utiliser l'un des raccourcis Unicode pour récupérer un octet, en fonction de votre délimiteur (qÊ
identique àql<space>
, par exemple).Crédits
la source
Compression des cordes
Japt (actuellement) utilise la bibliothèque shoco pour la compression de chaînes. Vous pouvez compresser une chaîne arbitraire en utilisant
Oc
, tant qu'elle contient des séries de lettres minuscules:Cela produit
HÁM, WŽld!
(enfin,Ž
c'est techniquement un caractère non imprimable). Vous pouvez décompresser cela en l'enveloppant dans des crochets:Testez-le en ligne!
Vous pouvez également utiliser la
Od
fonction pour décompresser une chaîne arbitraire. Ce n'est généralement pas utile, mais il a ses objectifs ...la source
HÁM, WŽld!
ou devrait-il être enfermé dans des crochets? Je devine ce dernier.Raccourcir les nombres avec des codes de caractères
Dans Japt, vous pouvez utiliser
#
, suivi d'un caractère pour créer un code de caractère. Cela est utile lorsque vous raccourcissez des nombres plus longs.Comme @ETHproductions l'a mentionné, cela ne fonctionne que sur des exécutions à trois chiffres dans la plage 100-255, sauf si vous êtes prêt à passer en UTF-8.
Exemples:
123
peut être raccourci en#{
101
peut être raccourci en#e
Vous pouvez même les enchaîner:
123101
peut être raccourci en#{#e
Vous pouvez utiliser
String.fromCharCode(123)
en JavaScript ou123d
en Japt pour trouver le caractère approprié.String.fromCharCode(123)
Retour{
la source
String.fromCharCode()
est l'une de ces (nombreuses!) méthodes JS terriblement longues qui peuvent analyser votre nombre d'octets. Vraisemblablement, ceux-ci seraient considérés comme des entiers? c'est-à-dire, si j'ai besoin de l'entier123
dans une solution, je pourrais utiliser#{
pour enregistrer un octet.-Q
indicateur dans votre fenêtre d'entrée, vous pouvez mieux visualiser le type de sortie: guillemets autour de chaînes , tableaux , etc.String.fromCharCode(123)
fonctionne en JavaScript, mais vous pouvez le faire123d
dans Japt pour obtenir le même résultat ;-) En outre, cela ne fonctionne que sur des exécutions à trois chiffres de la plage100
-255
(sauf si vous êtes prêt à passer en UTF-8)Conseil rapide: tableau vide
[]
Japt a une constante pour un tableau vide:
A
. Mais, pour y accéder, vous devez ajouter un point-virgule;
à votre programme pour utiliser les constantes alternatives de Japt, sinon ceA
sera le cas10
. Donc , en utilisant;A
offre en fait un 0 octet d' économiser plus[]
, mais va vous faire économiser octets si vous devez affecter votre tableau à une variable (par exempleA=[]
).Cependant, si (et seulement si) votre programme ne prend aucune entrée, vous pouvez accéder au tableau vide avec seulement 1 octet en utilisant la
N
variable, qui est le tableau des entrées - sans entrée, il serait vide. Essayez-le ici .Cela a également l'avantage supplémentaire de vous permettre d'utiliser les valeurs constantes par défaut dans votre programme et, dans certains cas, peut encore vous faire économiser des octets lors de l'utilisation
;A
même lorsque votre programme prend des entrées grâce aux raccourcis pours1
ets2
.la source
N
, bonne idée.Évaluation de JavaScript
Japt vous permet d'exécuter du JavaScript brut en l'enveloppant
$...$
.Par exemple,
$alert("hello world")$
Cela peut être raccourci en profitant de la fermeture automatique
$
et de Japt)
.$alert("hello world")$
peut être raccourci en$alert("hello world"
Compression de JavaScript
Vous pouvez également compresser JavaScript en utilisant
Ox
.S'il existe une fonction JavaScript que vous souhaitez utiliser, par exemple
screen.width
, vous pouvez compresser la chaîne à l'"screen.width"
aideOc
, puis en insérant le résultat entre Ox` ... `Notez que vous n'avez pas besoin de fermer les guillemets dans Japt lorsqu'il n'est suivi par rien d'autre.
la source
Ox
pour évaluer la chaîne. Sinon, vous ne feriez que sortir le texte"screen.width"
. ExempleConnaissez les drapeaux
Selon le dernier méta-consensus (décembre 2017) , les indicateurs de ligne de commande ne sont plus comptés dans les octets. C'est vraiment une excellente nouvelle pour Japt car il a de nombreux indicateurs pour un traitement supplémentaire en entrée / sortie.
Tous les indicateurs disponibles dans Japt sont décrits ci-dessous, dans l'ordre d'évaluation . Les drapeaux du même groupe sont exclusifs les uns aux autres. Notez que les drapeaux de différents groupes peuvent être utilisés en combinaison, ce qui donne quelque chose comme ça :)
mdefæ
L'ensemble du programme est mappé sur le premier argument (
U
).Si plusieurs arguments sont présents, ils sont transmis tels quels (c'est-à-dire non mappés par paire). Sinon, le deuxième argument est l'index, et le troisième est le tableau entier, tout comme
U.m
. SiU
est un nombre, il est converti en plage; si chaîne, elle est convertie en tableau de caractères et les résultats sont réunis.-m
: Applique ce qui précède et rien d'autre.-d
: Retournetrue
si un résultat est vrai,false
sinon.-e
: Renvoietrue
si tous les résultats sont véridiques,false
sinon.-f
: Renvoie le tableau des élémentsU
dont les résultats sont véridiques.-æ
: Applique-f
et renvoie son premier élément.gh
Prend un élément à l'index spécifié.
-g
: Prend le premier élément (index 0).-gX
: Prend l'élément à l'indexX
(peut être n'importe quel entier positif).-h
: Prend le dernier élément.!¡
Convertissez le résultat en booléen.
-!
: Appliquer booléen pas.-¡
: Appliquer booléen pas deux fois (retourne la véracité).N
Convertissez le résultat en nombre. Le plus unaire est utilisé.
PRSQ
Convertissez en chaîne quelconque.
-P
: Rejoignez le tableau avec""
.-R
: Rejoignez le tableau avec"\n"
.-S
: Rejoignez le tableau avec" "
.-Q
: AppliquerJSON.stringify
(peut être n'importe quel objet, pas seulement un tableau). Exemple .x
Applique la fonction
x
à la sortie. (Ce n'est littéralementx
pas "une seule fonction de l'alphabet minuscule".)la source
Raccourcis Unicode
Il y a beaucoup de structures communes dans Japt qui ne peut pas être stockés dans un seul char ASCII, tels que
qS
,p2
,mX{
,}
, etc. Donc , pour contourner ce problème, Japt a « raccourcis Unicode », qui sont des caractères dans la plage\xA1
-\xDE
(¡
-Þ
) qui s'étendent à ces structures communes. Vous pouvez trouver une liste complète de ceux-ci dans la documentation de l' interpréteur .En outre,
@
signifieXYZ{
et_
signifie pourZ{Z
aider à créer des fonctions. Jouons donc notre exemple de programme à partir d' une autre réponse :Tout d'abord, nous pouvons remplacer
X{X
par_
, ce qui nous donne:Ensuite, nous pouvons remplacer
m_
par l'®
enregistrement d'un autre octet:Ou nous pourrions remplacer
X{
par@
, ce qui nous donne:Cela nous permet ensuite d'utiliser le
¡
raccourci pour économiser deux octets:L'un de ces deux chemins peut être raccourci d'un octet de plus que l'autre. Pouvez-vous comprendre lequel?
la source
®c s16
pour 6 octets - est-ce que je gagne un cookie?!®c sG
?csG
.Profitez des variables prédéfinies
Variables
A
-S
sont prédéfinies à des valeurs communes qui prennent plus d'un octet à représenter dans Japt:A
-G
sont10
-16
.H
est32
,I
est64
,J
est-1
,L
est100
.K
est défini commenew Date()
, que vous pouvez manipuler de différentes manières.M
etO
sont des objets avec diverses fonctions utiles. Vous pouvez en savoir plus dans la documentation.P
est la chaîne vide,Q
est un guillemet,R
est un saut de ligne etS
est un espace.T
est défini sur0
, vous pouvez donc l'utiliser comme accumulateur si nécessaire.Si le premier caractère du programme est un point-virgule
;
,A-L
sont réinitialisés comme suit:A
est le tableau vide[]
.B
est"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
.C
est"abcdefghijklmnopqrstuvwxyz"
.D
est"QWERTYUIOP\nASDFGHJKL\nZXCVBNM"
.E
est"[a-z]"
, etF
est"[A-Za-z]"
(utile avant de les ajouter comme fonctionnalités d'expression régulière)G
est36
,H
est65
etI
est91
(utile pour les plages alphabétiques).J
est une seule virgule;L
, une seule période.Aujourd'hui seulement
A
,B
,C
etD
de cette liste sont vraiment utiles. Je prévois d'ajouter un meilleur système qui autorise jusqu'à 256 variables à deux octets, qui seront prédéfinies à ces valeurs et bien plus encore.la source
Utiliser les fonctions automatiques
Vous le savez probablement déjà
@
et ce_
sont des raccourcis pourXYZ{
etZ{Z
, respectivement (couverts dans la réponse des raccourcis Unicode ). Mais parfois, vous pouvez raccourcir les fonctions.Supposons que vous disposiez d'un tableau de caractères et que vous vouliez mapper chaque caractère à son code de caractère. Vous pouvez le faire avec l'un ou l'autre de ces éléments:
Mais il y a une meilleure façon. Si une méthode ou un opérateur est le premier élément après une autre méthode ou un
(
, il est transformé en chaîne. Ces deux lignes sont donc équivalentes:Mais comment cela aide-t-il avec nos fonctions? Eh bien, la plupart des méthodes qui acceptent des fonctions, si elles reçoivent une chaîne représentant une méthode ou un opérateur, l'interpréteront comme une fonction. Ce qui signifie que vous pouvez également le faire:
J'appelle ces "fonctions automatiques". Il existe plusieurs variétés différentes:
m@Xc}
→mc
m@Xc1}
→mc1
m@X+1}
→m+1
m@1+X}
→m!+1
m@2pX}
→m!p2
J'espère que vous avez l'idée. Pour permuter les arguments, préfixez simplement la méthode ou l'opérateur avec
!
.la source
m@2pXÃ
→m!p2<space>
→m!²
.Affectation implicite de variable
Chaque fois que vous démarrez une nouvelle ligne dans Japt, le résultat de la ligne précédente est automatiquement affecté à l'une des variables d'entrée (
U
-Z
), la première ligne étantU
la deuxièmeV
, etc.Prenons un exemple: supposons que vous vouliez créer 2 tableaux avec lesquels travailler, l'un contenant les nombres 1-10 et l'autre contenant leurs carrés. Le long chemin à parcourir serait le suivant:
Cependant, en utilisant l'affectation automatique des variables, cela peut être raccourci:
Nous y avons enregistré 4 octets. Mais, dans ce cas, nous pouvons enregistrer un octet de plus car le tableau de 1 à 10 est affecté à
U
etU
peut être omis dans certains scénarios :Mise en garde
Une chose à laquelle vous devez faire attention avec cette astuce est que vous n'écrasez pas les variables d'entrée dont vous pourriez avoir besoin plus tard dans votre programme. Cela peut être évité en laissant une ou plusieurs lignes vides au début. Dans l'exemple suivant, les 2 tableaux seront affectés aux variables
V
&W
, au lieu deU
&V
:la source
Connaître le Javascript
Étant donné que tout code Japt s'exécute en tant que JS transpilé, une bonne compréhension des opérateurs JS et des méthodes intégrées aide beaucoup à jouer au golf des morceaux de code Japt.
Conseils JS pertinents
U
puis évalueV.m
. (La présence d'une nouvelle ligne active l'affectation implicite àU
la première ligne.)0
dessus'0
).Fonctions intégrées JS pertinentes
Examinez attentivement les paramètres passés aux arguments de fonction.
Array.prototype.map
Array.a/b/m/x/y/í
,Number.o/õ
,String.m/y/í
Array.prototype.reduce
Array.r/å
,String.å
; carå
, le 4ème argument n'est pas passé.Array.prototype.some
Array.d
Array.prototype.every
Array.e
Pour les méthodes de chaîne, il est bon de savoir comment les comportements diffèrent entre le passage d'une chaîne ou d'une expression régulière avec ou sans
g
indicateur.String.prototype.match
String.f/o
String.prototype.search
String.â
String.prototype.replace
String.e/k/r
e/r
, passer des fonctions comme 2ème argument est OK, et la compréhension des paramètres de fonction est fortement encouragée.la source
Utilisez plusieurs lignes si nécessaire
Pour la plupart des défis pas trop difficiles, vous pouvez exprimer la solution dans une seule ligne de Japt, sous la forme d'une séquence d'application de fonctions intégrées. Mais les plus complexes nécessiteront l'utilisation de constructions en boucle, la récursivité ou la réutilisation de gros morceaux de code. C'est là qu'intervient la programmation multi-lignes.
Supprimer les parens de fermeture
Tâche : étant donné un tableau de nombres, associez chaque élément à l'index au carré et triez-le par la somme.
[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]]
La solution à une ligne l'est
íUm@Yp2})ñx
, mais})
coûte deux octets (et il n'y a pas de raccourci d'un octet). Vous pouvez supprimer})
en déplaçant simplementñx
la dernière ligne vers la ligne suivante, de sorte que le code ressemble à ceci:et le JS transpilé devient:
Vous pouvez clairement voir que cela fait la même chose que la solution à une ligne, en attribuant simplement le résultat intermédiaire à
U
.Recurse avec des arguments implicites
La fonction de récursivité
ß
prend toutUVWXYZ
comme paramètre implicite, si elle n'est pas spécifiée.U
est évidemment l'entrée principale, mais vous pouvez utiliser n'importe laquelleVWXYZ
pour garder une trace des autres valeurs dont vous avez besoin. Par exemple, vous pouvez faire quelque chose comme ceci:Alternativement, si tout ce que vous voulez est une variable temporaire, vous pouvez utiliser l'affectation en ligne, comme
(T=...)
, comme variableT
(0) est rarement utilisée telle quelle.Réutiliser une fonction longue
Pour cela, je ne pense pas que je puisse trouver un bon exemple de tâche, donc je vais faire référence à la seule solution que cette astuce a été utilisée , et juste décrire quelques idées générales.
{
,@
ou_
fait le travail. Alternativement, vous pouvez également faire quelque chose comme(T=@...})
pour incorporer l'affectation de fonction dans une ligne plus complexe.V
c'est une fonction et que nous voulons appelerV(U)
en JS.VU
ne fonctionne pas car cela signifie simplementV,U
.V(U
non plus; c'estV,(U)
. Même les méthodes de fonction ne sont pas très utiles. La meilleure façon que nous avons trouvée est:[U]xV
(carte et somme) si le résultat est un nombreUmV
siU
est un seul caractère etV
renvoie une chaîne, ou$V($U
ou[U]mV g
en général.UmV
. Pour trouver le premier entier satisfaisantV
, utilisezVa
.la source
Amusant avec les fonctions automatiques
Dans le prolongement de l'astuce générale de l'ETH sur les fonctions automatiques , cette astuce fournira quelques exemples spécifiques de trucs d'économie d'octets que vous pouvez réaliser avec eux, que j'ajouterai en y réfléchissant davantage.
Obtenez le plus grand entier d'un tableau.
Supposons que le tableau soit
[3,1,4,2]
affecté à la variableU
et que nous en récupérions le plus grand nombre. Nous pourrions le faire en 4 octets en triant le tableau puis en éclatant le dernier élément:L'inconvénient est que nous avons modifié le tableau d'origine;
U
est maintenant[1,2,3]
ce qui n'est pas toujours souhaitable. Heureusement, il existe un moyen de le faire sans modifier le tableau qui est également un octet plus court:Ce que nous y avons fait est de réduire le tableau en utilisant la
w
méthode qui, lorsqu'elle est utilisée sur un entier, renvoie le plus grand de l'entier et l'argument de la méthode (par exemple,2w5
renvoie5
). Donc, ce qui précède est l'équivalent deUrÈwY
ouUrXY{XwY}
. Notez cependant que cette astuce ne fonctionnera pas si tous les entiers du tableau sont négatifs.la source
Quand non pas utiliser
í
í
est un outil intégré utile qui associe (ouzip
s) deux tableaux ou chaînes, et mappe éventuellement chaque paire via une fonction. Cependant, il présente actuellement quelques problèmes mineurs lorsqu'il est donné des tableaux ou des chaînes inégaux:undefined
.Cela peut rendre difficile, par exemple, la comparaison de deux chaînes inégales et de prendre le caractère avec le point de code le plus élevé de chaque paire. Même si vous savez que ce
U
sera le plus long, il faut encore beaucoup d'octets pour résoudre cette tâche simple:Ce que vous pourriez faire à la place serait de prendre l'entrée comme un tableau de deux chaînes, de transposer le tableau avec
y
, puis de mapper chaque ligne au résultat correct:Cela a l'avantage de toujours remplir la chaîne la plus courte avec des espaces, ce qui en fait un morceau de gâteau pour parcourir l'intégralité des deux chaînes.
Exemples concrets: 1 , 2
la source
Générer la plage ASCII
Bien que Japt n'ait pas (encore) de fonction intégrée pour la plage ASCII, vous pouvez générer un tableau de caractères en seulement 5 octets:
Essayez-le
Comment ça fonctionne
95o
crée la plage[0,95)
avec chaque élément passant par la fonction automatiqued
qui, lorsqu'elle est utilisée sur un nombre, renvoie le caractère à ce point de code. Passez un nombre comme argument aud
méthode, dans ce casH
, la constante Japt pour 32, et elle sera ajoutée au nombre d'origine avant d'être convertie.Une solution équivalente en JavaScript serait:
Caractères aléatoires
Pour obtenir un caractère aléatoire dans la plage ASCII, utilisez à la
ö
place, qui renvoie un nombre aléatoire de la plage[0,X)
, oùX
est le numéro sur lequel il est exécuté.Ou, pour obtenir un tableau de plusieurs caractères aléatoires, passez le nombre de caractères dont vous avez besoin comme argument de
ö
. Les éléments suivants renvoient 10 caractères:la source
Supprimez les caractères structurels inutiles
En caractères structuraux, je veux dire
{}
,()
,$
, même"
et`
. Vous pouvez généralement supprimer ces caractères chaque fois qu'ils surviennent à la fin d'un programme (par exempleUmX{Xc +"; "} -> UmX{Xc +";
).De plus, vous pouvez supprimer des parens ou des espaces chaque fois qu'ils apparaissent aux endroits suivants:
;
(ou la fin du programme);{
(et par extension,@
) ou[
, ou à gauche de]
ou}
.En outre, les virgules sont très rarement nécessaires pour séparer les arguments. Si vous écrivez
AB
, par exemple, Japt sait que vous voulez direA
etB
séparément. Vous n'avez vraiment besoin que d'une virgule pour séparer deux littéraux numériques, tels queUs2,5
.Enfin, s'il y a un
U
au début d'un programme ou après un{
ou;
suivi d'un appel de méthode (lettre minuscule ou raccourci Unicode liés) ou tout opérateur binaire hors+
et-
(*
,&
,==
, etc.), vous pouvez supprimer leU
pour enregistrer un octet et Japt l'insérera pour vous.la source
U
peuvent être omis même quand ce n'est pas au début du programme.{
ou;
. Y en a-t-il d'autres que vous connaissez? (Cela fait un moment que je n'ai pas codé cette fonctionnalité: P)Modifier le dernier élément d'un tableau
Parfois, vous devrez peut-être modifier le dernier élément d'un tableau, alors voici une explication d'une manière courte de le faire. Nous allons travailler avec le tableau
[2,4,8,32]
affecté à la variable d'entréeU
et diviser le dernier entier (32
) par 2.La manière évidente d'y parvenir serait avec cette solution de 9 octets ( démo ):
hnx
définit l'élément à l'indexn
surx
.gn
renvoie l'élément à l'indexn
.J
est la constante Japt pour-1
qui, grâce au support de Japt pour un indice négatif, nous permet de travailler avec le dernier élément d'un tableau; pratique lorsque vous ne connaissez pas la taille du tableau./2
est simplement une division par 2.Donc, ce qui précède définit l'élément à l'index
-1
dans le tableau à l'élément à l' index-1
dans le tableau divisé par 2. Ou en JavaScript:U[3]=U[3]/2
. Lorsque vous l'écrivez comme ça, cela semble être une manière beaucoup trop longue de s'y prendre. Heureusement, il existe un chemin plus court; nous pourrions extraire le dernier élément du tableau, le modifier et le repousser dans le tableau. L'exécution de chacune de ces opérations individuellement prendrait plus de 9 octets, mais nous pouvons les faire toutes à la fois pour seulement 7 octets, une économie de 2 octets ( Démo )Traduit en JS, c'est l'équivalent de:
la source