Étant donné une chaîne, calculez le numéro de la colonne à laquelle il correspond

17

Dans Excel, les colonnes vont de A-Z, AA,AB,AZ,BA,..,BZet ainsi de suite. En fait, ils représentent chacun des nombres, mais sont plutôt codés sous forme de chaînes alphabétiques.

Dans ce défi, vous recevrez une chaîne d'alphabets et vous devrez calculer la colonne à laquelle elle correspond.

Quelques tests:

'A' renvoie 1 (ce qui signifie qu'il s'agit de la première colonne)

«B» renvoie 2

«Z» renvoie 26

«AA» renvoie 27

«AB» renvoie 28

«AZ» renvoie 52

'ZZ' renvoie 702

'AAA' renvoie 703

Vous pouvez supposer que les majuscules seront données uniquement.

Octets les plus courts gagnent.

Bonne chance!

K Split X
la source
Alors ... base 26 avec l'alphabet?
Jo King
1
Ce n'est pas tout à fait la base 26 parce qu'il n'y a pas de zéro.
J.Doe
@ J.Doe Ah, je suppose que vous avez raison. Je n'ai pas remarqué que ma solution était automatiquement traitée Zcomme 10 de toute façon
Jo King
Défi inversé .
user202729
6
@JoKing Bijective base .
user202729

Réponses:

9

Perl 6 , 17 octets

{:26[.ords X-64]}

Essayez-le en ligne!

Bloc de code anonyme qui soustrait 64 de chaque valeur d'octet et convertit de la base 26 avec Zdébordement à la colonne suivante.

Jo King
la source
7

Google Sheets, 21 octets

(la formule évalue le résultat, prend l'entrée de la cellule A1)

=column(indirect(A1&2
user202729
la source
Je suis sur le point de publier une version un peu moins golfée de cela.
ATaco
1
J'ai également une solution dans Google Sheets qui ne repose pas sur la COLONNE intégrée, consultez-la. (en plus, je me sens mal que la solution sur laquelle je fais plus d'efforts reçoive moins d'attention ... c'est un problème typique avec le vote de toute façon, surtout quand le défi est sur HNQ.)
user202729
6

R , 48 43 octets

-5 octets grâce à @Giuseppe, utilisant la même logique, mais comme un programme qui élimine l' ncharappel.

for(i in utf8ToInt(scan(,"")))F=F*26+i-64;F

Essayez-le en ligne!

J.Doe
la source
4

Java (JDK) , 39 octets

s->s.chars().reduce(0,(a,b)->a*26+b%32)

Essayez-le en ligne!

Olivier Grégoire
la source
Quelle plateforme java prend en charge cela?
Syed Hamza Hassan
@SyedHamzaHassan Java 8 ou plus.
Olivier Grégoire
3

05AB1E , 6 octets

Çžx-₂β

Essayez-le en ligne!

Okx
la source
Par curiosité, pourquoi utiliser žxau lieu de juste 64?
Kevin Cruijssen
Je ne sais pas, c'était plus joli, je suppose?
Okx
3

PHP, 41 38 octets

-3 merci à Jo King.

for($c=A;$c!=$argn;$i++)$c++;echo$i+1;

fonctionner comme tuyau avec -nr

sortie unaire, 34 octets:

1<?for($c=A;$c!=$argn;$c++)echo 1;

nécessite PHP 7.1. enregistrer dans un fichier, exécuter en tant que tuyau avec -nF.

Titus
la source
@JoKing Oui, cela peut être fait: sandbox.onlinephpfunctions.com/code/…
Ismael Miguel
@Titus Alright then
2

APL (NARS), 11 caractères, 22 octets

{+/26⊥⎕A⍳⍵}

tester

  f←{+/26⊥⎕A⍳⍵} 
  f¨'A' 'AA' 'AAA'
1 27 703 
  f¨'AB' 'ZZ' 'Z'
28 702 26 
RosLuP
la source
2

C (gcc) , 46 , 43 octets

a;f(int*s){for(a=0;*s;)a=*s++%64+a*26;s=a;}

Essayez-le en ligne!

Degolf

a; f(int*s)
{  for(a=0;*s;) // Loop through s, which is a null-terminated string.
       a=*s++%64 + a*26; // Multiply accumulated value by 26, and add current char modulo 64 to it.
   s=a;} // Return the accumulated value.

la source
1

Google Sheets, 100 octets

(la formule évalue le résultat, prend l'entrée de la cellule A1)

=sum(arrayformula(
  (
    code(
      mid(A1,row(indirect("1:"&len(A1))),1)
    )-64
  )*26^row(indirect("1:"&len(A1)))/26

Tous les espaces sont ajoutés pour plus de clarté uniquement.

Remarque .

  • Je ne sais pas s'il est possible de supprimer la duplication de row(indirect("1:"&len(A1)) .
  • Bien que Google Sheets ait une decimalfonction, la translittération prendrait beaucoup d'octets.
user202729
la source
1

APL + WIN, 12 octets

Origine de l'index 1.

26⊥¯65+⎕av⍳⎕

Essayez-le en ligne! Gracieuseté de Dyalog Classic

Explication:

⎕av⍳⎕ Prompts for input and gets Ascii integer value for each character

¯65+ subtracts 65 to give integers 1-26 for A-Z

26⊥ converts resulting vector from base 26 to single integer
Graham
la source
1

Java (JDK) , 92 octets

static int m(String v){int x=0;for(int i=0;i<v.length();i++)x=x*26+v.charAt(i)-64;return x;}

Essayez-le en ligne!

Production

A = 1

B = 2

Z = 26

AA = 27

AB = 28

AZ = 52

ZZ = 702

AAA = 703

Syed Hamza Hassan
la source
Je ne suis pas un expert dans le golf Java, mais vous pouvez le faire considérablement en retournant au lieu d'imprimer, en simplifiant les boucles for, en supprimant les espaces et en supprimant les variables pet n. 92 octets! .
Jo King du
Merveilleux .......
Syed Hamza Hassan
1
Vous pouvez supprimer staticpour gagner 7 octets. Vous pouvez également faire de cette fonction un lambda pour épargner plus d'octets. Je pense également que la version récursive pourrait économiser des octets. En tout cas, voici ma solution à 39 octets .
Olivier Grégoire
C'est merveilleux.
Syed Hamza Hassan
1

J , 11 octets

26#.64|3&u:

Essayez-le en ligne!

Comment ça fonctionne

26#.64|3&u:  Monadic verb. Input: a string.
       3&u:  Convert each character to Unicode codepoint
    64|      Modulo 64; maps A -> 1, ... Z -> 26
26#.         Interpret as base-26 digits and convert to single integer
Bubbler
la source
1

Japt -h, 10 octets

åÈ*26+InYc

Essayez-le

Ou sans drapeau. Le premier octet peut être supprimé si nous pouvons prendre l'entrée comme un tableau de caractères.

¨c aI̓26

Essayez-le


Explication

åÈ             :Cumulatively reduce by passing each character at Y through a function, with an initial total of 0
  *26          :  Multiply current total by 26
     -I        :  Subtract 64
       n       :   Subtracted from
        Yc     :    The codepoint of Y
               :Implicitly output the last element of the resulting array
Hirsute
la source
0

J , 20 octets

[:(#.~26$~#)32|a.i.]

Essayez-le en ligne!

Explication:

 [:(#.~26$~#)32|a.i.] 
                  i.    - indices 
                    ]   - of the characters of the input
                a.      - in the alphabet
             32|        - mod 32
 [:(        )           - apply the following code to the above
         $~             - create a list of (left and right arguments exchanged) 
       26               - the number 26
           #            - repeated the length of the input times
    #.~                 - to base (26)
Galen Ivanov
la source
0

Fusain , 10 octets

I↨²⁶ES⊕⌕αι

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

     S      Input string
    E       Map over characters
         ι  Current character
        α   Uppercase alphabet
       ⌕    Find index
      ⊕     Increment
  ²⁶        Literal 26
 ↨          Base conversion
I           Cast to string
            Implicitly print
Neil
la source
0

MBASIC , 84 octets

1 INPUT S$:L=LEN(S$):FOR I=1 TO L:V=ASC(MID$(S$,I,1))-64:T=T+26^(L-I)*V:NEXT:PRINT T

Production:

? AZ
 52

? ZZ
 702

? AAA
 703
wooshinyobject
la source
0

code machine x86, 19 octets

00000000: 31c0 8b19 83e3 3f41 b21a f7e2 01d8 3831  1.....?A......81
00000010: 75f0 c3                                  u..

Assemblée:

section .text
	global func
func:				;this function uses fastcall conventions
	xor eax, eax		;reset eax to 0
	loop:
		;ebx=*ecx%64
		mov ebx, [ecx]	;ecx is 1st arg to this func (in fastcall conventions)
		and ebx, 63	;because 64 is a pwr of 2,n%64=n&(64-1)

		;ecx++		get next char in str by incrementing ptr
		inc ecx
		
		;eax=eax*26
		mov dl, 26	;using an 8bit reg is less bytes
		mul edx
		
		;eax+=ebx //(eax=(*ecx%64)+(eax*26))
		add eax, ebx

		;if(*ecx!='\0')goto loop
		cmp byte [ecx], dh ;dh==0
		jne loop
	ret			;return value is in eax

Essayez-le en ligne!

Logern
la source
0

Kotlin , 29 octets

{it.fold(0){a,v->v-'@'+a*26}}

Essayez-le en ligne!

Expliqué

val column: (String) -> Int = {  // String in, Int out
    it.fold(0) { a, v ->  // acc, value
        v - '@'  // distance of char from @ (A=1 etc.)
                + a * 26
    }
}
escargot_
la source