Гольф кода: Числовой эквивалент имени столбца Excel

76
задан 8 revs, 5 users 79% 30 August 2012 в 20:00
поделиться

66 ответов

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

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

1
ответ дан 24 November 2019 в 11:02
поделиться

Ruby, 20 символов

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

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

$ ruby a.rb ABC
731
3
ответ дан 24 November 2019 в 11:02
поделиться

Lua, 61 символ

x=0 for c in(...):gfind(".")do x=x*26-64+c:byte()end print(x)
2
ответ дан 24 November 2019 в 11:02
поделиться

в 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
3
ответ дан 24 November 2019 в 11:02
поделиться

Perl, 47 символов (из stdin)

chop($l=<>);$_=A;$.++,$_++while$_ ne$l;die$.,$/
2
ответ дан 24 November 2019 в 11:02
поделиться

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

2
ответ дан 24 November 2019 в 11:02
поделиться

dc - 20 символов

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

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

?[26~64+rd0<LP]dsLxP
dc exccol.dc
326676
 ROFL
1
ответ дан 24 November 2019 в 11:02
поделиться

Smalltalk, 72

Smalltalk arguments first reverse inject:0into:[:o :e|o*26+e digitValue]
2
ответ дан 24 November 2019 в 11:02
поделиться

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
1
ответ дан 24 November 2019 в 11:02
поделиться

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

2
ответ дан 24 November 2019 в 11:02
поделиться

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

1
ответ дан 24 November 2019 в 11:02
поделиться

Пролог: 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
1
ответ дан 24 November 2019 в 11:02
поделиться

php 29 символов:


while($i++!=$t)$c++;echo$c+1;
  • при условии, что register_globals = On
  • предполагая error_reporting = 0
  • вызов через веб-сервер? i = A & t = ABC
1
ответ дан 24 November 2019 в 11:02
поделиться

PHP: 56 55 символов

для ($ i = 'a'; $ i ++! = Strtolower ($ argv [ 1]); @ $ c ++) {} echo ++ $ c;

PHP: 44 43 символа только для прописных букв

для ($ i = 'A'; $ i ++! = $ Argv [1]; @ $ c ++) {} echo ++ $ c;

2
ответ дан 24 November 2019 в 11:02
поделиться

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
1
ответ дан 24 November 2019 в 11:02
поделиться

wazoox:

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

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

2
ответ дан 24 November 2019 в 11:02
поделиться

прямой bash

фильтр : 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 , вероятно, не требуется, если вы уверены, что у вас нет этой переменной, установленной в вашей текущей оболочке.

1
ответ дан 24 November 2019 в 11:02
поделиться

Мое решение 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};
1
ответ дан 24 November 2019 в 11:02
поделиться

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)
2
ответ дан 24 November 2019 в 11:02
поделиться

K 3.2 (13 символов)

26_sv -64+_ic

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

  26_sv -64+_ic"ROFL"
326676

Пояснение:

  • Как упоминалось выше, K оценивается справа налево, поэтому _ic функция принимает все, что находится справа от него, и преобразует его в целочисленное значение, включая как отдельные символы, так и символьные векторы
  • -64 добавляется к каждому элементу целочисленного вектора, который для получения набора базовых значений
  • _sv принимает два аргумента: слева - это числовое основание, 26, а справа - целочисленный вектор значений смещения
1
ответ дан 24 November 2019 в 11:02
поделиться

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

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

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

1
ответ дан 24 November 2019 в 11:02
поделиться

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
1
ответ дан 24 November 2019 в 11:02
поделиться

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

Seq.fold (fun n c -> int c-64+26*n) 0
1
ответ дан 24 November 2019 в 11:02
поделиться

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

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

, например

php -r 'for($a=A;++$c,$a++!=$argv[1];);echo$c;' WTF
2
ответ дан 24 November 2019 в 11:02
поделиться

Python: 88 символов

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

s=input()
print sum([((26**(len(s)-i-1))*(ord(s[i])-64)) for i in range(len(s))])
1
ответ дан 24 November 2019 в 11:02
поделиться

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

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

  • максимальное значение co - AMJ (1024 столбца). Все, что больше, приводит к ошибке с совершенно неинформативным сообщением об ошибке.
    • Это ограничение также присутствует для функции ячейки COLUMN ().Предположительно это максимальное количество столбцов в электронной таблице OOCalc; Я не стал прокручивать так далеко или искать в Google.

Примечания:

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

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

1
ответ дан 24 November 2019 в 11:02
поделиться

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

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

1
ответ дан 24 November 2019 в 11:02
поделиться

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

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

1
ответ дан 24 November 2019 в 11:02
поделиться

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

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

1
ответ дан 24 November 2019 в 11:02
поделиться

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


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

0
ответ дан 24 November 2019 в 11:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: