Excelの列文字列に相当する数値を出力する、文字数による最短コード。
たとえば、A
列は1、B
は2などです。 Z
を押すと、次の列はAA
になり、次にAB
などになります。
A: 1
B: 2
AD: 30
ABC: 731
WTF: 16074
ROFL: 326676
コードカウントには、入力/出力(完全なプログラム)が含まれます。
_$_=()=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
_に対応します。
ジョブに適したツールを使用します。
=COLUMN()
26#.64-~av
例:
26#.64-~av 'WTF'
16074
説明:
av
は、引数内の各文字のASCIIインデックスのリストを返します。たとえば、av'ABC'
は65 66 67
を返します。64-~
を使用して、そのリストの各要素から64を引きます。#.
動詞を使用してリストを基数26に変換します。,[>>>[->>+++++[-<+++++>]<+<]>[-<+>]<<++++++++[<++++++++>-]<[<->-]<[>>>+<<<-],]>>>
,[ // 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#を打ち負かしました!
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
13文字
x
に値を入れます:
x←'WTF'
次にそれを計算します:
26⊥(⎕aV⍳x)-65
Jが私をbeatった唯一の理由は、括弧が原因でした。それらの必要性を避けるためにそれを再配置する何らかの方法があるべきだと思っていますが、それは長い一日でした。アイデア?
(ええ、あなたのPerlプログラマーは30以上のキャラクターソリューションを持っているのがとてもかわいいです!)
XFDまでサポート:
=COLUMN(INDIRECT(A1&"1"))
インストール:
使用法:
ROFLもサポート:
(A2) =MAX(B:B)
(B2) =IFERROR(26*B1+CODE(MID(A$1,ROW()-1,1))-64,0)
インストール:
使用法:
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);
}
}
[0]\+{31&\26*+}*
$ echo -n WTF | ./golfscript.rb Excel.gs
16074
$ echo -n ROFL | ./golfscript.rb Excel.gs
326676
main=interact$show.foldl(\x->(26*x-64+).fromEnum)0
使用法:
~:166$ echo -n "ROFL" | ./a.out
326676
~:167$ echo -n "WTF" | ./a.out
16074
26/:1+.Q.A?
説明:
.Q.A
はk4内で定義されます-ベクトル"ABC...XYZ"
?
は検索演算子です-x arg内のy argの項目に最初に一致するインデックス26/:
基数26に変換する注意点-これは、リストされたタイプが渡される場合にのみ機能します:
26/:1+.Q.A? "AD"
30
26/:1+.Q.A? "WTF"
16074
しかし:
26/:1+.Q.A? ,"A"
1
_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
_
function a(p)Array.reduce(p,function(t,d)t*26+d.charCodeAt()-64,0)
function a(p)(t=0,p.replace(/./g,function(d)t=t*26+d.charCodeAt()-64),t)
function a(p){t=0;p.split("").map(function(d){t=t*26+d.charCodeAt(0)-64});return t}
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}
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
[char[]]$args[($s=0)]|%{$s=$s*26+$_-64};$s
スカラ、30文字
print((0/:args(0))(_*26+_-64))"
例:
C:\>scala -e "print((0/:args(0))(_*26+_-64))" AD
30
(defun x(s)(reduce(lambda(x y)(+(* 26 x)y))(map 'vector(lambda(b)(-(char-code b)(char-code #\A)-1))s)))
いいね私はこれについて自分のバージョンをもう少し説明して http://aboutdev.wordpress.com/2009/12/19/excelcification-brain-teaser-code/ 。最適化されたバージョンではありませんが!
FYI。基数26の算術演算は hexavigesimal およびExcelの最大列は[〜#〜] xfd [〜#〜]であり、16383に変換されます(0を使用偶然正確に2 ^ 14セルです。
なぜ2 ^ 14なのか誰にも推測できますか?
s;main(c){while(c=getchar()+1)s=26*s+c-65;printf("%d",s);}
入力(stdin)にはA〜Zのみを含める必要があり、他の文字(改行を含む)は使用できません。
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);}}
一般的なLISP、86文字。
(defun z(s)(let((a 0))(map nil(lambda(v)(setf a(+(* 26 a)(digit-char-p v 36)-9)))s)a))
Python-63文字
>>> f = lambda z:reduce(lambda x、y:26 * x + y、[ord(c)-64 for c for z]))
>>> f( 'ROFL')
326676
map$\=26*$\-64+ord,pop=~/./g;print
いくつかの提案をしてくれたmobruleに感謝します。
Clojure:
user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "AD"))
30
user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "ROFL"))
326676
51文字、および入力文字列の文字数。
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);
}
}
C:
int r=0;
while(*c)r=r*26+*c++-64;
文字列は「c」に保存され、値は「r」に保存されます。
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
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
一般的なLISP、81文字
(defun y(s)(reduce(lambda(x y)(+(* 26 x)(-(char-code y)64)))s :initial-value 0))
おもしろいことに、新しいユーザーとして自分の回答を投稿できますが、他のユーザーのコメントは投稿できません。まあ、これを間違えたらおaびします!
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
$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
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);}}
p('A'..$*[0]).count
使用法:
$ Ruby a.rb ABC
731
ワズーオックス:
echo -n WTF | Perl -ple '$ =( A .. $)=='
これにより、新しい行が出力されるため、シェルで回答が読みやすくなります。
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
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;
for($a=A;++$c,$a++!=$argv[1];);echo$c;
使用法、例.
php -r 'for($a=A;++$c,$a++!=$argv[1];);echo$c;' WTF
with(Prompt())for(l=length,i=0,v=i--;++i<l;)v+=(charCodeAt(l-1-i)-64)*Math.pow(26,i);alert(v)
必要な文字列を変数wに保存します。
w←'rofl'
文字が小文字であると仮定します:
26⊥⎕a⍳w
文字が大文字であると仮定します:
26⊥⎕A⍳w
大/小文字混合または大文字と小文字の区別(14文字ですが、改善される可能性があります):
26⊥⊃⌊/⎕a⎕A⍳¨⊂w
Smalltalk arguments first reverse inject:0into:[:o :e|o*26+e digitValue]
x=0 for c in(...):gfind(".")do x=x*26-64+c:byte()end print(x)
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の達人の一部は、もっと小さなものを思い付くと確信しています。
chop($l=<>);$_=A;$.++,$_++while$_ ne$l;die$.,$/
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
_
制限事項:
ノート:
とにかく、セルに=C("A")
、=C("ABC")
などを入力すると、最初の4つのテストケースで機能します。最後の2つはエラーになります。
F#(37文字):
Seq.fold (fun n c -> int c-64+26*n) 0
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);}}
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);
}
}
大文字の入力を想定しています(コマンドライン引数を使用)。トリックのない明らかなアプローチ。
フィルター: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
_は必要ありません。
ファクター:47文字
reverse [26 swap ^ swap 64-*] map-index sum
私の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};
p ("A"..$*[0]).to_a.size
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
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
プロローグ: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? はい
(逆を行います)
dc
は文字入力を処理できないため、反対のコードを記述しました。列番号を入力し、列名を出力します。
?[26~64+rd0<LP]dsLxP
dc exccol.dc 326676 ROFL
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
php 29文字:
while($i++!=$t)$c++;echo$c+1;
リスト内包表記の使用:
s=input()
print sum([((26**(len(s)-i-1))*(ord(s[i])-64)) for i in range(len(s))])
26_sv -64+_ic
使用法:
26_sv -64+_ic"ROFL"
326676
説明:
range( "WTF")。Column
reduce(lambda a,b:a*26+ord(b)-64,raw_input(),0)
大文字でのみ動作します
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
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).
let e2n(c:string)= c |> Seq.map(fun x->(int)x-64)|> Seq.reduce(fun e a-> a * 26 + e)
移動: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)
}
私も本物のゴルフで失敗します。
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
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