ระบุสัญลักษณ์ของเซลล์


16

ดังนั้นเราทุกคนหวังว่าจะคุ้นเคยกับสัญกรณ์เซลล์ Spreadsheet 'A1'

มันเป็นเพียงตัวอักษรและตัวเลขของการวางตำแหน่งของเซลล์ดังกล่าวภายในตาราง ตัวอักษรแสดงถึงการวางตำแหน่งคอลัมน์ของเซลล์และตัวเลขแสดงถึงแถว

ส่วน 'ตัวอักษร' อาจประกอบด้วยตัวอักษรอย่างน้อย 1 ตัวจากตัวอักษรภาษาอังกฤษ 26 ตัวซึ่งทั้งหมดต้องเป็นตัวพิมพ์ใหญ่ แผนที่เหล่านี้เป็นตัวเลขโดยใช้การคำนวณตัวเลข bijective 26 adic ส่วน 'หมายเลข' อาจประกอบด้วยจำนวนเต็มบวกที่ไม่เป็นศูนย์


ความท้าทายเขียนโปรแกรมที่ให้สัญลักษณ์ A1 ของเซลล์ใด ๆ เป็นสตริงเดียวสามารถส่งออกสตริงที่มีตำแหน่งคอลัมน์ที่แสดงเป็นตัวเลขตามด้วยช่องว่างแล้วตามด้วยหมายเลขแถว

ตัวอย่างอินพุต / เอาต์พุตด้านล่าง:

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

นี่คือความท้าทายครั้งแรกของฉันดังนั้นความเรียบง่ายสัมพัทธ์และความอ่อนแอที่มีศักยภาพของเกณฑ์

แก้ไข : สตริงจะต้องเป็นตัวอักษรตามด้วยตัวเลขและเกณฑ์การชนะคือความยาวรหัสที่สั้นที่สุด (ถ้าเป็นได้)

แก้ไข : เกี่ยวข้องกับสิ่งนี้แต่ทำกระบวนการย้อนกลับที่มีดัชนีเริ่มต้นที่แตกต่างกัน บางคนอาจแย้งว่าข้อเท็จจริงนี้ทำให้ปริศนาที่เชื่อมโยงน่าสนใจยิ่งขึ้น


เราสามารถนำเข้าเป็นยกตัวอย่างเช่นอาร์เรย์ที่มีตัวอักษรและตัวเลข:["A", "1"]
สตีเฟ่น

1
@StepHen ไม่ต้องเป็นสตริงเดี่ยวที่มีทั้งตัวอักษรและตัวเลข ฉันควรจะเพิ่มด้วยเช่นกันว่าสตริงต้องอยู่ในลำดับของตัวอักษรตามด้วยตัวเลข
dbr

1
โดยทั่วไปเราอนุญาตให้รูปแบบอินพุตและเอาต์พุตมีความยืดหยุ่นมากขึ้นเช่นการเลือกบรรทัดใหม่แทนช่องว่างเป็นตัวคั่นเอาต์พุต
Luis Mendo

3
@DeanBrunt มันขึ้นอยู่กับคุณและแน่นอนว่าคุณสามารถบังคับใช้รูปแบบที่เข้มงวดเพื่อทำให้การท้าทายยากขึ้น แต่ผู้คนมักจะสนุกกับความยากลำบากในการคำนวณจริงมากกว่าในรูปแบบ
Luis Mendo

4
เป็นเพราะการจัดรูปแบบไม่ได้เพิ่มคุณค่าใด ๆ ให้กับความท้าทายที่แท้จริง
Adnan

คำตอบ:



20

Microsoft Excel, 43 ไบต์

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

ฉันไม่สามารถช่วยตัวเองได้ฉันต้องใช้เครื่องมือที่เหมาะสมกับงาน รับอินพุตบน A1

กรณีทดสอบ


11

Microsoft Excel ขนาด 40 ไบต์

รุ่นภาษาโปรตุเกสของบราซิล

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

ฉบับแปล (และดังนั้นจึงแข็งแรงเล่นกอล์ฟ) รุ่นวิธีการแก้ปัญหาของ Ataco


ฉันจำไม่ได้ว่า Excel อนุญาตให้ใช้แผ่นงานนี้ได้หรือไม่ แต่คุณสามารถใช้คำแนะนำโดย @Uriel กับคำตอบอื่นและวงเล็บ 2 ตัวสุดท้ายหายไปได้หรือไม่
dbr

คำแนะนำนั้น (ไม่ใส่วงเล็บขวาสุด) จะส่งคำเตือนใน Excel ที่คุณต้องยืนยันเพื่อดำเนินการต่อดังนั้นฉันจึงไม่คิดว่าจะได้รับอนุญาตที่นี่
pajonk

ฉันเข้าใจแล้ว มันแตกต่างจากแผ่นงานแล้ว
dbr

7

Python 2 , 94 91 73 ไบต์

-3 ไบต์ขอบคุณ Jonathan Allan
-18 ไบต์ขอบคุณ tsh

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

ลองออนไลน์!

ละเมิดสิทธิมนุษยชนนี้วิธีการที่.stripผลงานเอาตัวเลขทั้งหมดรึป่าวa=s(`3**39`)ที่`3**39`เป็นเพียงวิธีที่สั้นลงเพื่อสร้างตัวเลขจาก0การ9นี้จะเก็บเพียงตัวอักษรบนaที่จะใช้ในการตัดตัวอักษรจากตัวเลขบนs(a)


I don't think there is a need for strip's input to be the unique characters, so 3**39 should do the same job.
Jonathan Allan

1

6

Google Sheets, 43 bytes

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

Try it online!

A1 is the input cell. Hopefully the above link works, I've never tried code golf with Google Sheets before.


1
@ATaco There's no reason to, as duplicate answers can coexist.
Conor O'Brien

1
The appearance of Google Sheets and Microsoft Excel answers pleases me.
dbr

5
you can do =COLUMN(INDIRECT(A1))&" "&ROW(INDIRECT(A1 for 41 bytes. sheets fills in missing right parens.
Uriel





1

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

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

Try it online!

The map statement treats the column like a base26 number and converts it to decimal. The substitution replaces the letters with the numbers. The input and output are implicit in the -p flag.


1

Mathematica, 108 bytes

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

Operator form of StringReplace which takes the alphabetic part c of the string, converts it to a list of character codes, subtracts 64 from each code point, interprets the result as a base 26 integer, converts that integer to a String, then StringJoins a space followed by the numeric part r.

Using a regex (also 108 bytes):

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

1
ToCharacterCode@c-64 can sometimes be reduced to LetterNumber@c. LetterNumber does not wrap the output in List when the input is a single character, though.
JungHwan Min

1

Jelly,  16  15 bytes

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

A full program accepting the string as an argument and printing the result

Try it online!

How?

Ø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

Note: conversion from a list of numbers using the base conversion atom allows places to be outside of the expected range, so conversion from, say, [2,26,1] ("BZA") using ḅ26 is calculated as 2×262+26×261+1×260=2029 even though the "expected" representation would have been [3,0,1].


2
@Dean Brunt It is not usual to accept an answer so quickly (most leave it a week) - it may discourage others from competing. I would not be surprised to see this beaten by 05AB1E or another golfing language...
Jonathan Allan

Point taken. Still learning my way round
dbr

No problem! Welcome to PPCG, & nice first post :)
Jonathan Allan

1

Mathematica, 77 72 69 68 bytes

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

Takes a list of characters.

Try it on Wolfram Sandbox

Usage

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

{194, 93}

or

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

{194, 93}

Explanation

#/.

In the input replace...

{a__,b__?DigitQ}

A list containing two sequences a and b (with 1 or more elements), where b consists of digit characters only... (Mathematica uses lazy pattern matching, so no check is required for a)

:>

into...

f=FromDigits;

Set f to digit-to-integer conversion function.

LetterNumber@{a}

Convert a to letter numbers (a -> 1, b -> 2, etc).

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

Convert the above from base-26 to decimal, and convert b to decimal.



1

Retina, 85 bytes

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

Try it online! Explanation:

[A-Z]
$& 

Separate the letters from each other and the final number.

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

Convert the letters to decimal.

\d+
$*

Convert everything to unary.

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

While there are at least three numbers, multiply the first by 26 and add it to the second.

1+
$.&

Convert everything to decimal.



1

><>, 42 Bytes

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

Try It Online

Explanation:

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

The above loop will read in the first number of the numbers part (eg. '3' in "AB34") before breaking, and will have already subtracted 64 from it, so the next bit of code has to deal with that

$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

This loop starts by outputting a character which will either be the 1st character read in by the first loop, or the character read in by the previous iteration of this loop.

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

Excel-VBA Immediate window, 44 45 Bytes (36 35)

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

1 byte added to suppress the trailing newline


Or for 35 with leading whitespace

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

1 byte saved thanks to @TaylorScott!

Both take input from cell A1, output to the VBE Immediate window


1
I'm gonna go ahead and say that the leading whitespace answer is a valid response as having to remove it would force the use of Trim() on nearly all numeric answers - and on that not I would go with Set v=Range([A1]):?v.Column""&v.Row over your current solution
Taylor Scott

also, darn, I can't believe I missed this question when it came out!
Taylor Scott

@TaylorScott Oh nice trick using the "" - I guess Excel knows to insert the ; when the character following Column can't be part of the routine name. I wonder if there's a single character that could do the same thing, probably not. Yes, I would have guessed the leading space would be acceptable for most qus, but for this one I think it's more of a "Print this exact string". I did ask (last comment on question) and was told no leading space or newline.
Greedo

1
also, when I saw the question title, I immediately knew I should have a go if you or someone else hadn't already! As the other Excel-based answers say, right tool for the job.
Greedo

1

Lua, 127 Bytes

Some nice string manipulations going there, I'm using some function that are usually never used while golfing in lua :D. The best way to golf this would be to find an other way to iterate over the column part of the input while being able to retain the position of each letter. I didn't ^^'.

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

Explanation

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.