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!

K X teilen
quelle
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:

9

Perl 6 , 17 Bytes

{:26[.ords X-64]}

Probieren Sie es online!

Anonymer Codeblock, der 64 von jedem Bytewert subtrahiert und von der Basis 26 mit ZÜberlauf zur nächsten Spalte konvertiert .

Scherzen
quelle
7

Google Sheets, 21 Bytes

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

=column(indirect(A1&2
user202729
quelle
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!

J.Doe
quelle
4

Java (JDK) , 39 Byte

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

Probieren Sie es online!

Olivier Grégoire
quelle
Welche Java-Plattform unterstützt dies?
Syed Hamza Hassan
@SyedHamzaHassan Java 8 oder höher.
Olivier Grégoire
3

05AB1E , 6 Bytes

Çžx-₂β

Probieren Sie es online!

Okx
quelle
Warum aus Neugier žxstatt nur 64?
Kevin Cruijssen
Ich weiß nicht, es sah besser aus, denke ich?
Okx
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 
RosLuP
quelle
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.

quelle
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.
user202729
quelle
1

APL + WIN, 12 Bytes

Indexherkunft 1.

26⊥¯65+⎕av⍳⎕

Probieren Sie es online! Mit freundlicher Genehmigung von Dyalog Classic

Erläuterung:

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

Syed Hamza Hassan
quelle
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
Bubbler
quelle
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
Zottelig
quelle
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)
Galen Ivanov
quelle
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
Neil
quelle
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
wooshinyobject
quelle
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!

Logern
quelle
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
    }
}
Schnecke_
quelle