Code Golf: Numerisches Äquivalent eines Excel-Spaltennamens

76

Die Herausforderung

Der kürzeste Code nach Zeichenanzahl, der das numerische Äquivalent einer Excel-Spaltenzeichenfolge ausgibt.

Zum Beispiel ist die ASpalte 1, Bist 2 usw. Sobald Sie drücken Z, wird die nächste Spalte AA, dann ABund so weiter.

Testfälle:

A:    1
B:    2
AD:   30
ABC:  731
WTF:  16074
ROFL: 326676

Die Codeanzahl umfasst die Eingabe / Ausgabe (dh das vollständige Programm).

Vivin Paliath
quelle
19
Code Golf ist sinnlos, APL gewinnt immer am Ende.
BlueRaja - Danny Pflughoeft
1
Wenn Sie eine Lösung veröffentlichen, stellen Sie bitte sicher, dass sie in allen oben genannten Fällen funktioniert (Eingabe / Ausgabe, da der Lauf gut ist), und notieren Sie, wo dies nicht der Fall ist. Vielen Dank.
3
Warum zum Teufel ist das mit Rosettastein markiert?!
Josh Stodola
2
J ist APL ohne den Griechen. J wird immer gewinnen, niemand spricht mehr APL.
Callum Rogers
1
@BlueRaja: Es ist interessant, dass APL diese Dinge auch 2010 noch gewinnt, fast 40 Jahre nachdem es den Mainstream verlassen hat.
Kragen Javier Sitaker

Antworten:

96

Perl, 36 34 33 31 30 17 15 11 Zeichen

$_=()=A..$_

Verwendung:

$ echo -n WTF | perl -ple '$_=()=A..$_'
16074

Reduziert auf 17 durch Verwendung von echo -n, um einen chopAnruf zu vermeiden .

Reduziert auf 15 durch Verwendung von say anstelle von print.

Reduziert auf 11 durch Verwendung von -p anstelle von say.

Erläuterung: AWird im Zeichenfolgenkontext ausgewertet und erstellt A..$_eine Liste, die bei "A" beginnt und die Zeichenfolge bis zur Eingabezeichenfolge erhöht. Perl interpretiert den ++Operator (und damit ..) für Zeichenfolgen in einem alphabetischen Kontext, z. B. für $_="AZ";$_++;printAusgaben BA.

=()=(auch bekannt als "goatse" -Operator ) erzwingt die Auswertung eines Ausdrucks im Listenkontext und gibt die Anzahl der von diesem Ausdruck zurückgegebenen Elemente zurück, dh $scalar = () = <expr>entspricht @list = <expr>; $scalar = @list.

David
quelle
2
Verwenden Sie $_oder $` instead of $ n` und rufen Sie printohne Argumente auf.
Mob
4
Verwenden Sie "-p" und löschen Sie den Druck insgesamt: echo -n WTF | perl -p -e '$ _ = () = A .. $ _' Gesamtcode: 11 Zeichen, AH AH!
Wazoox
2
wechseln printzu sayund fallen noch 2 Zeichen :)
mpeters
16
Ah, ich liebe den Ziegenoperator :)
Ether
6
Hey, Perl schlägt J!
David
339

Excel, 9 Zeichen :)

Verwenden Sie das richtige Werkzeug für den Job:

=COLUMN()

= SPALTE ()

Danko Durbić
quelle
166
Verwenden Sie die richtige Sprache für den Job: Portugiesisch Excel =COL(). 6 Zeichen. (Siehe dolf.trieschnigg.nl/excel/excel.html )
Debilski
21
Großartig! nur unterstützt es aber nicht ROFL.
SIE
63
Diese Lösung gibt sogar die Einschränkungen von Excel korrekt wieder.
Kibibu
18
Es wird nicht einmal eine Zeichenfolge als Eingabe verwendet. Kommt dem, was das Problem gesagt hat, nicht nahe. Es funktioniert nur, wenn es sich in der Spalte befindet, die zufällig nach der betreffenden Zeichenfolge benannt ist. Ganz und gar nicht im Sinne der Frage.
Phkahler
9
Um fair zu sein, Code Golf ist gemacht für diese Art von smartass Antworten. Du bekommst also eine +1 von mir.
Reynolds
71

J , 17 12 10 Zeichen

26#.64-~av

Beispiel:

26#.64-~av  'WTF'
16074

Erläuterung:

  • J analysiert von rechts nach links.
  • avgibt eine Liste der ascii - Indizes von jedem der Zeichen in seinem Argument, so zum Beispiel av'ABC'zurückkehrt 65 66 67.
  • Dann subtrahieren wir 64 von jedem Element dieser Liste mit dem Verb 64-~.
  • Dann konvertieren wir die Liste mit dem #.Verb in Basis 26 .
David
quelle
2
Nachdem ich einige Kommentare darüber gelesen habe, dass die Excel-Lösung wirklich keine Zeichenfolgeneingabe akzeptiert, werde ich mich für die kürzeste Lösung entscheiden und tatsächlich eine Zeichenfolgeneingabe vornehmen.
Vivin Paliath
Wow eine J-Lösung, die ich tatsächlich verstehen kann :)
Callum Rogers
2
@Brandon: J ist für alles gemacht, solange es Ihnen nichts ausmacht, jahrelang zu lernen, wie man es liest.
David
55

Brainf * ck, 81 Zeichen (kein Leerzeichen)

,[>>>[->>+++++[-<+++++>]<+<]>[-<+>]<<++++++++[<++++++++>-]<[<->-]<[>>>+<<<-],]>>>

Erläuterung

,[  // get character input into p[0], enter loop if it isn't null (0)
>>>[->>+++++[-<+++++>]<+<] // take what's in p[3] and multiply by 26, storing it in p[4]
>[-<+>] // copy p[4] back to p[3]
<<++++++++[<++++++++>-]< // store 64 in p[1]
[<->-]< // subtract p[1], which is 64, from the input char to get it's alphabetical index
[>>>+<<<-] // add p[0] to p[3]
,] // get another character and repeat
>>> // move to p[3], where our final result is stored

Sie werden also feststellen, dass ich den numerischen Wert zum Drucken nicht in eine ASCII-Zeichenfolge konvertiert habe. Das würde wahrscheinlich den Spaß ruinieren. Aber ich habe den Gefallen getan, den Zeiger mit dem Ergebnis auf die Zelle zu bewegen, also ist es zumindest für die Maschine nützlich.

Hey, was weißt du, ich habe C # geschlagen!

Tesserex
quelle
16
LOL @ Beating C #
Dan
Ich bin überrascht, dass jemand Bf tatsächlich an erster Stelle verwendet
OscarRyz
31

Ruby 1.8.7, 53 50 46 44 24 17 Zeichen

p ('A'..$_).count

Verwendung:

$ echo -n ROFL | ruby -n a.rb
326676
$ echo -n WTF | ruby -n a.rb
16074
$ echo -n A | ruby -n a.rb
1
Mark Rushakoff
quelle
Großartig, ich habe bereits ein sehr ähnliches Muster getestet, aber ich habe das nicht bemerkt p (und es p(ist anders :(
YOU
Verwenden echo -n ...Sie, damit Sie die.chop
John La Rooy
@gnibbler: Danke für die -n Idee, die meine Perl-Lösung ebenfalls auf 17 reduziert.
David
Sie könnten das auf 16 bringen, indem Sie? A anstelle von 'A' verwenden
steenslag
23

APL

13 Zeichen

Geben Sie den Wert ein in x:

x←'WTF'

Berechnen Sie es dann mit:

26⊥(⎕aV⍳x)-65

Der einzige Grund, warum ich mich geschlagen habe, sind die Klammern. Ich denke, es sollte eine Möglichkeit geben, es neu zu ordnen, um die Notwendigkeit für sie zu vermeiden, aber es war ein langer Tag. Ideen?

(Heh, du Perl-Programmierer mit deinen über 30 Zeichenlösungen bist so süß!)

Ken
quelle
Vielleicht 26⊥⁻65 + ⎕aV⍳x stattdessen? So schreiben Sie negative 65 in APL, richtig?
Kragen Javier Sitaker
Ich habe momentan keine APL-Umgebung vor mir, aber ich glaube, ich habe so etwas versucht und es hat nicht funktioniert. Auf den ersten Blick (und zugegebenermaßen bin ich am weitesten von einem APL-Assistenten entfernt!) Ist ⁻ gleichbedeutend mit - und da es von rechts nach links ausgewertet wird, wird es nach dem + angewendet, sodass Sie am Ende 26⊥⁻ ( 65+ (⎕aV⍳x)) statt 26⊥ ((⁻65) + ⎕aV⍳x), was Sie hier brauchen.
Ken
Akzeptierte Perl-Lösung schlägt Ihren Code um zwei Zeichen ... =)
kolistivra
14

Excel (nicht betrügen), 25 Zeichen

Unterstützt bis zu XFD:

=COLUMN(INDIRECT(A1&"1"))

Installation:

  1. Geben Sie die Formel in Zelle A2 ein.

Verwendung:

  1. Geben Sie die Spaltenzeichenfolge in Zelle A1 ein.
  2. Lesen Sie das Ergebnis in Zelle A2.

54 Zeichen plus viele Anweisungen

Unterstützt ROFL auch:

(A2)  =MAX(B:B)
(B2)  =IFERROR(26*B1+CODE(MID(A$1,ROW()-1,1))-64,0)

Installation:

  1. Löschen Sie die gesamte Tabelle.
  2. Geben Sie die Formel (A2) in Zelle A2 ein.
  3. Geben Sie die Formel (B2) in Zelle B2 ein.
  4. Füllen Sie die Formel (B2) so weit wie möglich nach unten.

Verwendung:

  1. Geben Sie die Spaltenzeichenfolge in Zelle A1 ein.
  2. Lesen Sie das Ergebnis in Zelle A2.
kennytm
quelle
13

C # 156 146 118 Zeichen

using System.Linq;class P{static void Main(string[]a){System.Console.Write(
a[0].Aggregate(0,(t,c)=>(t+c-64)*26)/26);}}

Ungolfed:

using System.Linq;
class P
{
    static void Main(string[] a)
    {
        System.Console.Write(a[0]
            .Aggregate(0, (t, c) => (t + c - 64) * 26) / 26);
    }
}
Cameron MacFarland
quelle
Die Verknüpfung mit C = System.Console hilft Ihnen hier nicht weiter, da Sie am Ende "System" sagen müssen. zweimal. Sie können 5 Zeichen speichern, wenn Sie nur "using System" ausführen. und ändern Sie Ihren Code entsprechend. Aber meine Nicht-Linq-Version ist immer noch kürzer. :)
Igby Largeman
Sie haben Recht, und ich kann es noch kürzer machen, indem ich das erste Argument anstelle von Console.Readline verwende, wodurch es noch kürzer wird. : P
Cameron MacFarland
1
Oh Mist, ich habe dir geholfen, vor mir zu kommen! : P
Igby Largeman
Übrigens, danke, dass du meine Zeichenanzahl korrigiert hast. Darauf habe ich mich total geeinigt.
Igby Largeman
3
Wie wäre es Console.Writestatt WriteLine?
Andreas Grech
12

Golfscript - 16 Zeichen

[0]\+{31&\26*+}*


$ echo -n WTF | ./golfscript.rb excel.gs
16074
$ echo -n ROFL | ./golfscript.rb excel.gs
326676
Gnibbler
quelle
11

Haskell, 50 51 56 Zeichen

main=interact$show.foldl(\x->(26*x-64+).fromEnum)0

Verwendung:

~:166$ echo -n "ROFL" | ./a.out
326676
~:167$ echo -n "WTF" | ./a.out
16074
KennyTM
quelle
9

Python, 64 49 Zeichen

s=0
for c in raw_input():s=26*s+ord(c)-64
print s

Sie können auch ersetzen raw_input()mit input()zu reduzieren , die Zeichenanzahl von 4, aber das erfordert dann die Eingabe in Anführungszeichen es enthalten.

Und hier ist eine Unterroutine mit 47 Zeichen:

f=lambda x:len(x)and 26*f(x[:-1])+ord(x[-1])-64
Adam Rosenfield
quelle
Ihre Nummer 2 sollte f heißen. Versuchen Sie es jetzt, es funktioniert nicht. Und es kann mit Hilfe von Lambdas und Kurzschlussbewertung kürzer gemacht werden (47 Zeichen):f=lambda x:len(x)and 26*f(x[:-1])+ord(x[-1])-64
Ponkadoodle
@ Wallacoloo: Danke. Es ist ein Community-Wiki, sodass Sie jederzeit Änderungen vornehmen können.
Adam Rosenfield
Wie wäre es, len (x) für x alleine fallen zu lassen? wird 43 Zeichen: f = Lambda x: x und 26 * f (x [: - 1]) + ord (x [-1]) - 64
Nas Banov
9

k4 (kdb +), 11 Zeichen

26/:1+.Q.A?

Erläuterung:

  • k4 analysiert links von rechts
  • .Q.A ist in k4 definiert - es ist der Vektor "ABC...XYZ"
  • ? ist der Suchoperator - der Index der ersten Übereinstimmung für Elemente im y-Argument innerhalb des x-Arg
  • +1, um den Index zu versetzen
  • 26/: zur Basis 26 konvertieren

Eine Einschränkung - dies funktioniert nur, wenn aufgelistete Typen übergeben werden:

  26/:1+.Q.A? "AD"
30

  26/:1+.Q.A? "WTF"
16074

aber:

  26/:1+.Q.A? ,"A"
1
Ciarán
quelle
8

Powershell, 42 Zeichen

[char[]]$args[($s=0)]|%{$s=$s*26+$_-64};$s
Danko Durbić
quelle
8

JavaScript 1.8: 66 Zeichen

function a(p)Array.reduce(p,function(t,d)t*26+d.charCodeAt()-64,0)

Javascript 1.8: 72 Zeichen

function a(p)(t=0,p.replace(/./g,function(d)t=t*26+d.charCodeAt()-64),t)

JavaScript 1.6: 83 Zeichen

function a(p){t=0;p.split("").map(function(d){t=t*26+d.charCodeAt(0)-64});return t}

JavaScript: 95 Zeichen

function a(p){r=0;t=1;l=p.length;for(i=0;i<l;i++){r+=(p.charCodeAt(l-1-i)-64)*t;t*=26}return r}

JavaScript: 105 Zeichen

function a(p,i){i=i||0;l=p.length;return p?(p.charCodeAt(l-1)-64)*Math.pow(26,i)+a(p.slice(0,l-1),i+1):0}

Verwendung:

a("A")        // 1
a("B")        // 2
a("AD")       // 30
a("ABC")      // 731
a("WTF")      // 16074
a("ROFL")     // 326676
Daniel Vassallo
quelle
Ich habe 4 weitere Zeichen aus der 1.6-Lösung mithilfe von Ausdrucksschließungen rasiert. Möglicherweise können Sie es etwas weiter verkleinern, indem Sie das (t?g*26:0)Teil umgestalten .
David Murdoch
AKTUALISIEREN. Ich habe gerade 9 weitere Zeichen mit [] .reduce
David Murdoch
FWIW, ich habe eine Implementierung mitstring#replace
Chetan S
@Chetan, @David: Gute Arbeit. Das ist ordentlich!
Daniel Vassallo
6

Scala, 30 Zeichen

print((0/:args(0))(_*26+_-64))" 

Beispiel:

C:\>scala -e "print((0/:args(0))(_*26+_-64))" AD
30
Daniel C. Sobral
quelle
5

C89, 58 Zeichen

s;main(c){while(c=getchar()+1)s=26*s+c-65;printf("%d",s);}

Die Eingabe (stdin) darf nur AZ enthalten, andere Zeichen (einschließlich Zeilenumbrüche) sind nicht zulässig.

Adam Rosenfield
quelle
1
getchar()kehrt < 0auf EOF zurück; EOF ist nicht als -1 definiert, aber es ist üblich.
Strager
@strager: Guter Punkt. Um die vollständige Portabilität sicherzustellen, müssten dann 2 Zeichen hinzugefügt werden (durch Ändern c=getchar()+1von (c=getchar())>=0und 65zu 64). Dies sollte jedoch in fast jeder C-Implementierung funktionieren.
Adam Rosenfield
5

Erläuterung der Konzepte - Excelcification

Nett. Ich habe vor langer Zeit meine eigene Version mit etwas mehr Erklärung unter http://aboutdev.wordpress.com/2009/12/19/excelcification-brain-teaser-code/ geschrieben . Obwohl es keine ganz optimierte Version ist!

Zu Ihrer Information. Die Basis-26-Arithmetik heißt hexavigesimal und die maximale Spalte von Excel ist XFD , die in 16383 konvertiert wird (wobei 0 als erste Zelle verwendet wird), was zufällig genau 2 ^ 14 Zellen sind .

Kann jemand erraten, warum es 2 ^ 14 ist?

AboutDev
quelle
5
Vielleicht wollen sie zu diesem Zeitpunkt nur 64k Speicher verwenden :-)
SIE
Weil sie Offsets (xy) machen wollten, für die ein Vorzeichenbit erforderlich ist. Aber das sind nur 15 Bits. Was ist mit dem 16. Bit los? Wird es als Flagge verwendet?
Phkahler
1
Dies ist nicht genau Basis-26, da es keine 0 hat. Wenn wir A 1 darstellen lassen und mit 26^nfür die Position n(mit n = 0für den Buchstaben ganz rechts) multiplizieren , funktioniert alles wie gewohnt.
Thomas
@phkahler: Mit 1 Bit können Sie alle vorzeichenlosen Ganzzahlen im Bereich 0..2 ^ 0 darstellen. Somit können Sie mit 16 Bits 0..2 ^ 15 darstellen. Nehmen Sie 1 Bit für das Vorzeichen weg, der Maximalwert ist 2 ^ 14-1 (= 16383).
stakx - nicht mehr beitragen
1
@phkahler: Sie benötigen kein Vorzeichenbit, um Offsets darzustellen, solange Sie keine eindeutige Darstellung für Werte außerhalb der Grenzen benötigen (dh Sie können das Prozessorüberlaufbit überprüfen, um festzustellen, ob Sie außerhalb der Grenzen liegen ).
Kragen Javier Sitaker
5

Common Lisp, 103 128 Zeichen

(defun x(s)(reduce(lambda(x y)(+(* 26 x)y))(map 'vector(lambda(b)(-(char-code b)(char-code #\A)-1))s)))
Paul Richter
quelle
5

C #, 117 111 Zeichen

Kein Wettbewerb im Vergleich zu Perl, Ruby und APL, aber eine Verbesserung gegenüber den anderen bisher gegebenen C # / Java-Antworten.

Dies verwendet die Horner-Regel .

class C{static void Main(string[]a){int t=0;foreach(var c in a[0]){t=(t+c-64)*26;}System.Console.Write(t/26);}}
Daniel Renshaw
quelle
1
Sie können 3 Zeichen speichern, indem Sie den Abstand zwischen [] und 'a' sowie den foreach-Klammern entfernen.
Cameron MacFarland
Ich wusste nicht, dass String IEnumerable implementiert hat. Süss! Leider ist die Seite über Horners Regel weit über meinem Kopf, aber eindeutig eine Gewinnstrategie. Ich mag es nicht, Console.Write () zu verwenden, da die Ausgabe unübersichtlich ist. +1
Igby Largeman
4

Perl, 34 Zeichen

map$\=26*$\-64+ord,pop=~/./g;print

Vielen Dank an mobrule für einige Vorschläge.

user181548
quelle
Sie können sagen, pop=~/./ganstatt split//,$ARGV[0]Sie können das $_im ordAnruf weglassen . Sie können $` instead of $ s` verwenden und dann einfach sagen print.
Mob
4

C #, 148 Zeichen

using System;class P{static void Main(string[]a){var r=0d;int j=0,i=a[0].
Length;while(i-->0)r+=(a[0][i]-64)*Math.Pow(26,j++);Console.WriteLine(r);}}

Ungolfed:

using System;
class P
{
    static void Main(string[] a)
    {
        var r = 0d;
        int j = 0, i = a[0].Length;
        while (i-- > 0)
            r += (a[0][i] - 64) * Math.Pow(26, j++);

        Console.WriteLine(r);
    }
}
Igby Largeman
quelle
4

Python - 63 Zeichen

>>> f = Lambda z: reduzieren (Lambda x, y: 26 * x + y, [ord (c) -64 für c in z])

>>> f ('ROFL')

326676

Schlaf
quelle
4

Clojure:

user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "AD"))
30
user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "ROFL"))
326676

51 Zeichen plus die Anzahl der Zeichen in der Eingabezeichenfolge.

jimbokun
quelle
4

C:

int r=0;
while(*c)r=r*26+*c++-64;

Die Zeichenfolge wird in 'c' gespeichert, der Wert in 'r'.

flauschige
quelle
4

Ruby 1.9, 21 Zeichen

p'A'.upto(gets).count

Tests:

$ echo -n A| ruby x.rb
1
$ echo -n WTF| ruby x.rb
16074
$ echo -n ROFL| ruby x.rb
326676
SIE
quelle
Sie können Chop anstelle von Strip verwenden, um 1 Zeichen zu erhalten
JRL
Danke @JRL, ich war etwas falsch in der Verwendung von echo A |, es sollte seinecho A|
SIE
Verwenden Sie echo -nwie andere und loswerden chop.
Daniel C. Sobral
Danke @Daniel, ich habe es aktualisiert, aber es sieht so aus, echo -nals würde es unter Windows nicht funktionieren.
SIE
4

Common Lisp, 86 Zeichen.

(defun z(s)(let((a 0))(map nil(lambda(v)(setf a(+(* 26 a)(digit-char-p v 36)-9)))s)a))
Zhivago
quelle
3

Java: 112 124 Zeichen

class C{public static void main(String[]a){int r=0;for(int b:a[0].getBytes())r=26*r+b-64;System.out.print(r);}}
Robin
quelle
3

Common Lisp, 81 Zeichen

(defun y(s)(reduce(lambda(x y)(+(* 26 x)(-(char-code y)64)))s :initial-value 0))

Komisch, dass ich als neuer Benutzer meine eigene Antwort posten kann, aber nicht die eines anderen kommentieren kann. Na ja, entschuldige, wenn ich das falsch mache!

Dr. Pain
quelle
Ich denke du musst dich registrieren :) Dann kannst du einen Kommentar abgeben.
Vivin Paliath
3

MATLAB: 24 Zeichen

polyval(input('')-64,26)

Verwendung:

>> polyval(input('')-64,26)
(after pressing enter) 'WTF'

ans =

       16074

Hinweis: Sie können es auf 16 Zeichen reduzieren, wenn Sie die Zeichenfolge vorab speichern x, aber ich dachte, es wäre ein Betrug:

>> x = 'WTF'

x =

WTF

>> polyval(x-64,26)

ans =

       16074
rlbond
quelle
Wie könnte ich Polyval vergessen .. +1 für eine bessere Lösung
George
3

PHP - 73 Zeichen

$n=$argv[1];$s=$i=0;while($i<strlen($n))$s=$s*26+ord($n[$i++])-64;echo$s;

Verwendung:

php -r '$n=$argv[1];$s=$i=0;while($i<strlen($n))$s=$s*26+ord($n[$i++])-64;echo$s;' AA

> 27
Kevin Vaughan
quelle
1
Sie könnten 10 Zeichen verlieren, indem Sie die geschweiften Klammern um Ihre while-Funktion entfernen und die Variableninitialisierung ausgeben.
ChiperSoft