ordenar numeros numericos numerar numeracion funciones datos consecutivos condiciones con como columnas celdas automaticamente automatica excel code-golf

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:

  1. Pon la fórmula en la celda A2.

Uso:

  1. Ingrese la cadena de columna en la celda A1.
  2. 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:

  1. Borre toda la hoja de cálculo.
  2. Pon la fórmula (A2) en la celda A2.
  3. Pon la fórmula (B2) en la celda B2.
  4. Llene la fórmula (B2) lo más abajo posible.

Uso:

  1. Ingrese la cadena de columna en la celda A1.
  2. 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'' devuelve 65 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