Давши рядок, обчисліть номер стовпця, якому він відповідає


17

У Excel стовпці варіюються від A-Z, AA,AB,AZ,BA,..,BZтощо. Насправді кожне стоїть за цифрами, а скоріше кодується як рядки алфавіту.

У цьому виклику вам буде надано рядок алфавітів, і ви повинні обчислити стовпець, якому він відповідає.

Деякі тести:

'A' повертає 1 (це означає, що це перший стовпець)

'B' повертається 2

'Z' повертається 26

'AA' повертається 27

'AB' повертається 28

'AZ' повертає 52

'ZZ' повертає 702

'AAA' повертає 703

Можна припустити, що великі літери будуть надані лише.

Виграють найкоротші байти.

Удачі!


Отже ... основа 26 з алфавітом?
Джо Кінг

1
Це не зовсім основа 26, тому що немає нуля.
J.Doe

@ J.Doe Ах, певно, ти маєш рацію. Я не помітив, оскільки рішення про мене Zвсе одно автоматично трактували як 10
Jo King


Відповіді:



7

Google Таблиці, 21 байт

(формула оцінює результат, приймає вхід з комірки A1)

=column(indirect(A1&2

Якраз збираюся опублікувати трохи менш гольф-версію цього.
Атако

1
Також у Google Таблицях є рішення, яке не покладається на вбудований COLUMN, перевірте це. (окрім того, мені погано, що рішення, на яке я докладаю більше зусиль, отримує менше уваги ... це типова проблема з голосуванням у будь-якому разі, особливо, коли виклик на HNQ.)
user202729






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. зберегти у файл, запустити як pipe -nF.


@JoKing Так, це можна зробити: sandbox.onlinephpfunctions.com/code/…
Ісмаель Мігель


@Titus Добре, тоді


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

Спробуйте в Інтернеті!

Дегольф

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 Таблиці, 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

B = 2

Z = 26

AA = 27

AB = 28

AZ = 52

ZZ = 702

AAA = 703


Я не є експертом у галузі гольфу на Java, але ви можете значно знизити цей процес, повернувшись замість друку, спростивши цикли, видаливши пробіли та позбувшись змінних pта nзмінних. 92 байти! .
Джо Кінг

Чудовий .......
Syed Hamza Hassan

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

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

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.