Convertir le tableau de valeurs d'octets en base64 de la chaîne et de briser les longues lignes, Javascript (code de golf)
Cette fonction JavaScript prend un tableau de nombres (dans la plage de 0 à 255) et la convertit en une chaîne base64, puis les pauses longues lignes si nécessaire:
function encode(data)
{
var str = "";
for (var i = 0; i < data.length; i++)
str += String.fromCharCode(data[i]);
return btoa(str).split(/(.{75})/).join("\n").replace(/\n+/g, "\n").trim();
}
Pouvez-vous faire la même chose en moins de code? Pouvez-vous faire en sorte qu'elle s'exécute plus rapidement? La portabilité de la pas un objet, l'utilisation de la marque de nouvelles fonctionnalités de la langue si vous voulez, mais s 'dois être en JavaScript.
- S'exécute plus rapidement dans ce navigateur(s)?
btoa
est uniquement pris en charge par les navigateurs Gecko et WebKit pour autant que je sais. - Il se trouve que c'est un très petit morceau de une extension de Firefox, mais si vous avez un moyen astucieux de le faire en utilisant un autre navigateur JS, je serais heureux de voir que, trop.
- ahem... codegolf.stackexchange.com
- codegolf.SE est juste pour le divertissement; c'est un réel, légitime problème de programmation.
Vous devez vous connecter pour publier un commentaire.
J'ai une autre entrée:
Minifiés, 88 caractères:
Ou si vous voulez de nouvelles lignes de fuite, 85 caractères:
apply
. Il y a une limite matérielle de quelque chose comme 2**19 arguments d'une fonction (dans Firefox, de toute façon) et je pense qu'il pourrait avoir à faire plus d'un peu de travail supplémentaire déballage de la matrice dans l'argument de la zone. Je n'attends pas de mes tableaux à que depuis longtemps, cependant, et la brièveté est agréable.map
ouapply
serait le meilleur, c'est pourquoi je upvoted cette réponse, mais pas votre autre.Fonctionne dans Firefox 3.6.13:
trim
là?/.{1,76}/g
).reduce
bien que j'imagine que c'est pas plus vite que la boucle for, depuis le big coût va être de plus en plus la chaîne.Je n'ai pas Firefox à portée de main, donc je ne peux pas l'essayer, mais à partir d'un général de la chaîne de manutention de point de vue, il semble que vous avez un peu de place à l'amélioration. Ce que vous faites est, pour chaque octet, la création d'une nouvelle chaîne d'un caractère de plus que votre précédente. C'est un O(N^2) opération. Il ya quelques façons de couper vers le bas N de sorte que votre algorithme s'exécute en temps quasi-linéaire dans le temps:
Construire des chaînes de longueur 57 (cela donnera une 76-char Base64 résultat), puis d'effectuer une
btoa
sur elle et d'ajouter la chaîne résultante à votre sortieTout comme #1, seulement de construire un tableau de lignes et d'appels
join
pour créer le résultat final de la chaîne.Utilisation
map
pour créer un tableau de 1-les chaînes de caractères, puis d'appelerjoin
sur elle.Voici une partie du code non testé pour chaque méthode:
Et voici la dernière, minimisé (116 caractères):
btoa
.