代码高尔夫:与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()
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"))
安装:
- 把公式放在单元格A2中。
用法:
- input单元格A1中的列string。
- 在单元格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)尽量减less。
用法:
- input单元格A1中的列string。
- 在单元格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