文字列を指定して、対応する列の数を計算します


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 Ah、あなたは正しいと思う。Zとにかく私のソリューションが自動的に10として扱われたので気づかなかった
ジョーキング


回答:



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が必要です。ファイルに保存し、でパイプとして実行します-nF


@JoKingはい、それは行うことができます。sandbox.onlinephpfunctions.com/code/...
イスマエルミゲル


@Titus Alright then


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スプレッドシートには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;}

オンラインでお試しください!

出力

A = 1

B = 2

Z = 26

AA = 27

AB = 28

AZ = 52

ZZ = 702

AAA = 703


私はJavaのゴルフの専門家ではありませんが、印刷の代わりに戻る、forループを単純化する、空白を削除してpand 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

、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

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

オンラインでお試しください!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.