La gente sigue diciéndome que el cuadrado de un número es el número multiplicado por sí mismo. Esto es obviamente falso. La forma correcta de cuadrar un número es convertirlo en un cuadrado, apilándolo encima de sí mismo una cantidad de veces igual al número de dígitos que tiene, y luego leyendo todos los números del cuadrado resultante, ambos horizontalmente (de solo de izquierda a derecha) y verticalmente (solo de arriba a abajo), y luego sumarlos. Entonces, para el número 123, primero creas el cuadrado:
123
123
123
Luego, toma todas las filas y columnas del cuadrado y las agrega:
123+123+123+111+222+333
Lo que nos da un resultado de 1035.
Para los números negativos, usted apila normalmente (recuerde que solo cuenta el número de dígitos , por lo que el signo negativo no está incluido en la longitud), y luego lee los números horizontales normalmente (con signos negativos), y luego ignora los signos negativos para Los números verticales. Entonces, para el número -144obtenemos el cuadrado:
-144
-144
-144
Lo que nos da -144-144-144+111+444+444, lo que es igual567
Para números con solo un dígito, el cuadrado siempre es igual al número duplicado (leído una vez horizontalmente y una vez verticalmente). Entonces 4nos da
4
Lo que nos da 4+4, lo que es igual8 .
Para números con partes decimales, apile normalmente (recuerde que solo se cuentan los dígitos en la cantidad de veces que apila el número y, por lo tanto, no se cuenta el punto decimal), e ignore los símbolos decimales al leer los números verticales. Por ejemplo, el número 244.2nos da
244.2
244.2
244.2
244.2
Lo que nos da 244.2+244.2+244.2+244.2+2222+4444+4444+2222, lo que es igual14308.8 .
Los números fraccionales o complejos no pueden ser cuadrados.
Tu tarea:
Estoy cansado de cuadrar los números a mano, así que decidí automatizar el proceso. Escríbame un programa o función que tome un flotante o una cadena, lo que prefiera, como entrada y devuelva el resultado de cuadrarlo a mi manera.
Ejemplos:
123 -> 1035
388 -> 3273
9999 -> 79992
0 -> 0
8 -> 16
-6 -> 0
-25 -> 27
-144 -> 567
123.45 -> 167282.25
244.2 -> 14308.8
2 -> 4
-0.45 -> 997.65
0.45 -> 1000.35
Tanteo:
Mis manos se están apretando por escribir todos esos cuadrados, y mi computadora no admite copiar / pegar, por lo que gana la entrada con la menor cantidad de código para escribir (¿medido en bytes por alguna razón?).

244.2No es un número flotante. No se puede convertir a la cadena"244.2".Respuestas:
05AB1E , 7 bytes
Pruébalo en línea!
Explicación
fuente
Jalea ,
1312 bytesUn enlace monádico que acepta una lista de caracteres (un número decimal bien formado, el único cero inicial es un requisito para -1 <n <1 ) y devuelve un número.
Pruébalo en línea!
14 bytes para aceptar y números de retorno (entrada limitada a +/- 10 -5 por
ŒṘ):ŒṘfØDẋ€L$ŒV+⁸S.¿Cómo?
fuente
+€con+la versión de 15 bytes para -1.Haskell,
5956 bytesLa entrada se toma como una cadena.
Pruébalo en línea!
Cómo funciona
fuente
Japt v2 , 16 bytes
¡Pruébelo en línea!
Explicación
fuente
C # (.NET Core),
150141133 bytesGuardado 9 bytes gracias a @TheLethalCoderGuardado otros 8 bytes gracias a @TheLethalCoder
Pruébalo en línea!
Toma una cadena como entrada y genera el número 'cuadrado' como flotante.
Este código sigue el siguiente algoritmo:
Cree una nueva cadena a partir de la entrada, pero sin los puntos decimales y los símbolos, para que podamos obtener nuestra longitud y los números de las columnas desde allí.
Calcule la entrada multiplicada por la longitud de la cadena que creamos en el punto 1.
Para cada columna en nuestro 'cuadrado', cree una nueva cadena con el número de columna y la longitud de la fila y agréguela a nuestro resultado.
Ejemplo:
Entrada:
-135.51355, que tiene una longitud de4.-135.5 * 4 = -542.1111,3333,5555,5555.Si sumamos estos números, obtenemos
15012, que es exactamente lo que generará nuestro programa.fuente
string.Replace(), pero supongo que esa es la única forma en que funciona.iylen flotantes..Lengthno puede convertirse implícitamente en flotante.a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i<l;)r+=int.Parse(new string(c[i++],l));return r;}141 bytes. Podría ahorrar guardando la entrada como afloaty convirtiéndola en una cadena conn+""pero no lo he verificado.Brachylog , 23 bytes
Pruébalo en línea!
Brachylog no va bien con carrozas ...
Explicación:
fuente
Casco , 15 bytes
Toma una cadena y devuelve un número. Pruébalo en línea!
Explicación
Es un poco molesto que la función de análisis incorporada
rdé errores de análisis en las entradas no válidas en lugar de devolver un valor predeterminado, lo que significa que tengo que filtrar explícitamente las columnas que consisten en no dígitos. Si devuelve 0 en entradas mal formadas, podría soltarfΛ±y guardar 3 bytes.fuente
Python 3 ,
95 94 87 8584 bytesTest Suite .
Python 3 , 78 bytes
Banco de pruebas.
El segundo enfoque es un puerto para Python 3 inspirado en la solución de @ officialaimm.
fuente
Python 2 ,
8174 bytes-7 bytes gracias a @Mr. Xcoder :
'/'<iPruébalo en línea!
Explicación:
Say
123.45se da como entrada.[i for i in`x`if"/"<x]da una lista de enteros stringified['1','2','3','4','5'](que también esz). Ahora iteramos ,[x]+zes decir[123.45,'1','2','3','4','5'], multiplicamos cada elemento porlen(z)aquí5y los convertimos en un flotante (para que las cadenas también se conviertan en consecuencia), produciendo[617.25,11111.0,22222.0,33333.0,44444.0,55555.0]. Finalmente calculamossum(...)y obtenemos167282.25.fuente
i.isdigit()con"/"<i<":"i.isdigit()con"/"<i, de hecho, porque ambos.y-tienen códigos ASCII más bajos que los dígitos, y se/encuentra entre ellosJavaScript,
7562 bytesPruébalo en línea
-2 bytes gracias a Arnauld
-5 bytes gracias a Shaggy (aunque la función debe recibir un número, pero ahora veo que muchas otras respuestas también reciben cadena)
fuente
Perl 5 ,
3733 + 1 (-p) =3834 bytesPruébalo en línea!
Usé algunos trucos del código de Dom para afeitar 4 bytes
Explicado:
fuente
-ny-pliteralmente envuelve unwhile(){...}código para que}{salga de eso. Esto se desarma,$_pero si lo usa$\como su variable, todavía se imprimirá, ya que$\se adjunta a cada impresión. Significa que puede almacenar un número o algo en eso y no tener en cuenta$_. No estoy seguro de que haya sido una gran explicación, pero echa un vistazo a los Consejos para jugar golf en el hilo de Perl , ¡estoy seguro de que lo explicará mejor! ¡Me alegro de haber ayudado a tu puntaje!Jalea , 17 bytes
Pruébalo en línea!
fuente
Pyth, 18 bytes
Pruébalo aquí.
fuente
Pyth ,
2120 bytesBanco de pruebas.
Utiliza un enfoque completamente diferente de la respuesta de @ EriktheOutgolfer , que me ayudó a jugar golf 1 byte en el chat, del 22 al 21.
Explicación
K@jkUTQ+s.ev*lKbK*lKv K @ jkUTQ: filtra los dígitos y los asigna a una variable K. m - Mapa. Iterado a través de los dígitos con una variable d v - Evaluar (convertir a flotante). * lKd: multiplica cada dígito de cadena por la longitud de K. s - Suma + - Suma * lKvQ: multiplica el número por la longitud de los dígitos Cadenafuente
Octava ,
10082 bytes¡Muchas gracias @TomCarpenter por enseñarme que las tareas tienen un valor de retorno y ahorrarme
18bytes!Pruébalo en línea!
Ungolfed / Explicación
La forma en que esto funciona es que, básicamente, necesitamos sumar el número
ny multiplicar la suma de las columnas. Sumars' * logspace(0,n-1,n)logra la suma de columnas, por ejemplo, siv=-123.4esa matriz será:Así que solo tenemos que
sumhacerlo y listo.fuente
@(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n))). Pruébalo en línea!Swift 4 ,
139134bytesBanco de pruebas.
Explicación
func f(s:String)- Define una funciónfcon un parámetro de cadena explícitos.let k=s.filter{"/"<$0}- Filtros de los dígitos: Me di cuenta de que tanto-y.tienen valores ASCII más pequeños que todos los dígitos, y/está entre.,-y0. Por lo tanto, acabo de comprobar si"/"es más pequeño que el carácter actual, como lo hice en mi respuesta de Python.print(...)- Imprime el resultado.Float(s)!*Float(k.count)- Convierte la cadena y el número de dígitos en flotante y los multiplica (Swift no permite la multiplicación de flotación e int :()). Entonces agrega el número dexveces, dondexestá el número de dígitos que contiene?k.map{Int(String(repeating:$0,count:k.count))!- sek.map{}asignakcon el valor actual$0.String(repeating:$0,count:k.count)toma cada dígito, crea una cadena dexdígitos idénticos y laFloat(...)!convierte en un número de coma flotante..reduce(0,+)- Obtiene la suma de la lista anterior.Y finalmente
+suma los dos resultados.¡Tomemos un ejemplo!
Digamos que nuestra cadena es
"0.45". En primer lugar, filtramos los dígitos, por lo que nos queda0, 4, 5. Convertimos"0.45"a flotar y se multiplica por el número de dígitos:0.45 * 3 = 1.35. Luego tomamos cada dígito y convertirlo en una cadena de dígitos que repetir hasta que se llene la anchura de la plaza (cuántos dígitos hay):0, 4, 5 -> 000, 444, 555. Sumamos esto,000 + 444 + 555 = 999. Entonces sólo sumar los tiempos:1.35 + 999 = 1000.35.fuente
C #,
139137 bytesGuardado 2 bytes gracias a @Ian H.
Pruébalo en línea!
Versión completa / formateada:
fuente
var d=(n+ ...lugar devar d = (n ....Mathematica, 107 bytes
fuente
PHP,
7888 +1 bytesEjecutar como tubería con
-nR.Puede generar advertencias en PHP 7.1. Reparar
$c,$econ$c>0?$c:0,$epara arreglar.fuente
Python 3 , 68
707377bytesPruébalo en línea!
Recorre cada carácter de dígitos y lo repite por el número total de caracteres de dígitos, lo convierte en un número entero y lo agrega a
n. De esta forma senobtienendtiempos adicionales , la parte horizontal de la suma, junto con la repetición de dígitos, que es la parte vertical. Originalmente utilizadostr.isdigitpero>"/", gracias a otros en este hilo, ahorró muchos bytes. Guarda dos bytes al tomarlosncomo una cadena, pero el resultado es más desordenado.Pruébalo en línea!
fuente