Auflisten einer Zellennotation

16

Wir sind also hoffentlich alle mit der A1-Zellennotation in der Tabellenkalkulation vertraut.

Es ist einfach eine alphanumerische Darstellung der Positionierung der Zelle innerhalb eines Gitters. Die Buchstaben stehen für die Spaltenposition der Zelle und die Zahl für die Zeile.

Der Buchstabenteil kann aus einem oder mehreren Buchstaben des englischen Alphabets mit 26 Buchstaben bestehen. Alle Buchstaben müssen Großbuchstaben sein. Diese ordnen Zahlen mithilfe der 26-adischen bijektiven Nummerierung zu. Der Teil 'number' kann aus einer beliebigen positiven Ganzzahl ungleich Null bestehen.


Die Herausforderung, ein Programm zu schreiben, das die A1-Notation einer Zelle als einzelne Zeichenfolge angibt, kann eine Zeichenfolge ausgeben, die die als Zahl dargestellte Spaltenposition, gefolgt von einem Leerzeichen und der Zeilennummer enthält.

Beispiele für Ein- / Ausgänge unten:

A1
>>1 1
B10
>>2 10
AC4 
>>29 4
AAC753
>>705 753
F123
>>6 123
GL93
>>194 93

Dies ist meine erste Herausforderung, daher die relative Einfachheit und potenzielle Schwäche der Kriterien.

BEARBEITEN : Die Zeichenfolge muss aus Buchstaben, gefolgt von Zahlen bestehen und das Gewinnkriterium ist die kürzeste Codelänge (wenn das eine Sache sein kann).

BEARBEITEN : Bezogen auf diesen Vorgang wird jedoch der umgekehrte Vorgang mit einem anderen Startindex durchgeführt. Einige mögen argumentieren, dass diese Tatsache das verknüpfte Puzzle interessanter macht.

dbr
quelle
Können wir die Eingabe als ein Array mit den Buchstaben und den Zahlen betrachten:["A", "1"]
Stephen
1
@StepHen Nein. Es muss eine einzelne Zeichenfolge sein, die sowohl Buchstaben als auch Zahlen enthält. Ich sollte wahrscheinlich auch hinzufügen, dass die Zeichenfolge in der Reihenfolge der Buchstaben gefolgt von Zahlen sein muss.
dbr
1
Normalerweise erlauben wir flexiblere Eingabe- und Ausgabeformate, z. B. die Auswahl von Zeilenvorschub anstelle von Leerzeichen als Trennzeichen für die Ausgabe
Luis Mendo
3
@DeanBrunt Es hängt von Ihnen ab, und natürlich können Sie ein striktes Format erzwingen, um die Herausforderung zu erschweren. Aber die Leute genießen normalerweise die Schwierigkeit bei den tatsächlichen Berechnungen mehr als im Format
Luis Mendo
4
Das liegt daran, dass die Formatierung der eigentlichen Herausforderung selbst keinen Wert hinzufügt
Adnan

Antworten:

20

Microsoft Excel, 43 Bytes.

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

Ich konnte mir nicht helfen, ich musste einfach das richtige Werkzeug für den Job verwenden. Übernimmt die Eingabe auf A1.

Testfälle

Ein Taco
quelle
11

Microsoft Excel, 40 Bytes

Brasilianische portugiesische Sprachversion.

=COL(INDIRETO(A1))&" "&LIN(INDIRETO(A1))

Übersetzte (und damit golfene) Version der ATaco-Lösung .

pajonk
quelle
Ich kann mich nicht erinnern, ob Excel dies zulässt, aber könnten Sie den Vorschlag von @Uriel auf eine andere Antwort anwenden und die letzten beiden Klammern verlieren?
dbr
Bei diesem Vorschlag (ohne Klammern ganz rechts) wird in Excel eine Warnung ausgegeben, die Sie bestätigen müssen, um fortzufahren. Ich denke also, dass dies hier nicht zulässig ist.
Pajonk
Ah ich sehe. Es ist dann anders als Blätter.
Dienstag,
7

Python 2 , 94 91 73 Bytes

-3 Bytes dank Jonathan Allan
-18 Bytes dank tsh

s=input().strip
a=s(`3**39`);t=0
for n in a:t=t*26+ord(n)-64
print t,s(a)

Probieren Sie es online!

Dies missbraucht die Arbeitsweise .stripund entfernt alle Ziffern mita=s(`3**39`) denen `3**39`es sich nur um eine kürzere Methode zum Generieren der Ziffern von 0bis handelt. Dadurch 9werden nur die Zeichena der Zeichen von den Zahlen verwendet werdens(a)

Stange
quelle
Ich glaube nicht, dass die stripEingabe der eindeutigen Zeichen 3**39erforderlich ist , daher sollte dies auch so sein.
Jonathan Allan
1
73 Bytes
tsh
6

Google Sheets, 43 Bytes

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

Probieren Sie es online!

A1ist die Eingabezelle. Hoffentlich funktioniert der obige Link. Ich habe noch nie zuvor Codegolf mit Google Sheets ausprobiert.

notjagan
quelle
1
@ATaco Es gibt keinen Grund dafür, da doppelte Antworten nebeneinander existieren können.
Conor O'Brien
1
Das Erscheinungsbild von Google Sheets und Microsoft Excel-Antworten gefällt mir.
dbr
5
Sie können =COLUMN(INDIRECT(A1))&" "&ROW(INDIRECT(A1für 41 Bytes tun . Blatt füllt fehlende rechte Elternteile aus.
Uriel
5

JavaScript, 72 Bytes

x=>x.replace(/\D+/,s=>[...s].reduce((n,v)=>n*26+parseInt(v,36)-9,0)+' ')
tsh
quelle
2

Proton , 113 Bytes

k=>{b=(s=k.strip)('0123456789');str(sum(map((a=>26**a[1][0]*(ord(a[1][1])-64)),enumerate(b[to by-1]))))+' '+s(b)}

Probieren Sie es online!

-19 Bytes Rod-Algorithmus borgen ( Note to self: add listcomps )

HyperNeutrino
quelle
2

Dyalog APL, 44 Bytes

(26⊥¯65+⎕AV⍳(a~⎕D)),⎕A~⍨a←⍞

Probieren Sie es online!

bgiv
quelle
1
Entfernen Sie die Klammer um (a~⎕D). Nachschlagen ⎕Astatt ⎕AV. Mach stillschweigend. Tauschen Sie Argument von aus ,. Kommt auf nur 16 Bytes runter:~∘⎕A,⍨26⊥⎕A⍳~∘⎕D
Adám
1

Perl 5 , 35 + 1 (-p) = 36 Bytes

map$r=$r*26-64+ord,/\D/g;s/\D*/$r /

Probieren Sie es online!

Die mapAnweisung behandelt die Spalte wie eine base26-Zahl und konvertiert sie in eine Dezimalzahl. Die Ersetzung ersetzt die Buchstaben durch die Zahlen. Die Eingabe und Ausgabe sind im -pFlag enthalten.

Xcali
quelle
1

Mathematica, 108 Bytes

StringReplace[c:LetterCharacter..~~r:DigitCharacter..:>ToString@FromDigits[ToCharacterCode@c-64,26]<>" "<>r]

Die Operatorform StringReplacenimmt den alphabetischen Teil cder Zeichenfolge, konvertiert ihn in eine Liste von Zeichencodes, subtrahiert 64von jedem Codepunkt, interpretiert das Ergebnis als Basis- 26Ganzzahl, konvertiert diese Ganzzahl in a Stringund anschließend in ein StringJoinLeerzeichen, gefolgt vom numerischen Teilr .

Regex verwenden (auch 108Bytes):

StringReplace[RegularExpression["([A-Z]+)(.+)"]:>ToString@FromDigits[ToCharacterCode@"$1"-64,26]<>" "<>"$2"]
Genisis
quelle
1
ToCharacterCode@c-64kann manchmal reduziert werden auf LetterNumber@c. LetterNumberschließt die Ausgabe jedoch nicht ein, Listwenn die Eingabe ein einzelnes Zeichen ist.
JungHwan Min
1

Jelly ,  16  15 Bytes

ØAɓi@€ḟ0ḅ26,⁸Kḟ

Ein vollständiges Programm, das den String als Argument akzeptiert und das Ergebnis ausgibt

Probieren Sie es online!

Wie?

ØAɓi@€ḟ0ḅ26,⁸Kḟ - Main link: list of characters, ref  e.g. "AAC753"
ØA              - uppercase alphabet yield               = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  ɓ             - dyadic chain separation, call that B and place it on the right
   i@€          - first index for €ach (swap arguments)    [1,1,3,0,0,0]
      ḟ0        - filter discard zeros                     [1,1,3]
        ḅ26     - convert from base 26 to integer           705
            ⁸   - chain's left argument (ref)              "AAC753"
           ,    - pair                                     [705,['A','A','C','7','5','3']]
             K  - join with spaces                         [705,' ','A','A','C','7','5','3']
              ḟ - filter discard those in right (B)        [705,' ','7','5','3']
                - implicit print                        >>>705 753

Hinweis: Die Konvertierung aus einer Liste von Zahlen mit dem Basisumwandlungsatom ermöglicht, dass Orte außerhalb des erwarteten Bereichs liegen. Daher wird die Konvertierung aus [2,26,1]( "BZA") mit 2 × 26 2 + 26 × 26 1 + 1 × 26 0 =ḅ26 berechnet 2029 obwohl die "erwartete" Darstellung gewesen wäre .[3,0,1]

Jonathan Allan
quelle
2
@Dean Brunt Es ist nicht üblich, eine Antwort so schnell zu akzeptieren (die meisten lassen sie eine Woche) - dies kann andere vom Wettbewerb abhalten. Es würde mich nicht wundern, wenn 05AB1E oder eine andere Golfsprache dies unterbieten würden ...
Jonathan Allan
Punkt genommen. Ich lerne mich immer noch
zurecht
Kein Problem! Willkommen bei PPCG & schöner erster Beitrag :)
Jonathan Allan
1

Mathematica, 77 72 69 68 Bytes

#/.{a__,b__?DigitQ}:>{f=FromDigits;f[LetterNumber@{a},26],f[b<>""]}&

Nimmt eine Liste von Zeichen.

Probieren Sie es auf Wolfram Sandbox

Verwendung

#/.{a__,b__?DigitQ}:>{f=FromDigits;f[LetterNumber@{a},26],f[b<>""]}&[{"G", "L", "9", "3"}]

{194, 93}

oder

#/.{a__,b__?DigitQ}:>{f=FromDigits;f[LetterNumber@{a},26],f[b<>""]}&[Characters["GL93"]]

{194, 93}

Erläuterung

#/.

In der Eingabe ersetzen ...

{a__,b__?DigitQ}

Eine Liste , die zwei Sequenzen aund b(mit 1 oder mehreren Elementen) ist , wobei bnur der digit Zeichen besteht ... (Mathematica verwendet lazy Musteranpassung, also keine Prüfung für erforderlich a)

:>

in...

f=FromDigits;

Stellen Sie fzu Ziffer-to-Integer - Umwandlungsfunktion.

LetterNumber@{a}

Konvertieren Sie ain Buchstaben (a -> 1, b -> 2 usw.).

{f[ ... ,26],f[b<>""]}

Konvertieren Sie das Obige von der Basis 26 in eine Dezimalzahl und konvertieren Sie es bin eine Dezimalzahl.

JungHwan min
quelle
1

Haskell, 67 Bytes

(\(l,n)->show(foldl(\a->(a*26-64+).fromEnum)0l)++" "++n).span(>'9')

Probieren Sie es online aus.

Cristian Lupascu
quelle
1

Netzhaut , 85 Bytes

[A-Z]
$& 
[T-Z]
2$&
[J-S]
1$&
T`_L`ddd
\d+
$*
{`\G1(?=.* .* )
26$*
}` (.* )
$1
1+
$.&

Probieren Sie es online! Erläuterung:

[A-Z]
$& 

Trennen Sie die Buchstaben voneinander und die endgültige Nummer.

[T-Z]
2$&
[J-S]
1$&
T`_L`ddd

Konvertieren Sie die Buchstaben in Dezimalzahlen.

\d+
$*

Wandle alles in Einzahl um.

{`\G1(?=.* .* )
26$*
}` (.* )
$1

Während es mindestens drei Zahlen gibt, multiplizieren Sie die erste mit 26 und addieren Sie sie zur zweiten.

1+
$.&

Wandle alles in Dezimal um.

Neil
quelle
1

Rubin , 50, 48 + 1 = 51 49 Bytes

Verwendet die -pFlagge. -2 Bytes von m-chrzan.

sub(/\D+/){i=0;$&.bytes{|b|i=26*i+b-64};"#{i} "}

Probieren Sie es online!

Wert Tinte
quelle
i=i*26+b-64Spart 2 Bytes.
m-chrzan
1

> <>, 42 Bytes

0i88*-:0(?\$2d**+!
$n88*+48*o\
oi:0(?;   >

Probieren Sie es online

Erläuterung:

0i88*-:0(?\$2d**+! Read in the Letters part of the input
0                  Push an initial 0 to the stack
 i                 Read a character of input
  88*-             Subtract 64 to get from the ascii code to its value ('A'=1,'B'=2 etc.)
      :0(?\        If the value is less than 0, break out of this loop
           $2d**   Multiply our accumulator by 26
                +  Add our new number to the accumulator
                 ! don't add a new zero to the stack

Die obige Schleife liest die erste Nummer des Ziffernteils ein (z. B. '3' in "AB34"), bevor sie unterbrochen wird, und hat bereits 64 davon subtrahiert, sodass sich das nächste Codebit damit befassen muss

$n88*+48*o\        Output a space, and prepare to output the first number we read in during the previous loop
          \        Loop round to the left end of this line
$n                 Output the value of the letters part as a number
  88*+             Add the 64 we subtracted from the first number
      48*o         Output a space
          \        Enter the next loop

Diese Schleife beginnt mit der Ausgabe eines Zeichens, das entweder das erste von der ersten Schleife eingelesene Zeichen oder das von der vorherigen Iteration dieser Schleife eingelesene Zeichen ist.

oi:0(?;   >        Output the numbers part, by just echoing it
          >        Loop round to the start of the line
o                  Output the character
 i                 Read in the next character
  :0(?;            If the value read in was less than 0, terminate
Sasha
quelle
1

Ruby, 64 61 59 Bytes

->s{s.sub(/\D+/){"#{$&.bytes.reduce(0){|t,b|t*26+b-64}} "}}

Dank Value Ink 2 Bytes gespart.

m-chrzan
quelle
1
$&ist die letzte Regex-Übereinstimmung, verwenden Sie sie also m, um 2 Bytes zu speichern.
Value Ink
1

Excel-VBA-Direktfenster, 44 45 Bytes ( 36 35)

Set v=Range([A1]):?trim(v.Column &" "&v.Row);

1 Byte hinzugefügt, um den Zeilenumbruch zu unterdrücken


Oder für 35 mit führenden Leerzeichen

Set v=Range([A1]):?v.Column""&v.Row

Dank @TaylorScott 1 Byte gespart!

Beide nehmen Eingaben von Zelle A1 entgegen und geben sie an das VBE-Direktfenster aus

Greedo
quelle
1
Ich werde weitermachen und sagen, dass die führende Whitespace-Antwort eine gültige Antwort ist, da das Entfernen dieser Antwort die Verwendung Trim()nahezu aller numerischen Antworten erzwingen würde - und darauf würde ich nicht Set v=Range([A1]):?v.Column""&v.Rowüber Ihre aktuelle Lösung
Taylor Scott,
verdammt noch mal, ich kann nicht glauben, dass ich diese Frage verpasst habe, als sie herauskam!
Taylor Scott
@TaylorScott Oh, netter Trick mit dem "" - ich denke, Excel kann das einfügen, ;wenn das folgende Zeichen Columnnicht Teil des Routinennamens sein kann. Ich frage mich, ob es einen einzelnen Charakter gibt, der das Gleiche tun könnte, wahrscheinlich nicht. Ja, ich hätte gedacht, dass das führende Leerzeichen für die meisten qus akzeptabel ist, aber für dieses ist es meiner Meinung nach eher eine " genau diese Zeichenfolge drucken ". Ich habe gefragt (letzter Kommentar zu Frage) und es wurde mir kein führendes Leerzeichen oder Zeilenumbruch mitgeteilt.
Greedo
1
Als ich den Fragentitel sah, wusste ich sofort, dass ich es versuchen sollte, wenn Sie oder jemand anderes es nicht schon getan hätte! Wie die anderen Excel-basierten Antworten sagen, das richtige Werkzeug für den Job .
Greedo
1

Lua, 127 Bytes

Einige nette Saitenmanipulationen, ich benutze einige Funktionen, die normalerweise beim Golfen in lua: D nicht verwendet werden. Der beste Weg, um Golf zu spielen, besteht darin, einen anderen Weg zu finden, um über den Spaltenteil der Eingabe zu iterieren, während die Position jedes Buchstabens beibehalten werden kann. Ich habe nicht ^^ '.

Probieren Sie es online!

I=...l=I:gsub("%d",""):reverse()r=0
for i=1,#l
do
r=r+(l:sub(i,i):byte()-64)*math.pow(26,i-1)end
print(r.." "..I:gsub("%a",""))

Erläuterung

I=...                       -- shorthand for the input
l=I:gsub("%d","")           -- shorthand for the column part
   :reverse()               -- letters are put in reverse order to calculate their weight
r=0                         -- column number
for i=1,#l                  -- iterate over the letters of the input
do
  r=r+                      -- add to the column number
      (l:sub(i,i):byte()-64)-- the byte value of the current letter minus 64 (A=1 this way)
      *math.pow(26,i-1)     -- then apply its weight in base 26
end
print(r                     -- output the column number
        .." "               -- a space
        ..I:gsub("%a",""))  -- and the row number
Katenkyo
quelle