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!

K Divisão X
fonte
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
Desafio reverso .
user202729
6
@JoKing Bijective base .
user202729

Respostas:

9

Perl 6 , 17 bytes

{:26[.ords X-64]}

Experimente online!

Bloco de código anônimo que subtrai 64 de cada valor de byte e converte da base 26 com Ztransbordamento para a próxima coluna.

Brincadeira
fonte
7

Planilhas Google, 21 bytes

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

=column(indirect(A1&2
user202729
fonte
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!

J.Doe
fonte
4

Java (JDK) , 39 bytes

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

Experimente online!

Olivier Grégoire
fonte
Qual plataforma java suporta isso?
Syed Hamza Hassan
@SyedHamzaHassan Java 8 ou mais.
Olivier Grégoire
3

05AB1E , 6 bytes

Çžx-₂β

Experimente online!

Okx
fonte
Por curiosidade, por que usar em žxvez de apenas 64?
Kevin Cruijssen 21/10
Eu não sei, parecia melhor, eu acho?
Okx, 21/10/18
3

PHP, 41 38 bytes

-3 graças a Jo King.

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

correr como tubo com -nr

saída unária, 34 bytes:

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

requer PHP 7.1. salve em arquivo, execute como pipe com -nF.

Titus
fonte
@JoKing Sim, isso pode ser feito: sandbox.onlinephpfunctions.com/code/…
Ismael Miguel
@Titus Tudo bem então
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 
RosLuP
fonte
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.

fonte
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.
user202729
fonte
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
Graham
fonte
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

Syed Hamza Hassan
fonte
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
Bubbler
fonte
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
Shaggy
fonte
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)
Galen Ivanov
fonte
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
Neil
fonte
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
wooshinyobject
fonte
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!

Logern
fonte
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
    }
}
Caracol_
fonte