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!


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,


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.


7

Arkusze Google, 21 bajtów

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

=column(indirect(A1&2

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!








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 

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.


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.


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


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

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



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)

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


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

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!


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
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.