По заданной строке рассчитать номер столбца, которому она соответствует

17

В Excel столбцы варьируются от A-Z, AA,AB,AZ,BA,..,BZи так далее. На самом деле каждый из них обозначает числа, а кодируется в виде строк алфавита.

В этом задании вам дадут строку алфавитов, и вы должны вычислить столбец, которому она соответствует.

Некоторые тесты:

«A» возвращает 1 (это означает, что это первый столбец)

«B» возвращает 2

«Z» возвращает 26

«АА» возвращает 27

«AB» возвращает 28

'AZ' возвращает 52

«ZZ» возвращает 702

«ААА» возвращает 703

Вы можете предположить, что заглавные буквы будут даны только.

Кратчайшие байты выигрывают.

Удачи!

К Сплит Х
источник
Итак ... база 26 с алфавитом?
Джо Кинг
1
Это не совсем база 26, потому что нет нуля.
J.Doe
@ J.До, наверное, ты прав. Я не заметил, так как мое решение Zвсе равно автоматически рассматривалось как 10
Джо Кинг
6
@JoKing Биективная база .
user202729

Ответы:

9

Perl 6 , 17 байт

{:26[.ords X-64]}

Попробуйте онлайн!

Блок анонимного кода, который вычитает 64 из каждого байтового значения и преобразует из базы 26 с Zпереполнением в следующий столбец.

Джо Кинг
источник
7

Google Sheets, 21 байт

(формула оценивает результат, получает данные из ячейки A1)

=column(indirect(A1&2
user202729
источник
Просто собираюсь опубликовать чуть менее гольф-версию этого.
ATaco
1
У меня также есть решение в Google Sheets, которое не опирается на встроенную COLUMN, посмотрите его. (кроме того, мне плохо, что решение, на которое я прикладываю больше усилий, привлекает меньше внимания ... в любом случае, это типичная проблема с голосованием, особенно когда вызов на HNQ.)
user202729
6

R , 48 43 байта

-5 байт благодаря @Giuseppe, использующим ту же логику, но как программу, которая устраняет ncharвызов.

for(i in utf8ToInt(scan(,"")))F=F*26+i-64;F

Попробуйте онлайн!

j.doe
источник
4

Java (JDK) , 39 байт

s->s.chars().reduce(0,(a,b)->a*26+b%32)

Попробуйте онлайн!

Оливье Грегуар
источник
Какая платформа Java поддерживает это?
Сайед Хамза Хасан
@SyedHamzaHassan Java 8 или более.
Оливье Грегуар
3

05AB1E , 6 байтов

Çžx-₂β

Попробуйте онлайн!

Okx
источник
Из любопытства зачем использовать žxвместо просто 64?
Кевин Круйссен
Я не знаю, это выглядело лучше, я думаю?
Okx
3

PHP, 41 38 байт

-3 спасибо Джо Кинг.

for($c=A;$c!=$argn;$i++)$c++;echo$i+1;

бежать как труба с -nr

одинарный вывод, 34 байта:

1<?for($c=A;$c!=$argn;$c++)echo 1;

требует PHP 7.1. сохранить в файл, запустить как канал с -nF.

Titus
источник
@JoKing Да, это можно сделать: sandbox.onlinephpfunctions.com/code/…
Исмаэль Мигель
@ Титус Хорошо тогда
2

APL (NARS), 11 символов, 22 байта

{+/26⊥⎕A⍳⍵}

тестовое задание

  f←{+/26⊥⎕A⍳⍵} 
  f¨'A' 'AA' 'AAA'
1 27 703 
  f¨'AB' 'ZZ' 'Z'
28 702 26 
RosLuP
источник
2

C (gcc) , 46 , 43 байта

a;f(int*s){for(a=0;*s;)a=*s++%64+a*26;s=a;}

Попробуйте онлайн!

Degolf

a; f(int*s)
{  for(a=0;*s;) // Loop through s, which is a null-terminated string.
       a=*s++%64 + a*26; // Multiply accumulated value by 26, and add current char modulo 64 to it.
   s=a;} // Return the accumulated value.

источник
1

Google Sheets, 100 байт

(формула оценивает результат, получает данные из ячейки A1)

=sum(arrayformula(
  (
    code(
      mid(A1,row(indirect("1:"&len(A1))),1)
    )-64
  )*26^row(indirect("1:"&len(A1)))/26

Все пробелы добавлены только для ясности.

Примечание .

  • Я не знаю, возможно ли удалить дублирование row(indirect("1:"&len(A1)).
  • Хотя в Google Sheets есть decimalфункция, транслитерация занимает много байтов.
user202729
источник
1

Java (JDK) , 92 байта

static int m(String v){int x=0;for(int i=0;i<v.length();i++)x=x*26+v.charAt(i)-64;return x;}

Попробуйте онлайн!

Выход

А = 1

В = 2

Z = 26

АА = 27

AB = 28

AZ = 52

ZZ = 702

AAA = 703

Сайед Хамза Хасан
источник
Я не эксперт в гольфе Java, но вы можете играть в гольф это вниз значительно, возвращая вместо печати, упрощая для петель, устранения пробелов и избавления от pи nпеременных. 92 байта! ,
Джо Кинг
Замечательно .......
Сайед Хамза Хасан
1
Вы можете удалить, staticчтобы получить 7 байтов. Вы также можете сделать эту функцию лямбда, чтобы сэкономить больше байтов. Я также думаю, что рекурсивная версия может сохранить байты. В любом случае, вот мое 39-байтовое решение .
Оливье Грегуар,
Это прекрасно.
Сайед Хамза Хасан
1

J 11 байт

26#.64|3&u:

Попробуйте онлайн!

Как это устроено

26#.64|3&u:  Monadic verb. Input: a string.
       3&u:  Convert each character to Unicode codepoint
    64|      Modulo 64; maps A -> 1, ... Z -> 26
26#.         Interpret as base-26 digits and convert to single integer
фонтанчик для питья
источник
1

Japt -h, 10 байт

åÈ*26+InYc

Попытайся

Или без флага. Первый байт может быть удален, если мы можем принять ввод как символьный массив.

¨c aI̓26

Попытайся


объяснение

åÈ             :Cumulatively reduce by passing each character at Y through a function, with an initial total of 0
  *26          :  Multiply current total by 26
     -I        :  Subtract 64
       n       :   Subtracted from
        Yc     :    The codepoint of Y
               :Implicitly output the last element of the resulting array
мохнатый
источник
0

J , 20 байт

[:(#.~26$~#)32|a.i.]

Попробуйте онлайн!

Объяснение:

 [:(#.~26$~#)32|a.i.] 
                  i.    - indices 
                    ]   - of the characters of the input
                a.      - in the alphabet
             32|        - mod 32
 [:(        )           - apply the following code to the above
         $~             - create a list of (left and right arguments exchanged) 
       26               - the number 26
           #            - repeated the length of the input times
    #.~                 - to base (26)
Гален Иванов
источник
0

Древесный уголь , 10 байт

I↨²⁶ES⊕⌕αι

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

     S      Input string
    E       Map over characters
         ι  Current character
        α   Uppercase alphabet
       ⌕    Find index
      ⊕     Increment
  ²⁶        Literal 26
 ↨          Base conversion
I           Cast to string
            Implicitly print
Нил
источник
0

MBASIC , 84 байта

1 INPUT S$:L=LEN(S$):FOR I=1 TO L:V=ASC(MID$(S$,I,1))-64:T=T+26^(L-I)*V:NEXT:PRINT T

Выход:

? AZ
 52

? ZZ
 702

? AAA
 703
wooshinyobject
источник
0

машинный код x86, 19 байт

00000000: 31c0 8b19 83e3 3f41 b21a f7e2 01d8 3831  1.....?A......81
00000010: 75f0 c3                                  u..

Монтаж:

section .text
	global func
func:				;this function uses fastcall conventions
	xor eax, eax		;reset eax to 0
	loop:
		;ebx=*ecx%64
		mov ebx, [ecx]	;ecx is 1st arg to this func (in fastcall conventions)
		and ebx, 63	;because 64 is a pwr of 2,n%64=n&(64-1)

		;ecx++		get next char in str by incrementing ptr
		inc ecx
		
		;eax=eax*26
		mov dl, 26	;using an 8bit reg is less bytes
		mul edx
		
		;eax+=ebx //(eax=(*ecx%64)+(eax*26))
		add eax, ebx

		;if(*ecx!='\0')goto loop
		cmp byte [ecx], dh ;dh==0
		jne loop
	ret			;return value is in eax

Попробуйте онлайн!

Logern
источник