代码高尔夫:与Excel列名相同的数字

挑战

按字符计数的最短代码将输出Excel列string的数字等值。

例如, A列是1, B是2,依此类推。 一旦你点击Z ,下一列变成AA ,然后是AB ,依此类推。

testing用例:

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

代码计数包括input/​​输出(即完整程序)。

Perl, 36 34 33 31 30 17 15 11个字符

 $_=()=A..$_ 

用法:

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

通过使用回声-n来减less到17以避免chop呼叫。

通过使用说而不是打印减less到15。

通过使用-p而不是说减less到11。

说明: A在string上下文中计算, A..$_build立一个从“A”开始的列表,并且string递增到inputstring。 Perl在string上下文中解释++运算符(也就是.. ),例如$_="AZ";$_++;print输出BA

=()= (又名“goatse”运算符 )强制一个expression式在列表上下文中求值,并返回该expression式返回的元素个数,即$scalar = () = <expr>对应于@list = <expr>; $scalar = @list @list = <expr>; $scalar = @list

Excel,9个字符:)

使用正确的工具来完成这项工作:

 =COLUMN() 

= COLUMN()

J , 17 12 10个字符

 26#.64-~av 

例:

 26#.64-~av 'WTF' 16074 

说明:

  • J从右向左分析。
  • av返回参数中每个字符的ascii索引列表,例如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 

所以你会注意到我实际上并没有把数值转换成asciistring来打印。 这可能会毁了乐趣。 但是我把这个指针移动到单元格的结果是,所以至less对于机器来说是有用的。

嘿,你知道什么,我打败了C#!

ruby1.8.7,53 50 46 44 24 17个字符

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

用法:

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

APL

13个字符

把值放在x

 x←'WTF' 

然后计算它:

 26⊥(⎕aV⍳x)-65 

J打败我的唯一原因是因为括号。 我认为应该有一些方法来重新排列它,以避免它们的需要,但是这是漫长的一天。 想法?

(呵呵,你的perl程序员用你30多个angular色的解决scheme真是太可爱了!)

Excel(不作弊),25个字符

支持XFD:

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

安装:

  1. 把公式放在单元格A2中。

用法:

  1. input单元格A1中的列string。
  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)尽量减less。

用法:

  1. input单元格A1中的列string。
  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);}} 

Ungolfed:

 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 

哈斯格尔,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 

你也可以用input()来replaceraw_input()来减less4个字符的数量,但是这就要求input中包含引号。

这是一个47个字符的子程序:

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

k4(kdb +),11个字符

 26/:1+.QA? 

说明:

  • k4parsing左边的权利
  • .QA在k4内定义 – 它是vector"ABC...XYZ"
  • ? 是find操作符 – x arg中y arg中项目的第一个匹配项的索引
  • +1来抵消索引
  • 26/:转换为基数26

一个警告 – 这只会在列出的types被传入的地方工作:

  26/:1+.QA? "AD" 30 26/:1+.QA? "WTF" 16074 

但:

  26/:1+.QA? ,"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) 

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

input(stdin)只能包含AZ,不允许其他字符(包括换行符)。

概念的解释 – Excelcification

尼斯。 很久以前,我在http://aboutdev.wordpress.com/2009/12/19/excelcification-brain-teaser-code/上写了我自己的版本。; 虽然它不是一个优化版本!

仅供参考。 基础26算术被称为hexavigesimal ,Excel的最大列是XFD ,它转换为16383(使用0作为第一个单元格),它恰好恰好是2 ^ 14个单元格

任何人都可以猜测,为什么它是2 ^ 14?

Common Lisp,103个128个字符

 (defun x(s)(reduce(lambda(xy)(+(* 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的几个build议。

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

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个字符

>>> 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个字符,加上inputstring中的字符数。

C:

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

string存储在'c'中,值是'r'。

Ruby 1.9,21个字符

 p'A'.upto(gets).count 

testing:

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

Common Lisp,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 字符

 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个字符

 (defun y(s)(reduce(lambda(xy)(+(* 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 

注意:如果预先将string存储在x ,则可以将其减less到16个字符,但我认为这是作弊:

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