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"))

Установка:

  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) как можно дальше.

Использование:

  1. Введите строку столбца в ячейке A1.
  2. Прочитайте результат в ячейке 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);}}