Code Golf: числовой эквивалент имени столбца Excel
Задача
Самый короткий код по количеству символов, который выведет числовой эквивалент строки столбца Excel.
Например, столбец A
равен 1, B
равно 2, так далее и т.д. Как только вы нажмете Z
, следующий столбец станет AA
, затем AB
и т.д.
Тестовые примеры:
A: 1
B: 2
AD: 30
ABC: 731
WTF: 16074
ROFL: 326676
Количество кодов включает ввод/вывод (т.е. полную программу).
Ответы
Ответ 1
Perl, 36 34 33 31 30 17 15 11 символов
$_=()=A..$_
Использование:
$ echo -n WTF | perl -ple '$_=()=A..$_'
16074
Уменьшено до 17 с помощью echo -n, чтобы избежать вызова chop
.
Уменьшено до 15, используя вместо него текст вместо.
Уменьшено до 11 с помощью -p вместо того, чтобы сказать.
Объяснение:
A
оценивается в контексте строки, а A..$_
строит список, начинающийся с "A", и приращение строки до входной строки. Perl интерпретирует оператор ++
(и, следовательно, ..
) для строк в алфавитном контексте, поэтому, например, $_="AZ";$_++;print
выводит BA
.
=()=
(aka "goatse" operator) заставляет выражение оцениваться в контексте списка и возвращает количество элементов, возвращаемых это выражение, т.е. $scalar = () = <expr>
соответствует @list = <expr>; $scalar = @list
.
Ответ 2
Excel, 9 символов:)
Используйте правильный инструмент для задания:
=COLUMN()
![=COLUMN()]()
Ответ 3
J, 17 12 10 символов
26#.64-~av
Пример:
26#.64-~av 'WTF'
16074
Пояснение:
- J анализирует справа налево.
-
av
возвращает список индексов ascii каждого из символов в своем аргументе, поэтому, например, av'ABC'
возвращает 65 66 67
.
- Затем мы вычитаем 64 из каждого элемента этого списка с помощью глагола
64-~
.
- Затем мы преобразуем список в базу 26 с помощью глагола
#.
.
Ответ 4
Brainf * ck, 81 символ (без пробелов)
,[>>>[->>+++++[-<+++++>]<+<]>[-<+>]<<++++++++[<++++++++>-]<[<->-]<[>>>+<<<-],]>>>
Описание
,[ // get character input into p[0], enter loop if it isn't null (0)
>>>[->>+++++[-<+++++>]<+<] // take what 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 alphabetical index
[>>>+<<<-] // add p[0] to p[3]
,] // get another character and repeat
>>> // move to p[3], where our final result is stored
Итак, вы заметите, что я фактически не преобразовал числовое значение в строку ascii для печати. Это, вероятно, испортит веселье. Но я сделал предложение переместить указатель на ячейку с результатом, так что, по крайней мере, это полезно для машины.
Эй, что ты знаешь, я победил С#!
Ответ 5
Ruby 1.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
Ответ 6
АПЗ
13 символов
Поместите значение в x
:
x←'WTF'
затем вычислить его с помощью:
26⊥(⎕aV⍳x)-65
Единственная причина, по которой я бил меня, - это скобки. Я думаю, что должен быть какой-то способ перестроить его, чтобы избежать необходимости в них, но это был долгий день. Идеи?
(Хе-хе, вы, программисты perl, с вашими решениями с более чем 30 символами, так мило!)
Ответ 7
Excel (не обман), 25 символов
Поддерживает до XFD:
=COLUMN(INDIRECT(A1&"1"))
Установка:
- Поместите формулу в ячейку A2.
Использование:
- Введите строку столбца в ячейке A1.
- Прочитайте результат в ячейке 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) как можно дальше.
Использование:
- Введите строку столбца в ячейке A1.
- Прочитайте результат в ячейке A2.
Ответ 8
С# 156 146 118 Chars
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);
}
}
Ответ 9
Golfscript - 16 символов
[0]\+{31&\26*+}*
$ echo -n WTF | ./golfscript.rb excel.gs
16074
$ echo -n ROFL | ./golfscript.rb excel.gs
326676
Ответ 10
Haskell, 50 51 56 chars
main=interact$show.foldl(\x->(26*x-64+).fromEnum)0
Использование:
~:166$ echo -n "ROFL" | ./a.out
326676
~:167$ echo -n "WTF" | ./a.out
16074
Ответ 11
Python, 64 49 символов
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
k4 (kdb +), 11 символов
26/:1+.Q.A?
Пояснение:
- k4 анализирует слева направо
-
.Q.A
определяется в пределах k4 - это вектор "ABC...XYZ"
-
?
- это оператор find - индекс первого соответствия для элементов в y arg внутри x arg
- +1 для смещения индекса
-
26/:
для преобразования в базу 26
Одно предостережение - это будет работать только там, где перечислены перечисленные типы:
26/:1+.Q.A? "AD"
30
26/:1+.Q.A? "WTF"
16074
а
26/:1+.Q.A? ,"A"
1
Ответ 13
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
Ответ 14
Powershell, 42 символа
[char[]]$args[($s=0)]|%{$s=$s*26+$_-64};$s
Ответ 15
Scala, 30 символов
print((0/:args(0))(_*26+_-64))"
Пример:
C:\>scala -e "print((0/:args(0))(_*26+_-64))" AD
30
Ответ 16
C89, 58 символов
s;main(c){while(c=getchar()+1)s=26*s+c-65;printf("%d",s);}
Ввод (stdin) должен содержать только A-Z, другие символы (включая новые строки) не допускаются.
Ответ 17
Объяснение понятий - Excelcification
Ницца. Я написал свою собственную версию этого еще немного объяснения давно
http://aboutdev.wordpress.com/2009/12/19/excelcification-brain-teaser-code/. Хотя это не совсем оптимизированная версия!
FYI. Арифметика base 26 называется hexavigesimal и максимальная колонка Excel XFD, которая преобразуется в 16383 (используя 0 в качестве первой ячейки), которая по совпадению совпадает именно с 2 ^ 14 ячеек.
Кто-нибудь может предположить, почему это 2 ^ 14??
Ответ 18
Общие 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)))
Ответ 19
С#, 117 111 символов
Нет соревнований по сравнению с такими, как Perl, Ruby и APL, но улучшенными для других ответов на С#/Java, которые были предоставлены до сих пор.
Здесь используется правило Horner.
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);}}
Ответ 20
Perl, 34 символа
map$\=26*$\-64+ord,pop=~/./g;print
Благодаря mobrule для нескольких предложений.
Ответ 21
Ruby 1.9, 21 символ
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
Ответ 22
С#, 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);
}
}
Ответ 23
Python - 63 символа
> f = lambda z: reduce (lambda x, y: 26 * x + y, [ord (c) -64 для c в z])
→ > F ( 'ROFL')
326676
Ответ 24
Общие Lisp, 86 символов.
(defun z(s)(let((a 0))(map nil(lambda(v)(setf a(+(* 26 a)(digit-char-p v 36)-9)))s)a))
Ответ 25
Clojure:
user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "AD"))
30
user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "ROFL"))
326676
51 символ, а также количество символов во входной строке.
Ответ 26
С
int r=0;
while(*c)r=r*26+*c++-64;
Строка сохраняется в 'c', значение находится в 'r'.
Ответ 27
в 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
Ответ 28
Ruby, 20 символов
p('A'..$*[0]).count
Использование:
$ ruby a.rb ABC
731
Ответ 29
PHP - 73 Chars
$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
Java: 112 124 символы
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);}}