7
votes

Comment créer une fonction qui convertit un numéro à un hexavigesimal bijectif?

Peut-être que je ne suis pas suffisamment bon en mathématiques, mais j'ai un problème pour convertir un nombre en alphabétique pur BIJEFIVE HEXAVIGESIMAL Comme comment Microsoft Excel / OpenOffice Calc le faire.

Voici une version de mon code mais ne m'a pas donné la sortie dont j'avais besoin: P>


    var toHexvg = function(a){
     var x='';
     var let="_abcdefghijklmnopqrstuvwxyz";
     var len=let.length;
     var b=a;
     var cnt=0;
     var y = Array();
     do{
      a=(a-(a%len))/len;
      cnt++;
     }while(a!=0)
     a=b;
     var vnt=0;
     do{
      b+=Math.pow((len),vnt)*Math.floor(a/Math.pow((len),vnt+1));
      vnt++;
     }while(vnt!=cnt)
     var c=b;
     do{
      y.unshift( c%len );
      c=(c-(c%len))/len;
     }while(c!=0)
     for(var i in y)x+=let[y[i]];
     return x;
    }


9 commentaires

aa n'a pas vraiment de sens. C'est 00 . Le "numéro" après z est ba , votre sortie semble donc être correcte. Ou est _ votre 0 , ce qui semble un peu étrange?


uhm, désolé pour le code de l'échantillon, suppose que je ne devrais pas la poster, je pense que cela a fait exprimer ma question plus compliqué, ahaha ... mais je suppose que mon résultat n'est que j'ai besoin d'un code qui génère le YZ AA AB et Non YX BA BB ... Et vous pourriez dire "" est le 0, mais la situation dont j'ai besoin est qu'aucune partie de la sortie ne peut contenir de "" ... ^^ hmmm


^ [Corrections]: Et vous pourriez dire "_" (Underscore) est le 0, mais la situation dont j'ai besoin est qu'aucune partie de la sortie ne peut contenir de "_" (Undercore) ...


@Felixkling - Si vous avez compté à l'infini dans la base 27 avec "" = 0, "A" = 1, .. "Z" = 26, "AA" = 27, "AA" = 28, etc., alors vous avez défini toutes les valeurs contenant "_" (0) dans n'importe quel "chiffre", la séquence restante correspond à la manière dont les colonnes étiquettes du logiciel de feuille de calcul. Donc, déterminer ce qu'est la étiquette avec, disons, la colonne 589 n'est pas simplement une conversion vers la base 26 ou la base 27 ...


Cette question ou Celui-ci < / a> traiter le même problème dans d'autres langues peut donner des indices


@nnnnnn: Oui j'ai compris maintenant. J'ai manqué la partie bijective , mais Wikipedia était utile :) merci!


Oh mon cher - base 27? À quoi je pensais? C'est ce qui se passe quand je posterai à minuit.


Merci d'avoir demandé cela - j'essayais de faire la même chose et j'ai eu recours à Googling.


J'ai écrit une fonction pour faire cela et je n'avais absolument aucune idée de quoi le nommer. :-( En fait Dû demander à un site SE différent , où la première réponse m'a amené à cela. +1 pour m'apprendre le mot "Numération bijective").


6 Réponses :


-2
votes

A représente 0 et z représente 25 . Donc, le nombre après z est 26 , qui est 1 * 26 + 0 , donc ba est correct. (Et le numéro après zzzzz est Baaaaa .)


6 commentaires

UHM, je suppose, mais comment le programmer pour vous assurer que le prochain zzz est AAAA ..? Tout comme les colonnes dans Excel / Calc ..? ^^


Oh bien, je n'ai pas Excel Calc, j'ai peur. Je soupçonne qu'ils réduisent simplement la première lettre d'une lettre.


Ce n'est pas aussi simple que A = 0 à z = 25. Le système est après z il va à AA. Puis après zz est AAA. Etc. Donc, la recherche du numéro NTH est plus compliquée qu'une conversion à la base 26 avec des lettres sous forme de chiffres.


@nnnnnn: Si tel est le cas, alors mon commentaire est correct - ils font simplement une conversion standard, puis décrément le premier chiffre.


Ce n'est pas vraiment utile. L'auteur comprend déjà la conversion de base.


Non, Zzz vient après Baa parce que vous vous endormez après avoir compté le mouton. ;-)



13
votes

D'accord, voici ma tentative, en supposant que vous souhaitiez que la séquence commence par «A» (représentant 0) et allant:

alpha = "abcdefghijklmnopqrstuvwxyz";

function hex(a) {
  // First figure out how many digits there are.
  a += 1; // This line is funky
  c = 0;
  var x = 1;      
  while (a >= x) {
    c++;
    a -= x;
    x *= 26;
  }

  // Now you can do normal base conversion.
  var s = "";
  for (var i = 0; i < c; i++) {
    s = alpha.charAt(a % 26) + s;
    a = Math.floor(a/26);
  }

  return s;
}


3 commentaires

Merci!! ^^ tu es génial ..! Je n'ai jamais pensé à le faire de cette façon ... merci beaucoup ... je vais mettre ton nom dans les crédits une fois que le site est opérationnel, merci ... - ^^


Pas de soucis, pas besoin de crédit, le code doit être partagé et manipulé librement. De plus, User826788 n'est pas très romantique ... merci @jesse, n'a même pas remarqué!


Ce serait la méthode de récursion: alpha = "abcdefghijklmnopqrstuvwxyz"; fonction A (NUM) {NUM = NUM> 0? num - 1: 0; Si (num



0
votes

Je ne comprends pas comment travailler à partir d'une formule, mais je me suis trompé avec un peu de temps et je suis proposé l'algorithme suivant pour compter littéralement jusqu'au numéro de colonne demandé:

var getAlpha = (function() {
    var alphas = [null, "a"],
        highest = [1];

    return function(decNum) {
        if (alphas[decNum])
            return alphas[decNum];

        var d,
            next,
            carry,
            i = alphas.length;

        for(; i <= decNum; i++) {
            next = "";
            carry = true;
            for(d = 0; d < highest.length; d++){
                if (carry) {
                    if (highest[d] === 26) {
                        highest[d] = 1;
                    } else { 
                        highest[d]++;
                        carry = false;
                    }
                }
                next = String.fromCharCode(
                          highest[d] + 96)
                     + next;
            }
            if (carry) {
                highest.push(1);
                next = "a" + next;
            }
            alphas[i] = next;
        }

        return alphas[decNum];
    };
})();


alert(getAlpha(27));     // "aa"
alert(getAlpha(100000)); // "eqxd"


0 commentaires

3
votes

Bien que @ user826788 ait déjà publié un code de travail (qui est même un tiers plus rapide), je posterai mon propre travail, que je faisais avant de trouver les messages ici (comme je ne connaissais pas le mot "hexavigesimal"). Cependant, cela inclut également la fonction de l'inverse. Notez que j'utilise A = 1 comme je l'utilise pour convertir l'élément de liste de départ de xxx

à xxx

: xxx


1 commentaires

BTW dans Firefox La limite supérieure de Type = "A" listes est 2147483647 ou fxshrxw ;)



0
votes

Il suffit de terminer l'écriture Ce code plus tôt ce soir, et j'ai trouvé cette question sur un quête de déterminer quoi nommer la fichue chose. Ici, c'est (au cas où quelqu'un se sent comme l'utiliser): XXX


0 commentaires

2
votes

Vous pouvez y accomplir avec une récursion, comme ceci:

const toBijective = n => (n > 26 ? toBijective(Math.floor((n - 1) / 26)) : "") + ((n % 26 || 26) + 9).toString(36);
// Parsing is not recursive
const parseBijective = str => str.split("").reverse().reduce((acc, x, i) => acc + ((parseInt(x, 36) - 9) * (26 ** i)), 0);

toBijective(1) // "a"
toBijective(27) // "aa"
toBijective(703) // "aaa"
toBijective(18279) // "aaaa"
toBijective(127341046141) // "overflow"

parseBijective("Overflow") // 127341046141


0 commentaires