Код Golf: числовий еквівалент назви стовпця Excel


76

Змагання

Найкоротший код за підрахунком символів, який видасть числовий еквівалент рядка стовпця Excel.

Наприклад, Aстовпець дорівнює 1, Bдорівнює 2, тощо тощо. Після натискання Zстає наступною колонкою AA, потім ABтощо.

Тестові кейси:

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

Кількість кодів включає введення / вихід (тобто повну програму).


19
Код гольфу безглуздо, APL завжди перемагає в підсумку.
BlueRaja - Danny Pflughoeft

1
Коли ви публікуєте рішення, будь ласка, переконайтесь, що воно працює у всіх вищезазначених випадках (введення / виведення під час запуску приємне), і зауважте, де це не так. Дякую.

3
Чому на біса це позначено розеттовим каменем ?!
Джош Стодола,

2
J - APL без грецької. J завжди виграє, ніхто більше не говорить APL.
Каллум Роджерс

1
@BlueRaja: Цікаво, що APL все ще виграє ці речі в 2010 році, майже через 40 років після виходу з мейнстріму.
Краген Хав'єр Сітакер

Відповіді:


96

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..$_створює список, починаючи з "А" і збільшуючи рядок до вхідного рядка. Perl інтерпретує ++оператор (і, отже, ..) для рядків в алфавітному контексті, наприклад, $_="AZ";$_++;printрезультати BA.

=()=(він же "goatse" оператор ) змушує вираз оцінюватися в контексті списку і повертає кількість елементів, повернутих цим виразом, тобто $scalar = () = <expr>відповідає @list = <expr>; $scalar = @list.


2
Використовуйте $_або $` instead of $ n` і телефонуйте printбез аргументів.
моб

4
використовуйте "-p" і відкиньте друк взагалі: echo -n WTF | perl -p -e '$ _ = () = A .. $ _' Загальний код: 11 символів, AH AH!
wazoox

2
переключитися printна sayі відпустити ще 2 символи :)
mpeters

16
Ах, я люблю оператора козлів :)
Ефір

1
Існує лише обмежена кількість програм на 11 символів perl, які насправді будуть компілюватися ... змушує мене задуматися, що роблять інші.
Ден,

339

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

Використовуйте відповідний інструмент для роботи:

=COLUMN()

=COLUMN()


166
Використовуйте відповідну мову для роботи: португальська Excel =COL(). 6 символів. (Див. Dolf.trieschnigg.nl/excel/excel.html )
Debilski

21
Чудово! тільки це не підтримує ROFL.
ВАС

63
Це рішення навіть правильно відтворює обмеження Excel.
kibibu

18
Він навіть не приймає рядок як вхід. Не наближається до того, щоб сказати проблему. Це працює лише в тому випадку, якщо воно знаходиться в стовпці, який, імовірно, називається на честь відповідного рядка. Зовсім не в дусі питання.
phkahler

9
Чесно кажучи, Code Golf створений для таких типів розумних відповідей. Отже, ви отримуєте від мене +1.
Рейнольдс,

71

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

26#.64-~av

Приклад:

26#.64-~av  'WTF'
16074

Пояснення:

  • J розбирає справа наліво.
  • avповертає список індексів ascii кожного з символів у своєму аргументі, так, наприклад, av'ABC'повертає 65 66 67.
  • Тоді ми віднімаємо 64 від кожного елемента цього списку з дієсловом 64-~.
  • Потім ми перетворюємо список на базу 26, використовуючи #.дієслово.

2
Прочитавши кілька коментарів про те, як рішення Excel насправді не бере введення рядка, я піду з рішенням, яке є найкоротшим, і насправді бере введення рядка.
Vivin Paliath

Вау J рішення, яке я насправді можу зрозуміти :)
Каллум Роджерс

2
@Brandon: J створений для всього, якщо ти не проти витратити роки, щоб навчитися його читати.
Девід,

55

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 для друку. Це, мабуть, зіпсує задоволення. Але я зробив послугу, перемістивши вказівник на клітинку з результатом, так що принаймні це корисно для машини.

Гей, що ти знаєш, я побив С #!


Я здивований, що хтось насправді використовує Bf
OscarRyz

31

Рубін 1.8.7, 53 50 46 44 24 17 символів

p ('A'..$_).count

Використання:

$ echo -n ROFL | рубін -н а.рб
326676
$ echo -n WTF | рубін -н а.рб
16074
$ echo -n A | рубін -н а.рб
1

Відмінно, я відчув дуже схожу картину вже, але я не розумію , що p (і p(відрізняється, :(
ви

використовуйте, echo -n ...щоб ви могли кинути.chop
Джон Ла Рой

@gnibbler: Дякую за ідею -n, яка також зводить моє рішення Perl до 17.
Девід

Ви могли б отримати це до 16, використовуючи? A замість "A"
steenslag

23

APL

13 символів

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

x←'WTF'

потім обчислити його за допомогою:

26⊥(⎕aV⍳x)-65

Єдина причина, чому Дж. Мене побив - це дужки. Я думаю, що має бути якийсь спосіб переставити його, щоб уникнути потреби в них, але це був довгий день. Ідеї?

(Хе, ви, програмісти perl, з вашими 30+ рішеннями для персонажів, такі милі!)


Можливо, замість цього 26⊥⁻65 + ⎕aV⍳x? Ось як ви пишете мінус 65 в APL, так?
Краген Хав'єр Сітакер

Зараз у мене немає свого середовища APL, але я думаю, що я спробував щось подібне, і це не спрацювало. Зверху моєї голови (і, правда, я найдальше від майстра APL!) ⁻ Еквівалентно - і оскільки він обчислює справа наліво, він застосовується після +, тож ви отримуєте 26⊥⁻ ( 65+ (⎕aV⍳x)) замість 26⊥ ((⁻65) + ⎕aV⍳x), що саме вам тут потрібно.
Кен

Прийняте рішення Perl перевершує ваш код двома символами ... =)
kolistivra

14

Excel (не обдурюючи), 25 символів

Підтримує до XFD:

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

Встановлення:

  1. Помістіть формулу в клітинку A2.

Використання:

  1. Введіть рядок стовпця в комірку A1.
  2. Прочитайте результат у комірці А2.

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. Заповніть формулу (В2) якомога далі.

Використання:

  1. Введіть рядок стовпця в комірку A1.
  2. Прочитайте результат у комірці А2.

13

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

Використання комбінації клавіш C = System.Console вам тут не допомагає, тому що в підсумку вам доведеться сказати "Система". двічі. Ви можете заощадити 5 символів, якщо просто "використовувати System;" і відповідно змініть свій код. Але моя версія без посилання все-таки коротша. :)
Ігбі Ларгеман

Ви маєте рацію, і я можу зробити його ще коротшим, використовуючи перший аргумент замість Console.Readline, роблячи його все ще коротшим. : P
Cameron MacFarland

1
о, лайно, я допоміг тобі випередити мене! : P
Ігбі Ларгеман

До речі, дякую за виправлення мого рахунку знаків. Я повністю розійшвся на цьому.
Ігбі Ларгеман,

3
Як щодо Console.Writeзамість WriteLine?
Андреас Грех,


11

Хаскелл, 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

9

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

ваш номер 2 повинен називатися f. Спробуйте запустити зараз, це не працює. І це можна зробити коротшим (47 символів) за допомогою лямбда і оцінки короткого замикання:f=lambda x:len(x)and 26*f(x[:-1])+ord(x[-1])-64
Ponkadoodle

@wallacoloo: Дякую. Це вікі спільноти, тому ви можете сміливо вносити зміни будь-коли.
Адам Розенфілд,

як щодо скидання len (x) лише для x? стає 43 символами: f = лямбда x: x та 26 * f (x [: - 1]) + ord (x [-1]) - 64
Нас Банов

9

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


8

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

Я поголив ще 4 символи з розчину 1.6, використовуючи закриття виразів. Можливо, ви зможете трохи зменшити його, переробивши (t?g*26:0)деталь.
Девід Мердок,

ОНОВЛЕННЯ. Я просто поголив ще 9 символів, використовуючи [] .reduce
Девід Мердок,

FWIW, я додав реалізацію, використовуючиstring#replace
Chetan S

@Chetan, @David: Гарна робота. Це акуратно!
Даніель Вассалло,


5

C89, 58 символів

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

Введення (stdin) має містити лише AZ, інші символи (включаючи нові рядки) не допускаються.


1
getchar()повернення < 0на EOF; EOF не визначається як -1, але він є загальним.
Strager

@strager: Гарна думка. Тоді для забезпечення повної переносимості потрібно буде додати 2 символи (змінивши c=getchar()+1на (c=getchar())>=0та 65на 64). Але це має працювати майже в будь-якій реалізації C.
Адам Розенфілд,

5

Пояснення понять - Excelcification

Приємно. Я давно написав свою власну версію з трохи більше пояснень http://aboutdev.wordpress.com/2009/12/19/excelcification-brain-teaser-code/ . Хоча це не зовсім оптимізована версія!

FYI. Арифметика основи 26 називається гексавігезімальною, а максимальним стовпцем Excel є XFD, який перетворюється на 16383 (використовуючи 0 як першу комірку), що збігається рівно 2 ^ 14 комірок .

Хтось може здогадатися, чому це 2 ^ 14 ??


5
Можливо, вони на той час хочуть використовувати лише 64 тис. Пам’яті :-)
ВАС

Тому що вони хотіли мати можливість робити зсуви (xy), для чого потрібен знаковий біт. Але це лише 15 біт, то що з 16 бітом? Чи використовується він як прапор?
phkahler

1
Це не зовсім база-26, оскільки вона не має 0. Якщо ми дозволимо A представляти 1, і помножимо на 26^nдля позиції nn = 0на крайню праву букву), все вийде як зазвичай.
Томас,

@phkahler: За допомогою 1 біта ви можете представляти всі беззнакові цілі числа в діапазоні 0..2 ^ 0. Таким чином, із 16 бітами ви можете представляти 0..2 ^ 15. Візьміть 1 біт для знаку, максимальне значення буде 2 ^ 14-1 (= 16383).
stakx - більше не вносить внесок

1
@phkahler: вам не потрібен біт знаку для представлення зсувів, якщо вам не потрібне розрізнене представлення для значень, що не виходять за межі (тобто ви можете перевірити біт переповнення процесора, щоб побачити, чи не виходить за межі ).
Краген Хав'єр Сітакер

5

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

5

C #, 117111 символів

Жоден конкурс у порівнянні з такими, як 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);}}

1
Ви можете заощадити 3 символи, видаливши простір між [] та 'a' та брекетами foreach.
Cameron MacFarland

Я не знав, що рядок реалізований IEnumerable. Солодко! На жаль, сторінка про правління Хорнера - це над головою, але явно виграшна стратегія. Мені не подобається використовувати Console.Write (), через брудний вихід. +1
Ігбі Ларгеман

4

Perl, 34 символи

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

Дякую mobrule за кілька пропозицій.


Ви можете сказати pop=~/./gзамість " split//,$ARGV[0]Ви можете пропустити" $_у ordдзвінку. Ви можете використовувати $` instead of $ s`, а потім просто сказати print.
моб

4

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

4

Python - 63 символи

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

>>> f ('ROFL')

326676


4

Clojure:

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

51 символ плюс кількість символів у вхідному рядку.



4

Рубін 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

Ви можете використовувати відбивну замість смужки, щоб отримати 1
знак

Дякую @JRL, я щось помилився у використанні echo A |, так повинно бутиecho A|
ВАС

Використовуйте, echo -nяк інші, і позбавляйтеся chop.
Daniel C. Sobral,

Дякую @Daniel, я оновив його, але схоже, що echo -nвін не працює в Windows.
ВАС

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

3

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

3

Common Lisp, 81 символ

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

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


Думаю, вам доведеться зареєструватися :) Тоді ви зможете коментувати.
Vivin Paliath,

3

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

Як я міг забути про поліваль .. +1 для кращого рішення
Джордж

3

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

1
Ви можете втратити 10 символів, видаливши фігурні дужки навколо вашої функції while та скинувши ініціалізацію змінної.
ChiperSoft
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.