As pessoas continuam me dizendo que o quadrado de um número é o número multiplicado por ele mesmo. Isto é obviamente falso. A maneira correta de colocar um número ao quadrado é transformá-lo em um quadrado, empilhando-o em cima de si várias vezes igual ao número de dígitos que possui e, em seguida, lendo todos os números do quadrado resultante, ambos horizontalmente (de somente da esquerda para a direita) e verticalmente (somente de cima para baixo) e, em seguida, adicionando-os. Portanto, 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:
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 dígitos , para que o sinal negativo não seja incluído no comprimento) e, em seguida, leia os números horizontais normalmente (com sinais negativos) e ignore 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
, que é igual a567
Para números com apenas um dígito, o quadrado é sempre igual ao número dobrado (leia uma vez na horizontal e outra na vertical). Então 4
nos dá
4
O que nos dá 4+4
, o que é igual 8
.
Para números com partes decimais, empilhe normalmente (lembre-se de que apenas os dígitos são contados no número de vezes que você empilha o número e, portanto, o ponto decimal não é contado) e ignore 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 14308.8
.
Números fracionários ou complexos não podem ser elevados ao quadrado.
Sua tarefa:
Estou cansado de quadrilhar números do meu jeito com a mão, então decidi automatizar o processo. Escreva-me um programa ou função que pegue um float ou string, conforme sua preferência, como entrada e retorne o resultado de quadrá-lo 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 esses quadrados, e meu computador não suporta copiar / colar, então a entrada com a menor quantidade de código para eu digitar (medida em bytes por algum motivo?) Vence!
244.2
não é um número flutuante. Não pode ser convertido para a sequência"244.2"
.Respostas:
05AB1E , 7 bytes
Experimente online!
Explicação
fonte
Geléia ,
1312 bytesUm link monádico que aceita uma lista de caracteres (um número decimal bem formado, sendo o zero inicial simples um requisito para -1 <n <1 ) e retornando um número.
Experimente online!
14 bytes para aceitar e números de retorno (entrada limitada a +/- 10 -5 por
ŒṘ
):ŒṘfØDẋ€L$ŒV+⁸S
.Quão?
fonte
+€
com+
a versão de 15-byte para -1.Haskell,
5956 bytesA entrada é tomada como uma sequência.
Experimente online!
Como funciona
fonte
Japonês v2 , 16 bytes
Teste online!
Explicação
fonte
C # (.NET Core),
150141133 bytesGuardou 9 bytes graças a @TheLethalCoder Guardououtros 8 bytes graças a @TheLethalCoder
Experimente online!
Pega uma string como uma entrada e gera o número do quadrado como um flutuador.
Este código segue o seguinte algoritmo:
Crie uma nova string a partir da entrada, mas sem os pontos decimais e símbolos, para que possamos obter nosso comprimento e os números das colunas a partir daí.
Calcule os tempos de entrada do comprimento da string que criamos no ponto 1.
Para cada coluna em nosso 'quadrado', crie uma nova string com o número da coluna e o comprimento da linha e adicione-a ao nosso resultado.
Exemplo:
Entrada:
-135.5
1355
, que tem um comprimento de4
.-135.5 * 4 = -542
.1111
,3333
,5555
,5555
.Se somarmos esses números, obteremos
15012
exatamente o que nosso programa produzirá.fonte
string.Replace()
, mas acho que é a única maneira que funciona!i
el
flutuando..Length
não pode ser convertida implicitamente em flutuante.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. Pode ser capaz de salvar usando a entrada como afloat
e convertendo-a em uma string com,n+""
mas eu não verifiquei.Braquilog , 23 bytes
Experimente online!
Brachylog não combina bem com carros alegóricos ...
Explicação:
fonte
Casca , 15 bytes
Pega uma string e retorna um número. Experimente online!
Explicação
É um pouco chato que a função de análise interna
r
forneça erros de análise em entradas inválidas em vez de retornar um valor padrão, o que significa que eu tenho que filtrar explicitamente as colunas que consistem em não dígitos. Se retornasse 0 em entradas malformadas, eu poderia eliminarfΛ±
e salvar 3 bytes.fonte
Python 3 ,
95 94 87 8584 bytesConjunto de Teste .
Python 3 , 78 bytes
Suíte de teste.
A segunda abordagem é uma porta para o Python 3 inspirada na solução do @ officialaimm.
fonte
Python 2 ,
8174 bytes-7 bytes graças a @Mr. Xcoder :
'/'<i
Experimente online!
Explicação:
A palavra
123.45
é dada como entrada.[i for i in`x`if"/"<x]
fornece uma lista de números inteiros com strings['1','2','3','4','5']
(que também éz
). Agora iteramos através[x]+z
isto é[123.45,'1','2','3','4','5']
, multiplicação por cada elementolen(z)
, aqui5
e a conversão de cada um para um flutuador (de modo que as cordas também converter em conformidade), obtendo-se[617.25,11111.0,22222.0,33333.0,44444.0,55555.0]
. Finalmente calculamossum(...)
e obtemos167282.25
.fonte
i.isdigit()
por"/"<i<":"
i.isdigit()
por"/"<i
, de fato, porque ambos.
e-
têm códigos ASCII mais baixos que dígitos, e o adn/
está entre elesJavaScript,
7562 bytesExperimente online
-2 bytes graças a Arnauld
-5 bytes graças a Shaggy (embora a função deva receber um número, mas agora vejo que muitas outras respostas também recebem string)
fonte
Perl 5 ,
3733 + 1 (-p) =3834 bytesExperimente online!
Utilizamos alguns truques do código do Dom para raspar 4 bytes
Explicado:
fonte
-n
e-p
literalmente envolvawhile(){...}
o código, para que ele se}{
rompa. Isso desativa,$_
mas se você usar$\
como variável, ela ainda será impressa, pois$\
é anexada a cada impressão. Significa que você pode armazenar números ou algo assim e desconsiderar$_
. Não tenho certeza de que foi uma ótima explicação, mas confira as dicas para jogar golfe no segmento Perl , tenho certeza de que isso explicará melhor! Ainda bem que ajudou sua pontuação!Geléia , 17 bytes
Experimente online!
fonte
Pitão, 18 bytes
Experimente aqui.
fonte
Pitão ,
2120 bytesSuíte de teste.
Usa uma abordagem completamente diferente da resposta de @ EriktheOutgolfer , que me ajudou a obter 1 byte no chat, de 22 a 21.
Explicação
fonte
Oitava ,
10082 bytesMuito obrigado ao TomCarpenter por me ensinar que as atribuições têm um valor de retorno e me salvam
18
bytes!Experimente online!
Ungolfed / Explicação
A maneira como isso funciona é que basicamente precisamos adicionar o número
n
vezes e adicionar a soma das colunas. A somas' * logspace(0,n-1,n)
atinge a soma das colunas, por exemplo, sev=-123.4
essa matriz for:Então, só precisamos fazer
sum
isso e terminamos.fonte
@(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n)))
. Experimente online!Swift 4 ,
139134 bytesSuíte de teste.
Explicação
func f(s:String)
- Define uma funçãof
com um parâmetro String explícitos
.let k=s.filter{"/"<$0}
- Filtra os dígitos: notei que ambos-
e.
possuem valores ASCII menores que todos os dígitos, e/
está entre.
,-
e0
. Portanto, apenas verifiquei se"/"
é menor que o caractere atual, como fiz na minha resposta em Python.print(...)
- Imprime o resultado.Float(s)!*Float(k.count)
- Converte a String e o número de dígitos em Flutuante e os multiplica (Swift não permite a multiplicação Flutuante e Int :()). Portanto, ele adiciona o número dex
vezes, ondex
está o número de dígitos que ele contém.k.map{Int(String(repeating:$0,count:k.count))!
-k.map{}
mapeiak
com o valor atual$0
.String(repeating:$0,count:k.count)
pega cada dígito, cria uma sequência dex
dígitos idênticos e oFloat(...)!
converte em 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!
Digamos que nossa String seja
"0.45"
. Primeiro, filtramos os dígitos, então ficamos com0, 4, 5
. Convertemos"0.45"
para flutuar e multiplicar pelo número de dígitos:0.45 * 3 = 1.35
. Então tomamos cada dígito e transformá-lo em um String repetindo esse dígito até preencher a largura do quadrado (quantos dígitos existem):0, 4, 5 -> 000, 444, 555
. Nós somamos isso000 + 444 + 555 = 999
. Em seguida, basta adicionar os resultados juntos:1.35 + 999 = 1000.35
.fonte
C #,
139137 bytesGuardado 2 bytes graças a @Ian H.
Experimente online!
Versão completa / formatada:
fonte
var d=(n+ ...
vez devar d = (n ...
.Mathematica, 107 bytes
fonte
PHP,
7888 +1 bytesCorra como cano com
-nR
.Pode gerar avisos no PHP 7.1. Repita
$c,$e
com$c>0?$c:0,$e
para corrigir.fonte
Python 3 , 68
707377bytesExperimente online!
Faz um loop sobre cada caractere de dígito e o repete pelo número total de caracteres de dígito, transforma isso em um número inteiro e adiciona isso a
n
. Dessa forma,n
são adicionadosd
tempos adicionais , a parte horizontal da soma, juntamente com a repetição de dígitos, que é a parte vertical. Originalmente usado ,str.isdigit
mas>"/"
graças a outras pessoas neste segmento, economizamos muitos bytes. Salva dois bytes usandon
como uma string, mas a saída é mais confusa.Experimente online!
fonte