numeros - Code Golf: equivalente numérico de un nombre de columna de Excel
ordenar columnas en excel (30)
El reto
El código más corto por recuento de caracteres que generará el equivalente numérico de una columna de columna de Excel.
Por ejemplo, la columna A
es 1, B
es 2, y así sucesivamente. Una vez que presionas Z
, la siguiente columna se convierte en AA
, luego AB
y así sucesivamente.
Casos de prueba:
A: 1
B: 2
AD: 30
ABC: 731
WTF: 16074
ROFL: 326676
El recuento de códigos incluye entrada / salida (es decir, programa completo).
APL
13 caracteres
Pon el valor en x
:
x←''WTF''
luego cómpralo con:
26⊥(⎕aV⍳x)-65
La única razón por la que J me gana es por los paréntesis. Estoy pensando que debería haber alguna manera de reorganizarlo para evitar la necesidad de ellos, pero ha sido un día largo. Ideas?
(Heh, ¡los programadores de Perl con sus soluciones de más de 30 caracteres son tan lindos!)
Brainf * ck, 81 caracteres (sin espacios en blanco)
,[>>>[->>+++++[-<+++++>]<+<]>[-<+>]<<++++++++[<++++++++>-]<[<->-]<[>>>+<<<-],]>>>
Explicación
,[ // 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
Entonces notará que en realidad no convertí el valor numérico en una cadena de caracteres para imprimir. Eso probablemente arruinaría la diversión. Pero hice el favor de mover el puntero a la celda con el resultado, por lo que al menos es útil para la máquina.
Oye, ¿qué sabes? ¡Le gané a C #!
C # 156 146 118 Caracteres
using System.Linq;class P{static void Main(string[]a){System.Console.Write(
a[0].Aggregate(0,(t,c)=>(t+c-64)*26)/26);}}
Ungolfed:
using System.Linq;
class P
{
static void Main(string[] a)
{
System.Console.Write(a[0]
.Aggregate(0, (t, c) => (t + c - 64) * 26) / 26);
}
}
C #, 148 caracteres
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);}}
Ungolfed:
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 #, 117 111 caracteres
Sin rival en comparación con los gustos de Perl, Ruby y APL, pero una mejora en las otras respuestas C # / Java dadas hasta ahora.
Esto usa la regla de 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);}}
C89, 58 caracteres
s;main(c){while(c=getchar()+1)s=26*s+c-65;printf("%d",s);}
La entrada (stdin) debe contener solo AZ, no se permiten otros caracteres (incluidas las líneas nuevas).
Excel (no hacer trampa), 25 caracteres
Admite hasta XFD:
=COLUMN(INDIRECT(A1&"1"))
Instalación:
- Pon la fórmula en la celda A2.
Uso:
- Ingrese la cadena de columna en la celda A1.
- Lea el resultado en la celda A2.
54 caracteres, más muchas instrucciones
Admite ROFL también:
(A2) =MAX(B:B)
(B2) =IFERROR(26*B1+CODE(MID(A$1,ROW()-1,1))-64,0)
Instalación:
- Borre toda la hoja de cálculo.
- Pon la fórmula (A2) en la celda A2.
- Pon la fórmula (B2) en la celda B2.
- Llene la fórmula (B2) lo más abajo posible.
Uso:
- Ingrese la cadena de columna en la celda A1.
- Lea el resultado en la celda A2.
Explicación de conceptos - Excelcification
Bonito. Escribí mi propia versión de esto con un poco más de explicación hace mucho tiempo en http://aboutdev.wordpress.com/2009/12/19/excelcification-brain-teaser-code/ . ¡Aunque no es una versión bastante optimizada!
FYI. La aritmética de la base 26 se llama hexavigesimal y la columna máxima de Excel es XFD, que convierte a 16383 (usando 0 como la primera celda) que es casualmente exactamente 2 ^ 14 celdas .
¿Alguien puede adivinar por qué es 2 ^ 14?
Haskell, 50 51 56 caracteres
main=interact$show.foldl(/x->(26*x-64+).fromEnum)0
Uso:
~:166$ echo -n "ROFL" | ./a.out
326676
~:167$ echo -n "WTF" | ./a.out
16074
Python, 64 49 caracteres
s=0
for c in raw_input():s=26*s+ord(c)-64
print s
También puede reemplazar raw_input()
con input()
para reducir el recuento de caracteres por 4, pero eso requiere que la entrada contenga comillas alrededor.
Y aquí hay una subrutina que muestra 47 caracteres:
f=lambda x:len(x)and 26*f(x[:-1])+ord(x[-1])-64
Ruby 1.8.7, 53 50 46 44 24 17 caracteres
p (''A''..$_).count
Uso:
$ echo -n ROFL | ruby -n a.rb 326676 $ echo -n WTF | ruby -n a.rb 16074 $ echo -n A | ruby -n a.rb 1
Ruby 1.9, 21 caracteres
p''A''.upto(gets).count
Pruebas:
$ echo -n A| ruby x.rb
1
$ echo -n WTF| ruby x.rb
16074
$ echo -n ROFL| ruby x.rb
326676
k4 (kdb +), 11 caracteres
26/:1+.Q.A?
Explicación:
- k4 analiza a la izquierda de la derecha
-
.QA
se define dentro de k4 - es el vector"ABC...XYZ"
-
?
es el operador de búsqueda - el índice de la primera coincidencia para los elementos en el yg dentro del x arg - +1 para compensar el índice
-
26/:
para convertir a la base 26
Una advertencia: esto solo funcionará cuando se pasen los tipos enumerados:
26/:1+.Q.A? "AD"
30
26/:1+.Q.A? "WTF"
16074
pero:
26/:1+.Q.A? ,"A"
1
Common Lisp, 103 128 caracteres
(defun x(s)(reduce(lambda(x y)(+(* 26 x)y))(map ''vector(lambda(b)(-(char-code b)(char-code #/A)-1))s)))
Excel, 9 caracteres :)
Use la herramienta adecuada para el trabajo:
=COLUMN()
Golfscript - 16 caracteres
[0]/+{31&/26*+}*
$ echo -n WTF | ./golfscript.rb excel.gs
16074
$ echo -n ROFL | ./golfscript.rb excel.gs
326676
Java: 112 124 caracteres
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);}}
JavaScript 1.8: 66 caracteres
function a(p)Array.reduce(p,function(t,d)t*26+d.charCodeAt()-64,0)
Javascript 1.8: 72 caracteres
function a(p)(t=0,p.replace(/./g,function(d)t=t*26+d.charCodeAt()-64),t)
JavaScript 1.6: 83 caracteres
function a(p){t=0;p.split("").map(function(d){t=t*26+d.charCodeAt(0)-64});return t}
JavaScript: 95 caracteres
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 caracteres
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}
Uso:
a("A") // 1
a("B") // 2
a("AD") // 30
a("ABC") // 731
a("WTF") // 16074
a("ROFL") // 326676
MATLAB: 24 caracteres
polyval(input('''')-64,26)
Uso:
>> polyval(input('''')-64,26)
(after pressing enter) ''WTF''
ans =
16074
Nota: Puede obtener hasta 16 caracteres si pre-almacena la cadena en x
, pero pensé que era trampa:
>> x = ''WTF''
x =
WTF
>> polyval(x-64,26)
ans =
16074
PHP - 73 caracteres
$n=$argv[1];$s=$i=0;while($i<strlen($n))$s=$s*26+ord($n[$i++])-64;echo$s;
Uso:
php -r ''$n=$argv[1];$s=$i=0;while($i<strlen($n))$s=$s*26+ord($n[$i++])-64;echo$s;'' AA
> 27
Perl, 34 caracteres
map$/=26*$/-64+ord,pop=~/./g;print
Gracias a mobrule por varias sugerencias.
Perl, 36 34 33 31 30 17 15 11 caracteres
$_=()=A..$_
Uso:
$ echo -n WTF | perl -ple ''$_=()=A..$_''
16074
Reducido a 17 usando eco -n para evitar una llamada de chop
.
Reducido a 15 usando decir en lugar de imprimir.
Reducido a 11 usando -p en lugar de decir.
Explicación: A
se evalúa en contexto de cadena y A..$_
construye una lista que comienza en "A" y aumenta la cadena hasta la cadena de entrada. Perl interpreta el operador ++
(y por lo tanto ..
) en cadenas en un contexto alfabético, por ejemplo, $_="AZ";$_++;print
salidas BA
.
=()=
(alias operador "goatse" ) fuerza una expresión a ser evaluada en el contexto de la lista, y devuelve el número de elementos devueltos por esa expresión, es decir, $scalar = () = <expr>
corresponde a @list = <expr>; $scalar = @list
@list = <expr>; $scalar = @list
.
Powershell, 42 caracteres
[char[]]$args[($s=0)]|%{$s=$s*26+$_-64};$s
J , 17 12 10 caracteres
26#.64-~av
Ejemplo:
26#.64-~av ''WTF''
16074
Explicación:
- J analiza de derecha a izquierda.
-
av
devuelve una lista de los índices ascii de cada uno de los caracteres en su argumento, por lo que, por ejemplo,av''ABC''
devuelve65 66 67
. - Luego restamos 64 de cada elemento de esa lista con el verbo
64-~
. - Luego convertimos la lista a la base 26 usando el
#.
verbo.
Clojure:
user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "AD"))
30
user> (reduce #(+ (* 26 %1) %2) (map #(- (int %) 64) "ROFL"))
326676
51 caracteres, más el número de caracteres en la cadena de entrada.
Common Lisp, 81 caracteres
(defun y(s)(reduce(lambda(x y)(+(* 26 x)(-(char-code y)64)))s :initial-value 0))
Es curioso que, como nuevo usuario, pueda publicar mi propia respuesta pero no hacer comentarios sobre la de otra persona. Oh, bueno, ¡disculpas si estoy haciendo esto mal!
Common Lisp, 86 caracteres.
(defun z(s)(let((a 0))(map nil(lambda(v)(setf a(+(* 26 a)(digit-char-p v 36)-9)))s)a))
DO:
int r=0;
while(*c)r=r*26+*c++-64;
La cadena se almacena en ''c'', el valor está en ''r''.
Python - 63 caracteres
>>> f = lambda z: reduce (lambda x, y: 26 * x + y, [ord (c) -64 para c en z])
>>> f (''ROFL'')
326676
Scala, 30 caracteres
print((0/:args(0))(_*26+_-64))"
Ejemplo:
C:/>scala -e "print((0/:args(0))(_*26+_-64))" AD
30