チャレンジ
Excelの列文字列に相当する数値を出力する文字数による最短のコード。
たとえば、A
列は1、2 B
、というように続きます。を押すZ
と、次の列は、、というAA
ようAB
になります。
テストケース:
A: 1
B: 2
AD: 30
ABC: 731
WTF: 16074
ROFL: 326676
コードカウントには、入力/出力(つまり完全なプログラム)が含まれます。
仕事に適したツールを使用します。
=COLUMN()
$_=()=A..$_
使用法:
$ echo -n WTF | perl -ple '$_=()=A..$_'
16074
chop
呼び出しを回避するためにecho-nを使用することにより、17に減少しました。
印刷の代わりにsayを使用することで15に削減されました。
sayの代わりに-pを使用すると、11に減少します。
説明:
A
文字列コンテキストで評価されA..$_
、「A」で始まり、入力文字列まで文字列をインクリメントするリストを作成します。Perlは、アルファベットのコンテキストで文字列の++
演算子(したがって..
)を解釈するため、たとえば、を$_="AZ";$_++;print
出力しますBA
。
=()=
(別名「goatse」演算子)は、式をリストコンテキストで評価するように強制し、その式によって返される要素の数を返します。つまり、に$scalar = () = <expr>
対応し@list = <expr>; $scalar = @list
ます。
26#.64-~av
例:
26#.64-~av 'WTF'
16074
説明:
av
引数内の各文字のASCIIインデックスのリストを返すため、たとえば。をav'ABC'
返します65 66 67
。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 | ルビー-na.rb 326676 $ echo -n WTF | ルビー-na.rb 16074 $ echo -n A | ルビー-na.rb 1
13文字
値を入れてくださいx
:
x←'WTF'
次に、次のように計算します。
26⊥(⎕aV⍳x)-65
Jが私を倒した唯一の理由は括弧のためです。それらの必要性を回避するためにそれを再配置する方法があるべきだと私は思っていますが、それは長い一日でした。アイデア?
(ええと、30以上のキャラクターソリューションを使ったPerlプログラマーはとてもかわいいです!)
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
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
26/:1+.Q.A?
説明:
.Q.A
k4内で定義されます-それはベクトルです"ABC...XYZ"
?
検索演算子です-xarg内のyarg内のアイテムの最初の一致のインデックス26/:
ベース26に変換する1つの注意点-これは、リストされたタイプが渡された場合にのみ機能します。
26/:1+.Q.A? "AD"
30
26/:1+.Q.A? "WTF"
16074
しかし:
26/:1+.Q.A? ,"A"
1
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
Scala、30文字
print((0/:args(0))(_*26+_-64))"
例:
C:\>scala -e "print((0/:args(0))(_*26+_-64))" AD
30
s;main(c){while(c=getchar()+1)s=26*s+c-65;printf("%d",s);}
入力(stdin)にはAZのみを含める必要があり、他の文字(改行を含む)は使用できません。
良い。私はずっと前にhttp://aboutdev.wordpress.com/2009/12/19/excelcification-brain-teaser-code/でこれの私自身のバージョンをもう少し説明で書きました 。完全に最適化されたバージョンではありませんが!
ご参考までに。ベース26の算術演算はヘキサビゲシマルと呼ばれ、Excelの最大列はXFDであり、16383(最初のセルとして0を使用)に変換されます。これは偶然にも正確に2^14セルです。
なぜそれが2^14であるかを誰かが推測できますか?
(defun x(s)(reduce(lambda(x y)(+(* 26 x)y))(map 'vector(lambda(b)(-(char-code b)(char-code #\A)-1))s)))
Perl、Ruby、APLのようなものと比較してコンテストはありませんが、これまでに提供された他のC#/Javaの回答が改善されています。
これはホーナー法を使用します。
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);}}
map$\=26*$\-64+ord,pop=~/./g;print
いくつかの提案をしてくれたmobruleに感謝します。
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
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);
}
}
Python-63文字
>>> f = lambda z:reduce(lambda x、y:26 * x + y、[ord(c)-64 for c in z])
>>> f('ROFL')
326676
Common Lisp、86文字。
(defun z(s)(let((a 0))(map nil(lambda(v)(setf a(+(* 26 a)(digit-char-p v 36)-9)))s)a))
Clojure:
user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "AD"))
30
user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "ROFL"))
326676
51文字に加えて、入力文字列の文字数。
C:
int r=0;
while(*c)r=r*26+*c++-64;
文字列は「c」に格納され、値は「r」に格納されます。
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
p('A'..$*[0]).count
使用法:
$ ruby a.rb ABC
731
$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);}}
Common Lisp、81文字
(defun y(s)(reduce(lambda(x y)(+(* 26 x)(-(char-code y)64)))s :initial-value 0))
新しいユーザーとして、自分の回答を投稿することはできますが、他の人の回答にコメントすることはできません。まあ、これを間違えたらお詫びします!
polyval(input('')-64,26)
使用法:
>> polyval(input('')-64,26)
(after pressing enter) 'WTF'
ans =
16074
注:文字列をに事前に保存すると、 16文字まで減らすことができますがx
、不正行為だと思いました。
>> x = 'WTF'
x =
WTF
>> polyval(x-64,26)
ans =
16074
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$.,$/
with(prompt())for(l=length,i=0,v=i--;++i<l;)v+=(charCodeAt(l-1-i)-64)*Math.pow(26,i);alert(v)
x=0 for c in(...):gfind(".")do x=x*26-64+c:byte()end print(x)
wazoox:
echo -n WTF | perl -ple'$ =()= A .. $ '
これにより、新しい行が出力されるため、シェルで回答が読みやすくなります。
Smalltalk arguments first reverse inject:0into:[:o :e|o*26+e digitValue]
PHP:5655文字
for($i='a';$i++!=strtolower($argv[1]);@$c++){}echo++$c;
PHP:大文字の場合のみ4443文字
for($i='A';$i++!=$argv[1];@$c++){}echo++$c;
Applescript:188
これは188文字の必須のapplescriptです。これは、非冗長にするのが非常に難しい言語です。また、これまでの言語の中で最も長い答えでもあります。誰かがそれを短くする方法を知っているなら、共有してください。
実行時に {o、c}を{0、0}に設定します (sのアイテム1)の文字の逆にiを繰り返します mを整数として26^cに設定します cをc+1に設定します oをo+((iのASCII番号)-64)*mに設定します リピート終了 エンドラン
使用法:
osascript /path/to/script.scpt ROFL
for($a=A;++$c,$a++!=$argv[1];);echo$c;
使用法、例えば
php -r 'for($a=A;++$c,$a++!=$argv[1];);echo$c;' WTF
目的の文字列を変数wに格納します。
w←'rofl'
文字が小文字であると仮定します。
26⊥⎕a⍳w
文字が大文字であると仮定します。
26⊥⎕A⍳w
大文字と小文字が混在しているか不明(14文字ですが、改善される可能性があります):
26⊥⊃⌊/⎕a⎕A⍳¨⊂w
php 29文字:
while($i++!=$t)$c++;echo$c+1;
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
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
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);
}
}
(コマンドライン引数を介して)大文字の入力を想定しています。トリックのない明白なアプローチ。
(反対のことをします)
dc
文字入力を処理できないため、反対のコードを記述しました。列番号を入力し、列名を出力します。
?[26~64+rd0<LP]dsLxP
dc exccol.dc 326676 ROFL
私のJavascriptソリューションはわずか82文字の長さで、基数36でInteger.parseIntを使用します。誰かがこれをこのスレッドのJavascriptセクションに追加できれば問題ありません。:-)
a=function(b){t=0;b.split('').map(function(n){t=parseInt(n,36)-9+t*26});return t};
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?>
使用法: php filename.php ROFL
出力: 326676
reduce(lambda a,b:a*26+ord(b)-64,raw_input(),0)
大文字でのみ機能します
Matlab38文字
大文字でのみ機能します。小文字でも機能する必要があるかどうかはわかりません(例ではありません)。
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
ファクター:47文字
リバース[26スワップ^スワップ64-*]マップインデックス合計
プロローグ: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? はい
リスト内包表記の使用:
s=input()
print sum([((26**(len(s)-i-1))*(ord(s[i])-64)) for i in range(len(s))])
OOBasic:178文字、インデント空白をカウントしない
このバージョンは、すべてのテストケースに合格しています。このナンバリングシステムを使ったスプレッドシートがあるという事実を「利用」しなければ、ゴルフはもっとうまくいくだろうと私は思う。それが特に役に立たない理由については、以下の元のバージョンのメモを参照してください。スコアを下げるのに一生懸命はしませんでした。
また、明らかな理由から、これはOOcalcスプレッドシートからマクロとして実行した場合にのみ機能することに注意してください。
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")
入力すると、最初の4つのテストケースで機能します。=C("ABC")
最後の2つはエラーになります。
フィルター: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
現在のシェルにその変数が設定されていないことが確実な場合は、おそらく必要ありません。
F#(37文字):
Seq.fold (fun n c -> int c-64+26*n) 0
26_sv -64+_ic
使用法:
26_sv -64+_ic"ROFL"
326676
説明:
range( "WTF")。Column
p ("A"..$*[0]).to_a.size
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
私も本物のゴルフに失敗します。
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
エラン、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 ea-> a * 26 + e)
Go: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)
}
Excel-99文字
配列数式として入力-Excelの加算{}はカウントしていません
=SUM((CODE(MID(A1,ROW(INDIRECT("1:" & LEN(A1))),1))-64)*26^(LEN(A1)-ROW(INDIRECT("1:" & LEN(A1)))))
演算子が次のように定義された新しい言語はどうですか
# -EXCELの= COLUMN()を文字列化された数値として返します
、 -文字列で読み取る
。 -文字列を書き出す
次に、それを行うためのプログラムは
、#。