Bir dize verildiğinde, karşılık geldiği sütun sayısını hesaplayın


17

Excel'de, sütunlar A-Z, AA,AB,AZ,BA,..,BZvb. Arasında değişir . Aslında her biri sayıları temsil eder, ancak alfabe dizeleri olarak kodlanır.

Bu meydan okumada size bir dizi alfabe verilecek ve karşılık gelen sütunu hesaplamanız gerekir.

Bazı testler:

'A' 1 değerini döndürür (yani ilk sütun olduğu anlamına gelir)

'B' 2 değerini döndürür

'Z' 26 döndürür

'AA' 27 döndürür

'AB' 28 değerini döndürür

'AZ' 52 döndürür

'ZZ' 702 değerini döndürüyor

'AAA' 703 değerini döndürür

Büyük harflerin yalnızca verileceğini varsayabilirsiniz.

En kısa bayt kazanır.

İyi şanslar!


Yani ... 26 alfabesi ile mi?
Jo King

1
Tamamen 26 değil çünkü sıfır yok.
J.Doe

@ J.Doe Ah, sanırım haklısın. Z
Jo King


Yanıtlar:



7

Google E-Tablolar, 21 bayt

(formül sonucu değerlendirir, A1 hücresinden girdi alır)

=column(indirect(A1&2

Bunun biraz daha az golf edilmiş bir versiyonunu yayınlamak üzere.
ATaco

1
Ayrıca Google E-Tablolar'da yerleşik COLUMN'a dayanmayan bir çözümüm var, bir göz atın. (ayrıca, daha fazla çaba harcadığım çözümün daha az dikkat çekmesi beni kötü hissettiriyor ... oylama ile ilgili tipik bir sorun, özellikle de zorluk HNQ'da olduğunda.)
user202729 22:18

6

R , 48 43 bayt

-Giuseppe sayesinde aynı mantığı kullanarak -5 bayt, ancak ncharçağrıyı ortadan kaldıran bir program olarak .

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

Çevrimiçi deneyin!








2

APL (NARS), 11 karakter, 22 bayt

{+/26⊥⎕A⍳⍵}

Ölçek

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

2

C (gcc) , 46 , 43 bayt

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

Çevrimiçi deneyin!

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 E-Tablolar, 100 bayt

(formül sonucu değerlendirir, A1 hücresinden girdi alır)

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

Tüm alanlar yalnızca netlik için eklenmiştir.

Not .

  • Çoğaltmasını kaldırmak mümkün mü bilmiyorum row(indirect("1:"&len(A1)).
  • Google E-Tablolar'ın bir decimalişlevi olmasına rağmen , harf çevirisi çok fazla bayt alır.

1

APL + WIN, 12 bayt

Endeks kaynağı 1.

26⊥¯65+⎕av⍳⎕

Çevrimiçi deneyin! Dyalog Classic'in izniyle

Açıklama:

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

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

Çevrimiçi deneyin!

Çıktı

A = 1

B = 2

Z = 26

AA = 27

AB = 28

AZ = 52

ZZ = 702

Aaa = 703


Java golf uzmanı değilim, ancak baskı yerine geri dönerek, döngüler için basitleştirerek, boşluğu kaldırarak ve pve ndeğişkenlerden kurtularak bunu önemli ölçüde azaltabilirsiniz. 92 bayt! .
Jo King

Harika .......
Syed Hamza Hassan

1
static7 bayt kazanmak için kaldırabilirsiniz . Ayrıca bu fonksiyonu daha fazla bayt için lambda yapabilirsiniz. Ayrıca özyinelemeli sürümün bayt kaydedebileceğini düşünüyorum. Her durumda, benim 39 bayt çözümüm .
Olivier Grégoire

Bu harika.
Syed Hamza Hassan




1

J , 11 bayt

26#.64|3&u:

Çevrimiçi deneyin!

Nasıl çalışır

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 bayt

åÈ*26+InYc

Dene

Veya bayraksız. Girdiyi karakter dizisi olarak alabilirsek ilk bayt kaldırılabilir.

¨c aI̓26

Dene


açıklama

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

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

Çevrimiçi deneyin!

Açıklama:

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

Kömür , 10 bayt

I↨²⁶ES⊕⌕αι

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

     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 bayt

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

Çıktı:

? AZ
 52

? ZZ
 702

? AAA
 703

0

x86 makine kodu, 19 bayt

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

Montaj:

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

Çevrimiçi deneyin!


0

Kotlin , 29 bayt

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

Çevrimiçi deneyin!

Açıklaması

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
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.