web-dev-qa-db-ja.com

コードゴルフ:Excelの列名に相当する数値

チャレンジ

Excelの列文字列に相当する数値を出力する、文字数による最短コード。

たとえば、A列は1、Bは2などです。 Zを押すと、次の列はAAになり、次にABなどになります。

テストケース:

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

コードカウントには、入力/出力(完全なプログラム)が含まれます。

76
Vivin Paliath

Perl、 36343331301715 11文字

_$_=()=A..$_
_

使用法:

_$ echo -n WTF | Perl -ple '$_=()=A..$_'
16074
_

Echo -nを使用してchop呼び出しを回避することにより、17に削減されました。

Printの代わりにsayを使用して、15に減少しました。

Sayの代わりに-pを使用して11に削減されました。

説明:Aは文字列コンテキストで評価され、_A..$__は「A」で始まり、入力文字列まで文字列インクリメントするリストを作成します。 Perlは、アルファベットコンテキストの文字列で_++_演算子(したがって_.._)を解釈するため、たとえば_$_="AZ";$_++;print_はBAを出力します。

=()=(別名 "goatse" operator )は、リストコンテキストで式を評価し、その式によって返される要素の数、つまり$scalar = () = <expr>を返します。 _@list = <expr>; $scalar = @list_に対応します。

96
David

Excel、9文字:)

ジョブに適したツールを使用します。

=COLUMN()

=COLUMN()

340
Danko Durbić

[〜#〜] j [〜#〜] 、 1712 10文字

26#.64-~av

例:

26#.64-~av  'WTF'
16074

説明:

  • Jは右から左に解析します。
  • avは、引数内の各文字のASCIIインデックスのリストを返します。たとえば、av'ABC'65 66 67を返します。
  • 次に、動詞64-~を使用して、そのリストの各要素から64を引きます。
  • 次に、#.動詞を使用してリストを基数26に変換します。
71
David

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文字列に変換しなかったことにお気付きでしょう。それはおそらく楽しさを台無しにするでしょう。しかし、結果のあるセルにポインターを移動することを好んだので、少なくともマシンにとっては便利です。

ねえ、あなたは何を知っていますか、私はC#を打ち負かしました!

55
Tesserex

Ruby 1.8.7、 5350464424 17文字

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

使用法:

 $ echo -n ROFL | Ruby -n a.rb 
 326676 
 $ echo -n WTF | Ruby -n a.rb 
 16074 
 $ echo -n A | Ruby -n a.rb 
 1 
31
Mark Rushakoff

APL

13文字

xに値を入れます:

x←'WTF'

次にそれを計算します:

26⊥(⎕aV⍳x)-65

Jが私をbeatった唯一の理由は、括弧が原因でした。それらの必要性を避けるためにそれを再配置する何らかの方法があるべきだと思っていますが、それは長い一日でした。アイデア?

(ええ、あなたのPerlプログラマーは30以上のキャラクターソリューションを持っているのがとてもかわいいです!)

23
Ken

Excel(不正行為ではない)、25文字

XFDまでサポート:

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

インストール:

  1. セルA2に数式を入力します。

使用法:

  1. セルA1に列文字列を入力します。
  2. セルA2の結果を読み取ります。

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. 数式(B2)を可能な限り下に入力します。

使用法:

  1. セルA1に列文字列を入力します。
  2. セルA2の結果を読み取ります。
14
kennytm

C# 156146 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);
    }
}
13

Golfscript-16文字

[0]\+{31&\26*+}*


$ echo -n WTF | ./golfscript.rb Excel.gs
16074
$ echo -n ROFL | ./golfscript.rb Excel.gs
326676
12
John La Rooy

ハスケル、50 5156 チャー

main=interact$show.foldl(\x->(26*x-64+).fromEnum)0

使用法:

~:166$ echo -n "ROFL" | ./a.out
326676
~:167$ echo -n "WTF" | ./a.out
16074
11
kennytm

k4(kdb +)、11文字

26/:1+.Q.A?

説明:

  • k4は右から左に解析します
  • .Q.Aはk4内で定義されます-ベクトル"ABC...XYZ"
  • ?は検索演算子です-x arg内のy argの項目に最初に一致するインデックス
  • インデックスをオフセットするには+1
  • 26/:基数26に変換する

注意点-これは、リストされたタイプが渡される場合にのみ機能します:

  26/:1+.Q.A? "AD"
30

  26/:1+.Q.A? "WTF"
16074

しかし:

  26/:1+.Q.A? ,"A"
1
9
Ciarán

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
_
9
Adam Rosenfield

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
8
Daniel Vassallo

Powershell、42文字

[char[]]$args[($s=0)]|%{$s=$s*26+$_-64};$s
8
Danko Durbić

スカラ、30文字

print((0/:args(0))(_*26+_-64))" 

例:

C:\>scala -e "print((0/:args(0))(_*26+_-64))" AD
30
6

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
Paul Richter

概念の説明-エクセフィケーション

いいね私はこれについて自分のバージョンをもう少し説明して http://aboutdev.wordpress.com/2009/12/19/excelcification-brain-teaser-code/ 。最適化されたバージョンではありませんが!

FYI。基数26の算術演算は hexavigesimal およびExcelの最大列は[〜#〜] xfd [〜#〜]であり、16383に変換されます(0を使用偶然正確に2 ^ 14セルです。

なぜ2 ^ 14なのか誰にも推測できますか?

5
AboutDev

C89、58文字

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

入力(stdin)にはA〜Zのみを含める必要があり、他の文字(改行を含む)は使用できません。

5
Adam Rosenfield

C#、 117 111文字

Perl、RubyおよびAPLのようなものと比較したコンテストはありませんが、これまでに示した他のC#/ Javaの回答の改善です。

これは Hornerの規則 を使用します。

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);}}
5
Daniel Renshaw

一般的なLISP、86文字。

(defun z(s)(let((a 0))(map nil(lambda(v)(setf a(+(* 26 a)(digit-char-p v 36)-9)))s)a))
4
user318719

Python-63文字

>>> f = lambda z:reduce(lambda x、y:26 * x + y、[ord(c)-64 for c for z]))

>>> f( 'ROFL')

326676

4
user318679

Perl、34文字

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

いくつかの提案をしてくれたmobruleに感謝します。

4
user181548

Clojure:

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

51文字、および入力文字列の文字数。

4
jimbokun

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
Igby Largeman

C:

int r=0;
while(*c)r=r*26+*c++-64;

文字列は「c」に保存され、値は「r」に保存されます。

4
fluffy

Ruby 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
4
YOU

MATLAB:24文字

polyval(input('')-64,26)

使用法:

>> polyval(input('')-64,26)
(after pressing enter) 'WTF'

ans =

       16074

注:xに文字列を事前に保存している場合は、16文字まで取得できますが、不正行為と思われました。

>> x = 'WTF'

x =

WTF

>> polyval(x-64,26)

ans =

       16074
3
rlbond

一般的なLISP、81文字

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

おもしろいことに、新しいユーザーとして自分の回答を投稿できますが、他のユーザーのコメントは投稿できません。まあ、これを間違えたらおaびします!

3
Dr. Pain

vBAでは98になりました

Sub G(s)
Dim i, t
For i = 0 To Len(s) - 1
    t = t + ((Asc(Left(Right(s, i + 1), 1)) - 64)) * ((26 ^ i))
Next
MsgBox t
End Sub
3
Kevin Ross

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
3
Kevin Vaughan

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
Robin

ルビー、20文字

p('A'..$*[0]).count

使用法:

$ Ruby a.rb ABC
731
3
Jonas Elfström

ワズーオックス:

echo -n WTF | Perl -ple '$ =( A .. $)=='

これにより、新しい行が出力されるため、シェルで回答が読みやすくなります。

2
sabujp

Applescript:188
これは188文字の必須アップルスクリプトです。これは非冗長にするのが非常に難しい言語です。また、これはたまたまこれまでのどの言語の最長の回答でもあります。短縮方法を知っている人がいたら、共有してください。

実行s 
で{o、c}を{0、0}に設定
(sのアイテム1)の文字
の逆のiで繰り返すm〜26 ^ c整数として
 cをc + 1に設定
 oをo +に設定((iのASCII番号)-64)* m 
 end repeat 
実行終了

使用法:
osascript /path/to/script.scpt ROFL

2
user1330493

PHP: 56 55文字

for($i='a';$i++!=strtolower($argv[1]);@$c++){}echo++$c;

PHP: 44 大文字のみ43文字

for($i='A';$i++!=$argv[1];@$c++){}echo++$c;

2
chebur

PHP、38文字

for($a=A;++$c,$a++!=$argv[1];);echo$c;

使用法、例.

php -r 'for($a=A;++$c,$a++!=$argv[1];);echo$c;' WTF
2
user318965

JavaScript、93文字

with(Prompt())for(l=length,i=0,v=i--;++i<l;)v+=(charCodeAt(l-1-i)-64)*Math.pow(26,i);alert(v)
2
user316178

APL:7文字

必要な文字列を変数wに保存します。

w←'rofl'

文字が小文字であると仮定します:

26⊥⎕a⍳w

文字が大文字であると仮定します:

26⊥⎕A⍳w

大/小文字混合または大文字と小文字の区別(14文字ですが、改善される可能性があります):

26⊥⊃⌊/⎕a⎕A⍳¨⊂w
2
Dylan Freedman

Smalltalk、72

Smalltalk arguments first reverse inject:0into:[:o :e|o*26+e digitValue]
2
Paolo Bonzini

ルア、61文字

x=0 for c in(...):gfind(".")do x=x*26-64+c:byte()end print(x)
2
gwell

Perl、120文字

chomp($n=<>);@c=split(//,uc($n));$o=64;$b=0;$l=$#c;for($i=$l;$i>=0;$i--){$b+=((26**($l-$i))*(ord($c[$i])-$o));}print$b;

使用法:

vivin@serenity ~/Projects/code/Perl/excelc
$ echo WTF | Perl e.pl
16074
vivin@serenity ~/Projects/code/Perl/excelc
$ echo ROFL | Perl e.pl
326676

ここでのPerlの達人の一部は、もっと小さなものを思い付くと確信しています。

2
Vivin Paliath

Perl、47文字(標準入力から)

chop($l=<>);$_=A;$.++,$_++while$_ ne$l;die$.,$/
2
hobbs

OOBasic:178文字、インデント空白をカウントしない

改訂された

このバージョンはすべてのテストケースに合格します。この番号付けシステムを使用したスプレッドシートがあるという事実を「活用」しなければ、ゴルフが成功するのではないかと思います。特に有用ではない理由については、以下の元のバージョンに関する注意を参照してください。スコアを減らすために一生懸命努力しませんでした。

また、これはOO calcスプレッドシートからマクロとして実行した場合にのみ機能することに注意してください。

_Function C(st as String) as Long
    C = 0
    while len(st)
        C = C*26 + ThisComponent.Sheets(0).getCellRangeByName(left(st,1) &"1").CellAddress.Column+1
        st = mid(st,2)
    wend
End Function
_

元の

OOBasic(OpenOffice Basic)、多すぎる文字(124):

_Function C(co As String) As Long 
    C = ThisComponent.Sheets(0).getCellRangeByName(co &"1").CellAddress.Column+1
End Function
_

制限事項:

  • coの最大値はAMJ(1024列)です。それより大きいものは、まったく情報のないエラーメッセージを伴うエラーになります。
    • この制限は、COLUMN()セル関数にも存在します。おそらくこれは、OOCalcスプレッドシートの列の最大数です。私はそこまでスクロールしたり、グーグルで調べたりしませんでした。

ノート:

  • 奇妙なことに、変数 'c​​o'に1文字の名前を付けることはできません。この背後にあるロジックが何であるかはわかりませんが、OOBasicを使用して十分な時間を費やした後、ロジックの検索を停止し、物事のあり方を盲目的に受け入れ始めます(おそらく太陽を見つめすぎているため)。

とにかく、セルに=C("A")=C("ABC")などを入力すると、最初の4つのテストケースで機能します。最後の2つはエラーになります。

1
intuited

F#(37文字):

Seq.fold (fun n c -> int c-64+26*n) 0
1
Jon Harrop

Java、164文字

public class A{public static void main(String[] z){int o=0,c=0;for(int i=z[0].length()-1;i>=0;i--,c++)o+=(z[0].charAt(i)-64)*Math.pow(26,c);System.out.println(o);}}

Java、177文字

public class A
{
public static void main(String[] z)
{
    int m,o=0,c=0;
    for(int i=z[0].length()-1;i>=0;i--,c++)
    {
        m=(int)Math.pow(26,c);
        o+=(z[0].charAt(i)-64)*m;
    }
    System.out.println(o);
}
}

大文字の入力を想定しています(コマンドライン引数を使用)。トリックのない明らかなアプローチ。

1
Ross

ストレートバッシュ

フィルター:97文字

_{ read c;i=0;while [ $c ];do eval s=({A..${c:0:1}});i=$((i*26+${#s[@]}));c=${c:1};done;echo $i;}
_

使用法:

_echo ROFL | { read c;i=0;while [ $c ];do eval s=({A..${c:0:1}});i=$((i*26+${#s[@]}));c=${c:1};done;echo $i;}
326676
_

関数:98文字

_C(){ i=0;while [ $1 ];do eval s=({A..${1:0:1}});i=$((i*26+${#s[@]}));set -- ${1:1};done;echo $i;}
_

使用法:

_C ROFL
326676
_

説明フィルターバージョン:

_read c;i=0;
_

列と合計を初期化します。

_while [ $c ];do
_

まだ列の文字が残っている間

_eval s=({A..${c:0:1}});
_

_${c:0:1}_は、列の最初の文字を返します。 s=({A..Z})は、sをA〜Zの文字を含む配列にします

_i=$((i*26+${#s[@]}));
_

$((...))は算術評価をラップします。 _${#s[@]}_は配列$ sの要素数です

_c=${c:1};done;
_

_${c:1}_は、最初の文字の後の$ cの文字です。 doneはwhileループを終了します

_echo $i
_

私は忘れて

より良いが疑わしい

5文字の「echo」を削除すると、「ROFL」の入力に対する出力が次のようになります。

_326676: command not found
_

また、現在のシェルにその変数が設定されていないことが確実な場合は、おそらく_i=0_は必要ありません。

1
intuited

ファクター:47文字

reverse [26 swap ^ swap 64-*] map-index sum

1
user319031

私のJavascriptソリューションは82文字の長さで、Radix 36でInteger.parseIntを使用します。誰かがこのスレッドのJavascriptセクションにこれを追加できれば大丈夫です! :-)

a=function(b){t=0;b.split('').map(function(n){t=parseInt(n,36)-9+t*26});return t};
1
bflesch

26文字のRubyソリューション

p ("A"..$*[0]).to_a.size

1
Gerhard

48文字のJosl

main 0 0 argv each 64 - swap 26 * + next print

例:

$ josl numequiv.j A
1
$ josl numequiv.j ABC
731
$ josl numequiv.j ROFL
326676

標準入力からの読み取り:

main 0 STDIN read-line each 64 - swap 26 * + next print
1
jeremy

PHP:

<?$t=0;$s=str_split($argv[1]);$z=count($s);foreach($s as$v){$z--;$t+=(ord($v)-64)*pow(26,$z);}echo$t?>

sage: php filename.php ROFL

出力: 326676

1
user318594

プロローグ:49文字

 c([]、A、A)。
 c([H | T]、I、R):-JはH-64 + I * 26、c(T、J、 R)。

上記のコードを使用:

 | ?-c( "WTF"、0、R)。
 R = 16074? 
はい
 | ?-c( "ROFL"、0、R)。
 R = 326676? 
はい
1
Michael

dc-20文字

(逆を行います)

dcは文字入力を処理できないため、反対のコードを記述しました。列番号を入力し、列名を出力します。

?[26~64+rd0<LP]dsLxP
 dc exccol.dc 
 326676 
 ROFL 
1

Matlab 38文字


大文字のみで動作します。小文字でも動作する必要があるかどうかはわかりません(例ではなし)。

x=input('')'-64;26.^(size(x)-1:-1:0)*x

新しい行が37(セミコロンを省略)だけをカウントしない場合:

x=input('')'-64
26.^(size(x)-1:-1:0)*x

Matlabは多くの言語に勝っています。誰がそれを期待するでしょう。

例:

Input: 'ROFL' (dont forget the '' )
Output: ans = 326676
1
George

php 29文字:


while($i++!=$t)$c++;echo$c+1;
  • register_globals = Onを想定
  • error_reporting = 0と仮定
  • ウェブサーバー経由で呼び出す?i = A&t = ABC
1
elias

Python:88文字

リスト内包表記の使用:

s=input()
print sum([((26**(len(s)-i-1))*(ord(s[i])-64)) for i in range(len(s))])
1

K 3.2(13文字)

26_sv -64+_ic

使用法:

  26_sv -64+_ic"ROFL"
326676

説明:

  • 上記のように、Kは右から左に評価するため、_ic関数はその右にあるものをすべて取り、整数値に変換します。これには、単一の文字と文字ベクトルの両方が含まれます
  • -64は、一連の基本値を取得する整数ベクトルの各アイテムに追加されます
  • _svは2つの引数を取ります。左側の1つは基数26、右側の1つはオフセット値の整数ベクトルです。
1
afshin

Excel VBA、19文字:

range( "WTF")。Column

1
Patrick Honorez

Python(47文字)

reduce(lambda a,b:a*26+ord(b)-64,raw_input(),0)

大文字でのみ動作します

1
amashi

Python

import string

letters = string.uppercase
colnum = lambda s: sum((letters.index(let)+1)*26**idx for idx, let in enumerate(s[::-1]))

print colnum('WTF') 
# 16074
print colnum('ROFL')
# 326676
1
ars

Elang、53/78

シェル、53文字:

F=fun(S)->lists:foldl(fun(C,A)->A*26+C-64end,0,S)end.

モジュール、78文字:

-module(g).
-export([f/1]).
f(S)->lists:foldl(fun(C,A)->A*26+C-64end,0,S).
0
Philip Robinson

F#92文字:)


let e2n(c:string)= c |> Seq.map(fun x->(int)x-64)|> Seq.reduce(fun e a-> a * 26 + e)

0
user318996

移動:106文字

すべての言語の中で最も短いわけではありません。ただし、C、C++、Java、およびC#の中で最も短い場合があります。

package main
import("os"
"fmt")
func main(){t:=0
for _,c := range os.Args[1]{t=t*26+c-64}
fmt.Println(t)}

フォーマット済みバージョン:

package main

import (
    "os"
    "fmt"
)

func main() {
    t := 0
    for _, c := range os.Args[1] {
        t = t*26 + c - 64
    }   
    fmt.Println(t)
}
0
Stephen Hsu

実際のVBA、216個のスペースなし

私も本物のゴルフで失敗します。

Private Sub CB1_Click()
Dim C, S
Range("A1").Select
Do
S = Len(ActiveCell)
x = 0
C = 0
Do
C = (Asc(Mid(ActiveCell, (S - x), 1)) - 64) * (26 ^ x) + C
x = x + 1
Loop Until x = S
ActiveCell.Offset(0, 1) = C
ActiveCell.Offset(1, 0).Activate
Loop Until ActiveCell = ""
End Sub

入力に列Aを使用し、列Bに出力し、VBコマンドボタンクリックで実行します。= D

0
user318967

Groovy:51文字

char[] a=args[0];t=0;for(i in a)t=26*t+i-64;print t

として呼び出す

groovy *scriptname* ROFL

または

groovy -e "char[] a=args[0];t=0;for(i in a)t=26*t+i-64;print t" ROFL

これは基本的にJavaと同じです。範囲とクロージャを使用することでいくつかの可能性を想像しますが、この例では何も思い浮かびませんでした。他の誰かがこれを短くする方法を見つけますか?

残念ながら、クロージャー付きのよりグルーヴィーなバージョンは、少し長くなります。

t=0;args[0].toCharArray().each{t=t*26+it-64};print t
0
DaveG