Cuadrar un número a mi manera

Gryphon 08/21/2017. 20 answers, 1.959 views
code-golf number

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, apilarlo encima de sí mismo varias veces igual a la cantidad de dígitos que tiene, y luego leer todos los números del cuadrado resultante, ambos horizontalmente (desde de izquierda a derecha solamente) y verticalmente (de arriba a abajo solamente) y luego sumarlos. Por lo tanto, para el número 123, primero crea el cuadrado:

123
123
123 

Luego, toma todas las filas y columnas del cuadrado y las agrega juntas:

123+123+123+111+222+333 

Lo que nos da un resultado de 1035 .

Para números negativos, apila normalmente (recuerde que solo cuenta el número de digits , por lo que el signo negativo no está incluido en la longitud), y luego lea los números horizontales normalmente (con signos negativos), y luego ignore 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 equivale a 567

Para números con un solo dígito, el cuadrado siempre es igual al número duplicado (leer una vez horizontalmente y una vez verticalmente). Entonces 4 nos da

4 

Lo que nos da 4+4 , que equivale a 8 .

Para números con partes decimales, apilar normalmente (recuerde que solo se cuentan los digits en la cantidad de veces que se 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 equivale a 14308.8 .

Los números fraccionarios o complejos no se pueden cuadrar.

Tu tarea:

Estoy cansado de cuadrar los números a mano, así que decidí automatizar el proceso. Escríbeme un programa o función que tome una flotación o cuerda, lo que prefiera, como entrada y devuelve 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 abarrotando de escribir todos esos cuadrados, y mi computadora no admite copiar / pegar, por lo que la entrada con la menor cantidad de código para escribir (medida en bytes por alguna razón) ¡gana!

5 Comments
Gryphon 07/29/2017
Me di cuenta de que esto no estaba en la caja de arena por mucho tiempo (solo un poco más de un día), pero ya tenía 7 votos positivos, así que pensé que probablemente estaba listo para publicar.
1 Leaky Nun 07/29/2017
"123.45" y "244.2" no son flotantes válidos en sí mismo porque la computadora almacena el número en binario. Esto normalmente no es un problema hasta que el problema se basa en la representación decimal.
3 Leaky Nun 07/29/2017
@Gryphon Aquí es donde falla. 244.2 no es un número flotante. No se puede convertir a la cadena "244.2" .
2 Leaky Nun 07/29/2017
@Gryphon Pero comportamientos como este lo hacen muy inconveniente.
7 Gryphon 07/29/2017
¿Por qué tres votos cercanos? Si 11 personas pueden responder la pregunta, ¡creo que es bastante clara!

20 Answers


Erik the Outgolfer 07/29/2017.

05AB1E , 7 bytes

þSDg×+O 

¡Pruébalo en línea!

Explicación

þSDg×+O Implicit input
þ       Keep digits
 S      Get chars
  D     Duplicate
   g    Length
    ×   Repeat string(s)
     +  Add (implicit input added to all elements)
      O Sum 
4 comments
3 Jonathan Allan 07/29/2017
Ooo explicación cuando puedes por favor
1 Jonathan Allan 07/29/2017
También señalaría que el cero inicial único es un requisito en la entrada para -1 <entrada <1 (es decir, 0.45 y 0.45 son entradas diferentes pero el mismo número, solo el primero es aceptable)
Erik the Outgolfer 07/29/2017
@JonathanAllan Este último no se maneja de todos modos.
Erik the Outgolfer 07/29/2017
@JonathanAllan Hecho.

Jonathan Allan 07/29/2017.

Jelly , 13 12 bytes

fØDẋ€L$ŒV+VS 

Un enlace monádico que acepta una lista de caracteres (un número decimal bien formado, siendo el único cero inicial un requisito para -1 < n < 1 ) y devuelve un número.

Try it online!

14 bytes para aceptar y devolver números (entrada limitada a +/-10-5 por ŒṘ ): ŒṘfØDẋ€L$ŒV+⁸S .

¿Cómo?

fØDẋ€L$ŒV+VS - Link: list of characters         e.g. "-0.45"
 ØD          - yield digit characters                "0123456789"
f            - filter keep                           "045"
      $      - last two links as a monad:
     L       -   length (number of digit characters) 3
   ẋ€        -   repeat list for €ach digit          ["000","444","555"]
       ŒV    - evaluate as Python code (vectorises)  [0,444,555]
          V  - evaluate (the input) as Jelly code    -0.45
         +   - addition (vectorises)                 [-0.45,443.55,554.55]
           S - sum                                   997.65 
4 comments
Erik the Outgolfer 07/29/2017
Umm, puedes reemplazar +€ con + en la versión de 15 bytes por -1.
Jonathan Allan 07/29/2017
¡Ya lo hice, gracias!
Erik the Outgolfer 07/29/2017
Umm, no en la versión de 15 bytes. EDITAR: 3 segundos antes de lo previsto, supongo ...
Jonathan Allan 07/29/2017
Sip acaba de notar que dijiste la versión de 15 bytes, ¡gracias de nuevo!

nimi 07/29/2017.

Haskell, 59 56 bytes

f s|l<-filter(>'.')s=0.0+sum(read<$>(s<$l)++[c<$l|c<-l]) 

La entrada se toma como una cadena.

¡Pruébalo en línea!

Cómo funciona

l<-filter(>'.')s      -- let l be the string of all the numbers of the input string
f s   = 0.0 + sum     -- the result is the sum of (add 0.0 to fix the type to float)
   read<$>            -- turn every string of the following list into a number
   s<$l               -- length of l times the input string followed by
   [c<$l|c<-l]        -- length of l times c for each c in l 

ETHproductions 07/29/2017.

Japt v2 , 16 bytes

o\d
l
¬xpV +V*Ng 

Pruébalo en línea!

Explicación

o\d    First line: Set U to the result.
o      Keep only the chars in the input that are
 \d      digits. (literally /\d/g)

l    Second line: Set V to the result.
l    U.length

¬xpV +V*Ng    Last line: implicitly output the result.
¬             Split U into chars.
 x            Sum after
  pV            repeating each V times.
     +V*Ng    Add V * first input (the sum of the horizontals) to the result. 

Ian H. 07/31/2017.

C # (.NET Core), 150 141 133 bytes

Saved 9 bytes thanks to @TheLethalCoder
Guardado otros 8 bytes gracias a @TheLethalCoder

a=>{var c=(a+"").Replace(".","").Replace("-","");int i=0,l=c.Length;var r=a*l;for(;i 

¡Pruébalo en línea!

Toma una cadena como entrada y saca el número 'cuadrado' como un flotador.


Este código sigue el siguiente algoritmo:

  1. Cree una nueva cadena a partir de la entrada, pero sin los puntos y símbolos decimales, para que podamos obtener nuestra longitud y los números de las columnas a partir de ahí.

  2. Calcule la entrada por la longitud de la cadena que creamos en el punto 1.

  3. 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

  1. Si reemplazamos puntos decimales y símbolos obtenemos la cadena 1355 , que tiene una longitud de 4 .
  2. Los tiempos de entrada 4: -135.5 * 4 = -542 .
  3. Ahora creamos nuevas cadenas para cada columna, las analizamos y las agregamos a nuestro resultado:
    1111 , 3333 , 5555 , 5555 .

Si sumamos estos números obtenemos 15012 , que es exactamente lo que producirá nuestro programa.

5 comments
1 Dada 07/31/2017
Bienvenido al sitio, y buena primera respuesta (¡las explicaciones en particular son apreciadas!)!
Ian H. 07/31/2017
@Dada ¡Gracias! Incluso es difícil no estar satisfecho con los bytes que obtuve de cosas como string.Replace() , pero supongo que esa es la única forma en que funciona.
TheLethalCoder 07/31/2017
Podría ser capaz de guardar algunos bytes configurando i y l para flotantes.
Ian H. 07/31/2017
@TheLethalCoder También pensé que, lamentablemente, la indexación no funciona con flotadores, y .Length no se puede convertir implícitamente en flotante.
1 TheLethalCoder 07/31/2017
a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i 141 bytes. Podría ser capaz de guardar tomando entrada como un float y lanzar a una cadena con n+"" pero no lo he marcado.

Erik the Outgolfer 07/29/2017.

Brachylog , 23 bytes

{∋ịṫ}ᶠ⟨≡zl⟩j₎ᵐ;[?]zcịᵐ+ 

¡Pruébalo en línea!

Brachylog no va bien con flotadores ...

Explicación:

{∋ịṫ}ᶠ⟨≡zl⟩j₎ᵐ;[?]zcịᵐ+ Takes string (quoted) input, with '-' for the negative sign
     ᶠ                  Return all outputs (digit filter)
{   }                    Predicate (is digit?)
 ∋                        An element of ? (input)
  ị                       Convert to number (fails if '-' or '.')
   ṫ                      Convert back to string (needed later on)
      ⟨   ⟩             Fork
       ≡                 Identity
         l               Length
                        with
        z                Zip
             ᵐ          Map
            ₎            Subscript (optional argument)
           j              Juxtapose (repeat) (this is where we need strings)
              ;         Pair with literal
               [ ]       List
                ?         ?
                  z     Zip
                   c    Concatenate (concatenate elements)
                     ᵐ  Map
                    ị    Convert to number
                      + Add (sum elements) 

Zgarb 07/29/2017.

Cáscara , 15 bytes

§+ȯṁrfΛ±TṁrSR#± 

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 integrada r proporcione errores de análisis en entradas no válidas en lugar de devolver un valor predeterminado, lo que significa que tengo que filtrar explícitamente las columnas que constan de no dígitos. Si devuelve 0 en las entradas mal formadas, podría soltar fΛ± y guardar 3 bytes.

§+ȯṁrfΛ±TṁrSR#±  Implicit input, e.g. "-23"
             #±  Count of digits: 2
           SR    Repeat that many times: ["-23","-23"]
         ṁr      Read each row (parse as number) and take sum of results: -46
  ȯṁrfΛ±T        This part is also applied to the result of SR.
        T        Transpose: ["--","22","33"]
     fΛ±         Keep the rows that contain only digits: ["22","33"]
   ṁr            Parse each row as number and take sum: 55
§+               Add the two sums: 9 

Mr. Xcoder 07/29/2017.

Python 3 , 95 94 87 85 84 bytes

 def f(i):l=[x for x in i if"/" 

Suite de prueba .

Python 3 , 78 bytes

 lambda x:sum(float(i*len(z))for z in[[i for i in str(x)if"/" 

Banco de pruebas.

El segundo enfoque es un puerto para Python 3 inspirado en la solución de @ officialaimm.


ThePirateBay 07/31/2017.

JavaScript, 75 62 bytes

a=>(b=a.match(/\d/g)).map(b=>a+=+b.repeat(c),a*=c=b.length)&&a 

Pruébalo en línea

-2 bytes thanks to Arnauld
-5 bytes thanks to Shaggy (aunque la función debe recibir un número, pero ahora veo que muchas otras respuestas también reciben cadena)


Xcali 08/05/2017.

Perl 5 , 37 33 + 1 (-p) = 38 34 bytes

 $_*=@n=/\d/g;for$\(@n){$_+=$\x@n} 

¡Pruébalo en línea!

Usé algunos trucos del código de Dom para afeitar 4 bytes

Explained:

 @n=/\d/g;    # extract digits from input
$_*=@n;      # multiply input by number of digits
for$\(@n){   # for each digit:
  $_+=       # add to the input
  $\x@n}     # this digit, repeated as many times as there were digits
             # taking advantage of Perl's ability to switch between strings
             # and numbers at any point 
3 comments
Dom Hastings 07/31/2017
Apareció con un enfoque muy similar, pero logró sacar un par de bytes usando $ \ y saliendo del ciclo: ¡ pruébalo en línea!
Xcali 08/05/2017
Usé algo de tu inspiración para afeitarte. ¿Cuál es el constructo "} {" al final del tuyo? No estoy familiarizado con eso.
Dom Hastings 08/05/2017
Es uno que aprendí de este sitio, básicamente -n y -p literalmente, envuelven un while(){...} alrededor del código así que }{ rompe con eso. Esto desata $_ pero si usa $\ como su variable, seguirá imprimiéndose ya que $\ se agrega a cada impresión. Significa que puedes almacenar el número o algo en eso y descartar $_ . No estoy seguro de si fue una gran explicación, pero eche un vistazo a los Consejos para jugar al golf g en Perl thread, ¡estoy seguro de que lo explicará mejor! ¡Me alegro de haber ayudado a tu puntuación!

Erik the Outgolfer 07/29/2017.

Jelly , 17 bytes

ŒṘfØDẋ€L©$ŒV;ẋ®$S 

¡Pruébalo en línea!


Erik the Outgolfer 07/29/2017.

Pyth, 18 bytes

s+RvQsM*RF_lB@jkUT 

Pruébalo aquí.


Mr. Xcoder 07/29/2017.

Pyth , 21 20 bytes

K@jkUTQ+smv*lKdK*lKv 

Banco de pruebas.

Utiliza un enfoque completamente diferente de la respuesta de @ EriktheOutgolfer , que me ayudó a jugar golf de 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.  Iterados a través de los dígitos con una variable d             v - Evaluar (convertir a flotar).              * 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 Cadena 

officialaimm 07/30/2017.

Python 2 , 81 74 bytes

-7 bytes thanks to @Mr. Xcoder -7 bytes thanks to @Mr. Xcoder : '/'

  • Toma en entero o float, devuelve float.
 lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/" 

¡Pruébalo en línea!

Explicación:

Diga 123.45 como entrada. [i for i in`x`if"/" da una lista de enteros codificados ['1','2','3','4','5'] (que también es z ). Ahora iteramos a través de [x]+z es decir [123.45,'1','2','3','4','5'] , multiplicando cada elemento por len(z) , aquí 5 y convirtiendo cada uno a un Float (para que las cadenas también se conviertan en consecuencia), produciendo [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] . Finalmente calculamos la sum(...) y obtenemos 167282.25 .

4 comments
Mr. Xcoder 07/29/2017
78 bytes . Reemplace i.isdigit() con "/"
1 Mr. Xcoder 07/29/2017
74 bytes . Puede reemplazar i.isdigit() con "/" , de hecho, porque ambos . y - tienen códigos ASCII más bajos que dígitos, / están entre ellos
officialaimm 07/29/2017
@ Mr.Xcoder ¡Muchas gracias!
Mr. Xcoder 07/29/2017
De nada. Lo he portado a Python 3 como una alternativa a mi respuesta

Bruce Forte 07/30/2017.

Octava , 100 82 bytes

Muchas gracias @TomCarpenter por enseñarme que las asignaciones tienen un valor de retorno y me ahorran 18 bytes.

 @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n))) 

¡Pruébalo en línea!

Sin modificar / Explicación

 function f=g(v)
  s=strrep(num2str(abs(v)),'.','')-'0';  % number to vector of digits (ignore . and -)
  n=nnz(s);                              % length of that vector
  f=n*v+sum(sum(s'*logspace(0,n-1,n)))   % add the number n times and sum the columns of the square
end 

La forma en que esto funciona es que básicamente necesitamos agregar el número en sí n veces y luego sumar la suma de las columnas. Sumando s' * logspace(0,n-1,n) logra la suma de columnas, por ejemplo, si v=-123.4 esa matriz será:

 [ 1     10    100   1000;
  2     20    200   2000;
  3     30    300   3000;
  4     40    400   4000 ] 

Así que solo tenemos que sum y hemos terminado.

1 comments
1 Tom Carpenter 07/30/2017
Puede guardar 18 bytes moviéndolo todo a una función anónima @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(‌​s'*logspace(0,n-1,n)‌​)) . ¡Pruébalo en línea!

Mr. Xcoder 07/30/2017.

Swift 4 , 139 134 bytes

 func f(s:String){let k=s.filter{"/"<$0};print(Float(s)!*Float(k.count)+k.map{Float(String(repeating:$0,count:k.count))!}.reduce(0,+))} 

Banco de pruebas.


Explicación

  • func f(s:String) - Define una función f con un parámetro String explícito s .

  • let k=s.filter{"/"<$0} - Filtra los dígitos: Noté que ambos - y . tienen valores ASCII más pequeños que todos los dígitos, y / está entre . , - y 0 . Por lo tanto, acabo de comprobar si "/" es más pequeño que el personaje actual, como lo hice en mi respuesta de Python.

  • print(...) - Imprime el resultado.

  • Float(s)!*Float(k.count) - Convierte tanto el String como el número de dígitos en Float y los multiplica (Swift no permite la multiplicación Float e Int :()). Entonces agrega el número x veces, donde x es la cantidad de dígitos que contiene.

  • k.mapNO maps over k with the current value $0 . - k.map{} asigna k con el valor actual $0 . String(repeating:$0,count:k.count) toma cada dígito, crea una cadena de x dígitos idénticos y Float(...)! lo convierte en un número de punto flotante.

  • .reduce(0,+) - Obtiene la suma de la lista anterior.

  • Y finalmente + suma los dos resultados.


¡Tomemos un ejemplo!

Diga que nuestra cadena es "0.45" . En primer lugar, filtramos los dígitos, por lo que nos quedan 0, 4, 5 . Convertimos "0.45" en Float y multiplicamos por el número de dígitos: 0.45 * 3 = 1.35 . Luego tomamos cada dígito y lo convertimos en una Cadena repitiendo ese dígito hasta que llena el ancho del cuadrado (cuántos dígitos hay): 0, 4, 5 -> 000, 444, 555 . Sumamos esto, 000 + 444 + 555 = 999 . Luego solo agregamos los resultados juntos: 1.35 + 999 = 1000.35 .


TheLethalCoder 07/31/2017.

C #, 139 137 bytes

 using System.Linq;n=>{var d=(n+"").Where(char.IsDigit);return d.Sum(i=>int.Parse(new string(i,d.Count())))+new int[d.Count()].Sum(_=>n);} 

Saved 2 bytes thanks to @Ian H.

¡Pruébalo en línea!

Versión completa / Formateada:

 namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func f = n =>            {
                var d = (n + "").Where(char.IsDigit);
                return d.Sum(i => int.Parse(new string(i, d.Count()))) + new int[d.Count()].Sum(_ => n);
            };

            Console.WriteLine(f(123));
            Console.WriteLine(f(-144));
            Console.WriteLine(f(4));
            Console.WriteLine(f(244.2));

            Console.ReadLine();
        }
    }
} 
2 comments
Ian H. 07/31/2017
Puede guardar 2 bytes al principio usando var d=(n+ ... lugar de var d = (n ...
TheLethalCoder 07/31/2017
@IanH. Olvidé eliminar todos los espacios -_- Eso es lo que obtengo para responder mientras hago una llamada de soporte.

Jenny_mathy 08/09/2017.

Mathematica, 107 bytes

(t=Length[s=#&@@RealDigits[#]//.{a___, 0}:>{a}];If[IntegerPart@#==0,t++];t#+Tr[FromDigits@Table[#,t]&/@s])& 

Titus 08/11/2017.

PHP, 78 88 +1 bytes

 for($e=preg_match_all("#\d#",$n=$argn);~$c=$n[$i++];)$s+=str_repeat($c,$e);echo$s+$n*$e; 

Ejecutar como tubería con -nR .

Puede producir advertencias en PHP 7.1. Repace $c,$e con $c>0?$c:0,$e para corregir.


C McAvoy 07/31/2017.

Python 3 , 68 70 73 77 bytes

 lambda n:sum(float(n)+int(_*sum(x>"/"for x in n))for _ in n if"/"<_) 

¡Pruébalo en línea!

Pasa por cada carácter de un dígito y lo repite por el número de caracteres de dígitos en general, lo convierte en un número entero y lo suma a n . De esta forma n se agrega d veces, la parte horizontal de la suma, junto con la repetición de dígitos, que es la parte vertical. Originalmente utilizado str.isdigit pero >"/" , gracias a otros en este hilo, guardó una gran cantidad de bytes. Ahorra dos bytes tomando n como una cadena, pero la salida es más desordenada.

 lambda n:sum(n+int(_*sum(x>"/"for x in str(n)))for _ in str(n)if"/"<_) 

¡Pruébalo en línea!

Related questions

Hot questions

Language

Popular Tags