Dada uma sequência, calcule o número da coluna à qual corresponde


17

No Excel, as colunas variam A-Z, AA,AB,AZ,BA,..,BZe assim por diante. Na verdade, eles representam números, mas são codificados como seqüências de caracteres do alfabeto.

Neste desafio, você receberá uma sequência de alfabetos e deverá calcular a coluna à qual corresponde.

Alguns testes:

'A' retorna 1 (o que significa que é a primeira coluna)

'B' retorna 2

'Z' retorna 26

'AA' retorna 27

'AB' retorna 28

'AZ' retorna 52

'ZZ' retorna 702

'AAA' retorna 703

Você pode assumir que apenas as letras maiúsculas serão fornecidas.

Os bytes mais curtos vencem.

Boa sorte!


Então ... base 26 com o alfabeto?
Jo rei

1
Não é exatamente a base 26 porque não há zero.
J.Doe

@ J.Doe Ah, acho que você está certo. Eu não notei desde a minha solução tratada automaticamente Zcomo 10 de qualquer maneira
Jo rei


Respostas:



7

Planilhas Google, 21 bytes

(a fórmula é avaliada como resultado, obtém entrada da célula A1)

=column(indirect(A1&2

Estou prestes a publicar uma versão um pouco menos complexa disso.
ATaco

1
Também tenho uma solução no Planilhas Google que não depende de COLUMN, confira. (além disso, eu me sinto mal que a solução que eu colocar mais esforço no recebe menos atenção ... é um problema típico com a votação de qualquer forma, especialmente quando o desafio é em HNQ.)
user202729

6

R , 48 43 bytes

-5 bytes graças a @ Giuseppe, usando a mesma lógica, mas como um programa que elimina a ncharchamada.

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

Experimente online!








2

APL (NARS), 11 caracteres, 22 bytes

{+/26⊥⎕A⍳⍵}

teste

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

Experimente online!

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

Planilhas Google, 100 bytes

(a fórmula é avaliada como resultado, obtém entrada da célula A1)

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

Todos os espaços são adicionados apenas para maior clareza.

Nota .

  • Não sei se é possível remover a duplicação de row(indirect("1:"&len(A1)) .
  • Embora o Planilhas Google tenha uma decimalfunção, a transliteração levaria muitos bytes.

1

APL + WIN, 12 bytes

Origem do índice 1.

26⊥¯65+⎕av⍳⎕

Experimente online! Cortesia de Dyalog Classic

Explicação:

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

Experimente online!

Resultado

A = 1

B = 2

Z = 26

AA = 27

AB = 28

AZ = 52

ZZ = 702

AAA = 703


Eu não sou especialista em golfe em Java, mas você pode resolver isso consideravelmente, retornando em vez de imprimir, simplificando os loops for, removendo os espaços em branco e se livrando das variáveis pe n. 92 bytes! .
Jo rei

Maravilhoso .......
Syed Hamza Hassan

1
Você pode remover staticpara obter 7 bytes. Você também pode tornar essa função um lambda para poupar mais bytes. Eu também acho que a versão recursiva pode salvar bytes. De qualquer forma, aqui está minha solução de 39 bytes .
Olivier Grégoire

Isso é maravilhoso.
Syed Hamza Hassan




1

J , 11 bytes

26#.64|3&u:

Experimente online!

Como 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

Japonês -h, 10 bytes

åÈ*26+InYc

Tente

Ou sem bandeira. O primeiro byte pode ser removido se pudermos receber a entrada como uma matriz de caracteres.

¨c aI̓26

Tente


Explicação

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

Experimente online!

Explicação:

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

Carvão , 10 bytes

I↨²⁶ES⊕⌕αι

Experimente online! Link é a versão detalhada do código. Explicação:

     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

Resultado:

? 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..

Montagem:

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

Experimente online!


0

Kotlin , 29 bytes

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

Experimente online!

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
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.