Biorąc pod uwagę ciąg, obliczyć numer kolumny, której odpowiada

17

W programie Excel kolumny mają zakres od A-Z, AA,AB,AZ,BA,..,BZ i tak dalej. W rzeczywistości każdy z nich oznacza cyfry, ale są raczej kodowane jako ciągi alfabetu.

W tym wyzwaniu otrzymasz ciąg alfabetów i musisz obliczyć odpowiednią kolumnę.

Niektóre testy:

„A” zwraca 1 (co oznacza, że ​​jest to pierwsza kolumna)

„B” zwraca 2

„Z” zwraca 26

„AA” zwraca 27

„AB” zwraca 28

„AZ” zwraca 52

„ZZ” zwraca 702

„AAA” zwraca 703

Możesz założyć, że wielkie litery będą podawane tylko.

Najkrótsze bajty wygrywają.

Powodzenia!

K Split X
źródło
Więc ... baza 26 z alfabetem?
Jo King,
1
To nie jest całkiem podstawowa 26, ponieważ nie ma zera.
J.Doe,
@ J.Doe Ah, chyba masz rację. Nie zauważyłem, ponieważ moje rozwiązanie i tak automatycznie traktowane jest Zjako 10
Jo King,
Odwrotne wyzwanie .
user202729,
6
@JoKing Bijective base .
user202729,

Odpowiedzi:

9

Perl 6 , 17 bajtów

{:26[.ords X-64]}

Wypróbuj online!

Anonimowy blok kodu, który odejmuje 64 od każdej wartości bajtu i konwertuje z podstawy 26 z Zprzepełnieniem do następnej kolumny.

Jo King
źródło
7

Arkusze Google, 21 bajtów

(formuła ocenia wynik, pobiera dane z komórki A1)

=column(indirect(A1&2
użytkownik202729
źródło
Właśnie zamierzam opublikować nieco mniej golfową wersję tego.
ATaco,
1
Mam również rozwiązanie w Arkuszach Google, które nie polega na wbudowanym COLUMN, sprawdź to. (poza tym czuję się źle, że rozwiązanie, na które wkładam więcej wysiłku, traci mniej uwagi ... i tak jest to typowy problem z głosowaniem, szczególnie gdy wyzwanie jest w HNQ.)
user202729
6

R , 48 43 bajtów

-5 bajtów dzięki @Giuseppe, wykorzystując tę ​​samą logikę, ale jako program, który eliminuje ncharwywołanie.

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

Wypróbuj online!

J.Doe
źródło
4

Java (JDK) , 39 bajtów

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

Wypróbuj online!

Olivier Grégoire
źródło
Która platforma Java to obsługuje?
Syed Hamza Hassan
@SyedHamzaHassan Java 8 lub więcej.
Olivier Grégoire,
3

05AB1E , 6 bajtów

Çžx-₂β

Wypróbuj online!

Okx
źródło
Z ciekawości, po co używać žxzamiast po prostu 64?
Kevin Cruijssen
Nie wiem, chyba ładniej to wyglądało?
Okx
2

APL (NARS), 11 znaków, 22 bajty

{+/26⊥⎕A⍳⍵}

test

  f←{+/26⊥⎕A⍳⍵} 
  f¨'A' 'AA' 'AAA'
1 27 703 
  f¨'AB' 'ZZ' 'Z'
28 702 26 
RosLuP
źródło
2

C (gcc) , 46 , 43 bajtów

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

Wypróbuj 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.

źródło
1

Arkusze Google, 100 bajtów

(formuła ocenia wynik, pobiera dane z komórki A1)

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

Wszystkie spacje zostały dodane wyłącznie dla przejrzystości.

Uwaga .

  • Nie wiem, czy można usunąć duplikację row(indirect("1:"&len(A1)).
  • Chociaż Arkusze Google mają decimalfunkcję, transliteracja zajmuje dużo bajtów.
użytkownik202729
źródło
1

APL + WIN, 12 bajtów

Pochodzenie indeksu 1.

26⊥¯65+⎕av⍳⎕

Wypróbuj online! Dzięki uprzejmości Dyalog Classic

Wyjaśnienie:

⎕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
źródło
1

Java (JDK) , 92 bajty

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

Wypróbuj online!

Wynik

A = 1

B = 2

Z = 26

AA = 27

AB = 28

AZ = 52

ZZ = 702

AAA = 703

Syed Hamza Hassan
źródło
Nie jestem ekspertem w golfa Java, ale można golf to znacznie w dół powracając zamiast drukowania, upraszczając dla pętli, usuwając spacje i pozbycie się pi nzmiennych. 92 bajty! .
Jo King,
Cudownie .......
Syed Hamza Hassan
1
Możesz usunąć, staticaby zyskać 7 bajtów. Możesz także ustawić tę funkcję na lambda, aby oszczędzić więcej bajtów. Myślę również, że wersja rekurencyjna może oszczędzać bajty. W każdym razie oto moje 39 bajtowe rozwiązanie .
Olivier Grégoire,
Wspaniale.
Syed Hamza Hassan
1

J , 11 bajtów

26#.64|3&u:

Wypróbuj online!

Jak to działa

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
źródło
1

Japt -h, 10 bajtów

åÈ*26+InYc

Spróbuj

Lub bez flagi. Pierwszy bajt można usunąć, jeśli weźmiemy dane wejściowe jako tablicę znaków.

¨c aI̓26

Spróbuj


Wyjaśnienie

åÈ             :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
Kudłaty
źródło
0

J , 20 bajtów

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

Wypróbuj online!

Wyjaśnienie:

 [:(#.~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 Iwanow
źródło
0

Węgiel drzewny , 10 bajtów

I↨²⁶ES⊕⌕αι

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

     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
źródło
0

MBASIC , 84 bajty

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

Wynik:

? AZ
 52

? ZZ
 702

? AAA
 703
wooshinyobject
źródło
0

kod maszynowy x86, 19 bajtów

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

Montaż:

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

Wypróbuj online!

Logern
źródło
0

Kotlin , 29 bajtów

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

Wypróbuj online!

Wyjaśniono

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
    }
}
ślimak_
źródło