Introdução e Crédito
Todos conhecemos e amamos nossas regras impressionantes para testar se um número é divisível por 11 ou 3, o que é apenas uma soma inteligente sobre os dígitos do número. Agora, esse desafio leva isso a um novo nível, exigindo que você calcule a soma dos dígitos e, em seguida, verifique se o resultado é um quadrado inteiro perfeito, e nenhuma das operações geralmente pode ser realizada com muito pouco tempo. Como essa propriedade também é muito difícil de ver quando se olha para um número, queremos que isso seja feito para listas inteiras de números, para que possamos salvar o trabalho humano. Portanto, este é o seu desafio agora!
Esta foi uma tarefa no meu curso de programação funcional da universidade. Esta tarefa está encerrada e foi discutida em sala de aula e tenho a permissão do meu professor para publicá-la aqui (perguntei explicitamente).
Especificação
Entrada
Sua entrada é uma lista de números inteiros não negativos, em qualquer formato de E / S padrão.
Você pode escolher o formato da lista conforme seu idioma precisar
Saída
A saída é uma lista de números inteiros, em qualquer formato de E / S padrão.
O que fazer?
Filtre todos os números inteiros da lista de entrada para os quais a soma dos dígitos não é um quadrado (de um número inteiro).
A ordem dos elementos não podem ser alterados, por exemplo, se você conseguir [1,5,9]
você pode não retornar[9,1]
Casos de canto em potencial
0 é um número inteiro não negativo e, portanto, uma entrada válida e 0 também é uma raiz inteira válida, por exemplo, 0 conta como um quadrado inteiro.
A lista vazia também é uma entrada e saída válida.
Quem ganha?
Isso é código-golfe, então a resposta mais curta em bytes vence!
Regras padrão se aplicam, é claro.
Casos de teste
[1,4,9,16,25,1111] -> [1,4,9,1111]
[1431,2,0,22,999999999] -> [1431,0,22,999999999]
[22228,4,113125,22345] -> [22228,4,22345]
[] -> []
[421337,99,123456789,1133557799] -> []
Exemplo passo a passo
Example input: [1337,4444]
Handling first number:
Sum of the digits of 1337: 1+3+3+7=14
14 is not an integer square, thus will be dropped!
Handling second number:
Sum of the digits of 4444: 4+4+4+4=16
16 is an integer square because 4*4=16, can get into the output list!
Example output: [4444]
Respostas:
Pyke, 6 bytes
Experimente aqui!
fonte
Mathematica,
3936 bytesUma função anônima:
LLlAMnYP salvou um byte. Obrigado!
Martin Ender economizou mais três substituindo
IntegerQ
porAtomQ
. Inteligente! (O resultado de√
será exato, portanto, ele retornará uma expressão composta comoSqrt[5]
se o argumento não fosse um quadrado.)fonte
...Digits@#&
vez de #...Digits[#]&
Geléia,
87 bytes1 byte graças a @ Sp3000 .
Suíte de teste.
Explicação
fonte
Brachylog v2, 8 bytes
Experimente online!
Explicação
o
&
meios que a saída elementos são os mesmos que aqueles na lista de entrada, mas oℤ
será erro se a entrada do bloco não é um número quadrado, então temos a lista de entrada com elementos com somas dígitos não quadrados descartados.Observe que, a princípio, pode parecer um problema de imprecisão de ponto flutuante aqui (alguns números inteiros não quadrados muito grandes têm raízes quadradas inteiras devido ao arredondamento). No entanto, o Brachylog suporta a aritmética do bignum e, na verdade, tem esse comportamento levado em consideração na implementação de
√
: um número que é um quadrado perfeito terá sua raiz quadrada relatada como um número inteiro, enquanto um número que não é um quadrado perfeito (mas próximo o suficiente para sua raiz quadrada é integral) terá sua raiz quadrada relatada como um valor flutuante com um valor integral. Convenientemente,ℤ
apenas permite o primeiro tipo de valor de retorno, dando uma falha de afirmação para o último.fonte
Pitão, 10 bytes
Suíte de teste.
Explicação
fonte
CJam, 14 bytes
Obrigado a @FryAmTheEggman por salvar um byte!
Experimente online!
Este é um bloco sem nome que espera a lista de entrada na pilha e deixa a lista filtrada nela.
Explicação
fonte
Haskell -
706059 bytesUso:
Bem direto; calcula a soma dos dígitos e verifica se floor (sqrt (y)) ^ 2 == y
Edit: Roubou a idéia de verificar a lista de quadrados de C. Quilley
fonte
f=
necessário para esta resposta.05AB1E,
1910 bytesExplicação
Experimente online
Editar: salvou 9 bytes graças a @Adnan
fonte
vySO
e verificar imediatamente se é quadrado ou não. Eu tenho essa a 5:tDï->
. Também há um built-in especial que imprimey
quando igual a1
, que é (—
). Então, isso seriavySOtDï->—
.R ,
5755 bytesUse
Filter
no vetor. Assume números inteiros de 32 bits, com no máximo 10 dígitos.Caixas de canto: retorna
NULL
para o vetor vazio enumeric(0)
para um vetor sem números válidos. Como ambos têm comprimento zero, devem ser aceitáveis.-2 graças a @Giuseppe
Experimente online!
fonte
PowerShell ,
6454 bytesExperimente online!
-10 bytes graças ao mazzy
Recebe entrada como argumentos de linha de comando (veja exemplos abaixo), que são processados no PowerShell na matriz
$args
. Nós canalizamos isso para?
um alias paraWhere-Object
(funções semelhantes afilter
) para selecionar nossa saída. Nossa seleção é baseada na chamada .NET[math]::Sqrt()
da soma de dígitos do número com um número inteiro!(...%1)
. Inteiros resultarão em 0, que quandonot
ed se tornaTrue
enquanto raízes não inteiras se tornamFalse
.Como mencionado em outro lugar, "retornando" uma matriz vazia não faz sentido, pois é convertida para
$null
assim que sai do escopo; portanto, a saída para uma entrada vazia não é nada.Exemplos
fonte
$n%1
verifica se int única$args|?{!([math]::Sqrt(([char[]]"$_"-join'+'|iex))%1)}
Python 2, 76 bytes
Experimente aqui!
Algum abuso de avaliação para verificar um número quadrado, o resto é bastante espetacular.
A declaração eval é avaliada como
sum(map(int,
n))**.5==int(sum(map(int,
n))**.5)
fonte
Oracle SQL 11.2, 213 bytes
Sem golfe
fonte
Braquilog , 26 bytes
Exemplo:
Explicação
Essa é uma situação em que algo funciona um pouco bem demais ... a
~^[X:2]
parte é verdadeira tanto positiva quanto negativaX
, para evitar duplicatas, preciso especificar issoX > 0
.A
;.0
parte está aqui devido a um erro (enumerar não funciona no número inteiro 0).Predicado principal
Predicado 1
fonte
Python 2, 53 bytes
Teste em Ideone .
fonte
f([1111111111111111])
, parece querepr(n)
contém um'L'
eint('L')
lança umValueError
. Eu sinto que você precisastr(n)
aqui?J,
3327 bytes6 bytes graças a @miles .
Em intérpretes online,
inv
não é instalado. Mude isso para^:_1
.Uso
Onde
>>
está STDIN e<<
está STDOUT.Ligeiramente não-destruído
Versão anterior de 33 bytes
Uso
Onde
>>
está STDIN e<<
está STDOUT.Ligeiramente não-destruído
fonte
f&.g
para aplicarg
, entãof
e, em seguida , o inverso deg
para reduzir*:@<.@%:
para<.&.%:
salvar 2 bytes. Você pode reorganizá-lo e usar apenas floor para obter#~[:(=<.)@%:+/"1@(10&#.inv)
27 bytes ondeinv
está^:_1
e já está definido.Javascript 66 bytes
Obrigado por SergioFC por salvar 7 bytes
fonte
c+d
vez dec-+-d
? Além disso, você pode usarn%1==0
para testar se o resultado é um int, então talvez você pode salvar alguns bytes usandob=>!(Math.sqrt((b+"").split``.reduce((c,d)=>c-+-d))%1)
para filtrarPerl 5, 42 bytes
41, mais 1 para em
-pe
vez de-e
Explicação:
-p
obtém cada número inteiro de entrada em uma nova linha e atribui$_
a essa sequência.my$s
inicializa a variável$s
para nada, novamente para cada número inteiro de entrada.map$s+=$_,/./g
pega cada caractere numérico e o adiciona numericamente ao$s
. (A nova linha se torna 0 quando numerada.)sqrt$s==~~sqrt$s
testa se$s
possui uma raiz quadrada não-íntegra e$_ x=
cria$_
em si mesma ou na cadeia vazia, dependendo desse teste.-p
impressões$_
Graças a Brad Gilbert b2gills por salvar três bytes.
Também 41 mais 1:
s/./$s+=$&/ger
adiciona cada caractere numérico a$s
(e a nova linha é 0 como acima)fonte
JavaScript (Node.js) , 48 bytes
Experimente online!
Explicação
fonte
MATL,
161413 bytesExperimente Online!
Explicação
fonte
Julia - 38 bytes
É muito fácil ver o que isso faz.
digits
converte um número em uma lista de seus dígitos,sum
calcula a soma dos dígitos√
e produz um número inteiro se o número for um quadrado; caso contrário, haverá uma parte fracionária.%1
retornará apenas a parte fracionária e, se for zero (==0
),filter
a manterá na lista, caso contrário, será filtrada.Usado como
![22228,4,113125,22345]
fonte
Jolf, 8 bytes
Experimente aqui!
Explicação
fonte
MATLAB,
524342 bytesCria uma função anônima chamada
ans
que pode ser chamada com uma matriz como entrada:ans([22228,4,113125,22345])
.Demo Online . A demonstração online está no Octave, que não funciona para a entrada vazia, mas o MATLAB funciona.
Explicação
Convertemos cada elemento da matriz de entrada na base 10, o que produzirá uma matriz de caracteres 2D em que cada linha contém os dígitos de um número na matriz. Para converter esses caracteres em números, subtraímos 48 (ASCII para
'0'
). Em seguida, somamos as linhas, obtemos a raiz quadrada e determinamos se cada valor é um quadrado perfeito~mod 1
. Em seguida, usamos esse booleano para filtrar a matriz de entrada.fonte
Clojure, 110 bytes
Calcula a soma dos dígitos dos números e depois filtra aqueles para os quais não existe um número ao quadrado igual à soma.
Você pode ver o resultado aqui - https://ideone.com/ciKOje
fonte
Perl 6 ,
3835 bytesTeste:
fonte
C,
143141 bytesTentativa sem golfe online
fonte
Retina , 69
Porque testar quadrados perfeitos na retina. Isso pode ser modificado para o cálculo da raiz quadrada inteira generalizada .
Entrada é uma lista separada por nova linha.
Experimente online.
a
a
unário, expresso comob
s, separado por espaçosfonte
%
-configuration,\G
e encaminhar referências. Sinta-se livre para levá-la: retina.tryitonline.net/... :)Python, 50 bytes
Se n for a lista de entrada de números
fonte
Ruby , 39 bytes
Experimente online!
fonte
K (oK) ,
191713 bytesSolução:
Experimente online!
Explicação:
Notas:
fonte
func#list
) ?MathGolf ,
54 bytesExperimente online!
Explicação:
O MathGolf ainda está em desenvolvimento,
portanto, suponho que em brevehaveráentrada implícita para eliminar esse primeiro byte.Yay!fonte