Berechnen Sie bei einer gegebenen Zeichenfolge die Nummer der Spalte, der sie entspricht


17

In Excel reichen die Spalten von A-Z, AA,AB,AZ,BA,..,BZund so weiter. Sie stehen eigentlich jeweils für Zahlen, sind aber als alphabetische Zeichenfolgen kodiert.

In dieser Herausforderung erhalten Sie eine Folge von Buchstaben und müssen die Spalte berechnen, der sie entspricht.

Einige Tests:

'A' gibt 1 zurück (was bedeutet, dass es die erste Spalte ist)

'B' gibt 2 zurück

'Z' gibt 26 zurück

'AA' gibt 27 zurück

'AB' gibt 28 zurück

'AZ' gibt 52 zurück

'ZZ' gibt 702 zurück

'AAA' gibt 703 zurück

Sie können davon ausgehen, dass nur Großbuchstaben angegeben werden.

Kürzeste Bytes gewinnen.

Viel Glück!


Also ... Basis 26 mit dem Alphabet?
Jo King

1
Es ist nicht ganz Basis 26, weil es keine Null gibt.
J.Doe

@ J.Doe Ah, ich denke du hast recht. Ich habe es nicht bemerkt, da meine Lösung Zsowieso automatisch als 10 behandelt wurde
Jo King,


6
@JoKing Bijective base .
user202729

Antworten:



7

Google Sheets, 21 Bytes

(Formel wird zum Ergebnis ausgewertet, Eingabe von Zelle A1)

=column(indirect(A1&2

Wir stehen kurz davor, eine etwas weniger golfene Version davon zu veröffentlichen.
ATaco

1
Ich habe auch eine Lösung in Google Sheets, die nicht auf der integrierten COLUMN basiert. Probieren Sie es aus. (Außerdem fühle ich mich schlecht, dass die Lösung, auf die ich mich mehr konzentriere, weniger Beachtung findet ... es ist sowieso ein typisches Problem bei Abstimmungen, besonders wenn die Herausforderung auf HNQ läuft.)
user202729 22.10.18

6

R , 48 43 Bytes

-5 Bytes dank @Giuseppe, mit der gleichen Logik, aber als Programm, das den ncharAufruf beseitigt .

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

Probieren Sie es online!








2

APL (NARS), 11 Zeichen, 22 Byte

{+/26⊥⎕A⍳⍵}

Prüfung

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

2

C (gcc) , 46 , 43 Bytes

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

Probieren Sie es 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

(Formel wird zum Ergebnis ausgewertet, Eingabe von Zelle A1)

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

Alle Leerzeichen werden nur zur Verdeutlichung hinzugefügt.

Hinweis .

  • Ich weiß nicht, ob es möglich ist, die Duplizierung von zu entfernen row(indirect("1:"&len(A1)).
  • Obwohl Google Sheets eine decimalFunktion hat, würde die Transliteration eine Menge Bytes benötigen.


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

Probieren Sie es online!

Ausgabe

A = 1

B = 2

Z = 26

AA = 27

AB = 28

AZ = 52

ZZ = 702

AAA = 703


Ich bin kein Experte im Golfen mit Java, aber Sie können dies erheblich reduzieren, indem Sie zurückkehren anstatt zu drucken, die for-Schleifen vereinfachen, Leerzeichen entfernen und die pund -Variablen entfernen n. 92 Bytes! .
Jo King

Wunderbar .......
Syed Hamza Hassan

1
Sie können entfernen static, um 7 Bytes zu erhalten. Sie können diese Funktion auch als Lambda definieren, um mehr Bytes zu sparen. Ich denke auch, dass die rekursive Version Bytes sparen könnte. In jedem Fall ist hier meine 39-Byte-Lösung .
Olivier Grégoire

Das ist wunderbar.
Syed Hamza Hassan




1

J , 11 Bytes

26#.64|3&u:

Probieren Sie es online!

Wie es funktioniert

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 Bytes

åÈ*26+InYc

Versuch es

Oder ohne Flagge. Das erste Byte kann entfernt werden, wenn die Eingabe als Zeichenarray erfolgen kann.

¨c aI̓26

Versuch es


Erläuterung

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

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

Probieren Sie es online!

Erläuterung:

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

Kohle , 10 Bytes

I↨²⁶ES⊕⌕αι

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

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

Ausgabe:

? AZ
 52

? ZZ
 702

? AAA
 703

0

x86-Maschinencode, 19 Byte

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

Versammlung:

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

Probieren Sie es online!


0

Kotlin , 29 Bytes

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

Probieren Sie es online!

Erklärt

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
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.