Quadrado um número meu caminho

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

As pessoas continuam me dizendo que o quadrado de um número é o número multiplicado por ele mesmo. Isso é obviamente falso. A maneira correta de quadrar um número é transformá-lo em um quadrado, empilhando-o em cima de si mesmo um número de vezes igual ao número de dígitos que possui e, em seguida, lendo todos os números do quadrado resultante, tanto horizontalmente esquerda para a direita apenas) e verticalmente (de cima para baixo apenas) e, em seguida, adicioná-los juntos. Então, para o número 123, você primeiro cria o quadrado:

123
123
123 

Em seguida, você pega todas as linhas e colunas do quadrado e as adiciona juntas:

123+123+123+111+222+333 

O que nos dá um resultado de 1035 .

Para números negativos, você empilha normalmente (lembre-se de contar apenas o número de digits , portanto o sinal negativo não é incluído no comprimento) e depois lê os números horizontais normalmente (com sinais negativos) e ignora os sinais negativos para os números verticais. Então, para o número -144 , obtemos o quadrado:

-144
-144
-144 

O que nos dá -144-144-144+111+444+444 , o que equivale a 567

Para números com apenas um dígito, o quadrado é sempre igual ao número duplicado (lido uma vez na horizontal e uma vez na vertical). Então, 4 nos dá

4 

O que nos dá 4+4 , o que é igual a 8 .

Para números com partes decimais, empilhe normalmente (lembre-se de que apenas os digits são contados no número de vezes que você empilha o número e, portanto, o ponto decimal não é contado) e ignora os símbolos decimais ao ler os números verticais. Por exemplo, o número 244.2 nos dá

244.2
244.2
244.2
244.2 

O que nos dá 244.2+244.2+244.2+244.2+2222+4444+4444+2222 , o que é igual a 14308.8 .

Números fracionários ou complexos não podem ser elevados ao quadrado.

Sua tarefa:

Estou cansado de ajustar números à mão, então decidi automatizar o processo. Escreve-me um programa ou função que usa um float ou string, como você preferir, como entrada e retorna o resultado da quadratura do meu jeito.

Exemplos:

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 

Pontuação:

Minhas mãos estão ficando apertadas de escrever todos os quadrados, e meu computador não suporta copiar / colar, então a entrada com a menor quantidade de código para eu digitar (medido em bytes, por alguma razão?) Ganha!

5 Comments
Gryphon 07/29/2017
Eu percebi que isso não estava na caixa de areia por muito tempo (apenas um pouco mais de um dia), mas ele já tinha 7 votos positivos, então, eu pensei que provavelmente estava pronto para postar.
1 Leaky Nun 07/29/2017
"123.45" e "244.2" não são floats válidos em si, porque o computador armazena o número em binário. Isso normalmente não é um problema até que o problema se baseie na representação decimal.
3 Leaky Nun 07/29/2017
@Gryphon Isto é onde ele falha. 244.2 não é um número flutuante. Não pode ser convertido para a cadeia "244.2" .
2 Leaky Nun 07/29/2017
@Gryphon Mas comportamentos como esse tornam muito inconveniente.
7 Gryphon 07/29/2017
Por que três votos apertados? Se 11 pessoas puderem responder a pergunta, acho que é bem claro!

20 Answers


Erik the Outgolfer 07/29/2017.

05AB1E , 7 bytes

þSDg×+O 

Experimente online!

Explicação

þ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 explicação quando você pode por favor
1 Jonathan Allan 07/29/2017
Também gostaria de observar que o único zero inicial é um requisito na entrada para -1 <entrada <1 (ou seja, 0,45 e 0,45 são entradas diferentes, mas o mesmo número, somente a primeira é aceitável)
Erik the Outgolfer 07/29/2017
@ JonathanAllan O último não é tratado de qualquer maneira.
Erik the Outgolfer 07/29/2017
@JonathanAllan Feito.

Jonathan Allan 07/29/2017.

Geléia , 13 12 bytes

fØDẋ€L$ŒV+VS 

Um link monádico aceitando uma lista de caracteres (um número decimal bem formado, sendo o único zero inicial um requisito para -1 < n < 1 ) e retornando um número.

Try it online!

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

Como?

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
Hum, você pode substituir +€ com + na versão de 15 bytes para -1.
Jonathan Allan 07/29/2017
Já fiz, obrigado embora!
Erik the Outgolfer 07/29/2017
Umm não na versão de 15 bytes. EDIT: 3 segundos cedo demais suponho ...
Jonathan Allan 07/29/2017
Yup só notei que você disse versão de 15 bytes - obrigado novamente!

nimi 07/29/2017.

Haskell, 59 56 bytes

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

A entrada é tomada como uma string.

Experimente online!

Como 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 

Teste online!

Explicação

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
Salvo outros 8 bytes graças a @TheLethalCoder

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

Experimente online!

Utiliza uma string como entrada e gera o número 'quadrado' como float.


Este código segue o seguinte algoritmo:

  1. Crie uma nova string a partir da entrada, mas sem os pontos e símbolos decimais, para que possamos obter nosso comprimento e os números das colunas a partir daí.

  2. Calcule a entrada vezes o comprimento da string que criamos no ponto 1.

  3. Para cada coluna em nosso 'quadrado', crie uma nova string com o número da coluna e a extensão da linha e adicione-a ao nosso resultado.

Exemplo:

Entrada: -135.5

  1. Se substituirmos os pontos e símbolos decimais, obtemos a string 1355 , que tem um comprimento de 4 .
  2. Os tempos de entrada 4: -135.5 * 4 = -542 .
  3. Agora criamos novas strings para cada coluna, analisamos e adicionamos ao nosso resultado:
    1111 , 3333 , 5555 , 5555 .

Se 15012 esses números, obtemos 15012 , que é exatamente o que nosso programa produzirá.

5 comments
1 Dada 07/31/2017
Bem-vindo ao site e boa primeira resposta (as explicações em particular são apreciadas!)!
Ian H. 07/31/2017
@Dada Obrigado! Mesmo difícil, eu estou um tanto insatisfeito com os bytes que ganhei de coisas como string.Replace() , mas eu acho que é a única maneira que funciona!
TheLethalCoder 07/31/2017
Pode ser capaz de salvar alguns bytes, definindo i e l para flutuar.
Ian H. 07/31/2017
@TheLethalCoder Pensando nisso, infelizmente, a indexação não funciona com floats e .Length não pode implicitamente ser convertido em float.
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. Pode salvar inserindo input como float e convertendo para uma string com n+"" mas não verifiquei.

Erik the Outgolfer 07/29/2017.

Brachylog , 23 bytes

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

Experimente online!

Brachylog não vai bem com carros alegóricos ...

Explicação:

{∋ịṫ}ᶠ⟨≡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.

Casca , 15 bytes

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

Toma uma string e retorna um número. Experimente online!

Explicação

É um pouco chato que a função de análise integrada r dê erros de análise em entradas inválidas, em vez de retornar um valor padrão, o que significa que tenho que filtrar explicitamente as colunas que consistem em não dígitos. Se ele retornasse 0 em entradas malformadas, eu poderia diminuir fΛ± e salvar 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"/" 

Suíte de Testes .

Python 3 , 78 bytes

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

Suíte de teste.

A segunda abordagem é uma porta para o Python 3 inspirada na solução do @ 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 

Experimente online

-2 bytes thanks to Arnauld
-5 bytes thanks to Shaggy (eu acho que a função deve receber um número, mas agora eu vejo que muitas outras respostas recebem string também)


Xcali 08/05/2017.

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

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

Experimente online!

Usou alguns truques do código do Dom para raspar 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
Surgiu com uma abordagem muito semelhante, mas conseguiu retirar alguns bytes usando $ \ e saindo do loop: experimente on-line!
Xcali 08/05/2017
Usou alguma inspiração de você para raspar o meu. Qual é o construto "} {" no final do seu? Eu não estou familiarizado com isso.
Dom Hastings 08/05/2017
É um que eu aprendi com este site, basicamente -n e -p literalmente quebra um while(){...} torno do código para }{ irromper disso. Isso desativa $_ mas se você usar $\ como sua variável, ela ainda será impressa, uma vez que $\ é anexado a cada impressão. Significa que você pode armazenar números ou algo assim e desconsiderar $_ . Não tenho certeza que foi uma grande explicação, mas confira as dicas para golfing g em Perl thread, tenho certeza que vou explicar melhor! Fico feliz em ter ajudado a sua pontuação embora!

Erik the Outgolfer 07/29/2017.

Geléia , 17 bytes

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

Experimente online!


Erik the Outgolfer 07/29/2017.

Pyth, 18 bytes

s+RvQsM*RF_lB@jkUT 

Experimente aqui.


Mr. Xcoder 07/29/2017.

Pyth , 21 20 bytes

K@jkUTQ+smv*lKdK*lKv 

Suíte de teste.

Usa uma abordagem completamente diferente da resposta de @ EriktheOutgolfer , que me ajudou a jogar 1 byte no chat, de 22 a 21.


Explicação

  K@jkUTQ+s.ev*lKbK*lKv   K @ jkUTQ - Filtra os dígitos e os atribui a uma variável K.           m - Mapa.  Iterado pelos dígitos com uma variável d             v - Avaliar (converter em float).              * lKd - Multiplica cada dígito de String pelo comprimento de K.          s - Soma         + - Soma                   * lKvQ - Multipies o número pelo comprimento dos dígitos String 

officialaimm 07/30/2017.

Python 2 , 81 74 bytes

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

  • Aceita inteiro ou float, retorna float.
 lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/" 

Experimente online!

Explicação:

Diga 123.45 é dado como entrada. [i for i in`x`if"/" fornece uma lista de inteiros stringificados ['1','2','3','4','5'] (que também é z ). Agora nós iteramos através de [x]+z ie [123.45,'1','2','3','4','5'] , multiplicando cada elemento por len(z) , aqui 5 e convertendo cada um em um Flutuante (de modo que as seqüências de caracteres também convertam em conformidade), produzindo [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] , [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] , [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] , [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] , [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] , 0, [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] , [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] . Finalmente calculamos a sum(...) e obtemos 167282.25 .

4 comments
Mr. Xcoder 07/29/2017
78 bytes . Substitua i.isdigit() por "/"
1 Mr. Xcoder 07/29/2017
74 bytes . Você pode substituir i.isdigit() por "/" , na verdade, porque ambos . e - têm códigos ASCII mais baixos do que dígitos, adn / está entre eles
officialaimm 07/29/2017
@ Mr.Xcoder Muito obrigado!
Mr. Xcoder 07/29/2017
Seja bem-vindo. Eu portei para o Python 3 como uma alternativa à minha resposta

Bruce Forte 07/30/2017.

Octave , 100 82 bytes

Muito obrigado ao @TomCarpenter por me ensinar que as atribuições têm um valor de retorno e me salvam 18 bytes!

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

Experimente online!

Não Ungolfed / Explicação

 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 

A maneira como isso funciona é que basicamente precisamos adicionar o próprio número n vezes e, em seguida, adicionar a soma das colunas. A soma de s' * logspace(0,n-1,n) atinge a soma das colunas, por exemplo, se v=-123.4 essa matriz será:

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

Então, só precisamos sum e terminamos.

1 comments
1 Tom Carpenter 07/30/2017
Você pode salvar 18 bytes colocando tudo em uma função anônima @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(‌​s'*logspace(0,n-1,n)‌​)) . Experimente online!

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,+))} 

Suíte de teste.


Explicação

  • func f(s:String) - Define uma função f com um parâmetro String explícito s .

  • let k=s.filter{"/"<$0} - Filtra os dígitos: notei que ambos - e . tem valores ASCII menores que todos os dígitos e / está entre . , - e 0 . Por isso, apenas verifiquei se "/" é menor que o caractere atual, como fiz em minha resposta Python.

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

  • Float(s)!*Float(k.count) - Converte a String e o número de dígitos em Float e multiplica-os (Swift não permite Flutuar e Multiplicação Int :()). Por isso, adiciona o número x vezes, em que x é o número de dígitos que ele contém.

  • k.mapNO maps over k with the current value $0 . - k.map{} mapeia sobre k com o valor atual $0 . String(repeating:$0,count:k.count) pega cada dígito, cria uma String de x dígitos idênticos e Float(...)! converte-o para um número de ponto flutuante.

  • .reduce(0,+) - Obtém a soma da lista acima.

  • E finalmente + soma os dois resultados.


Vamos dar um exemplo!

Diga que nossa string é "0.45" . Primeiramente, filtramos os dígitos, então ficamos com 0, 4, 5 . Nós convertemos "0.45" em Float e multiplicamos pelo número de dígitos: 0.45 * 3 = 1.35 . Então pegamos cada dígito e o transformamos em uma String repetindo esse dígito até preencher a largura do quadrado (quantos dígitos existem): 0, 4, 5 -> 000, 444, 555 . Somamos isso, 000 + 444 + 555 = 999 . Então nós adicionamos os 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.

Experimente online!

Versão completa / formatada:

 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
Você pode salvar 2 bytes no começo usando var d=(n+ ... invés de var d = (n ... .
TheLethalCoder 07/31/2017
@IanH. Esqueci de remover todos os espaços -_- É isso que recebo por responder enquanto faço uma chamada de suporte.

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; 

Executar como pipe com -nR .

Pode produzir avisos no PHP 7.1. Repita $c,$e com $c>0?$c:0,$e para corrigir.


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"/"<_) 

Experimente online!

Faz um loop sobre cada caractere de dígito e o repete pelo número total de dígitos, transforma isso em um inteiro e adiciona isso a n . Desta forma, n é adicionado d vezes, a parte horizontal da soma, juntamente com a repetição do dígito, que é a parte vertical. Originalmente usado str.isdigit mas >"/" , graças a outros neste segmento, economizou muitos bytes. Salva dois bytes tomando n como uma string, mas a saída é mais confusa.

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

Experimente online!

Related questions

Hot questions

Language

Popular Tags