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


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
Джо Кинг


Ответы:



7

Google Sheets, 21 байт

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

=column(indirect(A1&2

Просто собираюсь опубликовать чуть менее гольф-версию этого.
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

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






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.


@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 

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функция, транслитерация занимает много байтов.


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

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

машинный код 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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.