Code Golf: числовой эквивалент имени столбца Excel

Соревнование

Самый короткий код по количеству символов, который выводит числовой эквивалент строки столбца Excel.

Например, столбец A равен 1, B равен 2 и т. Д. Как только вы нажмете Z, следующий столбец станет AA, затем AB и так далее.

Тестовые примеры:

A:    1
B:    2
AD:   30
ABC:  731
WTF:  16074
ROFL: 326676

Количество кодов включает ввод / вывод (т.е. полная программа).


person Community    schedule 14.04.2010    source источник
comment
Кодировать гольф бессмысленно, APL всегда побеждает в конце.   -  person BlueRaja - Danny Pflughoeft    schedule 14.04.2010
comment
Когда вы публикуете решение, убедитесь, что оно работает во всех описанных выше случаях (ввод / вывод при запуске - это хорошо), и обратите внимание, где это не так. Спасибо.   -  person    schedule 16.04.2010
comment
Какого черта это помечено розеттским камнем ?!   -  person Josh Stodola    schedule 16.04.2010
comment
J - это APL без греческого языка. J всегда будет побеждать, никто больше не говорит APL.   -  person Callum Rogers    schedule 17.04.2010
comment
@BlueRaja: Интересно, что APL все еще выигрывает эти вещи в 2010 году, спустя почти 40 лет после того, как она ушла из мейнстрима.   -  person Kragen Javier Sitaker    schedule 17.04.2010
comment
@Kragen: Это потому, что это самый смехотворно сжатый язык на свете; это нехорошо.   -  person BlueRaja - Danny Pflughoeft    schedule 17.04.2010
comment
@BlueRaja: ну, я не программирую на нем, и похоже, что мейнстрим согласен с вами (и Дейкстрой). Тем не менее, меня соблазняет идея Нотации как инструмента мысли ...   -  person Kragen Javier Sitaker    schedule 24.04.2010


Ответы (67)


Perl, 36 34 33 31 30 17 15 11 символов

$_=()=A..$_

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

$ echo -n WTF | perl -ple '$_=()=A..$_'
16074

Уменьшено до 17 с помощью команды echo -n, чтобы избежать вызова chop.

Уменьшено до 15 за счет использования say вместо print.

Уменьшено до 11 за счет использования -p вместо say.

Объяснение: A оценивается в строковом контексте, а A..$_ строит список, начинающийся с «A» и увеличивающийся до входной строки. Perl интерпретирует оператор ++ (и, следовательно, ..) для строк в алфавитном контексте, поэтому, например, $_="AZ";$_++;print выводит BA.

=()= (он же оператор "goatse") заставляет выражение оцениваться в контексте списка и возвращает количество элементов, возвращаемых этим выражением, т. е. $scalar = () = <expr> соответствует @list = <expr>; $scalar = @list.

person Community    schedule 14.04.2010
comment
Используйте $_ или $` instead of $ n` и вызывайте print без аргументов. - person mob; 14.04.2010
comment
@mobrule: Спасибо! Это отбрасывает персонажа. - person David; 14.04.2010
comment
используйте -p и полностью отбросьте печать: echo -n WTF | perl -p -e '$ _ = () = A .. $ _' Общий код: 11 символов, AH AH! - person wazoox; 16.04.2010
comment
переключите print на say и опустите еще 2 символа :) - person mpeters; 16.04.2010
comment
@wazoox, у меня это не работает - зависает, так как на входе нет \ n. - person David; 16.04.2010
comment
Ах, я люблю козла-оператора :) - person Ether; 16.04.2010
comment
Так оно и есть ... теперь Perl - победитель (пока) :) - person Vivin Paliath; 17.04.2010
comment
Вы можете сбросить -n, если используете здесь -l. - person jfs; 17.04.2010
comment
Знаете, даже в духе соревнования, когда команда для вызова вашего кода длиннее, чем сам код, я не думаю, что это имеет значение :-p - person Justin; 19.04.2010
comment
Да, я все же считаю решение J более элегантным. :) - person David; 25.04.2010
comment
Существует лишь ограниченное количество программ на языке Perl, состоящих из 11 символов, которые будут компилироваться ... заставляет меня задаться вопросом, что делают другие. - person Dan; 17.05.2010
comment
Мне кажется, что это 40 символов. - person AMissico; 09.06.2010

Excel, 9 символов :)

Используйте подходящий инструмент для работы:

=COLUMN()

= КОЛОНКА ()

person Community    schedule 14.04.2010
comment
Используйте правильный язык для работы: португальский Excel =COL(). 6 символов. (См. dolf.trieschnigg.nl/excel/excel.html) - person Debilski; 14.04.2010
comment
Здорово! только он не поддерживает ROFL. - person YOU; 14.04.2010
comment
Я разрываюсь между принятием этого и решением Ruby (которое является самым коротким). Excel на самом деле не язык, но все же это довольно умно :). Сообщество SO - как вы думаете? - person Vivin Paliath; 14.04.2010
comment
Я думаю, вам следует принять мое решение из 12 символов J, но я могу быть предвзятым. :) - person David; 15.04.2010
comment
Это решение даже правильно воспроизводит ограничения Excel. - person kibibu; 15.04.2010
comment
Я решил пойти с этим, хотя это не настоящий язык программирования. В основном из-за того, насколько он умный :) - person Vivin Paliath; 15.04.2010
comment
@Vivin: Excel, конечно, настоящий язык программирования. gamasutra.com/view/feature/3563/ - person kennytm; 16.04.2010
comment
Он даже не принимает строку в качестве ввода. Не подходит к тому, о чем говорила проблема. Он работает только в том случае, если он находится в столбце, который назван в честь рассматриваемой строки. Совершенно не в духе вопроса. - person phkahler; 16.04.2010
comment
Честно говоря, Code Golf создан для таких умных ответов. Итак, вы получаете от меня +1. - person Reynolds; 16.04.2010

J, 17 12 10 символов

26#.64-~av

Пример:

26#.64-~av  'WTF'
16074

Объяснение:

  • J анализирует справа налево.
  • av возвращает список индексов ascii каждого из символов в своем аргументе, поэтому, например, av'ABC' возвращает 65 66 67.
  • Затем мы вычитаем 64 из каждого элемента этого списка с помощью глагола 64-~.
  • Затем мы преобразуем список в базу 26 с помощью глагола #..
person Community    schedule 14.04.2010
comment
Прочитав несколько комментариев о том, что решение Excel действительно не принимает строковый ввод, я собираюсь выбрать решение, которое является самым коротким и фактически принимает строковый ввод. - person Vivin Paliath; 16.04.2010
comment
Ничего себе решение J, которое я действительно могу понять :) - person Callum Rogers; 17.04.2010
comment
@Brandon: J создан для всего, если вы не против потратить годы на то, чтобы научиться его читать. - person David; 17.04.2010

Brainf * ck, 81 символ (без пробелов)

,[>>>[->>+++++[-<+++++>]<+<]>[-<+>]<<++++++++[<++++++++>-]<[<->-]<[>>>+<<<-],]>>>

Объяснение

,[  // 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 #!

person Community    schedule 14.04.2010
comment
Я удивлен, что кто-то на самом деле использует Bf в первую очередь - person OscarRyz; 16.04.2010

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
person Community    schedule 14.04.2010
comment
Отлично, я уже тестировал очень похожий шаблон, но я не понимал, что p ( и p( разные, :( - person YOU; 14.04.2010
comment
используйте echo -n ..., чтобы можно было сбросить .chop - person John La Rooy; 14.04.2010
comment
@gnibbler: Спасибо за идею -n, благодаря которой мое решение perl также снизилось до 17. - person David; 15.04.2010
comment
Вы можете получить это до 16, используя? A вместо A - person steenslag; 21.04.2010

APL

13 персонажей

Поместите значение в x:

x←'WTF'

затем вычислите его с помощью:

26⊥(⎕aV⍳x)-65

Единственная причина, по которой Джей победил меня, - это круглые скобки. Я думаю, должен быть способ переставить его, чтобы они не понадобились, но это был долгий день. Идеи?

(Хех, вы, программисты на Perl, со своими 30+ символами, такие милые!)

person Community    schedule 15.04.2010
comment
Может, 26⊥⁻65 + ⎕aV⍳x? Вот так в APL пишется минус 65, не так ли? - person Kragen Javier Sitaker; 17.04.2010
comment
У меня сейчас нет моей среды APL, но я думаю, что пробовал что-то в этом роде, и это не сработало. Сверху в голове (и, по общему признанию, я дальше всех от мастера APL!) ⁻ Эквивалентно - и, поскольку он оценивает справа налево, он применяется после +, так что в итоге вы получаете 26 ( 65+ (⎕aV⍳x)) вместо 26⊥ ((⁻65) + ⎕aV⍳x), что вам и нужно здесь. - person Ken; 19.04.2010
comment
Принятое решение Perl превосходит ваш код на два символа ... =) - person kolistivra; 02.05.2010

Excel (не обман), 25 символов

Поддерживает до XFD:

=COLUMN(INDIRECT(A1&"1"))

Установка:

  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)

Установка:

  1. Очистить всю таблицу.
  2. Поместите формулу (A2) в ячейку A2.
  3. Поместите формулу (B2) в ячейку B2.
  4. Заполните формулу (B2) как можно глубже.

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

  1. Введите строку столбца в ячейку A1.
  2. Прочтите результат в ячейке A2.
person Community    schedule 16.04.2010

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);}}

Без гольфа:

using System.Linq;
class P
{
    static void Main(string[] a)
    {
        System.Console.Write(a[0]
            .Aggregate(0, (t, c) => (t + c - 64) * 26) / 26);
    }
}
person Community    schedule 14.04.2010
comment
Использование ярлыка using C = System.Console здесь не поможет, потому что в конечном итоге вам придется сказать System. дважды. Вы можете сэкономить 5 символов, если просто используете System; и соответствующим образом измените свой код. Но моя версия, отличная от linq, все же короче. :) - person Igby Largeman; 14.04.2010
comment
Вы правы, и я могу сделать его еще короче, используя первый аргумент вместо Console.Readline, сделав его еще короче. :П - person Cameron MacFarland; 15.04.2010
comment
о, дерьмо, я помог тебе опередить меня! :П - person Igby Largeman; 15.04.2010
comment
Кстати, спасибо, что исправили мой счетчик символов. Я полностью на это рассчитывал. - person Igby Largeman; 15.04.2010
comment
Как насчет Console.Write вместо WriteLine? - person Andreas Grech; 16.04.2010
comment
Вы можете избежать использования Math.Pow () с помощью правила Хорнера (см. Мой ответ) - person Daniel Renshaw; 16.04.2010
comment
Вероятно, вы можете сократить количество символов, вызвав Aggregate () как обычный метод, который в конечном итоге приведет к удалению ключевого слова using. - person erikkallen; 17.04.2010
comment
@erikkallen - Пробовал, это на несколько символов длиннее. используя ‹Enumerable - person Cameron MacFarland; 17.04.2010
comment
Думаю, вы можете написать только саму функцию, без использования, классов и т. Д. - person Kamarey; 27.04.2010

Golfscript - 16 символов

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


$ echo -n WTF | ./golfscript.rb excel.gs
16074
$ echo -n ROFL | ./golfscript.rb excel.gs
326676
person Community    schedule 14.04.2010

Haskell, 50 51 56 символов

main=interact$show.foldl(\x->(26*x-64+).fromEnum)0

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

~:166$ echo -n "ROFL" | ./a.out
326676
~:167$ echo -n "WTF" | ./a.out
16074
person Community    schedule 14.04.2010

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
person Community    schedule 14.04.2010
comment
ваш номер 2 должен называться f. Попробуйте запустить его сейчас, не работает. И его можно сделать короче (47 символов) с помощью лямбда-выражений и вычисления короткого замыкания: f=lambda x:len(x)and 26*f(x[:-1])+ord(x[-1])-64 - person Ponkadoodle; 17.04.2010
comment
@wallacoloo: Спасибо. Это вики сообщества, так что вы можете в любое время вносить правки. - person Adam Rosenfield; 17.04.2010
comment
как насчет того, чтобы отбросить len (x) только на x? становится 43 символа: f = лямбда x: x и 26 * f (x [: - 1]) + ord (x [-1]) - 64 - person Nas Banov; 15.05.2010

k4 (kdb +), 11 символов

26/:1+.Q.A?

Объяснение:

  • k4 анализирует слева направо
  • .Q.A определяется в k4 - это вектор "ABC...XYZ"
  • ? - это оператор поиска - индекс первого совпадения для элементов в аргументе y в аргументе x
  • +1 для смещения индекса
  • 26/: преобразовать в базу 26

Одно предостережение - это будет работать только в том случае, если переданы перечисленные типы:

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

  26/:1+.Q.A? "WTF"
16074

но:

  26/:1+.Q.A? ,"A"
1
person Community    schedule 16.04.2010

Powershell, 42 символа

[char[]]$args[($s=0)]|%{$s=$s*26+$_-64};$s
person Community    schedule 14.04.2010

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
person Community    schedule 14.04.2010
comment
Я вырезал еще 4 символа из решения 1.6, используя закрытие выражений. Возможно, вы сможете уменьшить его еще немного, отредактировав часть (t?g*26:0). - person David Murdoch; 16.04.2010
comment
ОБНОВИТЬ. Я только что сбрил еще 9 символов с помощью [] .reduce - person David Murdoch; 16.04.2010
comment
FWIW, я добавил реализацию с использованием string#replace - person Chetan S; 16.04.2010
comment
@ Четан, @ Дэвид: Хорошая работа. Это здорово! - person Daniel Vassallo; 16.04.2010

Scala, 30 символов

print((0/:args(0))(_*26+_-64))" 

Пример:

C:\>scala -e "print((0/:args(0))(_*26+_-64))" AD
30
person Community    schedule 16.04.2010

C89, 58 знаков

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

Ввод (stdin) должен содержать только A-Z, другие символы (включая символы новой строки) не допускаются.

person Community    schedule 14.04.2010
comment
getchar() возвращает < 0 в EOF; EOF не определяется как -1, но это обычное дело. - person strager; 14.04.2010
comment
@strager: Хорошее замечание. Тогда для обеспечения полной переносимости потребуется добавить 2 символа (изменив c=getchar()+1 на (c=getchar())>=0 и 65 на 64). Но это должно работать практически в любой реализации C. - person Adam Rosenfield; 14.04.2010

Разъяснение понятий - Excelcification

Хороший. Я написал свою собственную версию этого с небольшими пояснениями давным-давно по адресу http://aboutdev.wordpress.com/2009/12/19/excelcification-brain-teaser-code/. Хотя это не совсем оптимизированная версия!

К вашему сведению. Арифметика с основанием 26 называется шестнадцатеричной системой < / a>, а максимальный столбец Excel - XFD, который преобразуется в 16383 (с использованием 0 в качестве первой ячейки), что по совпадению представляет собой ровно 2 ^ 14 ячеек.

Кто-нибудь может догадаться, почему это 2 ^ 14 ??

person Community    schedule 14.04.2010
comment
Может быть, тогда они захотят использовать только 64k памяти :-) - person YOU; 14.04.2010
comment
Потому что они хотели иметь возможность делать смещения (x-y), для которых требуется знаковый бит. Но это всего лишь 15 бит, так что с 16-м битом? Используется как флаг? - person phkahler; 16.04.2010
comment
Это не точно base-26, потому что у него нет 0. Если мы позволим A представлять 1 и умножим на 26^n для позиции nn = 0 для самой правой буквы), все будет работать как обычно. . - person Thomas; 16.04.2010
comment
@phkahler: с 1 битом вы можете представить все беззнаковые целые числа в диапазоне 0..2 ^ 0. Таким образом, с 16 битами вы можете представить 0..2 ^ 15. Уберите 1 бит для знака, максимальное значение будет 2 ^ 14-1 (= 16383). - person stakx - no longer contributing; 16.04.2010
comment
@phkahler: вам не нужен знаковый бит для представления смещений, если вам не нужно особенное представление для значений, выходящих за пределы (т.е. вы можете проверить бит переполнения процессора, чтобы увидеть, выходите ли вы за пределы ). - person Kragen Javier Sitaker; 17.04.2010
comment
@stakx: Хороший трюк ... Но 1 бит может представлять 0..2 ^ ** 1 ** - 1. 16 бит - это 0..2 ^ ** 16 ** - 1. Уберите 1 бит для знака, максимальное значение будет 2 ^ ** 15 ** - 1 (= 32767). Если вы мне не верите, попробуйте с 2 битами. 2 бита - это не 0..2 ^ 1 = 0..2. У вас есть 00, 01, 10, 11 = 0, 1, 2, 3 в base10 соответственно. - person Ponkadoodle; 17.04.2010
comment
@wallacoloo: Ой. Вы, конечно, правы; о чем я только думал! - person stakx - no longer contributing; 17.04.2010

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)))
person Community    schedule 15.04.2010

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);}}
person Community    schedule 16.04.2010
comment
Вы можете сэкономить 3 символа, удалив пробел между [] и 'a', а также фигурные скобки foreach. - person Cameron MacFarland; 16.04.2010
comment
Я не знал, что строка реализована в IEnumerable. Сладкий! К сожалению, страница о правлении Хорнера мне не по зубам, но это явно выигрышная стратегия. Однако мне не нравится использовать Console.Write () из-за беспорядочного вывода. +1 - person Igby Largeman; 10.05.2010

Perl, 34 символа

map$\=26*$\-64+ord,pop=~/./g;print

Спасибо mobrule за несколько предложений.

person Community    schedule 14.04.2010
comment
Вы можете сказать pop=~/./g вместо split//,$ARGV[0]. Вы можете опустить $_ в ord вызове. Вы можете использовать $` instead of $ s`, а затем просто сказать print. - person mob; 14.04.2010

C #, 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);}}

Без гольфа:

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);
    }
}
person Community    schedule 14.04.2010

Python - 63 символа

››› f = лямбда z: уменьшить (лямбда x, y: 26 * x + y, [ord (c) -64 для c в z])

››› f («РОФЛ»)

326676

person Community    schedule 16.04.2010

Clojure:

user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "AD"))
30
user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "ROFL"))
326676

51 символ плюс количество символов во входной строке.

person Community    schedule 16.04.2010

C:

int r=0;
while(*c)r=r*26+*c++-64;

Строка хранится в 'c', значение - в 'r'.

person Community    schedule 16.04.2010

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
person Community    schedule 14.04.2010
comment
Вы можете использовать отбивную вместо полосы, чтобы получить 1 символ - person JRL; 14.04.2010
comment
Спасибо @JRL, я неправильно использовал echo A |, должно быть echo A| - person YOU; 14.04.2010
comment
Используйте echo -n, как другие, и избавьтесь от chop. - person Daniel C. Sobral; 16.04.2010
comment
Спасибо, @Daniel, я обновил его, но похоже, что echo -n не работает в Windows. - person YOU; 17.04.2010

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))
person Community    schedule 16.04.2010

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);}}
person Community    schedule 16.04.2010

Common Lisp, 81 символ

(defun y(s)(reduce(lambda(x y)(+(* 26 x)(-(char-code y)64)))s :initial-value 0))

Забавно, что как новый пользователь я могу публиковать свой ответ, но не комментировать чужой. Ну что ж, извиняюсь, если я делаю это неправильно!

person Community    schedule 16.04.2010
comment
Думаю, вам придется зарегистрироваться :) Тогда вы сможете комментировать. - person Vivin Paliath; 17.04.2010

MATLAB: 24 символа

polyval(input('')-64,26)

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

>> polyval(input('')-64,26)
(after pressing enter) 'WTF'

ans =

       16074

Примечание. Вы можете уменьшить его до 16 символов, если предварительно сохраните строку в x, но я подумал, что это обман:

>> x = 'WTF'

x =

WTF

>> polyval(x-64,26)

ans =

       16074
person Community    schedule 17.04.2010
comment
Как я мог забыть о polyval .. +1 для лучшего решения - person George; 17.04.2010

PHP - 73 символа

$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
person Community    schedule 16.04.2010
comment
Вы можете потерять 10 символов, удалив фигурные скобки вокруг вашей функции while и сбросив инициализацию переменной. - person ChiperSoft; 16.04.2010

в 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
person Community    schedule 14.04.2010
comment
Конечно, отступ вам не нужен. - person ; 14.04.2010
comment
Вам не нужно объявлять подпрограмму как Public, и при этом вам не нужно говорить Next i (просто используйте Next). Кроме того, я думаю, что если вы зацикливаете с 1, а не с нуля, вы можете сбрить символ или два. - person Gary McGill; 16.04.2010
comment
@ Гэри, спасибо за советы, это мой первый раунд кодового гольфа, я уверен, что поправлюсь еще несколько раз - person Kevin Ross; 17.04.2010

Рубин, 20 символов

p('A'..$*[0]).count

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

$ ruby a.rb ABC
731
person Community    schedule 14.04.2010

Perl, 120 символов

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 могут придумать что-то гораздо меньшее.

person Community    schedule 14.04.2010

Perl, 47 символов (из стандартного ввода)

chop($l=<>);$_=A;$.++,$_++while$_ ne$l;die$.,$/
person Community    schedule 14.04.2010
comment
Отличный трюк! Вы можете объяснить, как вам это удалось? На самом деле это первый гольф-код, который я когда-либо пробовал, и я не знаком со всеми хитростями, которые вы можете делать на Perl. - person Vivin Paliath; 14.04.2010
comment
Он злоупотребляет магией, которую оператор ++ делает со строками - см. perldoc perlop и поищите немного дополнительной встроенной магии. Я напишу более подробное объяснение после того, как займусь каким-нибудь делом на работе. - person hobbs; 14.04.2010

JavaScript, 93 символа

with(prompt())for(l=length,i=0,v=i--;++i<l;)v+=(charCodeAt(l-1-i)-64)*Math.pow(26,i);alert(v)
person Community    schedule 14.04.2010
comment
+1 Это должно быть худшее злоупотребление заявлением with, которое я когда-либо видел. (-: - person Na7coldwater; 06.07.2010

Lua, 61 символ

x=0 for c in(...):gfind(".")do x=x*26-64+c:byte()end print(x)
person Community    schedule 14.04.2010

wazoox:

echo -n WTF | perl -ple '$ = () = A .. $'

Это напечатает новую строку, чтобы ответ был более читабельным в оболочке.

person Community    schedule 16.04.2010

Smalltalk, 72

Smalltalk arguments first reverse inject:0into:[:o :e|o*26+e digitValue]
person Community    schedule 16.04.2010
comment
На мгновение я подумал, что вы написали для этого реализацию Smalltalk-72, затем я понял, что 72 - это количество символов. - person Kragen Javier Sitaker; 17.04.2010

Яблочный текст: 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

person Community    schedule 16.04.2010

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;

person Community    schedule 16.04.2010

PHP, 38 символов

for($a=A;++$c,$a++!=$argv[1];);echo$c;

использование, например

php -r 'for($a=A;++$c,$a++!=$argv[1];);echo$c;' WTF
person Community    schedule 17.04.2010

APL: 7 символов

Сохраните желаемую строку в переменной w:

w←'rofl'

Предполагая, что символы в нижнем регистре:

26⊥⎕a⍳w

Предполагая, что символы в верхнем регистре:

26⊥⎕A⍳w

Смешанный регистр или неуверенный регистр (14 символов, но их можно улучшить):

26⊥⊃⌊/⎕a⎕A⍳¨⊂w
person Community    schedule 19.05.2012

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
person Community    schedule 14.04.2010
comment
Не знаю, как вы, но я считаю, что это намного проще для понимания, чем решение Perl, в котором почти вдвое больше символов. +1 за Python-любовь. - person BlueRaja - Danny Pflughoeft; 14.04.2010

Java, 164 символа

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);}}

Java, 177 символов

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);
}
}

Предполагает ввод в верхнем регистре (через аргумент командной строки). Очевидный подход без уловок.

person Community    schedule 14.04.2010

dc - 20 символов

(делает наоборот)

dc не может обрабатывать ввод символов, поэтому я закодировал обратное: введите номер столбца и выведите имя столбца:

?[26~64+rd0<LP]dsLxP
dc exccol.dc
326676
 ROFL
person Community    schedule 15.04.2010
comment
dc может обрабатывать ввод символов, просто установите базу примерно на 36 с помощью 36i. - person Adam Rosenfield; 16.04.2010
comment
@Adam - не работает (по крайней мере, в версии GNU) 36i dc: входная база должна быть числом от 2 до 16 (включительно) - person Carlos Gutiérrez; 16.04.2010

Мое решение 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};
person Community    schedule 16.04.2010

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

person Community    schedule 16.04.2010

Python (47 символов)

reduce(lambda a,b:a*26+ord(b)-64,raw_input(),0)

работает только с заглавными буквами

person Community    schedule 16.04.2010

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
person Community    schedule 17.04.2010

Фактор: 47 символов

обратный [26 swap ^ swap 64 - *] сумма индекса карты

person Community    schedule 17.04.2010

Пролог: 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
person Community    schedule 17.04.2010

php 29 символов:


while($i++!=$t)$c++;echo$c+1;

  • при условии, что register_globals = On
  • предполагая error_reporting = 0
  • позвонить через веб-сервер? i = A & t = ABC
person Community    schedule 17.04.2010

Python: 88 символов

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

s=input()
print sum([((26**(len(s)-i-1))*(ord(s[i])-64)) for i in range(len(s))])
person Community    schedule 17.04.2010

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
person Community    schedule 18.04.2010

OOBasic: 178 символов, не считая пробелов в отступах.

пересмотренный

Эта версия проходит все тесты. Я подозреваю, что гольф был бы более успешным, если бы он не «воспользовался» тем фактом, что существует электронная таблица, использующая эту систему нумерации. См. Примечания к исходной версии ниже, чтобы узнать, почему это не особенно полезно. Я не особо старался сократить счет.

Также обратите внимание, что это будет работать только при запуске в качестве макроса из электронной таблицы OO calc по очевидным причинам.

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

Ограничения:

  • maximum value of co is AMJ (1024 columns). Anything larger results in an error with a completely uninformative error message.
    • This limitation is also present for the COLUMN() cell function. Presumably this is the maximum number of columns in an OOCalc spreadsheet; I didn't bother scrolling over that far or googling to find out.

Примечания:

  • как ни странно, невозможно дать переменной «co» однобуквенное имя. Не уверен, что за этим стоит логика, но, потратив достаточно времени на использование OOBasic, вы перестаете искать логику и начинаете слепо принимать текущее положение вещей (возможно, слишком долго глядя на Солнце).

В любом случае ввод =C("A"), =C("ABC") и т. Д. В ячейку работает для первых четырех тестовых случаев; последние два выдают ошибки.

person Community    schedule 18.04.2010

прямой удар

фильтр: 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}) делает s массивом, содержащим буквы от A до Z

i=$((i*26+${#s[@]}));

$((...)) завершает арифметическое вычисление; ${#s[@]} - количество элементов в массиве $ s

c=${c:1};done;

${c:1} - символы в $ c после первого. done завершает цикл while

echo $i

эм, я забыл

лучше, но сомнительно

Удаление 5 символов «эхо» приведет к тому, что для ввода «ROFL» будет получен

326676: command not found

Также i=0, вероятно, не нужен, если вы уверены, что эта переменная не установлена ​​в вашей текущей оболочке.

person Community    schedule 18.04.2010

F # (37 символов):

Seq.fold (fun n c -> int c-64+26*n) 0
person Community    schedule 18.04.2010

K 3.2 (13 знаков)

26_sv -64+_ic

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

  26_sv -64+_ic"ROFL"
326676

Объяснение:

  • Как упоминалось выше, K вычисляется справа налево, поэтому функция _ic принимает все, что находится справа, и преобразует его в целочисленное значение, включая как отдельные символы, так и векторы символов.
  • -64 добавляется к каждому элементу целочисленного вектора, чтобы получить набор базовых значений
  • _sv принимает два аргумента: слева - это числовое основание, 26, а справа - целочисленный вектор значений смещения.
person Community    schedule 20.04.2010

Excel VBA, 19 символов:

диапазон ("WTF"). Столбец

person Community    schedule 27.04.2010

Решение Ruby в 26 символов

p ("A"..$*[0]).to_a.size

person Community    schedule 01.07.2010

Настоящий VBA, 216 без пробелов

Я тоже терплю поражение в настоящем гольфе.

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

person Community    schedule 16.04.2010

Эланг, 53/78

Оболочка, 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).
person Community    schedule 17.04.2010

F # 92 символа :)


let e2n (c: string) = c |> Seq.map (fun x -> (int) x - 64) |> Seq.reduce (fun e a -> a * 26 + e)

person Community    schedule 17.04.2010

Groovy: 51 символ

char[] a=args[0];t=0;for(i in a)t=26*t+i-64;print t

Вызвать как

groovy *scriptname* ROFL

or

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
person Community    schedule 17.04.2010

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)
}
person Community    schedule 17.04.2010

Excel - 99 знаков

Введите как формулу массива - я не считаю добавление в Excel {}

=SUM((CODE(MID(A1,ROW(INDIRECT("1:" & LEN(A1))),1))-64)*26^(LEN(A1)-ROW(INDIRECT("1:" & LEN(A1)))))

person Community    schedule 17.04.2010

как насчет нового языка
с операторами, определенными как

# - вернет = COLUMN () EXCEL в виде строкового числа.

, - читать в строке

. - выпишите строку

тогда программа для этого

, #.

person Community    schedule 16.04.2010
comment
Я надеюсь, что в будущем кодовые гольфисты создадут правило, гласящее, что язык должен быть полным по Тьюрингу, чтобы прекратить эти гнилые шутки. - person kennytm; 16.04.2010
comment
Простой. Определите расширение HQ9 + B (которое само является полным по Тьюрингу расширением HQ9 +), которое имеет три новых оператора ... - person Jouni K. Seppänen; 16.04.2010
comment
Фактическое решение состоит в том, чтобы заставить производителей микросхем внедрить машинные инструкции для решения этих проблем. - person Jonno_FTW; 16.04.2010
comment
@Kenny: еще одна перспектива в духе ioccc :) en.wikipedia.org/wiki/ < / а> - person alvin; 17.04.2010
comment
даже каждый используемый пакет / библиотека подразумевает металингвистическую абстракцию. поэтому, если бы я написал пакет для решения этой проблемы с помощью одного вызова API, и случайно этот пакет был включен в стандартную библиотеку :) любого из полных языков по Тьюрингу, я смог бы решить проблему всего за один вызов API. будет ли он тогда засчитан как действительный ответ. так что, по крайней мере, язык должен быть ограничен простым базовым языком, без использования каких-либо библиотек. в некоторых ответах используются математические или строковые библиотеки. не следует ли также учитывать размер исходного кода этих вызовов? - person alvin; 17.04.2010
comment
Это не сработает из-за ограничений количества столбцов в Excel. На самом деле эту проблему невозможно решить на вашем новом языке. - person intuited; 18.04.2010
comment
@intuited. это интересно. - person alvin; 18.04.2010
comment
@alvin: теперь, если вы добавите функцию для преобразования veganhexisimula [sp!] в десятичное число, тогда вы в восторге. Но он все еще придумывает правила на ходу, а правила таковы, что я выигрываю. - person intuited; 18.04.2010