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

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

Martin Ender
sumber
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))
James
sumber
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.

Martin Ender
sumber
1
Bagaimana dengan 2√ # &?
chyanog
2

dc, 5

?2*vp

Cobalah online .


Sebelumnya saya salah membaca pertanyaan. Versi ini berfungsi untuk input bilangan bulat positif apa pun, bukan hanya kuadrat sempurna:

dc, 12

?dv1+d*1-r-p

Cobalah online .

Trauma Digital
sumber
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.

Ad Hoc Garf Hunter
sumber
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.

Stewie Griffin
sumber
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
menyebarkan
sumber
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

JavaScript ES6, 10 byte

n=>n**.5*2

Cobalah online! Math.sqrtcukup lama itu sebabnya kami gunakan**.5

Downgoat
sumber
2
Maka itu ES7 daripada ES6 ...
Neil
1

TI-Basic, 3 byte

2√(Ans

Pendekatan paling sederhana ...

Timtech
sumber
1

05AB1E , 2 byte

Cobalah online!

Port lain dari pengajuan Martin Ender ...

sampah luar angkasa
sumber
Selamat datang di PPCG!
Erik the Outgolfer
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
caird coinheringaahing
sumber
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.
DrQuarius
sumber
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

PHP , 44 byte

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

Cobalah online!

Jörg Hülsermann
sumber
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.
Martin Ender
sumber
0

Pergi , 56 byte

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

Cobalah online!

benar-benar manusiawi
sumber
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
steenbergh
sumber
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.

Neil
sumber
0

T-SQL, 22 byte

SELECT 2*SQRT(a)FROM t

Input adalah melalui tabel yang sudah ada sebelumnya, sesuai standar kami .

BradC
sumber
0

Java (OpenJDK 9) / JShell, 17 byte

n->2*Math.sqrt(n)

Cobalah online!

Catatan: Ini perlu import java.util.function.*;masuk ke IntFunction<T>Java 8 atau Java 9, tetapi java.util.functionpaket diimpor secara default di JShell.

David Conrad
sumber
0

Haskell, 9 byte

(*2).sqrt

Cobalah online

Input dan output akan diperlakukan sebagai nilai Float.

Antisthenes
sumber
0

Noether, 7 byte

I.5^2*P

Coba di sini!

Sama seperti setiap jawaban lainnya: menghasilkan dua kali akar kuadrat.

Peluruhan Beta
sumber