Dada una cadena, calcule el número de la columna a la que corresponde


17

En Excel, las columnas van desde, A-Z, AA,AB,AZ,BA,..,BZetc. En realidad, cada uno representa números, sino que están codificados como cadenas alfabéticas.

En este desafío, se le dará una cadena de alfabetos, y debe calcular la columna a la que corresponde.

Algunas pruebas:

'A' devuelve 1 (lo que significa que es la primera columna)

'B' devuelve 2

'Z' devuelve 26

'AA' devuelve 27

'AB' devuelve 28

'AZ' devuelve 52

'ZZ' devuelve 702

'AAA' devuelve 703

Puede suponer que solo se darán letras mayúsculas.

Los bytes más cortos ganan.

¡Buena suerte!


Entonces ... ¿base 26 con el alfabeto?
Jo King

1
No es del todo base 26 porque no hay cero.
J.Doe

@ J.Doe Ah, supongo que tienes razón. No me di cuenta ya que mi solución se trató automáticamente Zcomo 10 de todos modos
Jo King,


66
Base @JoKing Bijective .
usuario202729

Respuestas:


9

Perl 6 , 17 bytes

{:26[.ords X-64]}

Pruébalo en línea!

Bloque de código anónimo que resta 64 de cada valor de byte y convierte de base 26 con Zdesbordamiento a la siguiente columna.


7

Hojas de cálculo de Google, 21 bytes

(la fórmula evalúa el resultado, toma la entrada de la celda A1)

=column(indirect(A1&2

A punto de publicar una versión un poco menos golfizada de esto.
ATaco

1
También tengo una solución en Hojas de cálculo de Google que no se basa en COLUMNA incorporada, échale un vistazo. (además, me siento mal de que la solución que poner más esfuerzo en la recibe menos atención ... es un problema típico con la votación de todos modos, especialmente cuando el desafío está en hnq.)
user202729

6

R , 48 43 bytes

-5 bytes gracias a @Giuseppe, usando la misma lógica, pero como un programa que elimina la ncharllamada.

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

Pruébalo en línea!








2

APL (NARS), 11 caracteres, 22 bytes

{+/26⊥⎕A⍳⍵}

prueba

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

2

C (gcc) , 46 , 43 bytes

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

Pruébalo en línea!

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.


1

Hojas de cálculo de Google, 100 bytes

(la fórmula evalúa el resultado, toma la entrada de la celda A1)

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

Todos los espacios se agregan solo para mayor claridad.

Nota .

  • No sé si es posible eliminar la duplicación de row(indirect("1:"&len(A1)).
  • Aunque Google Sheets tiene una decimalfunción, la transliteración tomaría muchos bytes.

1

APL + WIN, 12 bytes

Origen del índice 1.

26⊥¯65+⎕av⍳⎕

Pruébalo en línea! Cortesía de Dyalog Classic.

Explicación:

⎕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

1

Java (JDK) , 92 bytes

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;}

Pruébalo en línea!

Salida

A = 1

B = 2

Z = 26

AA = 27

AB = 28

AZ = 52

ZZ = 702

AAA = 703


No soy un experto en jugar al golf en Java, pero puedes jugarlo de manera considerable regresando en lugar de imprimir, simplificando los bucles for, eliminando espacios en blanco y eliminando las variables py n. 92 bytes! .
Jo King

Maravilloso .......
Syed Hamza Hassan

1
Puede eliminar staticpara ganar 7 bytes. También podría hacer que esta función sea una lambda para ahorrar más bytes. También creo que la versión recursiva podría ahorrar bytes. En cualquier caso, aquí está mi solución de 39 bytes .
Olivier Grégoire

Eso es maravilloso.
Syed Hamza Hassan




1

J , 11 bytes

26#.64|3&u:

Pruébalo en línea!

Cómo funciona

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

1

Japt -h, 10 bytes

åÈ*26+InYc

Intentalo

O sin bandera. El primer byte puede eliminarse si podemos tomar la entrada como una matriz de caracteres.

¨c aI̓26

Intentalo


Explicación

åÈ             :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



0

J , 20 bytes

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

Pruébalo en línea!

Explicación:

 [:(#.~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)

0

Carbón de leña , 10 bytes

I↨²⁶ES⊕⌕αι

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

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


0

MBASIC , 84 bytes

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

Salida:

? AZ
 52

? ZZ
 702

? AAA
 703

0

código de máquina x86, 19 bytes

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

Montaje:

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

Pruébalo en línea!


0

Kotlin , 29 bytes

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

Pruébalo en línea!

Explicado

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
    }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.