Wylicz notację komórkową


16

Mamy nadzieję, że wszyscy znamy notację komórkową arkusza kalkulacyjnego „A1”.

Jest to po prostu alfanumeryczna reprezentacja pozycjonowania wspomnianej komórki w siatce. Litera (litery) reprezentują pozycję kolumny komórki, a liczba reprezentuje wiersz.

Część „literowa” może składać się z 1 lub więcej liter z 26-literowego alfabetu angielskiego, z których wszystkie muszą być dużymi literami. Odwzorowują się one na liczby za pomocą 26-adycznej numeracji bijective. Część „liczbowa” może składać się z dowolnej dodatniej, niezerowej liczby całkowitej.


Wyzwanie, napisz program, który podał notację A1 dowolnej komórki jako pojedynczego łańcucha, może wyprowadzić ciąg zawierający pozycję kolumny reprezentowaną przez liczbę, następnie spację, a następnie numer wiersza.

Przykładowe wejścia / wyjścia poniżej:

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

To jest moje pierwsze wyzwanie, stąd względna prostota i potencjalna słabość kryteriów.

EDYCJA : Ciąg musi składać się z liter i cyfr, a kryterium wygranej jest najkrótsza długość kodu (jeśli to może być rzecz)

EDYCJA : Związana z tym, ale wykonuje proces odwrotny z innym indeksem początkowym. Niektórzy mogą twierdzić, że ten fakt sprawia, że ​​połączone puzzle są bardziej interesujące.


Czy możemy wziąć dane wejściowe jako na przykład tablicę zawierającą litery i cyfry:["A", "1"]
Stephen

1
@StepHen Nie. Musi to być pojedynczy ciąg znaków zawierający zarówno litery, jak i cyfry. Powinienem też prawdopodobnie dodać, że ciąg MUSI być w kolejności liter i cyfr.
dbr

1
Zwykle zezwalamy na bardziej elastyczne formaty wejściowe i wyjściowe, takie jak wybór nowej linii zamiast spacji jako separatora wyjściowego
Luis Mendo

3
@DeanBrunt To zależy od Ciebie i oczywiście możesz narzucić ścisły format, aby utrudnić wyzwanie. Ale ludzie zwykle lubią trudność w obliczeniach bardziej niż w formacie
Luis Mendo

4
To dlatego, że formatowanie nie wnosi żadnej wartości do samego wyzwania
Adnan

Odpowiedzi:



20

Microsoft Excel, 43 bajty.

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

Nie mogłem się powstrzymać, musiałem po prostu użyć odpowiedniego narzędzia do pracy. Pobiera dane na A1.

Przypadki testowe


11

Microsoft Excel, 40 bajtów

Wersja portugalska brazylijska.

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

Przetłumaczona (a zatem golfowa) wersja rozwiązania ATaco .


Nie pamiętam, czy Excel pozwala na takie arkusze, ale czy możesz skorzystać z sugestii @Uriel w innej odpowiedzi i stracić ostatnie 2 nawiasy?
dbr

Ta sugestia (pomijając nawiasy po prawej stronie) generuje ostrzeżenie w Excelu, że musisz potwierdzić, aby kontynuować, więc nie sądzę, że jest to dozwolone tutaj.
pajonk

O, rozumiem. Różni się wtedy od arkuszy.
dbr

7

Python 2 , 94 91 73 bajtów

-3 bajty dzięki Jonathanowi Allanowi
-18 bajtów dzięki tsh

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

Wypróbuj online!

To nadużywa sposobu, który .stripdziała, usuwając wszystkie cyfry, a=s(`3**39`)gdzie `3**39`jest tylko krótszy sposób generowania cyfr od 0do 9, spowoduje to zapisanie tylko znaków, aktóre zostaną użyte do usunięcia znaków z liczb nas(a)


Nie sądzę, że potrzeba, aby stripwkład był unikatowymi postaciami, więc 3**39powinien wykonać tę samą pracę.
Jonathan Allan


6

Arkusze Google, 43 bajty

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

Wypróbuj online!

A1jest komórką wejściową. Mam nadzieję, że powyższy link działa, nigdy wcześniej nie próbowałem golfa za pomocą Arkuszy Google.


1
@ATaco Nie ma powodu, aby duplikaty odpowiedzi mogły współistnieć.
Conor O'Brien

1
Podoba mi się wygląd Arkuszy Google i Microsoft Excel.
dbr

5
możesz zrobić =COLUMN(INDIRECT(A1))&" "&ROW(INDIRECT(A1dla 41 bajtów. arkusze wypełniają brakujące prawe pareny.
Uriel

5

JavaScript, 72 bajty

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

2

Proton , 113 bajtów

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

Wypróbuj online!

-19 bajtów pożyczenie algorytmu Rod ( uwaga do siebie: dodaj listcomps )




1

Perl 5 , 35 + 1 (-p) = 36 bajtów

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

Wypróbuj online!

Do maptraktuje oświadczenie kolumna jak numer base26 i konwertuje go do dziesiętnego. Podstawienie zastępuje litery cyframi. Dane wejściowe i wyjściowe są niejawne w ramach -pflagi.


1

Mathematica, 108 bajtów

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

Forma operatora, StringReplacektóra bierze część alfabetyczną cłańcucha, konwertuje go na listę kodów znaków, odejmuje 64od każdego punktu kodowego, interpretuje wynik jako 26liczbę całkowitą bazową , konwertuje tę liczbę całkowitą na a String, a następnie StringJoinspację, po której następuje część numeryczna r.

Za pomocą wyrażenia regularnego (także 108bajtów):

StringReplace[RegularExpression["([A-Z]+)(.+)"]:>ToString@FromDigits[ToCharacterCode@"$1"-64,26]<>" "<>"$2"]

1
ToCharacterCode@c-64czasami może zostać zredukowane do LetterNumber@c. LetterNumberjednak nie zawija wyniku, Listgdy wejście jest pojedynczym znakiem.
JungHwan Min

1

Galaretka ,  16  15 bajtów

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

Pełny program akceptujący ciąg jako argument i wypisujący wynik

Wypróbuj online!

W jaki sposób?

Ø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

Uwaga: konwersja z listy liczb przy użyciu podstawowego atomu konwersji pozwala, aby miejsca znajdowały się poza oczekiwanym zakresem, więc konwersja z, powiedzmy, [2,26,1]( "BZA") przy użyciu ḅ26jest obliczana jako 2 × 26 2 + 26 × 26 1 + 1 × 26 0 = 2029, nawet gdyby „oczekiwana” reprezentacja byłaby [3,0,1].


2
@Dean Brunt Zazwyczaj odpowiedź nie jest tak szybko (większość pozostawia ją na tydzień) - może zniechęcać innych do konkurowania. Nie byłbym zaskoczony widokiem tego pobicia przez 05AB1E lub inny język golfa ...
Jonathan Allan

Punkt wzięty. Wciąż się uczę
dbr

Nie ma problemu! Witamy w PPCG i miły pierwszy post :)
Jonathan Allan

1

Mathematica, 77 72 69 68 bajtów

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

Pobiera listę znaków.

Wypróbuj na Wolfram Sandbox

Stosowanie

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

{194, 93}

lub

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

{194, 93}

Wyjaśnienie

#/.

W danych wejściowych zamień ...

{a__,b__?DigitQ}

Lista zawierająca dwie sekwencje ai b(z 1 lub więcej elementów), na którą bskładają się tylko cyfry ... (Mathematica używa leniwego dopasowania wzorca, więc nie jest wymagane sprawdzanie a)

:>

w...

f=FromDigits;

Ustaw ffunkcję konwersji cyfr na liczby całkowite.

LetterNumber@{a}

Konwertuj ana liczby literowe (a -> 1, b -> 2 itd.).

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

Konwertuj powyższe z base-26 na dziesiętne i konwertuj bna dziesiętne.



1

Siatkówka , 85 bajtów

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

Wypróbuj online! Wyjaśnienie:

[A-Z]
$& 

Oddziel litery od siebie i ostatni numer.

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

Konwertuj litery na dziesiętne.

\d+
$*

Przekształć wszystko w jedno.

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

Chociaż są co najmniej trzy liczby, pomnóż pierwszą przez 26 i dodaj ją do drugiej.

1+
$.&

Konwertuj wszystko na dziesiętne.



1

> <>, 42 bajtów

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

Wypróbuj online

Wyjaśnienie:

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

Powyższa pętla odczyta pierwszą liczbę części liczbowej (np. „3” w „AB34”) przed zerwaniem i odejmie już 64 od niej, więc następny bit kodu musi sobie z tym poradzić

$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

Ta pętla zaczyna się od wyprowadzenia znaku, który będzie albo pierwszym znakiem odczytanym przez pierwszą pętlę, albo znakiem odczytanym przez poprzednią iterację tej pętli.

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

1

Rubin, 64 61 59 bajtów

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

Oszczędność 2 bajtów dzięki Value Ink.


1
$&jest ostatnim dopasowaniem wyrażenia regularnego, więc używaj go zamiast mzapisywać 2 bajty.
Wartość tuszu

1

Excel-VBA Natychmiastowe okno, 44 45 bajtów ( 36 35)

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

Dodano 1 bajt, aby ukryć końcowy znak nowej linii


Lub dla 35 z wiodącymi białymi znakami

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

1 bajt zapisany dzięki @TaylorScott!

Oba pobierają dane z komórki A1, a następnie wysyłają do okna natychmiastowego VBE


1
Powiem, że wiodąca odpowiedź na białe spacje jest prawidłową odpowiedzią, ponieważ jej usunięcie wymusiłoby użycie Trim()prawie wszystkich odpowiedzi numerycznych - a przy tym nie wybrałbym Set v=Range([A1]):?v.Column""&v.Rowtwojego obecnego rozwiązania
Taylor Scott

Cholera, nie mogę uwierzyć, że przegapiłem to pytanie, kiedy się pojawiło!
Taylor Scott,

@TaylorScott Och, dobra sztuczka za pomocą „” - myślę, że Excel wie, jak wstawić, ;kiedy następujący znak Columnnie może być częścią rutynowej nazwy. Zastanawiam się, czy jest jakaś postać, która mogłaby zrobić to samo, prawdopodobnie nie. Tak, domyślam się, że spacja wiodąca byłaby akceptowalna dla większości qus, ale w tym przypadku myślę, że jest to bardziej „Drukuj dokładnie ten ciąg”. Zapytałem (ostatni komentarz do pytania) i nie powiedziano mi, że nie ma spacji ani nowego wiersza.
Greedo,

1
także, kiedy zobaczyłem tytuł pytania, od razu wiedziałem, że powinienem spróbować, jeśli ty lub ktoś inny jeszcze tego nie zrobił! Jak mówią inne odpowiedzi oparte na Excelu, odpowiednie narzędzie do pracy .
Greedo,

1

Lua, 127 bajtów

Idąc tam kilka fajnych ciągów znaków, używam funkcji, które zwykle nigdy nie są używane podczas gry w golfa w lua: D. Najlepszym sposobem na grę w golfa byłoby znalezienie innego sposobu na iterację nad kolumnową częścią danych wejściowych, przy jednoczesnym zachowaniu pozycji każdej litery. Nie zrobiłem ^^.

Wypróbuj 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",""))

Wyjaśnienie

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.