셀 표기법 열거


16

우리는 모두 스프레드 시트 'A1'셀 표기법에 대해 잘 알고 있습니다.

그것은 단순히 그리드 내에서 상기 셀의 위치를 ​​나타내는 영숫자 표현이다. 문자는 셀의 열 위치를 나타내고 숫자는 행을 나타냅니다.

'글자'부분은 26 자 영어 알파벳에서 하나 이상의 문자로 구성 될 수 있으며 모두 대문자 여야합니다. 이것은 26-adic bijective numeration을 사용하여 숫자에 매핑됩니다. '숫자'부분은 0이 아닌 양의 정수로 구성 될 수 있습니다.


문제는 셀의 A1 표기법을 단일 문자열로 제공하는 프로그램을 작성하고 숫자로 표시되는 열 위치와 공백, 행 번호를 포함하는 문자열을 출력 할 수 있습니다.

아래의 샘플 입력 / 출력 :

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

이것은 나의 첫 번째 과제이므로, 기준의 상대적인 단순성과 잠재적 인 열악 함입니다.

편집 : 문자열은 문자 다음에 숫자가 있어야하며 우승 기준은 코드 길이가 가장 짧습니다 (가능한 경우)

편집 : 이것 과 관련 있지만 시작 인덱스가 다른 역 프로세스를 수행합니다. 어떤 사람들은이 사실이 연결된 퍼즐을 더욱 흥미롭게 만든다고 주장 할 수도 있습니다.


예를 들어 문자와 숫자를 포함하는 배열로 입력을 취할 수 있습니까?["A", "1"]
Stephen

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

파이썬 2 , 94 91 73 바이트

Jonathan Allan 덕분에 -3 바이트
tsh 덕분에 -18 바이트

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

온라인으로 사용해보십시오!

이 남용하는 방식 것을 .strip모든 숫자를 제거하는 작업은, wtih a=s(`3**39`)곳에 `3**39`자리에서 생성 단지 짧은 방법 0으로 9, 이것은 단지에 문자 저장합니다 a그에 숫자에서 문자를 제거하는 데 사용됩니다s(a)


strip의 입력이 고유 한 문자 일 필요는 없다고 생각 하므로 3**39동일한 작업을 수행해야합니다.
Jonathan Allan


6

Google 스프레드 시트, 43 바이트

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

온라인으로 사용해보십시오!

A1입력 셀입니다. 위의 링크가 작동하기를 바랍니다. 이전에 Google 스프레드 시트로 코드 골프를 시도한 적이 없습니다.


1
@ATaco 중복 답변이 공존 할 수 있으므로 그럴 이유가 없습니다.
Conor O'Brien

1
Google 스프레드 시트 및 Microsoft Excel의 답변이 마음에 듭니다.
dbr

5
당신은 =COLUMN(INDIRECT(A1))&" "&ROW(INDIRECT(A141 바이트를 위해 할 수 있습니다 . 시트가 누락 된 오른쪽 구획을 채 웁니다.
Uriel

5

자바 스크립트, 72 바이트

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




1

펄 5 , 35 + 1 (-p) = 36 바이트

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

온라인으로 사용해보십시오!

map명령문은 열을 기본 26 숫자처럼 취급하고 10 진수로 변환합니다. 대체는 문자를 숫자로 대체합니다. 입력과 출력은 -p플래그에 내재되어 있습니다.


1

수학, 108 바이트

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

연산자 형식은 문자열 StringReplace의 알파벳 부분을 취하여 c문자 코드 목록으로 변환하고, 64각 코드 포인트에서 빼고 , 결과를 기본 26정수 로 해석하고 , 해당 정수를 a로 변환 String한 다음 StringJoinsa 공백 다음에 숫자 부분으로 변환 r합니다.

정규식 사용 (또한 108바이트) :

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

1
ToCharacterCode@c-64때로는로 줄일 수 LetterNumber@c있습니다. 그러나 입력이 단일 문자 인 경우 LetterNumber출력을 랩핑하지 않습니다 List.
JungHwan Min

1

젤리 ,  16  15 바이트

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

문자열을 인수로 수락하고 결과를 인쇄하는 전체 프로그램

온라인으로 사용해보십시오!

어떻게?

Ø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

주 : 기준 변환자를 사용 번호 목록에서 변환 , 장소 예상 범위 밖에서 할 수 가령으로부터 변환하므로 [2,26,1]( "BZA"사용) ḅ26로 산출 2 × 26 2 + 26 × 26 1 + 1 × 26 0 = "예상 된"표현이 되었음에도 불구하고 2029 년[3,0,1] .


2
@Dean Brunt 답변을 너무 빨리 수락하는 것은 일반적이지 않습니다 (대부분 일주일 내내)-다른 사람들이 경쟁하는 것을 방해 할 수 있습니다. 나는 이것이 05AB1E 또는 다른 골프 언어에 의해 맞은 것을보고 놀라지 않을 것입니다 ...
Jonathan Allan

요점을 알았어. 아직도 내 방식으로 배우기
dbr

문제 없어요! PPCG에 오신 것을 환영합니다. 좋은 첫 번째 게시물 :)
Jonathan Allan

1

Mathematica, 77 72 69 68 바이트

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

문자 목록을 가져옵니다.

Wolfram Sandbox에서 사용해보십시오

용법

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

{194, 93}

또는

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

{194, 93}

설명

#/.

입력에서 교체 ...

{a__,b__?DigitQ}

두 서열을 포함하는 목록 ab(1 개 이상의 요소), b숫자 문자로 구성은 (어떤 확인이 요구되지 않도록 매쓰는 지연 패턴 매칭을 사용 a)

:>

으로...

f=FromDigits;

설정 f자리 - 투 - 정수 변환 기능.

LetterNumber@{a}

a문자 번호 ( a- > 1, b-> 2 등)로 변환하십시오.

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

위의 -26을 10 진수로 변환 b하고 10 진수 로 변환하십시오 .



1

망막 , 85 바이트

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

온라인으로 사용해보십시오! 설명:

[A-Z]
$& 

문자와 최종 숫자를 구분하십시오.

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

문자를 10 진수로 변환하십시오.

\d+
$*

모든 것을 단항으로 변환하십시오.

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

세 개 이상의 숫자가 있지만 첫 번째에 26을 곱하고 두 번째에 더합니다.

1+
$.&

모든 것을 십진수로 변환하십시오.



1

> <>, 42 바이트

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

온라인 시도

설명:

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

위의 루프는 깨기 전에 숫자 부분의 첫 번째 숫자 (예 : "AB34"의 '3')를 읽고 이미 64를 뺀 것이므로 다음 코드 비트는이를 처리해야합니다.

$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

이 루프는 첫 번째 루프에서 읽은 첫 번째 문자이거나이 루프의 이전 반복에서 읽은 문자가되는 문자를 출력하여 시작합니다.

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

루비, 64 61 59 바이트

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

Value Ink 덕분에 2 바이트가 절약되었습니다.


1
$&마지막 정규식 일치이므로 m2 바이트를 저장 하는 대신 사용하십시오 .
Value Ink

1

Excel-VBA 즉시 실행 창, 44 45 바이트 ( 36 35)

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

후행 줄 바꿈을 억제하기 위해 1 바이트 추가


또는 공백이있는 35 인 경우

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

@TaylorScott 덕분에 1 바이트가 절약되었습니다!

둘 다 셀 A1에서 입력을 받아 VBE 즉시 창으로 출력


1
계속해서 선행 공백 응답을 제거하면 Trim()거의 모든 숫자 답을 사용하게 될 것이므로 유효한 응답이라고 말할 수 Set v=Range([A1]):?v.Column""&v.Row있습니다. 현재 솔루션 에 대해서는 다루지 않을 것입니다
Taylor Scott

또한,이 질문이 나왔을 때 내가 놓친 것을 믿을 수 없습니다!
Taylor Scott

@TaylorScott ""를 사용한 멋진 트릭- ;다음 문자 Column가 루틴 이름의 일부가 될 수없는 경우 Excel에서 삽입을 알고 있는 것 같습니다 . 똑같은 일을 할 수있는 단일 캐릭터가 있는지 궁금합니다. 그렇습니다. 선행 공간이 대부분의 qus에 적합하다고 생각했을 것입니다. 그러나 이것에 대해서는 "이 정확한 문자열 인쇄"에 가깝습니다 . 나는 묻고 (질문에 대한 마지막 논평) 선행 공간 이나 줄 바꿈 이 없다고 들었다 .
Greedo

1
또한 질문 제목을 보았을 때 나는 당신이나 다른 누군가가 아직 가지 않았다면 즉시 가야한다는 것을 알았습니다! 다른 Excel 기반 답변에서 알 수 있듯이 작업에 적합한 도구입니다 .
Greedo

1

루아, 127 바이트

거기에가는 멋진 문자열 조작, 나는 lua : D에서 골프를 타는 동안 일반적으로 사용되지 않는 기능을 사용하고 있습니다. 골프를 치는 가장 좋은 방법은 각 글자의 위치를 ​​유지하면서 입력의 열 부분을 반복하는 다른 방법을 찾는 것입니다. 나는 ^^ '하지 않았다.

온라인으로 사용해보십시오!

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

설명

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.