按字符数排序的最短代码,它将输出Excel列字符串的数字等效值。
例如,A
列为1,B
为2,依此类推。点击Z
后,下一列变为AA
,然后变为AB
,依此类推。
A: 1
B: 2
AD: 30
ABC: 731
WTF: 16074
ROFL: 326676
代码计数包括输入/输出(即完整程序)。
答案 0 :(得分:340)
使用正确的工具:
=COLUMN()
答案 1 :(得分:96)
$_=()=A..$_
用法:
$ echo -n WTF | perl -ple '$_=()=A..$_'
16074
使用echo -n减少到17以避免chop
调用。
使用say而不是print来减少到15。
使用-p而不是说减少到11。
说明:
A
在字符串上下文中进行评估,A..$_
构建一个以“A”开头的字符串,并以字符串为单位递增到输入字符串。 Perl在字母上下文中解释字符串上的++
运算符(以及..
),例如$_="AZ";$_++;print
输出BA
。
=()=
(又名"goatse" operator)强制在列表上下文中计算表达式,并返回该表达式返回的元素数,即$scalar = () = <expr>
对应@list = <expr>; $scalar = @list
答案 2 :(得分:71)
26#.64-~av
示例:
26#.64-~av 'WTF'
16074
说明:
av
返回其参数中每个字符的ascii索引列表,例如av'ABC'
返回65 66 67
。64-~
。#.
动词将列表转换为基数26。答案 3 :(得分:55)
,[>>>[->>+++++[-<+++++>]<+<]>[-<+>]<<++++++++[<++++++++>-]<[<->-]<[>>>+<<<-],]>>>
,[ // 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#!答案 4 :(得分:31)
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
答案 5 :(得分:23)
13个字符
将值放在x
:
x←'WTF'
然后用:
计算它26⊥(⎕aV⍳x)-65
J击败我的唯一原因是因为括号。我认为应该有一些方法来重新排列它以避免它们的需要,但这是漫长的一天。想法?
(嘿,你这个有30多个角色解决方案的程序员非常可爱!)
答案 6 :(得分:14)
最多支持XFD:
=COLUMN(INDIRECT(A1&"1"))
安装:
用法:
也支持ROFL:
(A2) =MAX(B:B)
(B2) =IFERROR(26*B1+CODE(MID(A$1,ROW()-1,1))-64,0)
安装:
用法:
答案 7 :(得分:13)
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);
}
}
答案 8 :(得分:12)
[0]\+{31&\26*+}*
$ echo -n WTF | ./golfscript.rb excel.gs
16074
$ echo -n ROFL | ./golfscript.rb excel.gs
326676
答案 9 :(得分:11)
main=interact$show.foldl(\x->(26*x-64+).fromEnum)0
用法:
~:166$ echo -n "ROFL" | ./a.out
326676
~:167$ echo -n "WTF" | ./a.out
16074
答案 10 :(得分:9)
26/:1+.Q.A?
说明:
.Q.A
在k4中定义 - 它是向量"ABC...XYZ"
?
是find运算符 - x arg中y arg中项目的第一个匹配的索引26/:
转换为基础26 一个警告 - 这只适用于传递列出类型的地方:
26/:1+.Q.A? "AD"
30
26/:1+.Q.A? "WTF"
16074
但:
26/:1+.Q.A? ,"A"
1
答案 11 :(得分:9)
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
答案 12 :(得分:8)
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
答案 13 :(得分:8)
[char[]]$args[($s=0)]|%{$s=$s*26+$_-64};$s
答案 14 :(得分:6)
Scala,30个字符
print((0/:args(0))(_*26+_-64))"
示例:
C:\>scala -e "print((0/:args(0))(_*26+_-64))" AD
30
答案 15 :(得分:5)
尼斯。很久以前,我用更多的解释写了我自己的版本 http://aboutdev.wordpress.com/2009/12/19/excelcification-brain-teaser-code/。虽然它不是一个优化的版本!
FYI。基础26算术称为hexavigesimal,Excel的最大列为 XFD ,转换为16383(使用0作为第一个单元格),这是恰巧 2 ^ 14个细胞。
任何人都可以猜到为什么它是2 ^ 14 ??
答案 16 :(得分:5)
(defun x(s)(reduce(lambda(x y)(+(* 26 x)y))(map 'vector(lambda(b)(-(char-code b)(char-code #\A)-1))s)))
答案 17 :(得分:5)
s;main(c){while(c=getchar()+1)s=26*s+c-65;printf("%d",s);}
输入(stdin)必须只包含A-Z,不允许其他字符(包括换行符)。
答案 18 :(得分:5)
与Perl,Ruby和APL相比没有任何竞争,但到目前为止对其他C#/ Java答案的改进。
这使用Horner's rule。
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);}}
答案 19 :(得分:4)
Clojure的:
user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "AD"))
30
user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "ROFL"))
326676
51个字符,加上输入字符串中的字符数。
答案 20 :(得分:4)
Python - 63个字符
&GT;&GT;&GT; f = lambda z:reduce(lambda x,y:26 * x + y,[ord(c)-64 for c in z])
&GT;&GT;&GT; F( 'ROFL')
326676
答案 21 :(得分:4)
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))
答案 22 :(得分:4)
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);
}
}
答案 23 :(得分:4)
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
答案 24 :(得分:4)
C:
int r=0;
while(*c)r=r*26+*c++-64;
字符串存储在'c'中,值在'r'。
答案 25 :(得分:4)
map$\=26*$\-64+ord,pop=~/./g;print
感谢mobrule提出的一些建议。
答案 26 :(得分:3)
Common Lisp,81个字符
(defun y(s)(reduce(lambda(x y)(+(* 26 x)(-(char-code y)64)))s :initial-value 0))
有趣的是,作为一个新用户,我可以发布自己的答案,但不会评论别人的答案。哦,如果我做错了,请道歉!
答案 27 :(得分:3)
p('A'..$*[0]).count
用法:
$ ruby a.rb ABC
731
答案 28 :(得分:3)
在VBA中我把它降到了98
Sub G(s)
Dim i, t
For i = 0 To Len(s) - 1
t = t + ((Asc(Left(Right(s, i + 1), 1)) - 64)) * ((26 ^ i))
Next
MsgBox t
End Sub
答案 29 :(得分:3)
$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
答案 30 :(得分:3)
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);}}
答案 31 :(得分:3)
polyval(input('')-64,26)
用法:
>> polyval(input('')-64,26)
(after pressing enter) 'WTF'
ans =
16074
注意:如果您在x
预先存储字符串,则可以将其缩小为 16 字符,但我认为这是作弊:
>> x = 'WTF'
x =
WTF
>> polyval(x-64,26)
ans =
16074
答案 32 :(得分:2)
Applescript:188
这是188个字符中的必备苹果,这是一种非冗长的语言。它也恰好是目前为止所有语言中最长的答案。如果有人知道如何缩短它,请分享。
on run s set {o, c} to {0, 0} repeat with i in reverse of (s's item 1)'s characters set m to 26 ^ c as integer set c to c + 1 set o to o + ((ASCII number of i) - 64) * m end repeat end run
用法:
osascript /path/to/script.scpt ROFL
答案 33 :(得分:2)
PHP: 56 55个字符
for($i='a';$i++!=strtolower($argv[1]);@$c++){}echo++$c;
PHP: 44 仅限大写字母的43个字符
for($i='A';$i++!=$argv[1];@$c++){}echo++$c;
答案 34 :(得分:2)
for($a=A;++$c,$a++!=$argv[1];);echo$c;
用法,例如
php -r 'for($a=A;++$c,$a++!=$argv[1];);echo$c;' WTF
答案 35 :(得分:2)
将所需的字符串存储在变量w:
中w←'rofl'
假设字符是小写的:
26⊥⎕a⍳w
假设字符是大写的:
26⊥⎕A⍳w
混合案例或不确定案例(14个字符,但可能会有所改进):
26⊥⊃⌊/⎕a⎕A⍳¨⊂w
答案 36 :(得分:2)
wazoox:
echo -n WTF | perl -ple'$ =()= A .. $ '
这会打印一个新行,因此答案在shell上更具可读性。
答案 37 :(得分:2)
Smalltalk arguments first reverse inject:0into:[:o :e|o*26+e digitValue]
答案 38 :(得分:2)
chomp($n=<>);@c=split(//,uc($n));$o=64;$b=0;$l=$#c;for($i=$l;$i>=0;$i--){$b+=((26**($l-$i))*(ord($c[$i])-$o));}print$b;
用法:
vivin@serenity ~/Projects/code/perl/excelc
$ echo WTF | perl e.pl
16074
vivin@serenity ~/Projects/code/perl/excelc
$ echo ROFL | perl e.pl
326676
我确信这里的一些Perl大师可以想出更小的东西。
答案 39 :(得分:2)
x=0 for c in(...):gfind(".")do x=x*26-64+c:byte()end print(x)
答案 40 :(得分:2)
with(prompt())for(l=length,i=0,v=i--;++i<l;)v+=(charCodeAt(l-1-i)-64)*Math.pow(26,i);alert(v)
答案 41 :(得分:2)
chop($l=<>);$_=A;$.++,$_++while$_ ne$l;die$.,$/
答案 42 :(得分:1)
<强> PHP:强>
<?$t=0;$s=str_split($argv[1]);$z=count($s);foreach($s as$v){$z--;$t+=(ord($v)-64)*pow(26,$z);}echo$t?>
用法: php filename.php ROFL
输出 326676
答案 43 :(得分:1)
p ("A"..$*[0]).to_a.size
答案 44 :(得分:1)
范围( “WTF”)。柱
答案 45 :(得分:1)
26_sv -64+_ic
用法:
26_sv -64+_ic"ROFL"
326676
说明:
答案 46 :(得分:1)
F#(37个字符):
Seq.fold (fun n c -> int c-64+26*n) 0
答案 47 :(得分:1)
过滤:97个字符
{ read c;i=0;while [ $c ];do eval s=({A..${c:0:1}});i=$((i*26+${#s[@]}));c=${c:1};done;echo $i;}
用法:
echo ROFL | { read c;i=0;while [ $c ];do eval s=({A..${c:0:1}});i=$((i*26+${#s[@]}));c=${c:1};done;echo $i;}
326676
功能:98个字符
C(){ i=0;while [ $1 ];do eval s=({A..${1:0:1}});i=$((i*26+${#s[@]}));set -- ${1:1};done;echo $i;}
用法:
C ROFL
326676
过滤器版本的解释:
read c;i=0;
初始化列和总数。
while [ $c ];do
虽然还有列字符
eval s=({A..${c:0:1}});
${c:0:1}
返回列的第一个字符; s=({A..Z})
生成一个包含A到Z
i=$((i*26+${#s[@]}));
$((...))
包含算术评估; ${#s[@]}
是数组$ s
c=${c:1};done;
${c:1}
是第一个后面的$ c中的字符。 done
结束了while循环
echo $i
我忘记了
更好但可疑
删除5个字符“echo”将导致输入“ROFL”为
326676: command not found
如果您确定在当前shell中没有设置该变量,则可能不需要i=0
。
答案 48 :(得分:1)
OOBasic:178个字符,不包括缩进的空格
此版本通过了所有测试用例。我怀疑如果它没有“利用”使用这个编号系统的电子表格的事实,它会更成功地打高尔夫球。请参阅下面原始版本的注释,了解为何没有特别有用的信息。我并没有非常努力地降低分数。
另请注意,这仅在从OO计算电子表格中作为宏运行时才有效,原因很明显。
Function C(st as String) as Long
C = 0
while len(st)
C = C*26 + ThisComponent.Sheets(0).getCellRangeByName(left(st,1) &"1").CellAddress.Column+1
st = mid(st,2)
wend
End Function
OOBasic(OpenOffice Basic),字符太多(124):
Function C(co As String) As Long
C = ThisComponent.Sheets(0).getCellRangeByName(co &"1").CellAddress.Column+1
End Function
限制:
注意:
无论如何,在单元格中输入=C("A")
,=C("ABC")
等,对前四个测试用例起作用;最后两个给出错误。
答案 49 :(得分:1)
Josl,48个字符
main 0 0 argv each 64 - swap 26 * + next print
示例:
$ josl numequiv.j A
1
$ josl numequiv.j ABC
731
$ josl numequiv.j ROFL
326676
从标准输入读取:
main 0 STDIN read-line each 64 - swap 26 * + next print
答案 50 :(得分:1)
使用列表推导:
s=input()
print sum([((26**(len(s)-i-1))*(ord(s[i])-64)) for i in range(len(s))])
答案 51 :(得分:1)
php 29 chars:
while($i++!=$t)$c++;echo$c+1;
答案 52 :(得分:1)
序言:49个字符
c([],A,A). c([H|T],I,R):-J is H-64+I*26,c(T,J,R).
使用上面的代码:
| ?- c("WTF",0,R). R = 16074 ? yes | ?- c("ROFL",0,R). R = 326676 ? yes
答案 53 :(得分:1)
因素:47个字符
反转[26 swap ^ swap 64 - *] map-index sum
答案 54 :(得分:1)
Matlab 38个字符
仅适用于大写字母。不确定它是否也必须使用小写(例子中没有)。
x=input('')'-64;26.^(size(x)-1:-1:0)*x
如果新行不计算37(省略分号):
x=input('')'-64
26.^(size(x)-1:-1:0)*x
我看到Matlab击败了很多语言。谁会想到这一点。
示例:
Input: 'ROFL' (dont forget the '' )
Output: ans = 326676
答案 55 :(得分:1)
的Python
import string
letters = string.uppercase
colnum = lambda s: sum((letters.index(let)+1)*26**idx for idx, let in enumerate(s[::-1]))
print colnum('WTF')
# 16074
print colnum('ROFL')
# 326676
答案 56 :(得分:1)
public class A{public static void main(String[] z){int o=0,c=0;for(int i=z[0].length()-1;i>=0;i--,c++)o+=(z[0].charAt(i)-64)*Math.pow(26,c);System.out.println(o);}}
public class A
{
public static void main(String[] z)
{
int m,o=0,c=0;
for(int i=z[0].length()-1;i>=0;i--,c++)
{
m=(int)Math.pow(26,c);
o+=(z[0].charAt(i)-64)*m;
}
System.out.println(o);
}
}
假设输入大写(通过命令行参数)。没有技巧的明显方法。
答案 57 :(得分:1)
reduce(lambda a,b:a*26+ord(b)-64,raw_input(),0)
仅适用于大写字母
答案 58 :(得分:1)
(相反)
dc
无法处理字符输入,所以我编码相反:输入列号并输出列名:
?[26~64+rd0<LP]dsLxP
dc exccol.dc 326676 ROFL
答案 59 :(得分:1)
我的Javascript解决方案只是 82个字符,并使用Integer.parseInt和Radix 36.如果有人可以将此配置到此线程的Javascript部分,那就没问题! : - )
a=function(b){t=0;b.split('').map(function(n){t=parseInt(n,36)-9+t*26});return t};
答案 60 :(得分:0)
Groovy:51个字符
char[] a=args[0];t=0;for(i in a)t=26*t+i-64;print t
调用
groovy *scriptname* ROFL
或
groovy -e "char[] a=args[0];t=0;for(i in a)t=26*t+i-64;print t" ROFL
这与Java基本相同。我想象使用范围和闭包的一些可能性,但是这个例子没有想到任何东西。还有其他人看到缩短这个的方法吗?
不幸的是,带有封口的更加时髦的版本有点长。
t=0;args[0].toCharArray().each{t=t*26+it-64};print t
答案 61 :(得分:0)
Go:106个字符
这不是所有语言中最短的。但它可以是C,C ++,Java和C#中最短的。
package main
import("os"
"fmt")
func main(){t:=0
for _,c := range os.Args[1]{t=t*26+c-64}
fmt.Println(t)}
格式化版本:
package main
import (
"os"
"fmt"
)
func main() {
t := 0
for _, c := range os.Args[1] {
t = t*26 + c - 64
}
fmt.Println(t)
}
答案 62 :(得分:0)
让e2n(c:string)= c |&gt; Seq.map(有趣的x - &gt;(int)x - 64)|&gt; Seq.reduce(fun e a - &gt; a * 26 + e)
答案 63 :(得分:0)
Elang,53/78
Shell,53个字符:
F=fun(S)->lists:foldl(fun(C,A)->A*26+C-64end,0,S)end.
模块,78个字符:
-module(g).
-export([f/1]).
f(S)->lists:foldl(fun(C,A)->A*26+C-64end,0,S).
答案 64 :(得分:0)
我在真正的高尔夫球场也失败了。
Private Sub CB1_Click()
Dim C, S
Range("A1").Select
Do
S = Len(ActiveCell)
x = 0
C = 0
Do
C = (Asc(Mid(ActiveCell, (S - x), 1)) - 64) * (26 ^ x) + C
x = x + 1
Loop Until x = S
ActiveCell.Offset(0, 1) = C
ActiveCell.Offset(1, 0).Activate
Loop Until ActiveCell = ""
End Sub
使用A列输入,输出到B列,运行VB命令按钮单击。 = d
答案 65 :(得分:-1)
Excel - 99个字符
输入数组公式 - 我不计算Excel添加{}
=SUM((CODE(MID(A1,ROW(INDIRECT("1:" & LEN(A1))),1))-64)*26^(LEN(A1)-ROW(INDIRECT("1:" & LEN(A1)))))
答案 66 :(得分:-4)
新语言怎么样? 运算符定义为
# - 将EXCEL的= COLUMN()作为字符串编号返回
, - 读取字符串
。 - 写出一个字符串
然后执行该操作的程序是
下,#强>