Code Golf:相当于Excel列名的数字

Viv*_*ath 76 excel code-golf

挑战

按字符数排序的最短代码,将输出Excel列字符串的数字等效值.

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

测试用例:

A:    1
B:    2
AD:   30
ABC:  731
WTF:  16074
ROFL: 326676
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*bić 339

Excel,9个字符:)

使用正确的工具:

=COLUMN()
Run Code Online (Sandbox Code Playgroud)

= COLUMN()

  • 使用正确的语言:葡萄牙语Excel` = COL()`.6个字符.(见http://dolf.trieschnigg.nl/excel/excel.html) (166认同)
  • 此解决方案甚至可以正确地再现Excel的限制. (63认同)
  • 大!只是它不支持`ROFL`. (21认同)
  • 它甚至不需要字符串作为输入.不接近做问题所说的.它只适用于碰巧在相关字符串后面命名的列中.完全不符合问题的精神. (18认同)
  • 公平地说,Code Golf可以*为这些类型的smartass答案制作*.所以你从我那里得到+1. (9认同)
  • 我认为你应该接受我的12字符J解决方案,但我可能有偏见.:) (6认同)

Dav*_*vid 96

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

$_=()=A..$_
Run Code Online (Sandbox Code Playgroud)

用法:

$ echo -n WTF | perl -ple '$_=()=A..$_'
16074
Run Code Online (Sandbox Code Playgroud)

使用echo -n减少到17以避免chop呼叫.

使用say而不是print来减少到15.

使用-p而不是说减少到11.

说明: A在字符串上下文中计算,并A..$_构建一个从"A"开始的字符串,并以字符串为单位递增到输入字符串.Perl 在字母上下文中对字符串解释++运算符(因此也是如此..),例如$_="AZ";$_++;print输出BA.

=()=(又名"goatse"运算符)强制在列表上下文中计算表达式,并返回该表达式返回的元素数,即$scalar = () = <expr>对应于@list = <expr>; $scalar = @list.

  • 啊,我喜欢山羊运营商:) (16认同)
  • 嘿,Perl打败J! (6认同)
  • 使用"-p"并完全删除打印:echo -n WTF | perl -p -e'$ _ =()= A .. $ _'总代码:11个字符,AH AH! (4认同)
  • 使用`$ _`或`$ \`而不是`$ n`并在没有args的情况下调用`print`. (2认同)
  • 将`print`切换为`say`并删除另外2个字符:) (2认同)

Dav*_*vid 71

J,17 12 10个字符

26#.64-~av
Run Code Online (Sandbox Code Playgroud)

例:

26#.64-~av  'WTF'
16074
Run Code Online (Sandbox Code Playgroud)

说明:

  • J从右到左解析.
  • av返回其参数中每个字符的ascii索引列表,例如av'ABC'返回65 66 67.
  • 然后我们用动词从该列表的每个元素中减去64 64-~.
  • 然后我们使用#.动词将列表转换为base 26 .

  • +1 J pwns golfscript谈到基础转换:) (6认同)
  • 在阅读了一些关于Excel解决方案如何不采用字符串输入的评论后,我将采用最短的解决方案,并实际采用字符串输入. (2认同)
  • @Brandon:只要您不介意花费数年时间学习如何阅读它,J就是为所有事物而制造的. (2认同)

Tes*_*rex 55

Brainf*ck,81个字符(无空格)

,[>>>[->>+++++[-<+++++>]<+<]>[-<+>]<<++++++++[<++++++++>-]<[<->-]<[>>>+<<<-],]>>>
Run Code Online (Sandbox Code Playgroud)

说明

,[  // 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
Run Code Online (Sandbox Code Playgroud)

所以你会注意到我实际上没有将数值转换为ascii字符串进行打印.这可能会破坏乐趣.但我赞成将指针移动到具有结果的单元格,所以至少它对机器有用.

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

  • LOL @ Beating C# (16认同)
  • 来吧,不要停在那里,做Excel的其余部分. (2认同)

Mar*_*off 31

红宝石1.8.7,53 50 46 44 24 17个字符

p ('A'..$_).count
Run Code Online (Sandbox Code Playgroud)

用法:

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

  • 看起来我可能要开始学习Ruby了!:) (3认同)

Ken*_*Ken 23

APL

13个字符

把价值放在x:

x?'WTF'
Run Code Online (Sandbox Code Playgroud)

然后计算它:

26?(?aV?x)-65
Run Code Online (Sandbox Code Playgroud)

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

(嘿,你这个有30多个角色解决方案的程序员非常可爱!)


ken*_*ytm 14

Excel(不作弊),25个字符

支持最多XFD:

=COLUMN(INDIRECT(A1&"1"))
Run Code Online (Sandbox Code Playgroud)

安装:

  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)
Run Code Online (Sandbox Code Playgroud)

安装:

  1. 清除整个电子表格.
  2. 将公式(A2)放在单元格A2中.
  3. 将公式(B2)放在单元格B2中.
  4. 填写公式(B2)尽可能远.

用法:

  1. 在单元格A1中输入列字符串.
  2. 在A2单元格中读取结果.


Cam*_*and 13

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);}}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • `Console.Write`而不是`WriteLine`怎么样? (3认同)

Joh*_*ooy 12

Golfscript - 16个字符

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


$ echo -n WTF | ./golfscript.rb excel.gs
16074
$ echo -n ROFL | ./golfscript.rb excel.gs
326676
Run Code Online (Sandbox Code Playgroud)


ken*_*ytm 11

哈斯克尔,50岁 51 56 字符

main=interact$show.foldl(\x->(26*x-64+).fromEnum)0
Run Code Online (Sandbox Code Playgroud)

用法:

~:166$ echo -n "ROFL" | ./a.out
326676
~:167$ echo -n "WTF" | ./a.out
16074
Run Code Online (Sandbox Code Playgroud)


Ada*_*eld 9

Python,64个 49个字符

s=0
for c in raw_input():s=26*s+ord(c)-64
print s
Run Code Online (Sandbox Code Playgroud)

您也可以替换raw_input()input()4,减少文字数,但是那需要输入含有周围引号.

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

f=lambda x:len(x)and 26*f(x[:-1])+ord(x[-1])-64
Run Code Online (Sandbox Code Playgroud)


小智 9

k4(kdb +),11个字符

26/:1+.Q.A?
Run Code Online (Sandbox Code Playgroud)

说明:

  • k4解析右边的左边
  • .Q.A 在k4中定义 - 它是向量 "ABC...XYZ"
  • ? 是find运算符 - x arg中y arg中项目的第一个匹配的索引
  • +1来抵消索引
  • 26/: 转换为基数26

一个警告 - 这只适用于传入列出的类型的地方:

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

  26/:1+.Q.A? "WTF"
16074
Run Code Online (Sandbox Code Playgroud)

但:

  26/:1+.Q.A? ,"A"
1
Run Code Online (Sandbox Code Playgroud)


Dan*_*llo 8

JavaScript 1.8:66个字符

function a(p)Array.reduce(p,function(t,d)t*26+d.charCodeAt()-64,0)
Run Code Online (Sandbox Code Playgroud)

Javascript 1.8:72个字符

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

JavaScript 1.6:83个字符

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

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}
Run Code Online (Sandbox Code Playgroud)

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}
Run Code Online (Sandbox Code Playgroud)

用法:

a("A")        // 1
a("B")        // 2
a("AD")       // 30
a("ABC")      // 731
a("WTF")      // 16074
a("ROFL")     // 326676
Run Code Online (Sandbox Code Playgroud)


Dan*_*bić 8

Powershell,42个字符

[char[]]$args[($s=0)]|%{$s=$s*26+$_-64};$s
Run Code Online (Sandbox Code Playgroud)


Dan*_*ral 6

斯卡拉,30个字符

print((0/:args(0))(_*26+_-64))" 
Run Code Online (Sandbox Code Playgroud)

例:

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


Ada*_*eld 5

C89,58个字符

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

输入(stdin)必须仅包含AZ,不允许其他字符(包括换行符).


Abo*_*Dev 5

概念解释 - Excelcification

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

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

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

  • 也许他们当时只想使用64k内存:-) (5认同)

Pau*_*ter 5

Common Lisp,103 128个字符

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


Dan*_*haw 5

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);}}
Run Code Online (Sandbox Code Playgroud)