Số lượng giá trị giữa đầu vào và ô vuông cao nhất tiếp theo


9

Cho một số vuông dương làm đầu vào. Xuất số lượng giá trị giữa đầu vào và ô vuông cao nhất tiếp theo.

Thí dụ

Đầu vào: 1

Đầu ra: 2

Lý do: Các số 2 và 3 nằm trong khoảng từ 1 đến 4, hình vuông cao nhất tiếp theo

Đầu vào: 4

Đầu ra: 4

Lý do: Các số 5, 6, 7, 8 nằm trong khoảng từ 4 đến 9


1
Phạm vi của các giá trị đầu vào nào chúng ta phải hỗ trợ?
Martin Ender

16
Tôi nghĩ rằng điều này sẽ thú vị hơn nếu đầu vào không phải là một hình vuông.
xnor

1
@xnor Hindsight, tôi chắc chắn đồng ý.
Shayne03

Câu trả lời:


8

Thạch , 2 byte

½Ḥ

Hãy thử trực tuyến!

Cổng câu trả lời Mathicala của tôi (lấy căn bậc hai, sau đó nhân đôi). Điều này được giới hạn ở các đầu vào có thể được biểu diễn chính xác dưới dạng số dấu phẩy động. Nếu đó là một vấn đề, giải pháp ba byte ƽḤhoạt động cho các ô vuông tùy ý (mà Dennis đăng đầu tiên nhưng sau đó bị xóa).


1
Oh tôi đã bỏ lỡ toàn bộ "đầu vào sẽ là một hình vuông".
Jonathan Allan

1
@Jonathan Allan Tôi cũng vậy. IMO spec lạ.
Chấn thương kỹ thuật số

Có bất kỳ hình vuông nào không thể được biểu diễn chính xác trong dấu phẩy động không?
phân tán

@Christian Chắc chắn, các số dấu phẩy động được cố định về kích thước, do đó chỉ có một số hữu hạn các giá trị mà chúng có thể biểu thị.
Martin Ender

@MartinEnder Trong trường hợp đó, được hỗ trợ của Jelly cho các số nguyên chính xác tùy ý và thiếu thông số giới hạn trên, tôi bỏ phiếu nên hỗ trợ tất cả các đầu vào hợp lệ.
phân tán

12

Brain-Flak , 38 , 22 byte

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

Hãy thử trực tuyến!

Tôi rất tự hào về câu trả lời này. IMO, một trong những môn đánh gôn tốt nhất của tôi.

Làm thế nào nó hoạt động?

Như nhiều người dùng khác đã chỉ ra, câu trả lời chỉ đơn giản là sqrt (n) * 2 . Tuy nhiên, tính toán căn bậc hai trong flak não là rất rất không cần thiết. Vì chúng ta biết đầu vào sẽ luôn là một hình vuông, chúng ta có thể tối ưu hóa. Vì vậy, chúng tôi viết một vòng lặp trừ

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

từ đầu vào và theo dõi số lần nó chạy. Khi nó về 0, câu trả lời đơn giản là số cuối cùng chúng tôi trừ đi một.

Ban đầu, tôi đã đẩy một quầy sang ngăn xếp khác. Tuy nhiên, chúng ta có thể sử dụng chính ngăn xếp chính làm bộ đếm, bằng cách tăng chiều cao của ngăn xếp.

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

Trong mã giả python-y, đây về cơ bản là thuật toán sau:

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
Bộ não của tôi thực sự đã bị rung chuyển bởi điều này, công việc tốt.
Bạch tuộc ma thuật Urn

9

Toán học, 8 byte

2Sqrt@#&

Hãy thử trực tuyến! (Sử dụng toán học.)

Sự khác biệt giữa n 2(n + 1) 2 luôn là 2n + 1 nhưng chúng tôi chỉ muốn các giá trị giữa chúng không bao gồm cả hai đầu, là 2n .

Điều này có khả năng có thể được rút ngắn để 2#^.5&tùy thuộc vào yêu cầu chính xác.


1
Làm thế nào về 2√ # &?
chyanog





2

Brain-Flak , 20 byte

Hãy trả lời câu trả lời tuyệt vời của DJMcMayhem (albiet hơi lâu) tại đây

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

Hãy thử trực tuyến!

Giải trình

Mã này hoạt động bằng cách đếm ngược từ số vuông theo số gia lẻ. Vì mỗi ô vuông là tổng của các số lẻ liên tiếp, điều này sẽ đạt 0 trong n 1/2 bước. Bí quyết ở đây là chúng tôi thực sự theo dõi các bước của chúng tôi trong một thậm chí số lượng và sử dụng một tĩnh ()để bù đắp nó vào số lẻ thích hợp. Vì câu trả lời là 2n 1/2 , số chẵn này sẽ là câu trả lời của chúng tôi. Vì vậy, khi chúng tôi đạt 0, chúng tôi xóa số 0 và câu trả lời của chúng tôi nằm ở đó trên ngăn xếp.



1

Octave , 25 10 byte

@(n)2*n^.5

Hãy thử trực tuyến!

Lưu 15 byte bằng cách sử dụng phương pháp tốt hơn nhiều của Martin. Phạm vi bao gồm các 2*sqrt(n)yếu tố. Hàm thực hiện chính xác điều đó: Nhân 2với gốc của đầu vào.


1

Thạch , 7 byte

½‘R²Ṫ_‘

Hãy thử trực tuyến!

Giải trình:

½‘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, đầu vào sẽ luôn là một hình vuông.
Martin Ender

1
@Jonathan ALLan Đã sửa
phân tán

@MartinEnder Tôi hoàn toàn hiểu sai về thử thách, sau đó ... vì lợi ích của việc không sao chép câu trả lời của bạn (vì bây giờ rõ ràng là tại sao nó lại hoạt động) Tôi sẽ bỏ qua vấn đề này.
phân tán




1

TI-Basic, 3 byte

2√(Ans

Cách tiếp cận đơn giản nhất ...



1

Thêm ++ , 22 20 byte

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

Hãy thử trực tuyến!

Bạn có muốn biết làm thế nào nó hoạt động? Chà, đừng sợ! Tôi ở đây để giáo dục bạn!

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

Tôi có cùng logic với câu trả lời QBIC ban đầu của mình, nhưng có một cách ngắn hơn .
steenbergh

1

MATL ( 8 7 byte)

Tôi chắc chắn điều này có thể giảm đáng kể (chỉnh sửa: cảm ơn Luis), nhưng một giải pháp ngây thơ là:

X^QUG-q

Hãy thử trực tuyến!

Giải trình:

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
Bạn có thể thay thế 2^ bằng U(và điều này đã hoạt động trong phiên bản 20.1.1 , đây là lần gần đây nhất tại thời điểm thử thách, vì vậy câu trả lời sẽ đủ điều kiện ngay cả theo tiêu chuẩn cũ của chúng tôi)
Luis Mendo

1
Cảm ơn Luis! Tôi ngạc nhiên khi cách tiếp cận ngây thơ của tôi chỉ lãng phí 1 ký tự so với chủ MATL. :)
DrQuarius



0

Alice , 10 byte

2/*<ER
o@i

Hãy thử trực tuyến!

Giải trình

Một lần nữa, tính 2 sqrt (n) . Bố cục lưu hai byte trên giải pháp tiêu chuẩn:

/o
\i@/2RE2*

Phân tích mã, không bao gồm chuyển hướng 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

Đã lưu một bó bằng cách sao chép cách tiếp cận của @ MartinEnder.

Không có liên kết TIO cho QBIC, thật không may.

Giải trình

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



0

Võng mạc , 21 byte

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

Hãy thử trực tuyến! Giải thích: Hoạt động bằng cách lấy căn bậc hai của số dựa trên bộ giải số tam giác của @ MartinEnder. Sau khi khớp số vuông, $1là sự khác biệt giữa số vuông và số vuông trước đó, theo đơn. Chúng tôi muốn sự khác biệt tiếp theo, nhưng độc quyền, chỉ là 1 nữa. Để đạt được điều này, chúng tôi đếm số chuỗi null trong $1.



0

Java (OpenJDK 9) / JShell, 17 byte

n->2*Math.sqrt(n)

Hãy thử trực tuyến!

Lưu ý: Điều này sẽ yêu cầu import java.util.function.*;nhận được IntFunction<T>trong Java 8 hoặc Java 9, nhưng java.util.functiongói được nhập theo mặc định trong JShell.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.