挑战
按字符计数的最短代码,它将输出与Excel列字符串等效的数字。
例如,A
列是1,B
是2,依此类推。按下后Z
,下一列变为AA
,AB
依此类推。
测试用例:
A: 1
B: 2
AD: 30
ABC: 731
WTF: 16074
ROFL: 326676
代码计数包括输入/输出(即完整程序)。
按字符计数的最短代码,它将输出与Excel列字符串等效的数字。
例如,A
列是1,B
是2,依此类推。按下后Z
,下一列变为AA
,AB
依此类推。
A: 1
B: 2
AD: 30
ABC: 731
WTF: 16074
ROFL: 326676
代码计数包括输入/输出(即完整程序)。
Answers:
$_=()=A..$_
用法:
$ echo -n WTF | perl -ple '$_=()=A..$_'
16074
通过使用echo -n避免chop
调用,减少到17 。
通过使用说而不是打印减少到15。
通过使用-p而不是say减少到11。
说明:
A
在字符串上下文中求值,并A..$_
建立一个列表,该列表以“ A”开始,并以字符串递增直至输入字符串。Perl在字母上下文中++
(因此..
)在字符串上解释运算符,因此例如$_="AZ";$_++;print
output BA
。
=()=
(aka “ goatse”运算符)强制表达式在列表上下文中求值,并返回该表达式返回的元素数,即$scalar = () = <expr>
对应于@list = <expr>; $scalar = @list
。
$_
或$` instead of
$ n`,然后print
不带参数地调用。
print
到say
并放下另外2个字符:)
使用正确的工具进行工作:
=COLUMN()
=COL()
。6个字符。(见dolf.trieschnigg.nl/excel/excel.html)
ROFL
尽管它不支持。
26#.64-~av
例:
26#.64-~av 'WTF'
16074
说明:
av
返回其参数中每个字符的ascii索引列表,例如,av'ABC'
return 65 66 67
。64-~
。#.
动词将列表转换为以26为底的数字。,[>>>[->>+++++[-<+++++>]<+<]>[-<+>]<<++++++++[<++++++++>-]<[<->-]<[>>>+<<<-],]>>>
,[ // 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#!
p ('A'..$_).count
用法:
$ echo -n ROFL | 红宝石-n a.rb 326676 $ echo -n WTF | 红宝石-n a.rb 16074 $ echo -n A | 红宝石-n a.rb 1个
p (
而p(
不同的是,:(
echo -n ...
以便您可以放下.chop
13个字符
将值输入x
:
x←'WTF'
然后用:
26⊥(⎕aV⍳x)-65
J打败我的唯一原因是因为括号。我认为应该有某种方法可以重新安排它,以避免对它们的需要,但这已经是漫长的一天。有想法吗?
(嘿,您的30个字符解决方案的perl程序员真是太可爱了!)
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);
}
}
Console.Write
,而不是WriteLine
?
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
f=lambda x:len(x)and 26*f(x[:-1])+ord(x[-1])-64
function a(p)Array.reduce(p,function(t,d)t*26+d.charCodeAt()-64,0)
function a(p)(t=0,p.replace(/./g,function(d)t=t*26+d.charCodeAt()-64),t)
function a(p){t=0;p.split("").map(function(d){t=t*26+d.charCodeAt(0)-64});return 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}
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
(t?g*26:0)
零件来进一步缩小尺寸。
string#replace
Scala,30个字符
print((0/:args(0))(_*26+_-64))"
例:
C:\>scala -e "print((0/:args(0))(_*26+_-64))" AD
30
真好 很久以前,我在http://aboutdev.wordpress.com/2009/12/19/excelcification-brain-teaser-code/上编写了自己的版本,并作了一些解释 。虽然它不是一个优化的版本!
仅供参考。以26为底的算术称为十六进制,Excel的最大列为XFD,它转换为16383(使用0作为第一个单元格),恰好是2 ^ 14个单元格。
谁能猜出它为什么是2 ^ 14?
26^n
for位置n
(withn = 0
代表最右边的字母),则一切正常。
与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);}}
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);
}
}
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
echo A |
,应该是echo A|
echo -n
像其他人一样使用并摆脱chop
。
echo -n
在Windows上无法使用。
Common Lisp,81个字符
(defun y(s)(reduce(lambda(x y)(+(* 26 x)(-(char-code y)64)))s :initial-value 0))
有趣的是,作为新用户,我可以发布自己的答案,但不能对其他人的评论发表评论。哦,好,如果我做错了,就深表歉意!
$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