Code Golf : Excel 열 이름에 해당하는 숫자
도전
Excel 열 문자열에 해당하는 숫자를 출력하는 문자 수별 가장 짧은 코드입니다.
예를 들어, A
열은 1, B
2 등입니다. 당신이 명중하면 Z
, 다음 열이된다 AA
다음, AB
등등.
테스트 사례 :
A: 1
B: 2
AD: 30
ABC: 731
WTF: 16074
ROFL: 326676
코드 수에는 입력 / 출력 (예 : 전체 프로그램)이 포함됩니다.
Perl, 36 34 33 31 30 17 15 11 자
$_=()=A..$_
용법:
$ echo -n WTF | perl -ple '$_=()=A..$_'
16074
chop
호출 을 피하기 위해 echo -n을 사용하여 17로 줄 였습니다.
print 대신 say를 사용하여 15로 줄였습니다.
say 대신 -p를 사용하여 11로 줄였습니다.
설명 : A
문자열 컨텍스트에서 평가 A..$_
되고 "A"에서 시작하여 입력 문자열까지 문자열이 증가하는 목록을 빌드합니다. 펄 해석 ++
연산자 (그리고 ..
그렇게 예시하는 알파벳 컨텍스트 문자열)에, $_="AZ";$_++;print
출력한다 BA
.
=()=
(일명 "염소"연산자 )는 표현식이 목록 컨텍스트에서 평가되도록하고 해당 표현식이 반환 한 요소 수를 반환 $scalar = () = <expr>
합니다 @list = <expr>; $scalar = @list
. 즉,에 해당합니다 .
Excel, 9 자 :)
작업에 적합한 도구를 사용하십시오.
=COLUMN()
J , 17 12 10 자
26#.64-~av
예:
26#.64-~av 'WTF'
16074
설명:
- J는 오른쪽에서 왼쪽으로 구문 분석합니다.
av
그래서 예를 들어, 인수의 각 문자의 아스키 인덱스의 목록을 반환av'ABC'
돌아갑니다65 66 67
.- 그런 다음 동사를 사용하여 목록의 각 요소에서 64를 뺍니다
64-~
. - 그런 다음
#.
동사를 사용하여 목록을 기본 26으로 변환합니다 .
Brainf * ck, 81 자 (공백 없음)
,[>>>[->>+++++[-<+++++>]<+<]>[-<+>]<<++++++++[<++++++++>-]<[<->-]<[>>>+<<<-],]>>>
설명
,[ // get character input into p[0], enter loop if it isn't null (0)
>>>[->>+++++[-<+++++>]<+<] // take what's in p[3] and multiply by 26, storing it in p[4]
>[-<+>] // copy p[4] back to p[3]
<<++++++++[<++++++++>-]< // store 64 in p[1]
[<->-]< // subtract p[1], which is 64, from the input char to get it's alphabetical index
[>>>+<<<-] // add p[0] to p[3]
,] // get another character and repeat
>>> // move to p[3], where our final result is stored
따라서 실제로 인쇄를 위해 숫자 값을 ASCII 문자열로 변환하지 않았 음을 알 수 있습니다. 그것은 아마도 재미를 망칠 것입니다. 그러나 나는 결과와 함께 포인터를 셀로 이동하는 것을 선호했기 때문에 적어도 기계에 유용합니다.
이봐, 뭘 알아, 내가 C #을 이겼어!
루비 1.8.7, 53 50 46 44 24 17 자
p ('A'..$_).count
용법:
$ echo -n ROFL | 루비 -n a.rb 326676 $ echo -n WTF | 루비 -n a.rb 16074 $ echo -n A | 루비 -n a.rb 1
APL
13 자
값을 입력하십시오 x
.
x←'WTF'
그런 다음 다음과 같이 계산하십시오.
26⊥(⎕aV⍳x)-65
J가 나를이기는 유일한 이유는 괄호 때문입니다. 필요를 피하기 위해 재정렬 할 방법이 있어야한다고 생각하지만 긴 하루였습니다. 아이디어?
(Heh, 30 개 이상의 캐릭터 솔루션을 가진 펄 프로그래머들은 너무 귀엽다!)
Excel (속임수 아님), 25 자
최대 XFD 지원 :
=COLUMN(INDIRECT(A1&"1"))
설치:
- A2 셀에 수식을 넣습니다.
용법:
- A1 셀에 열 문자열을 입력하십시오.
- A2 셀에서 결과를 읽습니다.
54 자 및 많은 지침
ROFL도 지원합니다.
(A2) =MAX(B:B)
(B2) =IFERROR(26*B1+CODE(MID(A$1,ROW()-1,1))-64,0)
설치:
- 전체 스프레드 시트를 지 웁니다.
- 수식 (A2)를 A2 셀에 넣으십시오.
- 수식 (B2)을 B2 셀에 입력합니다.
- 가능한 한 아래로 공식 (B2)을 채우십시오.
용법:
- A1 셀에 열 문자열을 입력하십시오.
- A2 셀에서 결과를 읽습니다.
C # 156 146 118 개 숯을
using System.Linq;class P{static void Main(string[]a){System.Console.Write(
a[0].Aggregate(0,(t,c)=>(t+c-64)*26)/26);}}
미 골프 :
using System.Linq;
class P
{
static void Main(string[] a)
{
System.Console.Write(a[0]
.Aggregate(0, (t, c) => (t + c - 64) * 26) / 26);
}
}
Golfscript-16 자
[0]\+{31&\26*+}*
$ echo -n WTF | ./golfscript.rb excel.gs
16074
$ echo -n ROFL | ./golfscript.rb excel.gs
326676
Haskell, 50 세 51 56 문자
main=interact$show.foldl(\x->(26*x-64+).fromEnum)0
용법:
~:166$ echo -n "ROFL" | ./a.out
326676
~:167$ echo -n "WTF" | ./a.out
16074
Python,
64 자
49 자
s=0
for c in raw_input():s=26*s+ord(c)-64
print s
또한 대체 할 수 raw_input()
와 함께 input()
4 문자 수를 줄이기 위해,하지만 그 다음 주위에 인용 부호를 포함하는 입력을 필요로한다.
다음은 47 자에서 시작되는 서브 루틴입니다.
f=lambda x:len(x)and 26*f(x[:-1])+ord(x[-1])-64
k4 (kdb +), 11 자
26/:1+.Q.A?
설명:
- k4는 오른쪽에서 왼쪽으로 구문 분석
.Q.A
k4 내에서 정의됩니다-벡터입니다"ABC...XYZ"
?
찾기 연산자-x arg 내의 y arg에있는 항목에 대한 첫 번째 일치 항목의 인덱스- 인덱스를 오프셋하려면 +1
26/:
26 진법으로 변환
한 가지주의 사항-이것은 나열된 유형이 전달되는 경우에만 작동합니다.
26/:1+.Q.A? "AD"
30
26/:1+.Q.A? "WTF"
16074
그러나:
26/:1+.Q.A? ,"A"
1
Powershell, 42 자
[char[]]$args[($s=0)]|%{$s=$s*26+$_-64};$s
JavaScript 1.8 : 66 자
function a(p)Array.reduce(p,function(t,d)t*26+d.charCodeAt()-64,0)
자바 스크립트 1.8 : 72 자
function a(p)(t=0,p.replace(/./g,function(d)t=t*26+d.charCodeAt()-64),t)
JavaScript 1.6 : 83 자
function a(p){t=0;p.split("").map(function(d){t=t*26+d.charCodeAt(0)-64});return t}
JavaScript : 95 자
function a(p){r=0;t=1;l=p.length;for(i=0;i<l;i++){r+=(p.charCodeAt(l-1-i)-64)*t;t*=26}return r}
자바 스크립트 : 105 자
function a(p,i){i=i||0;l=p.length;return p?(p.charCodeAt(l-1)-64)*Math.pow(26,i)+a(p.slice(0,l-1),i+1):0}
용법:
a("A") // 1
a("B") // 2
a("AD") // 30
a("ABC") // 731
a("WTF") // 16074
a("ROFL") // 326676
Scala, 30 자
print((0/:args(0))(_*26+_-64))"
예:
C:\>scala -e "print((0/:args(0))(_*26+_-64))" AD
30
C89, 58 자
s;main(c){while(c=getchar()+1)s=26*s+c-65;printf("%d",s);}
입력 (stdin)은 AZ 만 포함해야하며 다른 문자 (줄 바꿈 포함)는 허용되지 않습니다.
Explanation of Concepts - Excelcification
Nice. I wrote my own version of this with a little more explanation a long time ago at http://aboutdev.wordpress.com/2009/12/19/excelcification-brain-teaser-code/. Although it's not quite an optimized version!
FYI. The base 26 arithmetic is called hexavigesimal and Excel's maximum column is XFD which converts to 16383 (using 0 as the first cell) which is coincidentally exactly 2^14 cells.
Can anyone guess as to why it is 2^14??
Common Lisp, 103 128 characters
(defun x(s)(reduce(lambda(x y)(+(* 26 x)y))(map 'vector(lambda(b)(-(char-code b)(char-code #\A)-1))s)))
C#, 117 111 chars
No contest compared to the likes of Perl, Ruby and APL but an improvement on the other C#/Java answers given so far.
This uses Horner's rule.
class C{static void Main(string[]a){int t=0;foreach(var c in a[0]){t=(t+c-64)*26;}System.Console.Write(t/26);}}
Perl, 34 characters
map$\=26*$\-64+ord,pop=~/./g;print
Thanks to mobrule for several suggestions.
C#, 148 chars
using System;class P{static void Main(string[]a){var r=0d;int j=0,i=a[0].
Length;while(i-->0)r+=(a[0][i]-64)*Math.Pow(26,j++);Console.WriteLine(r);}}
Ungolfed:
using System;
class P
{
static void Main(string[] a)
{
var r = 0d;
int j = 0, i = a[0].Length;
while (i-- > 0)
r += (a[0][i] - 64) * Math.Pow(26, j++);
Console.WriteLine(r);
}
}
Python - 63 chars
>>> f=lambda z: reduce(lambda x,y: 26*x+y, [ord(c)-64 for c in z])
>>> f('ROFL')
326676
Clojure:
user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "AD"))
30
user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "ROFL"))
326676
51 characters, plus the number of characters in the input string.
C:
int r=0;
while(*c)r=r*26+*c++-64;
String is stored in 'c', value is in 'r'.
Ruby 1.9, 21 characters
p'A'.upto(gets).count
Tests:
$ echo -n A| ruby x.rb
1
$ echo -n WTF| ruby x.rb
16074
$ echo -n ROFL| ruby x.rb
326676
Common Lisp, 86 characters.
(defun z(s)(let((a 0))(map nil(lambda(v)(setf a(+(* 26 a)(digit-char-p v 36)-9)))s)a))
Java: 112 124 characters
class C{public static void main(String[]a){int r=0;for(int b:a[0].getBytes())r=26*r+b-64;System.out.print(r);}}
Common Lisp, 81 characters
(defun y(s)(reduce(lambda(x y)(+(* 26 x)(-(char-code y)64)))s :initial-value 0))
Funny that as a new user I can post my own answer but not comment on someone else's. Oh well, apologies if I'm doing this wrong!
MATLAB: 24 characters
polyval(input('')-64,26)
Usage:
>> polyval(input('')-64,26)
(after pressing enter) 'WTF'
ans =
16074
참고 : 문자열을에 미리 저장하면 16 자 까지 줄일 수 x
있지만 속임수라고 생각했습니다.
>> x = 'WTF'
x =
WTF
>> polyval(x-64,26)
ans =
16074
PHP-73 자
$n=$argv[1];$s=$i=0;while($i<strlen($n))$s=$s*26+ord($n[$i++])-64;echo$s;
용법:
php -r '$n=$argv[1];$s=$i=0;while($i<strlen($n))$s=$s*26+ord($n[$i++])-64;echo$s;' AA
> 27
참고 URL : https://stackoverflow.com/questions/2634427/code-golf-numeric-equivalent-of-an-excel-column-name
'code' 카테고리의 다른 글
Android Studio에서 서명 된 APK의 키 별칭 및 키 비밀번호를 검색하는 방법 (Eclipse에서 마이그레이션 됨) (0) | 2020.10.15 |
---|---|
프로덕션 엔터프라이즈 환경에서 지금까지 본 것 중 가장 사악한 코드는 무엇입니까? (0) | 2020.10.15 |
dequeueBuffer : 버퍼 수를 설정하지 않고 여러 버퍼를 대기열에서 빼낼 수 없습니다. (0) | 2020.10.15 |
SWIG의 새로운 내장 기능과 함께 pythonappend를 사용하는 방법이 있습니까? (0) | 2020.10.15 |
"효과보다 더 강력한 모나드 트랜스포머"-예? (0) | 2020.10.15 |