étant donné à tout irable, par exemple: "ABCDEF"
Traitant presque comme un système de chiffre en tant que tel: P>
A B C ré E F Aa UN B Acteur UN D Ae UN F Ba Bb avant JC .... FF Aaa Aab .... p>
Comment allez-y trouver le membre I th sup> dans cette liste? Efficacement, pas en comptant tous. Je souhaite trouver le milliardiat (par exemple) membre de cette liste. J'essaie de faire cela en python et j'utilise 2.4 (pas par choix) qui pourrait être pertinent parce que je n'ai pas accès à iTerTools. P> Nice, mais non requis: la solution pourrait-elle être généralisée Pour pseudo- "Mixte Radix" System? P> --- Résultats --- p> fois: p>
8 Réponses :
La troisième fois est le charme:
Ne fonctionne pas: >>> pour i in gamme (200): ... Imprimer f (i, 'Abcde') ... BCDE BA BB BC BD BE CA CC CC CD DA DB DC DD DE EA EB EC EC Ee bab bab mauvais
Ouais, je n'avais pas réalisé l'implication des séquences comme "AA" avant. Je le réécris pour gérer ces cas correctement.
Désolé, ça étouffe encore Fff à Aaaa (donne à AAA à la place)
Ok, cette fois, il y avait un véritable bug. La façon dont j'avais augmenté "Max" était tout faux. Devrait être corrigé maintenant.
Ce que vous faites est proche d'une conversion de la base 10 (votre numéro) à la base 6, avec ABCDEF étant vos chiffres. La seule différence est "AA" et "A" sont différentes, ce qui ne va pas si vous envisagez "a" le chiffre zéro. P>
Si vous ajoutez la prochaine puissance de six à votre numéro, puis effectuez une conversion de base à la base 6 à l'aide de ces chiffres et enfin de la bande du premier chiffre (qui devrait être un "B", c'est-à-dire un "1") , vous avez le résultat. P>
Je veux juste poster une idée ici, pas une mise en œuvre, car la question sent beaucoup comme des devoirs pour moi (je fais profiter du doute; c'est juste mon sentiment). P>
Nan. Si tel était le cas, "A" et "AA" représenteraient la même valeur, comme 0 et 00.
@Nikhil Chelliah: Je ne comprends pas bien, pourriez-vous élaborer?
Je suppose que Nikhil Chelliah signifie que les systèmes numériques connaissent généralement un chiffre "0". Votre système, similaire aux chiffres romains, ne le fait pas.
@XU: Oui, ça fait. "A" est le zéro.
Si "A" est zéro, alors "AA", "AAA", "AAAA", etc.
solution multi-rayix en bas.
import math def get_max_value_for_digits(digits_list): max_vals = [] for val in digits_list: val = len(val) if max_vals: val *= max_vals[-1] max_vals.append(val) return max_vals def idx_to_length_and_value(n, digits_list): chars = 1 max_vals = get_max_value_for_digits(digits_list) while True: if chars-1 >= len(max_vals): raise OverflowError, "number not representable" max_val = max_vals[chars-1] if n < max_val: return chars, n chars += 1 n -= max_val def conv_base(chars, n, digits_list): ret = [] for i in range(chars-1, -1, -1): digits = digits_list[i] radix = len(digits) c = digits[n % len(digits)] ret.append(c) n /= radix return reversed(ret) digits_list = ["ABCDEF", "ABC", "AB"] for i in range(0, 120): chars, n = idx_to_length_and_value(i, digits_list) print "".join(conv_base(chars, n, digits_list))
Je pense que c'est ça. Je vais me charger le matin et voir si cela fonctionne aussi pour mon problème mixte Radix ..
Calculez d'abord la longueur en résumant les pouvoirs de six jusqu'à ce que vous dépassiez votre index (ou utilisez mieux la formule de la série géométrique). P>
Soustrayez la somme des plus petites puissances de l'indice. P>
calculer la représentation à la base 6, remplir les zéros de premier plan et la carte 0 -> A, ..., 5 -> F. P>
Je ne sais pas que la première étape fonctionne, dans un exemple de base raccourci 2, vous obtiendriez: 1 => A, 2 => B, 3 => AA ... 6 => BB, 7 => AAA .. . 14 => BBB, 15 => AAAA
Oh. J'ai mal interprété la partie "résumée". Donc, dans la base 2, si je <= 2 la longueur est 1, et si je <= (2 + 4) la longueur est 2, et si je <= (2 + 4 + 8) la longueur est 3 etc. La longueur La pièce fonctionne parfaitement et je trouve l'explication plus claire que les échantillons de code.
alphabet = 'ABCDEF' def idx_to_excel_column_name(x): x += 1 # Make us skip "" as a valid word group_size = 1 for num_letters in itertools.count(): if x < group_size: break x -= group_size group_size *= len(alphabet) letters = [] for i in range(num_letters): x, m = divmod(x, len(alphabet)) letters.append(alphabet[m]) return ''.join(reversed(letters)) def excel_column_name_to_idx(name): q = len(alphabet) x = 0 for letter in name: x *= q x += alphabet.index(letter) return x+q**len(name)//(q-1)-1
Je ne peux pas utiliser iterools, mais c'est une simple affaire de remplacement d'itheroTools.Count () avec tandis que: et Num_letters + = 1
en Perl vous convertiriez simplement votre entrée I de la base (10) à la base (longueur de "abcdef"), puis faites un oh, comme indiqué par Yariich Les combinaisons sont un peu différent, car si une représentation 0, alors il y aurait pas de combinaisons avec un dirigeant (bien qu'il l'a dit un peu différent). Il semble que je pensais que le problème soit plus trivial que cela. Vous ne pouvez pas simplement translitterrer différents numéros de base, car les numéros contenant l'équivalent de 0 seraient
ignoré dans la séquence. p>
Alors, ce que j'ai suggéré, c'est en fait la dernière étape de ce que Starblue suggéré, ce qui est essentiellement ce que Laurence Gonsalves mise en œuvre FTW. Oh, et il n'y a pas de translittération ( tr / 012345 / abcdef / code> qui est identique à celui de < Code> Y / 0-5 / AF / CODE>. Sûrement Python a un ensemble de caractéristiques similaires. P>
tr // code> ou
y // code>) en python, quelle honte. P>
Ce n'est pas simplement un système numérique avec une base différente. Par exemple, voir comment il y a 6 numéros à un chiffre et 36 numéros à deux chiffres. Dans la base décimale, il y a 9 nombres à un chiffre et 90 numéros à deux chiffres avec la formule pour le nombre de nombres n-chiffres étant (base-1) * base ^ (n-1) contrairement à la base ^ n dans le système décrit
Puisque nous sommes use strict;
use warnings;
my @Symbols=qw/0 A B C D E F/;
my $BaseSize=@Symbols ;
for my $NR ( 1 .. 45) {
printf ("Convert %3i => %s\n",$NR ,convert($NR));
}
sub convert {
my ($nr,$res)=@_;
return $res unless $nr>0;
$res="" unless defined($res);
#Adjust to skip '0'
$nr=$nr + int(($nr-1)/($BaseSize-1));
return convert(int($nr/$BaseSize),$Symbols[($nr % ($BaseSize))] . $res);
}
Attends ... Où "Base 10" vient-il dans cela?
Les numéros «normaux» sont la base 10, représentés par des chiffres «0» .. '9'. Pbowah décrit des "chiffres" avec des symboles 'A ".." F ", avec la complication additionnelle, que son système n'a pas de" 0 ".
Cela fonctionne (et c'est ce que j'ai finalement réglé) et que cela mérite d'être affiché parce qu'il est bien rangé. Cependant, il est plus lent que la plupart des réponses. Puis-je effectuer% et / dans la même opération?
def f0(x, alph='ABCDE'): result = '' ct = len(alph) while x>=0: result += alph[x%ct] x /= ct-1 return result[::-1]
oui, vous pouvez effectuer% et / dans la même opération avec la fonction Divmod CODE> DIVMOD CODE>: docs.python.org/2/library/fonctions.html#divmod