J'ai entendu dire que votre code peut fonctionner plus rapidement si vous l'indenter en sens inverse, de sorte que le compilateur puisse le traiter comme un motif de conception d'arborescence à partir du sommet des "branches". Cela aide car la gravité accélère le temps nécessaire à la compilation de votre code et améliore l'efficacité de la structure de données. Voici un exemple de script Java:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Mais pour une raison quelconque, Notepad n’a pas de paramètre permettant de le faire automatiquement; j’ai donc besoin d’un programme pour le faire à ma place.
La description
Les soumissions doivent prendre un extrait de code en entrée, inverser l'indentation et générer le code obtenu.
Ceci est fait par la procédure suivante:
Divisez le code en lignes. Chaque ligne commencera par zéro ou plusieurs espaces (il n'y aura pas de tabulations).
Trouvez tous les niveaux d'indentation uniques dans le code. Par exemple, pour l'exemple ci-dessus, ce serait
0 4 8 12
Inversez l'ordre de cette liste de niveaux d'indentation et mappez la liste inversée à la liste d'origine. C'est difficile à expliquer avec des mots, mais pour l'exemple, cela ressemblerait à
0 — 12 4 — 8 8 — 4 12 — 0
Appliquez ce mappage au code d'origine. Dans l'exemple, une ligne avec une indentation de 0 espace deviendrait indentée de 12 espaces, 4 espaces deviendraient 8 espaces, etc.
Entrée sortie
L'entrée et la sortie peuvent être fournies comme vous le souhaitez (STDIN / STDOUT, paramètre de fonction / valeur de retour, etc.); Si votre langue ne prend pas en charge la saisie multiligne (ou si vous ne le souhaitez pas), vous pouvez utiliser le |
caractère pour séparer les lignes.
L'entrée consistera uniquement en nouvelles lignes ASCII + imprimables et ne contiendra pas de lignes vides.
Cas de test
Contribution:
function fib(n) {
var a = 1, b = 1;
while (--n > 0) {
var tmp = a;
a = b;
b += tmp;
if (a === Infinity) {
return "Error!";
}
}
return a;
}
Sortie: l'exemple de code ci-dessus.
Contribution:
a
b
c
d
e
f
g
h
Sortie:
a
b
c
d
e
f
g
h
Contribution:
1
2
3
2
1
Sortie:
1
2
3
2
1
Contribution:
foo
Sortie:
foo
la source
Réponses:
CJam,
43 39 3635 octetsCela semble trop long. Je suis sûr que je ne suis pas l' optimisation assez!Comment ça fonctionne:
L’idée de base est de scinder l’entrée sur la nouvelle ligne, de calculer le nombre d’espaces en début de ligne, de trier et d’obtenir des nombres uniques, de copier ce tableau et de l’inverser, de translittérer les numéros originaux dans l’ordre avec ces deux tableaux, puis de former le chaîne finale en utilisant cette information.
La partie la plus longue consiste à déterminer le nombre d'espaces de début dans chaque ligne, car CJam n'a pas de moyen facile de le faire.
Expansion du code:
Et dans l'esprit de la question. Une véritable expansion du code:
7 octets économisés grâce à Martin et 1 octet grâce à Dennis
Essayez-le en ligne ici
la source
{}#
a un bug: il retourne un entier, mais il devrait retourner un long. Ironiquement,i
(cast to integer) corrige ce problème. 2. Depuis""#
n'a pas le même bug,_Sm0=#
est un octet plus court.Python 2 -
137131 octetsPrend entrée avec
|
au lieu de\n
.Explication
Les trois premières lignes sont assez simples. Dressez une liste de toutes les lignes de l'entrée, définissez une fonction qui vous indique le nombre d'espaces d'une chaîne, et créez une liste triée de valeurs que la fonction crache pour chaque ligne d'entrée.
La dernière ligne est bien plus amusante.
la source
()
économiser 4raw_
f(s)for s in i
devrait êtremap(f,i)
.d=[];d+=set(L)
est une version plus courte ded=sorted(set(L))
.JavaScript, ES6,
113 103101 octetsJe suis presque sûr que cela peut être joué au moins un peu plus loin, mais voilà.Je n'aurais jamais pensé qu'il y aurait une solution JS de 101 octets, battant Python!
Cela crée une méthode nommée
f
qui peut être appelée avec la chaîne d'entrée. Si vous êtes dans un Firefox récent, vous avez des modèles de chaînes et vous pouvez appeler la méthode commeSinon, vous pouvez aussi l'appeler comme
ou essayez l'extrait ci-dessous:
la source
\s
par un caractère d'espacement), et en supprimant les parenthèsesx
dans la fonction de remplacement.(x)
: /b
etc
vous? Ils se réfèrent simplement au même tableau de toute façon.Ruby, 63 octets
Ceci définit une fonction non nommée qui prend et retourne une chaîne. Vous pouvez l'appeler en ajoutant
["string here"]
ou en l'attribuant à une variable, puis en appelant cette variable.Fonctionnement:
s.scan(r=/^ */)
donne une liste de tous les espaces et magasins principaux qui contiennent des expressions rationnellesr
pour une utilisation ultérieure.uniq
élimine les doublons.sort
... tris.Maintenant, passez à la fin,
l.zip(l.reverse)
donne un tableau de paires que nous voulons substituer.to_h
transforme cela en un hachage, interprétant les paires comme des paires clé-valeur.A présent,
s.gsub
remplacez toutes les correspondances de l'expression rationnelle (tous les espaces de début) en utilisant ce hachage comme table de consultation pour trouver le remplacement.la source
Pyth 39
Essayez-le en ligne.
Utilise l'
|
option de délimiteur.la source
Japt
-R
, 27 octetsEssayez-le en ligne!
Déballé et comment ça marche
Comment ça marche vraiment
la source
Scala,
176171Il ajoutera une nouvelle ligne à la fin. Si je n'ai pas eu à préserver des espaces en bout de ligne, je peux le faire en 167:
Ungolfed:
la source
PowerShell , 112 octets
Essayez-le en ligne!
Moins joué au golf:
la source
Haskell, 116
la source
PHP - 173 octets
Le code non optimisé doit être stocké dans la
$v
variable:Voici la version non-golfée et commentée:
Je n'ai probablement jamais écrit quelque chose d'aussi sale. J'ai honte.
la source
JavaScript, 351
Version non-golfée:
Essai
Afficher l'extrait de code
Afficher l'extrait de code
Afficher l'extrait de code
Afficher l'extrait de code
la source
Perl 5, 112
111 + 1 pour
-n
(-E
gratuit)Je suis sûr que cela peut être fait en moins de coups, mais je ne vois pas comment pour le moment.
la source