Número de valores entre a entrada e o próximo quadrado mais alto

9

Dado um número quadrado positivo como entrada. Envie o número de valores entre a entrada e o próximo quadrado mais alto.

Exemplo

Entrada: 1

Saída: 2

Razão: Os números 2 e 3 estão entre 1 e 4, o próximo quadrado mais alto

Entrada: 4

Saída: 4

Razão: Os números 5, 6, 7, 8 estão entre 4 e 9

Shayne03
fonte
11
Que faixa de valores de entrada temos para oferecer suporte?
Martin Ender
16
Eu acho que isso seria mais interessante se a entrada não tivesse que ser um quadrado.
xnor
11
@xnor Em retrospecto, eu definitivamente concordo.
Shayne03

Respostas:

8

Geléia , 2 bytes

½Ḥ

Experimente online!

Porta da minha resposta do Mathematica (faça a raiz quadrada e depois o dobro). Isso é limitado a entradas que podem ser representadas exatamente como um número de ponto flutuante. Se isso é um problema, a solução de três bytes ƽḤfunciona para quadrados arbitrários (que Dennis postou primeiro, mas depois excluiu).

Martin Ender
fonte
11
Oh, eu perdi toda a "entrada será um quadrado" oops.
Jonathan Allan
11
@JonathanAllan Eu também. OMI estranho da especificação.
Digital Trauma
Existem quadrados que não podem ser representados exatamente no ponto flutuante?
scatter
@Christian Claro, os números de ponto flutuante são fixos em tamanho, portanto, há apenas um número finito de valores que eles podem representar.
Martin Ender
@MartinEnder Nesse caso, dado o suporte da Jelly a números inteiros de precisão arbitrária e a falta de um limite superior nas especificações, eu voto que deve suportar todas as entradas válidas.
scatter
12

Flak cerebral , 38 , 22 bytes

{([[]](({})))}{}([]<>)

Experimente online!

Estou muito orgulhoso desta resposta. OMI, um dos meus melhores campos de tiro certeiro.

Como funciona?

Como muitos outros usuários apontaram, a resposta é simplesmente sqrt (n) * 2 . No entanto, calcular a raiz quadrada no cérebro-flak é muito pouco trivial. Como sabemos que a entrada sempre será quadrada, podemos otimizar. Então escrevemos um loop que subtrai

1, 3, 5, 7, 9...

da entrada e acompanhe quantas vezes ele é executado. Quando atinge 0, a resposta é simplesmente o último número que subtraímos menos um.

Originalmente, eu havia empurrado um contador para a outra pilha. No entanto, podemos usar a própria pilha principal como um contador, aumentando a altura da pilha.

#While TOS (top of stack, e.g. input) != 0:
{

    #Push:
    (

      #The negative of the height of the stack (since we're subtracting)
      [[]]

      #Plus the TOS pushed twice. This is like incrementing a counter by two
      (({}))
    )

#Endwhile
}

#Pop one value off the main stack (or in other words, decrement our stack-counter)
{}

#And push the height of the stack onto the alternate stack
([]<>)

No pseudocódigo python-y, este é basicamente o seguinte algoritmo:

l = [input]
while l[-1] != 0:   #While the back of the list is nonzero
    old_len = len(l)
    l.append(l[-1])
    l.append(l[-1] - old_len)

l.pop()

print(len(l))
James
fonte
2
Meu cérebro foi literalmente destruído por esse bom trabalho.
Magic Octopus Urn
9

Mathematica, 8 bytes

2Sqrt@#&

Experimente online! (Usando matemática.)

A diferença entre n 2 e (n + 1) 2 é sempre 2n + 1, mas queremos apenas os valores entre eles, excluindo as duas extremidades, que é 2n .

Isso pode ser encurtado 2#^.5&dependendo dos requisitos de precisão.

Martin Ender
fonte
11
Que tal 2√ # &?
chyanog
2

dc, 5

?2*vp

Experimente online .


Anteriormente, eu interpretei mal a pergunta. Esta versão funciona para qualquer entrada inteira positiva, e não apenas quadrados perfeitos:

dc, 12

?dv1+d*1-r-p

Experimente online .

Trauma Digital
fonte
2

Flak cerebral , 20 bytes

Grite para a incrível resposta de DJMcMayhem (um pouco mais longa) aqui

{({}()[({}()())])}{}

Experimente online!

Explicação

Esse código funciona contando o número do quadrado em incrementos ímpares. Como cada quadrado é a soma dos números ímpares consecutivos, esse número chegará a 0 em n 1/2 etapas. O truque aqui é que, na verdade, acompanhamos nossas etapas em um número par e usamos uma estática ()para compensá-la para o número ímpar apropriado. Como a resposta é 2n 1/2 , esse número par será a nossa resposta. Então, quando atingimos 0, removemos o zero e nossa resposta está lá na pilha.

Caçador Ad Hoc Garf
fonte
1

Oitava , 25 10 bytes

@(n)2*n^.5

Experimente online!

Economizou 15 bytes usando a abordagem muito melhor de Martin. O intervalo consiste em 2*sqrt(n)elementos. A função faz exatamente isso: Multiplica-se 2com a raiz da entrada.

Stewie Griffin
fonte
1

Geléia , 7 bytes

½‘R²Ṫ_‘

Experimente online!

Explicação:

½‘R²Ṫ_    Input:              40
½         Square root         6.32455532...
 ‘        Increment           7.32455532...
  R       Range               [1, 2, 3, 4, 5, 6, 7]
   ²      Square              [1, 4, 9, 16, 25, 36, 49]
    Ṫ     Tail                49
     _‘   Subtract input+1    8
dispersar
fonte
Btw, a entrada sempre será um quadrado em si.
Martin Ender
11
@JonathanAllan Fixed
scatter
@MartinEnder Eu entendi totalmente o desafio, então ... no interesse de não copiar sua resposta (já que agora é óbvio por que isso funciona), vou deixar isso para trás.
scatter
1

JavaScript ES6, 10 bytes

n=>n**.5*2

Experimente online! Math.sqrté muito longo e é por isso que usamos**.5

Downgoat
fonte
2
Então isso é ES7 em vez de ES6 ...
Neil
1

TI-Basic, 3 bytes

2√(Ans

Abordagem mais simples ...

Timtech
fonte
1

05AB1E , 2 bytes

Experimente online!

Outro porto de submissão de Martin Ender ...

lixo espacial
fonte
Bem-vindo ao PPCG!
Erik the Outgolfer
1

Adicionar ++ , 22 20 bytes

+?
_
S
+1
^2
-1
-G
O

Experimente online!

Deseja saber como funciona? Bem, não tema! Estou aqui para educar você!

+?   Add the input to x (the accumulator)
_    Store the input in the input list
S    Square root
+1   Add 1
^2   Square
-1   Subtract 1
-G   Subtract the input
O    Output as number
caird coinheringaahing
fonte
Eu tinha a mesma lógica para minha resposta QBIC original, mas há uma maneira mais curta .
precisa
1

MATL ( 8 7 bytes)

Tenho certeza de que isso pode ser reduzido significativamente (editar: obrigado Luis), mas uma solução ingênua é:

X^QUG-q

Experimente online!

Explicação:

X^   % Take the square root of the input (an integer)
QU  % Square the next integer to find the next square
G-   % Subtract the input to find the difference
q    % Decrement solution by 1 to count only "in between" values.
DrQuarius
fonte
11
Você pode substituir 2^ por U(e este trabalhou na versão 20.1.1 , que foi o mais recente no momento do desafio, então a resposta seria elegível até mesmo por nosso velho padrão)
Luis Mendo
11
Obrigado Luis! Estou surpreso que minha abordagem ingênua tenha desperdiçado apenas 1 caractere em relação ao mestre do MATL. :)
DrQuarius 17/07/19
0

PHP , 44 bytes

<?=count(range($argn,(sqrt($argn)+1)**2))-2;

Experimente online!

Jörg Hülsermann
fonte
0

Alice , 10 bytes

2/*<ER
o@i

Experimente online!

Explicação

Mais uma vez, calcula 2 sqrt (n) . O layout salva dois bytes sobre a solução padrão:

/o
\i@/2RE2*

Divisão do código, excluindo o redirecionamento do IP:

2    Push 2 for later.
i    Read all input.
i    Try reading more input, pushes "".
2    Push 2.
R    Negate to get -2.
E    Implicitly discard the empty string and convert the input to an integer.
     Then take the square root of the input. E is usually exponentiation, but
     negative exponents are fairly useless in a language that only understands
     integers, so negative exponents are interpreted as roots instead.
*    Multiply the square root by 2.
o    Output the result.
@    Terminate the program.
Martin Ender
fonte
0

Go , 56 bytes

import."math"
func f(n float64)float64{return 2*Sqrt(n)}

Experimente online!

totalmente humano
fonte
0

QBIC , 19 9 bytes

?sqr(:)*2

Economizei muito copiando a abordagem de @ MartinEnder.

Infelizmente, nenhum link TIO para QBIC.

Explicação

?          PRINT
 sqr( )    The square root of
     :     the input
        *2 doubled
steenbergh
fonte
0

Retina , 21 bytes

.+
$*
(^1?|11\1)+
$1

Experimente online! Explicação: Funciona utilizando a raiz quadrada do número com base no solucionador de números triangular do @ MartinEnder. Depois de corresponder o número do quadrado, $1é a diferença entre o número do quadrado e o número do quadrado anterior, em unário. Queremos a próxima diferença, mas exclusiva, que é apenas mais 1. Para conseguir isso, contamos o número de cadeias nulas em $1.

Neil
fonte
0

Java (OpenJDK 9) / JShell, 17 bytes

n->2*Math.sqrt(n)

Experimente online!

Nota: Isso exigiria import java.util.function.*;entrar IntFunction<T>no Java 8 ou Java 9, mas o java.util.functionpacote é importado por padrão no JShell.

David Conrad
fonte
0

Haskell, 9 bytes

(*2).sqrt

Experimente online

Entrada e saída serão tratadas como valores flutuantes.

Antistenos
fonte
0

Noether, 7 bytes

I.5^2*P

Experimente aqui!

Exatamente o mesmo que qualquer outra resposta: gera duas vezes a raiz quadrada.

Beta Decay
fonte