programing

코드 골프:Excel 열 이름에 해당하는 숫자

megabox 2023. 4. 9. 21:19
반응형

코드 골프:Excel 열 이름에 해당하는 숫자

과제

Excel 열 문자열에 해당하는 숫자를 출력하는 문자 수별 최단 코드입니다.

를 들면, 「」는,A에는 1, 지만 1이 .B2면 되다★★★★★★★★★★★★를 누르면Z 열은 ,가 됩니다.AA , , , 「 」AB기타 등등.

테스트 케이스:

A:    1
B:    2
AD:   30
ABC:  731
WTF:  16074
ROFL: 326676

코드 수에는 입력/출력(즉, 전체 프로그램)이 포함됩니다.

Excel, 9글자 :)

작업에 적합한 도구를 사용하십시오.

=COLUMN()

= COLUMN()

Perl, 36 34 33 31 30 17 15 11 문자

$_=()=A..$_

사용방법:

$ echo -n WTF | perl -ple '$_=()=A..$_'
16074

- chopdiscl.discl.discl을 클릭합니다.

인쇄가 아닌 say를 사용하여 15로 줄였습니다.

say 대신 -p를 사용하면 11로 감소합니다.

명::A되며, " " "는 " "로 평가됩니다.A..$_는, 「 인크리먼트 하는 합니다.은 Perl을 합니다.++'연산자.., 영숫자 의 문자열에 , 「 」 「 」 「 」 「 」 、 「 」 「 」$_="AZ";$_++;print 력 outputsBA.

=()=(일명 "classe" 연산자)는 표현식을 목록 컨텍스트에서 평가하도록 강제하고 해당 표현식에 의해 반환되는 요소의 수를 반환합니다.$scalar = () = <expr> 대응하다@list = <expr>; $scalar = @list.

J, 17 12 10자

26#.64-~av

예:

26#.64-~av  'WTF'
16074

설명:

  • J는 오른쪽에서 왼쪽으로 파스를 한다.
  • av인수에 각 목록을 예: ASCII 인덱스).예를 들어 다음과 같습니다.av'ABC'65 66 67.
  • 그 의 각 .64-~.
  • 다음 을 변환합니다.#.동사.동사.동사.동사.동사:

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.rb326676$ echo - n WTF | 루비 - n a.rb16074$ echo - n A | 루비 - n a.rb1

APL

13 문자

을 입력하다x:

x←'WTF'

다음으로 계산:

26⊥(⎕aV⍳x)-65

J가 나를 이긴 이유는 괄호 때문이다.그들이 필요 없게 다시 정리할 방법이 있을 것 같은데, 긴 하루였어요.아이디어?

(헤헤, 30개 이상의 문자 솔루션을 가진 펄 프로그래머들은 너무 귀여워!)

Excel(부정행위 제외), 25글자

최대 XFD 지원:

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

설치:

  1. A2 세포에 공식을 넣으세요.

사용방법:

  1. 셀 A1에 열 문자열을 입력합니다.
  2. A2 셀에서 결과를 읽습니다.

54글자, 많은 지시사항 추가

ROFL도 지원:

(A2)  =MAX(B:B)
(B2)  =IFERROR(26*B1+CODE(MID(A$1,ROW()-1,1))-64,0)

설치:

  1. 전체 스프레드시트를 지웁니다.
  2. (A2)를 셀 A2에 넣습니다.
  3. (B2)를 셀 B2에 넣습니다.
  4. 식(B2)을 가능한 한 아래로 채운다.

사용방법:

  1. 셀 A1에 열 문자열을 입력합니다.
  2. 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);
    }
}

골프 스크립트 - 16 문자

[0]\+{31&\26*+}*


$ echo -n WTF | ./golfscript.rb excel.gs
16074
$ echo -n ROFL | ./golfscript.rb excel.gs
326676

하스켈, 505 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(숫자+), 11자

26/:1+.Q.A?

설명:

  • k4는 오른쪽의 왼쪽을 파싱합니다.
  • .Q.A내에서 됩니다. k4는 k4로 정의됩니다. 이것은 벡터입니다."ABC...XYZ"
  • ?연산자입니다.xarg find 첫 입니다.xarg 야르그 야르그 야르그 야르그야르그야르그야르그야르그야르그야르그야르그야르그야르그야르그야르다
  • 인덱스를 오프셋하려면 +1
  • 26/: 26으로

한 가지 주의사항 - 이는 나열된 유형이 전달된 경우에만 작동합니다.

  26/:1+.Q.A? "AD"
30

  26/:1+.Q.A? "WTF"
16074

단,

  26/:1+.Q.A? ,"A"
1

파워셸, 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)

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

JavaScript: 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

스칼라, 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)에는 A~Z만 포함되어야 하며 다른 문자(새 줄 포함)는 허용되지 않습니다.

개념 설명 - Excelification

좋습니다. 저는 오래전에 http://aboutdev.wordpress.com/2009/12/19/excelcification-brain-teaser-code/에 좀 더 많은 설명과 함께 저만의 버전을 썼습니다.최적화된 버전은 아니지만!

참고로 베이스 26의 산술은 헥사비지멀이라고 불리며, 엑셀의 최대 컬럼은 XFD로, 공교롭게도 정확히 2^14 셀인 16383(첫 번째 셀로서 0을 사용)로 변환됩니다.

왜 2^14인지 짐작할 수 있는 사람?

공통 리스프, 103128 문자

(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 문자

Perl, Ruby, APL과 비교해도 경합은 없고, 지금까지의 C#/Java의 답변보다 개선되었습니다.

이것은 호너의 법칙을 사용한다.

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 문자

map$\=26*$\-64+ord,pop=~/./g;print

몇 가지 제안을 해 준 mobrule 덕분에.

C#, 148 문자

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

골프 치지 않음

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 문자

>> f=sqda z: reduce (4qda x,y: 26*x+y, [c in z의 경우 ord(c)-64])

f('ROFL')

326676

클로저:

user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "AD"))
30
user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "ROFL"))
326676

51 문자에 입력 문자열의 문자 수를 더합니다.

C:

int r=0;
while(*c)r=r*26+*c++-64;

문자열은 'c'에 저장되고 값은 'r'에 저장됩니다.

루비 1.9, 21 문자

p'A'.upto(gets).count

테스트:

$ echo -n A| ruby x.rb
1
$ echo -n WTF| ruby x.rb
16074
$ echo -n ROFL| ruby x.rb
326676

공통 리스프, 86자

(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 문자

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

공통 리스프, 81자

(defun y(s)(reduce(lambda(x y)(+(* 26 x)(-(char-code y)64)))s :initial-value 0))

새로운 사용자로서 내 자신의 답변을 올릴 수는 있지만 다른 사용자의 답변에 대해서는 언급하지 않는 것이 이상하다.아, 내가 잘못했다면 사과할게!

MATLAB: 24 문자

polyval(input('')-64,26)

사용방법:

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

반응형