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


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


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))

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.


11
Que tal 2√ # &?
chyanog





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.



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.


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

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

TI-Basic, 3 bytes

2√(Ans

Abordagem mais simples ...




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.

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

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.


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



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.





Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.