Mã Golf: Số tương đương với tên cột Excel


76

Các thách thức

Mã ngắn nhất tính theo số ký tự sẽ xuất ra số tương đương với chuỗi cột Excel.

Ví dụ, Acột là 1, Blà 2, v.v. Khi bạn nhấn Z, cột tiếp theo sẽ trở thành AA, sau đó AB, v.v.

Các trường hợp kiểm tra:

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

Số lượng mã bao gồm đầu vào / đầu ra (tức là chương trình đầy đủ).


19
Golf mã là vô nghĩa, APL luôn thắng cuối cùng.
BlueRaja - Danny Pflughoeft

1
Khi bạn đăng một giải pháp, hãy đảm bảo rằng nó hoạt động trên tất cả các trường hợp ở trên (đầu vào / đầu ra khi chạy là tốt) và lưu ý nơi nó không hoạt động. Cảm ơn.

3
Tại sao cái quái này lại được gắn thẻ rosetta-stone ?!
Josh Stodola

2
J là APL không có tiếng Hy Lạp. J sẽ luôn chiến thắng, không ai nói APL nữa.
Callum Rogers

1
@BlueRaja: Thật thú vị khi APL vẫn đang giành được những điều này vào năm 2010, gần 40 năm sau khi nó rời khỏi dòng chính.
Kragen Javier Sitaker

Câu trả lời:


96

Perl, 36 34 33 31 30 17 15 11 ký tự

$_=()=A..$_

Sử dụng:

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

Giảm xuống 17 bằng cách sử dụng echo -n để tránh chopcuộc gọi.

Giảm xuống còn 15 bằng cách sử dụng say thay vì in.

Giảm xuống 11 bằng cách sử dụng -p thay vì nói.

Giải thích: Ađược đánh giá trong ngữ cảnh chuỗi và A..$_xây dựng một danh sách bắt đầu từ "A" và chuỗi tăng dần lên đến chuỗi đầu vào. Perl diễn giải ++toán tử (và do đó ..) trên chuỗi trong ngữ cảnh bảng chữ cái, ví dụ như $_="AZ";$_++;printkết quả đầu ra BA.

=()=(hay còn gọi là toán tử "Goatse" ) buộc một biểu thức được đánh giá trong ngữ cảnh danh sách và trả về số phần tử được trả về bởi biểu thức đó, tức là $scalar = () = <expr>tương ứng với @list = <expr>; $scalar = @list.


2
Sử dụng $_hoặc $` instead of $ n` và gọi printkhông có args.
đám đông

4
sử dụng "-p" và thả in hoàn toàn: echo -n WTF | perl -p -e '$ _ = () = A .. $ _' Tổng mã: 11 ký tự, AH AH!
wazoox

2
chuyển printsang sayvà thả thêm 2 ký tự :)
mpeters

16
Ah, tôi yêu nhà điều hành Goatse :)
Ether,

1
Chỉ có một số lượng giới hạn gồm 11 chương trình perl ký tự sẽ thực sự biên dịch ... khiến tôi tự hỏi những chương trình khác làm gì.
Dan

339

Excel, 9 ký tự :)

Sử dụng các công cụ thích hợp cho công việc:

=COLUMN()

=COLUMN()


166
Sử dụng ngôn ngữ phù hợp cho công việc: Tiếng Bồ Đào Nha Excel =COL(). 6 ký tự. (Xem dolf.trieschnigg.nl/excel/excel.html )
Debilski

21
Tuyệt quá! chỉ nó không hỗ trợ ROFLmặc dù.
YOU

63
Giải pháp này thậm chí còn tái tạo những hạn chế của Excel một cách chính xác.
kibibu

18
Nó thậm chí không lấy một chuỗi làm đầu vào. Không gần như làm những gì vấn đề đã nói. Nó chỉ hoạt động nếu nó nằm trong cột tình cờ được đặt tên theo chuỗi được đề cập. Hoàn toàn không đúng với tinh thần của câu hỏi.
phkahler

9
Công bằng mà nói, Code Golf được tạo ra cho những loại câu trả lời thông minh. Vì vậy, bạn nhận được một +1 từ tôi.
Reynolds

71

J , 17 12 10 ký tự

26#.64-~av

Thí dụ:

26#.64-~av  'WTF'
16074

Giải trình:

  • J nói từ phải sang trái.
  • avtrả về danh sách các chỉ mục ascii của mỗi ký tự trong đối số của nó, vì vậy, ví dụ av'ABC'trả về 65 66 67.
  • Sau đó, chúng tôi trừ 64 từ mỗi phần tử của danh sách đó với động từ 64-~.
  • Sau đó, chúng tôi chuyển đổi danh sách sang cơ số 26 bằng cách sử dụng #.động từ.

2
Sau khi đọc một số nhận xét về cách giải pháp Excel thực sự không sử dụng đầu vào chuỗi, tôi sẽ đi đến giải pháp ngắn nhất và thực sự sử dụng đầu vào chuỗi.
Vivin Paliath

Wow một giải pháp J mà tôi thực sự có thể hiểu được :)
Callum Rogers

2
@Brandon: J được tạo ra cho mọi thứ, miễn là bạn không ngại dành nhiều năm học cách đọc nó.
David

55

Brainf * ck, 81 ký tự (không có khoảng trắng)

,[>>>[->>+++++[-<+++++>]<+<]>[-<+>]<<++++++++[<++++++++>-]<[<->-]<[>>>+<<<-],]>>>

Giải trình

,[  // 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

Vì vậy, bạn sẽ nhận thấy rằng tôi đã không thực sự chuyển đổi giá trị số thành chuỗi ascii để in. Điều đó có thể sẽ làm hỏng cuộc vui. Nhưng tôi đã ủng hộ việc di chuyển con trỏ đến ô có kết quả, vì vậy ít nhất nó cũng hữu ích cho máy.

Này, bạn biết gì không, tôi đánh bại C #!


Tôi rất ngạc nhiên khi có ai đó thực sự sử dụng Bf ngay từ đầu
OscarRyz

31

Ruby 1.8.7, 53 50 46 44 24 17 ký tự

p ('A'..$_).count

Sử dụng:

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

Tuyệt vời, tôi đã thử nghiệm mô hình rất giống nhau rồi, nhưng tôi không nhận ra điều đó p (p(khác biệt, :(
YOU

sử dụng echo -n ..., do đó bạn có thể thả.chop
John La Rooy

@gnibbler: Cảm ơn ý tưởng -n, điều đó cũng đưa giải pháp perl của tôi xuống 17.
David

Bạn có thể nhận được rằng đến 16 bằng cách sử dụng một thay vì 'A'?
steenslag

23

APL

13 ký tự

Đặt giá trị vào x:

x←'WTF'

sau đó tính toán nó với:

26⊥(⎕aV⍳x)-65

Lý do duy nhất khiến J đánh tôi là vì dấu ngoặc đơn. Tôi nghĩ nên có một số cách để sắp xếp lại nó để tránh sự cần thiết của chúng, nhưng đã lâu rồi. Ý tưởng?

(Heh, các bạn lập trình viên perl với hơn 30 giải pháp ký tự của mình thật dễ thương!)


Có thể là 26⊥⁻65 + ⎕aV⍳x thay thế? Đó là cách bạn viết âm 65 trong APL, phải không?
Kragen Javier Sitaker

Tôi không có môi trường APL trước mặt tôi ngay bây giờ, nhưng tôi nghĩ rằng tôi đã thử một cái gì đó như vậy và nó không hoạt động. Ngoài đỉnh đầu của tôi (và phải thừa nhận rằng tôi là thứ xa nhất so với thuật sĩ APL!) ⁻ Tương đương với - và vì nó đánh giá từ phải sang trái nên nó được áp dụng sau dấu +, vì vậy bạn kết thúc bằng 26⊥⁻ ( 65+ (⎕aV⍳x)) thay vì 26⊥ ((⁻65) + ⎕aV⍳x), đó là những gì bạn cần ở đây.
Ken

Giải pháp Perl được chấp nhận đánh bại mã của bạn bằng hai ký tự ... =)
kolistivra

14

Excel (không gian lận), 25 ký tự

Hỗ trợ lên đến XFD:

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

Cài đặt:

  1. Đặt công thức vào ô A2.

Sử dụng:

  1. Nhập chuỗi cột vào ô A1.
  2. Đọc kết quả tại ô A2.

54 ký tự, cộng với rất nhiều hướng dẫn

Cũng hỗ trợ ROFL:

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

Cài đặt:

  1. Xóa toàn bộ bảng tính.
  2. Đặt công thức (A2) vào ô A2.
  3. Đặt công thức (B2) vào ô B2.
  4. Điền công thức (B2) xuống càng sâu càng tốt.

Sử dụng:

  1. Nhập chuỗi cột vào ô A1.
  2. Đọc kết quả tại ô A2.

13

C # 156 146 118 ký tự

using System.Linq;class P{static void Main(string[]a){System.Console.Write(
a[0].Aggregate(0,(t,c)=>(t+c-64)*26)/26);}}

Không thích:

using System.Linq;
class P
{
    static void Main(string[] a)
    {
        System.Console.Write(a[0]
            .Aggregate(0, (t, c) => (t + c - 64) * 26) / 26);
    }
}

Việc sử dụng phím tắt C = System.Console không giúp bạn ở đây, vì cuối cùng bạn phải nói "Hệ thống". hai lần. Bạn có thể lưu 5 ký tự nếu bạn chỉ thực hiện "using System;" và thay đổi mã của bạn cho phù hợp. Nhưng phiên bản không phải linq của tôi vẫn ngắn hơn. :)
Igby Largeman

Bạn nói đúng, và tôi có thể làm cho nó ngắn hơn bằng cách sử dụng đối số đầu tiên thay vì Console.Readline, làm cho nó vẫn ngắn hơn. : P
Cameron MacFarland

1
oh crap, tôi đã giúp bạn đi trước tôi! : P
Igby Largeman

Nhân tiện, cảm ơn vì đã sửa số lượng char của tôi. Tôi hoàn toàn không thích điều đó.
Igby

3
Làm thế nào về Console.Writethay vì WriteLine?
Andreas Grech

12

Golfscript - 16 ký tự

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


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

11

Haskell, 50 tuổi 51 56 ký tự

main=interact$show.foldl(\x->(26*x-64+).fromEnum)0

Sử dụng:

~:166$ echo -n "ROFL" | ./a.out
326676
~:167$ echo -n "WTF" | ./a.out
16074

9

Python, 64 49 ký tự

s=0
for c in raw_input():s=26*s+ord(c)-64
print s

Bạn cũng có thể thay thế raw_input()bằng input()để giảm số lượng ký tự đi 4, nhưng điều đó sau đó yêu cầu đầu vào phải chứa dấu ngoặc kép xung quanh nó.

Và đây là một chương trình con có 47 ký tự:

f=lambda x:len(x)and 26*f(x[:-1])+ord(x[-1])-64

# 2 của bạn nên được đặt tên là f. Hãy thử chạy nó ngay bây giờ, nó không hoạt động. Và nó có thể được thực hiện ngắn hơn (47 ký tự) với sự giúp đỡ của lambdas và đánh giá ngắn mạch:f=lambda x:len(x)and 26*f(x[:-1])+ord(x[-1])-64
Ponkadoodle

@wallacoloo: Cảm ơn. Đó là một wiki cộng đồng, vì vậy bạn có thể thoải mái chỉnh sửa bất cứ lúc nào.
Adam Rosenfield

làm thế nào về thả len (x) cho x một mình? trở thành 43 ký tự: f = lambda x: x và 26 * f (x [: - 1]) + ord (x [-1]) - 64
Nas Banov

9

k4 (kdb +), 11 ký tự

26/:1+.Q.A?

Giải trình:

  • k4 phân tích cú pháp bên trái bên phải
  • .Q.A được xác định trong k4 - nó là vectơ "ABC...XYZ"
  • ? là toán tử tìm - chỉ số của đối sánh đầu tiên cho các mục trong y arg trong x arg
  • +1 để bù đắp chỉ số
  • 26/: để chuyển đổi sang cơ số 26

Một lưu ý - điều này sẽ chỉ hoạt động khi các loại được liệt kê được chuyển vào:

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

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

nhưng:

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


8

JavaScript 1.8: 66 ký tự

function a(p)Array.reduce(p,function(t,d)t*26+d.charCodeAt()-64,0)

Javascript 1.8: 72 ký tự

function a(p)(t=0,p.replace(/./g,function(d)t=t*26+d.charCodeAt()-64),t)

JavaScript 1.6: 83 ký tự

function a(p){t=0;p.split("").map(function(d){t=t*26+d.charCodeAt(0)-64});return t}

JavaScript: 95 ký tự

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 ký tự

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}

Sử dụng:

a("A")        // 1
a("B")        // 2
a("AD")       // 30
a("ABC")      // 731
a("WTF")      // 16074
a("ROFL")     // 326676

Tôi đã cắt thêm 4 ký tự từ giải pháp 1.6 bằng cách sử dụng các đóng biểu thức. Bạn có thể thu nhỏ nó hơn một chút bằng cách cấu trúc lại bộ (t?g*26:0)phận.
David Murdoch

CẬP NHẬT. Tôi chỉ cạo 9 ký tự hơn bằng cách sử dụng [] .reduce
David Murdoch

FWIW, tôi đã thêm một triển khai bằng cách sử dụngstring#replace
Chetan S

@Chetan, @David: Làm tốt lắm. Thật gọn gàng!
Daniel Vassallo

6

Scala, 30 ký tự

print((0/:args(0))(_*26+_-64))" 

Thí dụ:

C:\>scala -e "print((0/:args(0))(_*26+_-64))" AD
30

5

C89, 58 ký tự

s;main(c){while(c=getchar()+1)s=26*s+c-65;printf("%d",s);}

Đầu vào (stdin) chỉ được chứa AZ, không cho phép các ký tự khác (kể cả dòng mới).


1
getchar()lợi nhuận < 0trên EOF; EOF không được định nghĩa là -1, nhưng nó phổ biến.
strager

@strager: Điểm tốt. Để đảm bảo tính di động đầy đủ sau đó sẽ yêu cầu thêm 2 ký tự (bằng cách thay đổi c=getchar()+1thành (c=getchar())>=065thành 64). Tuy nhiên, điều này sẽ hoạt động trong hầu hết mọi triển khai C.
Adam Rosenfield

5

Giải thích các khái niệm - Excelci hóa

Đẹp. Tôi đã viết phiên bản này của riêng mình với một chút giải thích cách đây khá lâu tại http://aboutdev.wordpress.com/2009/12/19/excelcification-brain-teaser-code/ . Mặc dù nó không hoàn toàn là một phiên bản tối ưu hóa!

FYI. Số học cơ số 26 được gọi là hệ thập lục phân và cột tối đa của Excel là XFD chuyển đổi thành 16383 (sử dụng 0 làm ô đầu tiên), trùng hợp chính xác là 2 ^ 14 ô .

Bất cứ ai có thể đoán tại sao nó là 2 ^ 14 ??


5
Có thể họ chỉ muốn sử dụng bộ nhớ 64k tại thời điểm đó :-)
BẠN

Bởi vì họ muốn có thể thực hiện phép bù (xy) đòi hỏi một bit dấu. Nhưng đó chỉ là 15bits, vậy bit thứ 16 là gì? Nó có được dùng làm cờ không?
phkahler

1
Đây không chính xác là cơ số 26, bởi vì nó không có 0. Nếu chúng ta để A đại diện cho 1 và nhân với 26^nvị trí của for n(với n = 0chữ cái ngoài cùng bên phải), tất cả sẽ diễn ra như bình thường.
Thomas

@phkahler: Với 1 bit, bạn có thể biểu diễn tất cả các số nguyên không dấu trong phạm vi 0..2 ^ 0. Do đó, với 16 bit, bạn có thể biểu diễn 0..2 ^ 15. Lấy đi 1 bit cho dấu hiệu, giá trị lớn nhất sẽ là 2 ^ 14-1 (= 16383).
stakx - không còn đóng góp vào

1
@phkahler: bạn không cần bit dấu để biểu thị hiệu số miễn là bạn không cần biểu diễn phân biệt cho các giá trị nằm ngoài giới hạn (tức là bạn có thể kiểm tra bit tràn bộ xử lý để xem bạn có nằm ngoài giới hạn không ).
Kragen Javier Sitaker

5

Lisp chung, 103 128 ký tự

(defun x(s)(reduce(lambda(x y)(+(* 26 x)y))(map 'vector(lambda(b)(-(char-code b)(char-code #\A)-1))s)))

5

C #, 117 111 ký tự

Không có cuộc thi nào so với Perl, Ruby và APL mà là một sự cải tiến đối với các câu trả lời C # / Java khác được đưa ra cho đến nay.

Điều này sử dụng quy tắc của Horner .

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

1
Bạn có thể lưu 3 ký tự bằng cách xóa khoảng trắng giữa dấu [] và 'a' và dấu ngoặc nhọn foreach.
Cameron MacFarland,

Tôi không biết chuỗi được triển khai IEnumerable. Ngọt! Thật không may, trang về quy tắc của Horner nằm cách xa tôi, nhưng rõ ràng là một chiến lược chiến thắng. Tôi không thích sử dụng Console.Write (), do đầu ra lộn xộn. +1
Igby Largeman

4

Perl, 34 ký tự

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

Cảm ơn mobrule cho một số đề xuất.


Bạn có thể nói pop=~/./gthay vì split//,$ARGV[0]bạn có thể bỏ qua $_trong ordcuộc gọi. Bạn có thể sử dụng $` instead of $ s` và sau đó chỉ cần nói print.
đám đông

4

C #, 148 ký tự

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

Không thích:

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

4

Python - 63 ký tự

>>> f = lambda z: Reduce (lambda x, y: 26 * x + y, [ord (c) -64 for c in z])

>>> f ('ROFL')

326676


4

Clojure:

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

51 ký tự, cộng với số ký tự trong chuỗi đầu vào.


4

C:

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

Chuỗi được lưu trữ trong 'c', giá trị là 'r'.


4

Ruby 1.9, 21 ký tự

p'A'.upto(gets).count

Kiểm tra:

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

Bạn có thể sử dụng đũa thay vì dải để đạt được 1 ký tự
JRL

Cảm ơn @JRL, tôi đã có gì đó sai trong cách sử dụng echo A |, lẽ ra là vậyecho A|
BẠN

Sử dụng echo -nnhư những người khác và thoát khỏi chop.
Daniel C. Sobral

Cảm ơn @Daniel, tôi đã cập nhật nó, nhưng có vẻ như echo -nnó không hoạt động trên Windows.
YOU

4

Lisp chung, 86 ký tự.

(defun z(s)(let((a 0))(map nil(lambda(v)(setf a(+(* 26 a)(digit-char-p v 36)-9)))s)a))

3

Java: 112 124 ký tự

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

3

Lisp chung, 81 ký tự

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

Thật buồn cười là với tư cách là một người dùng mới, tôi có thể đăng câu trả lời của riêng mình nhưng không bình luận về người khác. Ồ, xin lỗi nếu tôi làm sai!


Tôi nghĩ bạn sẽ phải đăng ký :) Sau đó, bạn sẽ có thể nhận xét.
Vivin Paliath

3

MATLAB: 24 ký tự

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

Sử dụng:

>> polyval(input('')-64,26)
(after pressing enter) 'WTF'

ans =

       16074

Lưu ý: Bạn có thể giảm nó xuống còn 16 ký tự nếu bạn lưu trữ trước chuỗi trong đó x, nhưng tôi nghĩ nó đang gian lận:

>> x = 'WTF'

x =

WTF

>> polyval(x-64,26)

ans =

       16074

Làm thế nào tôi có thể quên về polyval .. +1 để có giải pháp tốt hơn
George

3

PHP - 73 ký tự

$n=$argv[1];$s=$i=0;while($i<strlen($n))$s=$s*26+ord($n[$i++])-64;echo$s;

Sử dụng:

php -r '$n=$argv[1];$s=$i=0;while($i<strlen($n))$s=$s*26+ord($n[$i++])-64;echo$s;' AA

> 27

1
Bạn có thể mất 10 ký tự bằng cách xóa dấu ngoặc nhọn xung quanh hàm while của bạn và kết xuất phần khởi tạo biến.
ChiperSoft
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.