Girdi ile bir sonraki en yüksek kare arasındaki değerlerin sayısı


9

Girdi olarak pozitif kare sayısı verildi. Girdi ile bir sonraki en yüksek kare arasındaki değer sayısını çıktılar.

Misal

Giriş: 1

Çıktı: 2

Sebep: 2 ve 3 sayıları bir sonraki en yüksek kare olan 1 ile 4 arasındadır

Giriş: 4

Çıktı: 4

Sebep: 5, 6, 7, 8 sayıları 4 ile 9 arasındadır


1
Hangi girdi değerlerini desteklememiz gerekiyor?
Martin Ender

16
Girişin bir kare olması gerekmiyorsa bu daha ilginç olurdu.
xnor

1
@xnor Hindsight, kesinlikle katılıyorum.
Shayne03

Yanıtlar:


8

Jöle , 2 bayt

½Ḥ

Çevrimiçi deneyin!

Mathematica cevabımın portu (karekök al, sonra çift yap). Bu, tam olarak bir kayan nokta sayısı olarak gösterilebilen girişlerle sınırlıdır. Bu bir sorunsa, üç baytlık çözüm ƽḤkeyfi kareler için çalışır (Dennis önce yayınlar ancak sonra siler).


1
Ah "giriş kare olacak" oops özledim.
Jonathan Allan

1
@JonathanAllan Ben de. Garip spec IMO.
Dijital Travma

Tam olarak kayan noktada gösterilemeyen kareler var mı?
Dağılım

@Christian Elbette, kayan nokta sayıları sabittir, bu nedenle temsil edebilecekleri yalnızca sınırlı sayıda değer vardır.
Martin Ender

@MartinEnder Bu durumda, Jelly'in rasgele kesinlikli tamsayılara verdiği destek ve spesifikasyonun bir üst sınır bulunmaması nedeniyle, geçerli tüm girdileri desteklemesi gerektiğini düşünüyorum.
Dağılım

12

Brain-Flak , 38 , 22 bayt

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

Çevrimiçi deneyin!

Ben çok bu cevabın gurur. IMO, en iyi beyin flak golflerimden biri.

O nasıl çalışır?

Diğer birçok kullanıcının işaret ettiği gibi, cevap sadece sqrt (n) * 2'dir . Bununla birlikte, beyin-flak'ta kare kökü hesaplamak çok önemsizdir. Girdinin her zaman bir kare olacağını bildiğimiz için optimize edebiliriz. Bu yüzden çıkartan bir döngü yazıyoruz

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

girin ve kaç kez çalıştığını izleyin. 0'a çarptığında, cevap basitçe eksi bir çıkardığımız son sayıdır.

Başlangıçta, diğer yığına bir sayaç itmiştim. Ancak, yığın yüksekliğini artırarak ana yığını bir sayaç olarak kullanabiliriz.

#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
([]<>)

Python-y sözde kodunda, bu temelde aşağıdaki algoritmadır:

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
Beynim tam anlamıyla bu güzel iş tarafından kuşatıldı.
Sihirli Ahtapot Urn

9

Mathematica, 8 bayt

2Sqrt@#&

Çevrimiçi deneyin! (Matematiği Kullanmak.)

N 2 ve (n + 1) 2 arasındaki fark her zaman 2n + 1'dir, ancak aralarındaki değerlerin her iki ucu hariç, 2n olan hariç olmasını istiyoruz .

Bu, 2#^.5&hassasiyet gereksinimlerine bağlı olarak potansiyel olarak kısaltılabilir .


1
Peki ya 2 about # &?
chyanog





2

Brain-Flak , 20 bayt

DJMcMayhem'in şaşırtıcı (albiet biraz daha uzun) cevabına buradan seslenin

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

Çevrimiçi deneyin!

açıklama

Bu kod, kare sayısından garip artışlarla geri sayılarak çalışır. Her kare ardışık tek sayıların toplamı olduğundan, bu n 1/2 adımda 0'a ulaşacaktır . Burada hüner biz aslında bir bizim adımların takip olduğunu bile sayı ve bir statik kullanmak ()uygun tek sayıya bunu dengelemek için. Cevap 2n 1/2 olduğundan , bu çift sayı cevabımız olacaktır. Yani 0'a ulaştığımızda sıfırı kaldırırız ve cevabımız orada yığında oturur.



1

Oktav , 25 10 bayt

@(n)2*n^.5

Çevrimiçi deneyin!

Martin çok daha iyi bir yaklaşım kullanarak 15 bayt kurtardı. Aralık 2*sqrt(n)elemanlardan oluşur . İşlev tam olarak bunu yapar: 2Girişin kökü ile çarpar .


1

Jöle , 7 bayt

½‘R²Ṫ_‘

Çevrimiçi deneyin!

Açıklama:

½‘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, giriş her zaman bir karenin kendisi olacaktır.
Martin Ender

1
@JonathanAllan Sabit
dağılım

@MartinEnder Ben meydan okumayı tamamen yanlış okudum, o zaman ... cevabınızı kopyalamamak adına (şimdi neden işe yaradığı belli olduğu için) bunu bırakacağım.
Dağılım






1

++ , 22 20 bayt ekle

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

Çevrimiçi deneyin!

Nasıl çalıştığını bilmek ister misiniz? Korkma! Sizi eğitmek için buradayım!

+?   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

Orijinal QBIC yanıtım için aynı mantığa sahiptim, ancak daha kısa bir yol var .
steenbergh

1

MATL ( 8 7 bayt)

Eminim bu önemli ölçüde azaltılabilir (düzenleme: teşekkürler Luis), ama naif bir çözüm:

X^QUG-q

Çevrimiçi deneyin!

Açıklama:

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.

1
Sen değiştirebilir 2^ tarafından U(ve bu sürümde 20.1.1 çalışmış hatta bizim eski standardına göre uygun olacaktır cevap yüzden zorluk zamanda, en son oldu)
Luis Mendo

1
Teşekkürler Luis! Saf yaklaşımımın MATL ustasına göre sadece 1 karakter harcadığına şaşırdım. :)
DrQuarius



0

Alice , 10 bayt

2/*<ER
o@i

Çevrimiçi deneyin!

açıklama

Yine, 2 sqrt (n) hesaplar . Düzen, standart çözüme iki bayt kazandırır:

/o
\i@/2RE2*

IP'nin yeniden yönlendirilmesi hariç kodun dökümü:

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 bayt

?sqr(:)*2

@ MartinEnder'in yaklaşımını kopyalayarak bir grup kaydetti.

Ne yazık ki QBIC için TIO bağlantısı yok.

açıklama

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



0

Retina , 21 bayt

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

Çevrimiçi deneyin! Açıklama: @ MartinEnder'in üçgen sayı çözücüsüne dayanan sayının karekökünü alarak çalışır. Kare sayısını eşleştirdikten sonra $1, kare numarası ile bir önceki kare sayısı arasındaki fark, tekli. Bir sonraki farkı istiyoruz, ancak özel, sadece 1 tane daha. Bunu başarmak için, içindeki boş dizelerin sayısını sayıyoruz $1.





Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.