Liệt kê một ký hiệu tế bào


16

Vì vậy, tất cả chúng ta đều hy vọng quen thuộc với ký hiệu ô 'A1'.

Nó chỉ đơn giản là một biểu diễn chữ và số của vị trí của ô đã nói trong một lưới. (Các) chữ cái đại diện cho vị trí cột của ô và số đại diện cho hàng.

Phần 'chữ cái' có thể bao gồm 1 hoặc nhiều chữ cái trong bảng chữ cái tiếng Anh 26 chữ cái, tất cả đều phải là chữ in hoa. Những bản đồ này đến các con số thông qua việc sử dụng số lượng tính toán 26-adic. Phần 'số' có thể bao gồm bất kỳ số nguyên dương, khác không.


Thách thức, viết một chương trình đưa ra ký hiệu A1 của bất kỳ ô nào dưới dạng một chuỗi, có thể xuất ra một chuỗi chứa vị trí cột được biểu thị dưới dạng một số, theo sau là khoảng trắng và sau đó là số hàng.

Mẫu đầu vào / đầu ra dưới đây:

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

Đây là thử thách đầu tiên của tôi, do đó sự đơn giản tương đối và tiềm năng của các tiêu chí.

EDIT : Chuỗi phải là các chữ cái theo sau các số và tiêu chí chiến thắng là độ dài mã ngắn nhất (nếu đó có thể là một thứ)

EDIT : Liên quan đến điều này nhưng thực hiện quá trình ngược lại với một chỉ số bắt đầu khác nhau. Một số người có thể lập luận rằng thực tế này làm cho câu đố liên kết thú vị hơn.


Chúng ta có thể lấy đầu vào như, ví dụ, một mảng chứa các chữ cái và số:["A", "1"]
Stephen

1
@StepHen Không. Nó phải là một chuỗi chứa cả chữ và số. Tôi có lẽ cũng nên thêm rằng chuỗi PHẢI phải theo thứ tự các chữ cái theo sau là số.
dbr

1
Chúng tôi thường cho phép các định dạng đầu vào và đầu ra linh hoạt hơn, chẳng hạn như chọn dòng mới thay vì khoảng
trắng

3
@DeanBrunt Điều đó phụ thuộc vào bạn, và tất nhiên bạn có thể thực thi một định dạng nghiêm ngặt để làm cho thử thách trở nên khó khăn hơn. Nhưng mọi người thường thích sự khó khăn trong các tính toán thực tế hơn ở định dạng
Luis Mendo

4
Đó là vì định dạng không thêm bất kỳ giá trị nào vào thử thách thực tế
Adnan

Câu trả lời:



20

Microsoft Excel, 43 byte.

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

Tôi không thể tự giúp mình, tôi chỉ cần sử dụng đúng công cụ cho công việc. Đưa đầu vào vào A1.

Các trường hợp thử nghiệm


11

Microsoft Excel, 40 byte

Phiên bản tiếng Bồ Đào Nha Brasil.

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

Phiên bản dịch (và do đó được đánh gôn) của giải pháp ATaco .


Tôi không thể nhớ nếu Excel cho phép điều này giống như trang tính, nhưng bạn có thể sử dụng đề xuất của @Uriel cho câu trả lời khác và mất 2 dấu ngoặc đơn cuối cùng không?
dbr

Đề xuất đó (bỏ dấu ngoặc đơn ngoài cùng bên phải) đưa ra cảnh báo trong Excel mà bạn phải xác nhận để tiếp tục, vì vậy tôi không nghĩ rằng nó được cho phép ở đây.
pyjama

Ah tôi thấy. Nó khác với tờ rồi.
dbr

7

Python 2 , 94 91 73 byte

-3 byte nhờ Jonathan Allan
-18 byte nhờ tsh

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

Hãy thử trực tuyến!

Điều này lạm dụng cách thức .striphoạt động, loại bỏ tất cả các chữ số a=s(`3**39`)trong đó `3**39`chỉ là một cách ngắn hơn để tạo các chữ số từ 0đến 9, điều này sẽ chỉ lưu trữ các ký tự trên ađó sẽ được sử dụng để loại bỏ các ký tự từ các số trêns(a)


Tôi không nghĩ rằng cần phải có stripđầu vào là các ký tự duy nhất, vì vậy 3**39nên thực hiện cùng một công việc.
Jonathan Allan


6

Google Sheets, 43 byte

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

Hãy thử trực tuyến!

A1là ô nhập. Hy vọng rằng liên kết trên hoạt động, tôi chưa bao giờ thử chơi golf với Google Sheets trước đây.


1
@ATaco Không có lý do gì, vì các câu trả lời trùng lặp có thể cùng tồn tại.
Conor O'Brien

1
Sự xuất hiện của câu trả lời Google Sheets và Microsoft Excel làm tôi hài lòng.
DBR

5
bạn có thể làm =COLUMN(INDIRECT(A1))&" "&ROW(INDIRECT(A1cho 41 byte. tờ điền vào thiếu parens phải.
Uriel

5

JavaScript, 72 byte

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

2

Proton , 113 byte

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

Hãy thử trực tuyến!

-19 byte mượn thuật toán của Rod ( lưu ý đến bản thân: thêm listcomps )




1

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

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

Hãy thử trực tuyến!

Câu maplệnh xử lý cột như một số cơ sở 26 và chuyển đổi nó thành số thập phân. Sự thay thế thay thế các chữ cái với các số. Đầu vào và đầu ra được ẩn trong -pcờ.


1

Toán học, 108 byte

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

Dạng toán tử StringReplacelấy phần chữ cái ccủa chuỗi, chuyển đổi nó thành một danh sách mã ký tự, trừ 64từng điểm mã, diễn giải kết quả dưới dạng 26số nguyên cơ bản , chuyển đổi số nguyên đó thành a String, sau đó là StringJoinkhoảng trắng theo sau là phần số r.

Sử dụng biểu thức chính quy (cũng là 108byte):

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

1
ToCharacterCode@c-64đôi khi có thể được giảm xuống LetterNumber@c. LetterNumbermặc dù không bao bọc đầu ra Listkhi đầu vào là một ký tự đơn.
JungHwan Min

1

Thạch ,  16  15 byte

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

Một chương trình đầy đủ chấp nhận chuỗi làm đối số và in kết quả

Hãy thử trực tuyến!

Làm sao?

Ø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

Lưu ý: chuyển đổi từ danh sách các số sử dụng nguyên tử chuyển đổi cơ sở cho phép các địa điểm nằm ngoài phạm vi dự kiến, do đó, chuyển đổi từ, giả sử, [2,26,1]( "BZA") sử dụng ḅ26được tính là 2 × 26 2 + 26 × 26 1 + 1 × 26 0 = 2029 mặc dù đại diện "dự kiến" sẽ có được [3,0,1].


2
@Dean Brunt Thông thường không chấp nhận câu trả lời nhanh như vậy (hầu hết để lại một tuần) - nó có thể khiến người khác không thể cạnh tranh. Tôi sẽ không ngạc nhiên khi thấy điều này bị đánh bại bởi 05AB1E hoặc một ngôn ngữ chơi gôn khác ...
Jonathan Allan

Điểm lấy. Vẫn đang học theo cách của tôi
dbr

Không vấn đề gì! Chào mừng bạn đến với PPCG, và bài đăng đầu tiên tuyệt vời :)
Jonathan Allan

1

Toán học, 77 72 69 68 byte

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

Đưa ra một danh sách các nhân vật.

Dùng thử trên Wolfram Sandbox

Sử dụng

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

{194, 93}

hoặc là

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

{194, 93}

Giải trình

#/.

Trong đầu vào thay thế ...

{a__,b__?DigitQ}

Một danh sách chứa hai chuỗi ab(có 1 hoặc nhiều phần tử), trong đó chỉ bbao gồm các ký tự chữ số ... (Mathicala sử dụng khớp mẫu lười biếng, do đó không cần kiểm tra a)

:>

vào ...

f=FromDigits;

Đặt fthành hàm chuyển đổi chữ số sang số nguyên.

LetterNumber@{a}

Chuyển đổi athành số chữ cái (a -> 1, b -> 2, v.v.).

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

Chuyển đổi ở trên từ cơ sở-26 sang thập phân và chuyển đổi bsang thập phân.



1

Võng mạc , 85 byte

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

Hãy thử trực tuyến! Giải trình:

[A-Z]
$& 

Tách các chữ cái với nhau và số cuối cùng.

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

Chuyển đổi các chữ cái thành số thập phân.

\d+
$*

Chuyển đổi mọi thứ để unary.

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

Trong khi có ít nhất ba số, nhân số thứ nhất với 26 và thêm số đó vào số thứ hai.

1+
$.&

Chuyển đổi mọi thứ thành số thập phân.



1

> <>, 42 byte

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

Dùng thử trực tuyến

Giải trình:

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

Vòng lặp ở trên sẽ đọc số đầu tiên của phần số (ví dụ: '3' trong "AB34") trước khi ngắt và sẽ trừ 64 từ đó, vì vậy đoạn mã tiếp theo phải xử lý điều đó

$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

Vòng lặp này bắt đầu bằng cách xuất ra một ký tự sẽ là ký tự đầu tiên được đọc bởi vòng lặp đầu tiên hoặc ký tự được đọc bởi lần lặp trước của vòng lặp này.

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

Ruby, 64 61 59 byte

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

Đã lưu 2 byte nhờ Value Ink.


1
$&là kết hợp regex cuối cùng, vì vậy hãy sử dụng nó thay vì mđể lưu 2 byte.
Mực giá trị

1

Cửa sổ ngay lập tức Excel-VBA, 44 45 byte ( 36 35)

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

Đã thêm 1 byte để chặn dòng mới


Hoặc cho 35 với khoảng trắng hàng đầu

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

Lưu 1 byte nhờ @TaylorScott!

Cả hai đều lấy đầu vào từ ô A1, xuất ra cửa sổ ngay lập tức VBE


1
Tôi sẽ tiếp tục và nói rằng câu trả lời khoảng trắng hàng đầu là một câu trả lời hợp lệ vì phải loại bỏ nó sẽ buộc phải sử dụng Trim()gần như tất cả các câu trả lời số - và trên đó tôi sẽ không Set v=Range([A1]):?v.Column""&v.Rowgiải quyết vấn đề hiện tại của bạn
Taylor Scott

Ngoài ra, tôi không thể tin rằng tôi đã bỏ lỡ câu hỏi này khi nó xuất hiện!
Taylor Scott

@TaylorScott Thủ thuật tuyệt vời bằng cách sử dụng "" - Tôi đoán Excel biết cách chèn ;khi ký tự theo sau Columnkhông thể là một phần của tên thường trình. Tôi tự hỏi nếu có một nhân vật duy nhất có thể làm điều tương tự, có lẽ là không. Vâng, tôi đã đoán không gian hàng đầu sẽ được chấp nhận đối với hầu hết các qus, nhưng đối với điều này tôi nghĩ đó là một "In chuỗi chính xác này ". Tôi đã hỏi (bình luận cuối cùng về câu hỏi) và được cho biết không có không gian hàng đầu hoặc dòng mới.
Greedo

1
Ngoài ra, khi tôi nhìn thấy tiêu đề câu hỏi, tôi lập tức biết rằng tôi nên đi nếu bạn hoặc người khác chưa có! Như các câu trả lời dựa trên Excel khác nói, công cụ phù hợp cho công việc .
Greedo

1

Lua, 127 byte

Một số thao tác chuỗi đẹp ở đó, tôi đang sử dụng một số chức năng thường không bao giờ được sử dụng khi chơi golf trong lua: D. Cách tốt nhất để chơi gôn này là tìm một cách khác để lặp lại phần cột của đầu vào trong khi có thể giữ vị trí của mỗi chữ cái. Tôi đã không ^^ '.

Hãy thử trực tuyến!

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",""))

Giải trình

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.