46 votes

Programmation Riddle: Comment pourriez-vous traduire un nom de colonne Excel en un nombre?

Dans un entretien d'embauche, on m'a récemment demandé de résoudre un casse-tête de programmation que je pensais intéressant de partager. Il s’agit de traduire les lettres de colonne d’Excel en nombres réels, si vous vous rappelez bien, Excel nomme ses colonnes avec des lettres de A à Z, puis la séquence passe de AA, AB, AC ... AZ, BA, BB, etc.

Vous devez écrire une fonction qui accepte une chaîne en tant que paramètre (comme "AABCCE") et renvoie le numéro de colonne réel.

La solution peut être dans n'importe quelle langue.

36voto

Jimmy Points 35501

Cela ressemble à un standard réduire pour moi:

Python:

 def excel2num(x): 
    return reduce(lambda s,a:s*26+ord(a)-ord('A')+1, x, 0)
 

C #:

 int ExcelToNumber(string x) {
    return x.Aggregate(0, (s, c) => s * 26 + c - 'A' + 1 );
}
 

16voto

clorz Points 455

A écrit il y a bien longtemps pour un script python

 def index_to_int(index):
    s = 0
    pow = 1
    for letter in index[::-1]:
        d = int(letter,36) - 9
        s += pow * d
        pow *= 26
    # excel starts column numeration from 1
    return s
 

6voto

j_random_hacker Points 28473

Lisez un nom de colonne dans STDIN et imprimez le numéro correspondant:

 perl -le "$x = $x * 26 - 64 + ord for <> =~ /./g; print $x"
 

Mises en garde: Suppose ASCII.

4voto

Gordon Guthrie Points 4108

Hah - écrit déjà dans notre base de code - environ 3 fois différents :(

 %% @doc Convert an string to a decimal integer
%% @spec b26_to_i(string()) -> integer()

b26_to_i(List) when is_list(List) ->
    b26_to_i(string:to_lower(lists:reverse(List)),0,0).

%% private functions
b26_to_i([], _Power, Value) -> 
    Value;

b26_to_i([H|T],Power,Value)->
    NewValue = case (H > 96) andalso (H < 123) of
                   true ->
                       round((H - 96) * math:pow(26, Power));
                   _    ->
                       exit([H | T] ++ " is not a valid base 26 number")
               end,
    b26_to_i(T, Power + 1, NewValue + Value).
 

L'énigme est que ce n'est pas réellement une représentation Base26 d'un nombre (nous nous mentons dans le nom de notre fonction ici) car il n'y a pas de 0 dans celui-ci.

La séquence est la suivante: A, B, C ... Z, AA, AB, AC

et non: A, B, C ... Z, BA, BB, BC

(la langue est Erlang, mais oui).

4voto

Adam Davis Points 47683

Vous pouvez le faire en C comme ceci:

 unsigned int coltonum(char * string)
{
   unsigned result = 0;
   char ch;

   while(ch = *string++)
      result = result * 26 + ch - 'A' + 1;

  return result;
}
 

Aucune erreur de vérification, ne fonctionne que pour les chaînes en majuscules, chaîne doit être terminée par null.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X