Diberikan string, hitung jumlah kolom yang sesuai dengannya


17

Di Excel, kolom berkisar dari A-Z, AA,AB,AZ,BA,..,BZdan seterusnya. Mereka masing-masing berdiri untuk angka, tetapi lebih dikodekan sebagai string alfabet.

Dalam tantangan ini, Anda akan diberi serangkaian huruf, dan Anda harus menghitung kolom yang sesuai dengannya.

Beberapa tes:

'A' mengembalikan 1 (artinya kolom pertama)

'B' mengembalikan 2

'Z' mengembalikan 26

'AA' mengembalikan 27

'AB' mengembalikan 28

'AZ' mengembalikan 52

'ZZ' mengembalikan 702

'AAA' mengembalikan 703

Anda dapat mengasumsikan bahwa huruf kapital hanya akan diberikan.

Bytes terpendek menang.

Semoga berhasil!


Jadi ... dasar 26 dengan alfabet?
Jo King

1
Itu tidak cukup basis 26 karena tidak ada nol.
J.

@ J. Oh, saya kira Anda benar. Saya tidak memperhatikan karena solusi saya secara otomatis diperlakukan Zsebagai 10
Jo King


Jawaban:


9

Perl 6 , 17 byte

{:26[.ords X-64]}

Cobalah online!

Blok kode anonim yang mengurangi 64 dari setiap nilai byte dan mengkonversi dari basis 26 dengan Zmeluap ke kolom berikutnya.


7

Google Sheets, 21 byte

(rumus mengevaluasi hasil, mengambil input dari sel A1)

=column(indirect(A1&2

Akan memposting versi yang sedikit kurang golf ini.
ATaco

1
Saya juga punya solusi di Google Sheets yang tidak mengandalkan builtin COLUMN, coba lihat. (Selain itu, saya merasa tidak enak bahwa solusi yang saya upayakan lebih banyak mendapat perhatian kurang ... itu adalah masalah khas dengan pemungutan suara, terutama ketika tantangannya ada pada HNQ.)
user202729

6

R , 48 43 byte

-5 byte terima kasih kepada @Giuseppe, menggunakan logika yang sama, tetapi sebagai program yang menghilangkan ncharpanggilan.

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

Cobalah online!








2

APL (NARS), 11 karakter, 22 byte

{+/26⊥⎕A⍳⍵}

uji

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

2

C (gcc) , 46 , 43 byte

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

Cobalah 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

Google Sheets, 100 byte

(rumus mengevaluasi hasil, mengambil input dari sel A1)

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

Semua ruang ditambahkan hanya untuk kejelasan.

Catatan .

  • Saya tidak tahu apakah mungkin menghapus duplikasi row(indirect("1:"&len(A1)).
  • Meskipun Google Sheets memiliki decimalfungsi, transliterasi akan membutuhkan banyak byte.

1

APL + WIN, 12 byte

Asal indeks 1.

26⊥¯65+⎕av⍳⎕

Cobalah online! Atas perkenan Dyalog Classic

Penjelasan:

⎕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 byte

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

Cobalah online!

Keluaran

A = 1

B = 2

Z = 26

AA = 27

AB = 28

AZ = 52

ZZ = 702

AAA = 703


Saya bukan ahli golf Java, tapi Anda bisa mengurangi ini dengan mengembalikan alih-alih mencetak, menyederhanakan loop, menghapus spasi dan menyingkirkan variabel pdan n. 92 byte! .
Jo King

Luar biasa .......
Syed Hamza Hassan

1
Anda dapat menghapus staticuntuk mendapatkan 7 byte. Anda juga bisa menjadikan fungsi ini lambda untuk menyimpan lebih banyak byte. Saya juga berpikir bahwa versi rekursif dapat menghemat byte. Bagaimanapun, inilah solusi 39 byte saya .
Olivier Grégoire

Indah sekali.
Syed Hamza Hassan




1

J , 11 byte

26#.64|3&u:

Cobalah online!

Bagaimana itu bekerja

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 byte

åÈ*26+InYc

Cobalah

Atau tanpa bendera. Byte pertama dapat dihapus jika kita dapat mengambil input sebagai array karakter.

¨c aI̓26

Cobalah


Penjelasan

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

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

Cobalah online!

Penjelasan:

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

Arang , 10 byte

I↨²⁶ES⊕⌕αι

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

     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 byte

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

Keluaran:

? AZ
 52

? ZZ
 702

? AAA
 703

0

kode mesin x86, 19 byte

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

Majelis:

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

Cobalah online!


0

Kotlin , 29 byte

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

Cobalah online!

Dijelaskan

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
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.