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 -144
obtenemos 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 4
nos 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.2
nos 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.2
No 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.5
1355
, 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.i
yl
en flotantes..Length
no 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 afloat
y 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
r
dé 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 :
'/'<i
Pruébalo en línea!
Explicación:
Say
123.45
se 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]+z
es decir[123.45,'1','2','3','4','5']
, multiplicamos cada elemento porlen(z)
aquí5
y 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
-n
y-p
literalmente 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
fuente
Octava ,
10082 bytes¡Muchas gracias @TomCarpenter por enseñarme que las tareas tienen un valor de retorno y ahorrarme
18
bytes!Pruébalo en línea!
Ungolfed / Explicación
La forma en que esto funciona es que, básicamente, necesitamos sumar el número
n
y multiplicar la suma de las columnas. Sumars' * logspace(0,n-1,n)
logra la suma de columnas, por ejemplo, siv=-123.4
esa matriz será:Así que solo tenemos que
sum
hacerlo 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ónf
con 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 dex
veces, dondex
está el número de dígitos que contiene?k.map{Int(String(repeating:$0,count:k.count))!
- sek.map{}
asignak
con el valor actual$0
.String(repeating:$0,count:k.count)
toma cada dígito, crea una cadena dex
dí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,$e
con$c>0?$c:0,$e
para 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 sen
obtienend
tiempos adicionales , la parte horizontal de la suma, junto con la repetición de dígitos, que es la parte vertical. Originalmente utilizadostr.isdigit
pero>"/"
, gracias a otros en este hilo, ahorró muchos bytes. Guarda dos bytes al tomarlosn
como una cadena, pero el resultado es más desordenado.Pruébalo en línea!
fuente