Jumlah nilai antara input dan kotak tertinggi berikutnya


9

Diberikan angka kuadrat positif sebagai input. Keluarkan jumlah nilai antara input dan kuadrat tertinggi berikutnya.

Contoh

Input: 1

Output: 2

Alasan: Angka 2 dan 3 adalah antara 1 dan 4, kotak tertinggi berikutnya

Input: 4

Output: 4

Alasan: Angka 5, 6, 7, 8 adalah antara 4 dan 9


1
Kisaran nilai input apa yang harus kita dukung?
Martin Ender

16
Saya pikir ini akan lebih menarik jika inputnya tidak harus persegi.
xnor

1
@ xnor Hindsight, saya pasti setuju.
Shayne03

Jawaban:


8

Jelly , 2 byte

½Ḥ

Cobalah online!

Port jawaban Mathematica saya (ambil akar kuadrat, lalu gandakan). Ini terbatas pada input yang dapat direpresentasikan secara tepat sebagai angka titik-mengambang. Jika itu masalah, solusi tiga-byte ƽḤberfungsi untuk kuadrat sewenang-wenang (yang diposting Dennis pertama tetapi kemudian dihapus).


1
Oh, aku merindukan seluruh "input akan menjadi persegi" oops.
Jonathan Allan

1
@Jonathan Allan Me juga. IMO spec yang aneh.
Trauma Digital

Apakah ada kotak yang tidak dapat diwakili tepat di floating point?
Sebar

@Christian Tentu, angka floating-point tetap dalam ukuran, sehingga hanya ada sejumlah nilai yang dapat mereka wakili.
Martin Ender

@ MartinEnder Dalam hal ini, mengingat dukungan Jelly untuk bilangan bulat presisi arbitrer dan tidak adanya spesifikasi batas atas, saya memilih itu harus mendukung semua input yang valid.
berhamburan

12

Brain-Flak , 38 , 22 byte

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

Cobalah online!

Saya sangat bangga dengan jawaban ini. IMO, salah satu golf terbaik saya.

Bagaimana cara kerjanya?

Seperti yang ditunjukkan oleh banyak pengguna lain, jawabannya adalah sqrt (n) * 2 . Namun, menghitung akar kuadrat dalam brain-flak sangat tidak trivial. Karena kita tahu input akan selalu berbentuk kotak, kita dapat mengoptimalkan. Jadi kami menulis satu loop yang mengurangi

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

dari input, dan lacak berapa kali itu berjalan. Begitu mencapai 0, jawabannya hanyalah angka terakhir yang kita kurangi dikurangi satu.

Awalnya, saya telah mendorong penghitung ke tumpukan lainnya. Namun, kita dapat menggunakan tumpukan utama itu sendiri sebagai penghitung, dengan meningkatkan ketinggian tumpukan.

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

Dalam python-y pseudocode, ini pada dasarnya adalah algoritma berikut:

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
Otak saya benar-benar terkoyak oleh pekerjaan bagus ini.
Magic Gurita Guci

9

Mathematica, 8 byte

2Sqrt@#&

Cobalah online! (Menggunakan Matematika.)

Perbedaan antara n 2 dan (n + 1) 2 selalu 2n + 1 tetapi kami hanya ingin nilai di antara mereka tidak termasuk kedua ujungnya, yaitu 2n .

Ini berpotensi disingkat menjadi 2#^.5&tergantung pada persyaratan presisi.


1
Bagaimana dengan 2√ # &?
chyanog





2

Brain-Flak , 20 byte

Berteriaklah untuk jawaban DJMcMayhem yang luar biasa (albiet sedikit lebih lama) di sini

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

Cobalah online!

Penjelasan

Kode ini berfungsi dengan menghitung mundur dari angka kuadrat dengan kenaikan ganjil. Karena setiap kotak adalah jumlah angka ganjil berturut-turut, ini akan mencapai 0 dalam n 1/2 langkah. Kuncinya di sini adalah kita benar-benar melacak langkah-langkah kita dalam bilangan genap dan menggunakan statis ()untuk mengimbanginya ke bilangan ganjil yang sesuai. Karena jawabannya 2n 1/2 , angka genap ini akan menjadi jawaban kami. Jadi ketika kita mencapai 0 kita menghapus nol dan jawaban kita ada di tumpukan.



1

Oktaf , 25 10 byte

@(n)2*n^.5

Cobalah online!

Disimpan 15 byte dengan menggunakan pendekatan Martin yang jauh lebih baik. Rentang terdiri dari 2*sqrt(n)elemen. Fungsi tidak persis seperti itu: Mengalikan 2dengan akar input.


1

Jelly , 7 byte

½‘R²Ṫ_‘

Cobalah online!

Penjelasan:

½‘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, input akan selalu berupa kuadrat itu sendiri.
Martin Ender

1
@JonathanAllan Fixed
scatter

@ MartinEnder Saya benar-benar salah membaca tantangan, lalu ... untuk tidak menyalin jawaban Anda (karena sudah jelas sekarang mengapa itu berhasil) Saya akan meninggalkan yang ini.
bubar




1

TI-Basic, 3 byte

2√(Ans

Pendekatan paling sederhana ...



1

Tambahkan ++ , 22 20 byte

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

Cobalah online!

Apakah Anda ingin tahu cara kerjanya? Yah, jangan takut! Saya di sini untuk mendidik Anda!

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

Saya memiliki logika yang sama untuk jawaban QBIC asli saya, tetapi ada cara yang lebih pendek .
steenbergh

1

MATL ( 8 7 byte)

Saya yakin ini dapat dikurangi secara signifikan (sunting: terima kasih Luis), tetapi solusi naif adalah:

X^QUG-q

Cobalah online!

Penjelasan:

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
Anda dapat menggantinya 2^ dengan U(dan ini berfungsi dalam versi 20.1.1 , yang merupakan yang terbaru pada saat tantangan, sehingga jawaban itu akan memenuhi syarat bahkan oleh standar lama kita)
Luis Mendo

1
Terima kasih Luis! Saya terkejut bahwa pendekatan naif saya hanya menyia-nyiakan 1 karakter relatif terhadap master MATL. :)
DrQuarius



0

Alice , 10 byte

2/*<ER
o@i

Cobalah online!

Penjelasan

Sekali lagi, menghitung 2 sqrt (n) . Tata letak menghemat dua byte dari solusi standar:

/o
\i@/2RE2*

Rincian kode, tidak termasuk pengalihan 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 byte

?sqr(:)*2

Disimpan banyak dengan menyalin pendekatan @ MartinEnder.

Sayangnya, tidak ada tautan TIO untuk QBIC.

Penjelasan

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



0

Retina , 21 byte

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

Cobalah online! Penjelasan: Bekerja dengan mengambil akar kuadrat dari nomor berdasarkan pada pemecah nomor segitiga @ MartinEnder. Setelah mencocokkan angka kuadrat, $1adalah perbedaan antara angka kuadrat dan angka kuadrat sebelumnya, secara unary. Kami ingin perbedaan berikutnya, tetapi eksklusif, yaitu hanya 1 lagi. Untuk mencapai ini, kami menghitung jumlah string null di $1.





Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.