Làm tròn cho tôi, giúp tôi


23

Đưa ra một đầu vào n, chương trình hoặc hàm của bạn phải xuất ra số nguyên dương nhỏ nhất ksao cho nlàm tròn đến bội số gần nhất klớn hơn n.

Thí dụ.

Cho một đầu vào 20, giá trị đầu ra phải là 3:

  • Bội số gần nhất của 120, đó là không lớn hơn 20.

  • Bội số gần nhất của 220, đó là không lớn hơn 20.

  • Bội số gần nhất của 321, mà lớn hơn 20, vì vậy nó là đầu ra.

Các trường hợp thử nghiệm

#Input  #Output
2       3
4       5
6       4
8       3
10      4
12      7
14      3
16      6
18      4
20      3
22      4
24      5
26      3
28      5
30      4
32      3
34      4
36      8
38      3
40      6
42      4
44      3
46      4
48      5
50      3
52      6
54      4
56      3
58      4
60      7
62      3
64      5
66      4
68      3
70      4
72      11
74      3
76      6
78      4
80      3
82      4
84      5
86      3
88      5
90      4
92      3
94      4
96      7
98      3
1000    6

Đầu ra cho bất kỳ đầu vào lẻ ​​nên là 2.

Quy tắc

  • n là một số nguyên dương nhỏ hơn 2^32
  • làm tròn được thực hiện sao cho nếu hai bội số kcách xa nhau n, thì số lớn hơn được chọn ( "nửa vòng lên" ). Theo cách này, mỗi số lẻ nmang lại một đầu ra 2.
  • Đây là , vì vậy mã ngắn nhất trong mỗi ngôn ngữ sẽ thắng.

Tôi đã chỉnh sửa định dạng của các trường hợp thử nghiệm của bạn để dễ đọc hơn và ngắn gọn hơn. Hãy cho tôi biết nếu bạn có bất kỳ vấn đề nào với điều này, hoặc nếu bất kỳ ví dụ mới nào bị tắt. :)
DJMcMayhem

@Shaggy Xong! Tôi đã loại bỏ 500 tỷ lệ cược và 450 evens khỏi danh sách.
fireflame241

Có một liên kết oeis cho chuỗi này?
James K

@JamesK Tôi không tìm thấy cái nào khi tôi tìm kiếm trước đó. Có thể ai đó có tài khoản OEIS có thể tạo một tài khoản?
fireflame241

Câu trả lời:



9

Japt , 6 byte

@<rX}a

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

Giải trình:

@    <r X}a
XYZ{U<UrX}a
X              // X = 0; Increments when the condition in between {...} fails
   {     }a    // Return the first integer X where:
    U          //   The input
     <U        //   is less than the input
       rX      //     rounded to the nearest multiple of X

2
rlà một nội dung? o_o
Erik the Outgolfer 16/08/17

@EriktheOutgolfer: Japt cũng đã tích hợp sẵn để làm tròn lên hoặc xuống :)
Shaggy

5
Tôi biết tính năng này sẽ có ích vào một ngày nào đó: D
Sản phẩm điện tử

@Shaggy đó là hạt dẻ! o_o_o
Erik the Outgolfer

@Oliver: Điều này khiến tôi bị thuyết phục hơn khi nắm bắt được các phương thức hàm, bây giờ - phiên bản của riêng tôi là 7 byte:o æ@<rX
Shaggy

7

MATL , 13 byte

tQ:yy/Yo*<fX<

Hãy thử trực tuyến! Hoặc xác minh tất cả các đầu vào từ 1đến1000 .

Giải trình

Xem xét đầu vào 6.

t      % Implicit input. Duplicate
       % STACK: 6, 6
Q:     % Add 1, range
       % STACK: 6, [1 2 3 4 5 6 7]
yy     % Duplicate top two elements
       % STACK: 6, [1 2 3 4 5 6 7], 6, [1 2 3 4 5 6 7]
/      % Divide, element-wise
       % STACK: 6, [1 2 3 4 5 6 7], [6 3 2 1.5 1.2 1 0.8571]
Yo     % Round to closest integer. Halves are rounded up
       % STACK: 6, [1 2 3 4 5 6 7], [6 3 2 2 1 1 1]
*      % Multiply, element-wise
       % STACK: 6, [6 6 6 8 5 6 7]
<      % Less than, element-wise
       % STACK: [0 0 0 1 0 0 1]
f      % Find: indices of nonzeros (1-based)
       % STACK: [4 7]
X<     % Minimum of vector. Implicit display
       % STACK: 4


5

JavaScript (ES6), 28 25 byte

n=>g=x=>n%x>=x/2?x:g(-~x)
  • 3 byte được lưu nhờ Arnauld.

Kiểm tra nó

o.innerText=(f=

n=>g=x=>n%x>=x/2?x:g(-~x)

)(i.value=64)();oninput=_=>o.innerText=f(+i.value)()
<input id=i type=number><pre id=o>

Hoặc kiểm tra tất cả các số từ 1-1000 (Đợi một phút để chạy):


5

Proton , 33 byte

n=>[x for x:2..n+2if n%x>=x/2][0]

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


Tôi không biết gì về Proton, nhưng có vẻ như bạn có thể tiết kiệm 3 byte: Hãy thử trực tuyến!
jferard

Có thể là một sự trùng hợp ngẫu nhiên, nhưng điều này hoàn toàn giống với giải pháp hoàn toàn của con người ...: p
Erik the Outgolfer 18/8/17

@EriktheOutgolfer Chúng tôi đã đăng nó cùng một lúc (trên thực tế tôi đã ninja anh ta vài giây) với 37 nhân viên, bởi vì Hyper đã làm phiền các nhà khai thác, và khi anh ta sửa chúng, cả hai chúng tôi đã cập nhật.
Ông Xcoder

Uhh, tôi là bạn IIRC. : P
hoàn toàn là

@totallyhuman Bạn ninja tôi với 41 -ter. Tôi đã đăng bài trước 37 phút và ninja sẽ cùng bạn đăng bài đó vài giây.
Ông Xcoder



3

Thạch , 11 byte

÷R%1<.¬;1TṂ

Một liên kết đơn lấy và trả về số nguyên dương.

Hãy thử trực tuyến! hoặc xem một bộ thử nghiệm .

Làm sao?

÷R%1<.¬;1TṂ - Link: number, n       e.g. 10
 R          - range(n)               [ 1,2,3     ,4  ,5,6     ,7     ,8   ,9     ,10]
÷           - n divided by           [10,5,3.33..,2.5,2,1.66..,1.42..,1.25,1.11..,1 ]
  %1        - modulo by 1            [ 0,0,0.33..,0.5,0,0.66..,0.42..,0.25,0.11..,0 ]
    <.      - less than 0.5?         [ 1,1,1     ,0  ,1,0     ,1     ,1   ,1     ,1 ]
      ¬     - not                    [ 0,0,0     ,1  ,0,1     ,0     ,0   ,0     ,0 ]
       ;1   - concatenate a 1        [ 0,0,0     ,1  ,0,1     ,0     ,0   ,0     ,0 , 1]
         T  - truthy indices         [            4    ,6                           ,11]
          Ṃ - minimum                4

Lưu ý: Các nối của 1chỉ là để xử lý các trường hợp nlà một trong những 1, 2hoặc 4khi kết quả cần phải được n+1( ‘R÷@%1<.¬TṂcũng sẽ làm việc).




2

Bình thường, 5 byte

fgy%Q

Bộ kiểm tra

Không có nội dung làm tròn, chỉ cần kiểm tra số nguyên dương T đầu tiên, trong đó nhân đôi số mod T đầu vào lớn hơn hoặc bằng T.

Giải trình:

fgy%Q
fgy%QTT    Implicit variable introduction.
f          Find the first positive integer T such that the following is truthy:
   %QT     Input % T
  y        Doubled
 g    T    Is greater than or equal to T

2

Mã máy x86, 17 byte

Mã này thực hiện một giải pháp lặp lại cơ bản dưới dạng hàm tái sử dụng:

31 F6                   xor    esi, esi
46                      inc    esi         ; set ESI (our temp register) to 1

                     Loop:
89 C8                   mov    eax, ecx    ; copy 'n' to EAX for division
46                      inc    esi         ; eagerly increment temp
99                      cdq                ; extend EAX into EDX:EAX
F7 F6                   div    esi         ; divide EDX:EAX by ESI
01 D2                   add    edx, edx    ; multiply remainder by 2
39 F2                   cmp    edx, esi    ; compare remainder*2 to temp
7C F4                   jb     Loop        ; keep looping if remainder*2 < temp

96                      xchg   eax, esi    ; put result into EAX (1 byte shorter than MOV)
C3                      ret

Hàm tuân theo quy ước gọi fastcall , sao cho tham số đơn ( n) được truyền vào thanh ECXghi. Giá trị trả về ( k) là, thông thường, được trả về trong thanh EAXghi.

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


2

Java 8, 42 byte

Lambda từ Integerđến Integer.

n->{for(int f=1;;)if(n%++f*2>=f)return f;}

Dùng thử trực tuyến

Lời cảm ơn

  • -1 byte nhờ Kevin Cruijssen

4
Bạn có thể lưu một byte bằng cách bắt đầu f=1và sử dụng ++fvào đầu tiên f, như thế này:n->{for(int f=1;;)if(n%++f*2>=f)return f;}
Kevin Cruijssen


1

Forth (gforth) , 45 byte

: f 1 begin 1+ 2dup mod over 1+ 2/ >= until ;

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

Giải thích mã

: f             \ start a new word definition
  1             \ start a counter at 1
  begin         \ start an indefinite loop
    1+          \ add 1 to counter
    2dup mod    \ duplicate input value and counter, get remainder of input/counter
    over 1+ 2/  \ get counter/2 (add 1 to force rounding up)
    >=          \ check if remainder is greater than counter/2
  until         \ end loop if true, otherwise go back to beginning
;               \ end word definition

1

05AB1E , 9 byte

∞.ΔIs/Dò‹

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

Giải trình

∞.ΔIs/Dò‹ Full code
∞.Δ       Returns the first number for which the following code returns true
             -> stack is [n]
   Is     Push the input and swap the stack -> stack is [input, n]
     /    Divide both of them -> stack is [input/n]
      Dò  Duplicate and round the second -> stack is [input/n, rounded(input/n)]
        ‹ Check if input/n got larger by rounding -> stack is [bool]
             -> if bool is true, abort and return the current number

1

Rockstar , 681 byte

Thought takes Patience and Control
While Patience is as high as Control
Let Patience be without Control

Give back Patience

Rock takes Art
Love is neverending
Sex is bottomless
Put Thought taking Art & Love into your head
If your head is Sex
Give back Art
Else
Limits are inspiration
Put Art with Limits without your head into the rubbish
Give back the rubbish


Listen to Chance
Questions are unstoppable
Until Questions is Chance
Build Questions up
Put Thought taking Chance, Questions into your mind
Answers are independence (but)
Put Questions over Answers into the world
Put Rock taking the world into the world
If your mind is as big as the world
Say Questions
Break it down

Bạn có thể thử rockstar trực tuyến , nhưng bạn sẽ cần sao chép và dán mã. Nó sẽ nhắc bạn cho một số đầu vào.

Tôi đã không đạt được số byte thấp nhất, vì Rockstar rõ ràng không được tạo ra để chơi gôn, vì vậy thay vào đó tôi đã cố gắng chuyển lời bài hát Rock 'n' Roll.

Giải trình:

Điều này dựa trên cùng một giải pháp như những người khác (python, java):

Iterate up from 2:
if n % iterator >= ceil(n/2)
    return iterator

Trước tiên, tôi cần xác định các mô đun và chức năng trần, vì mục đích của thơ được gọi là Tư tưởng và Đá.

Dưới đây là một phiên bản ít thơ hơn với các tên biến khác nhau và giải thích trong đó cú pháp không rõ ràng. Dấu ngoặc đơn biểu thị ý kiến.

Modulus takes Number and Divisor
While Number is as high as Divisor
Put Number minus Divisor into Number
    (blank line ending While block)
Give back Number (return Number)
    (blank line ending function declaration)
Ceil takes Decimal
Put Modulus taking Decimal, 1 into Remainder
If Remainder is 0
Give back Decimal (return Decimal)
Else
Put Decimal with 1 minus Remainder into Result
Give back Result (return Result)
    (blank line ending if block)
    (blank line ending function declaration)
Listen to Input (Read from STDIN to Input)
Index is 1
Until Index is Input
Build Index up (Increment by 1)
Put Modulus taking Input, Index into LHS
Put Index over 2 into RHS
Put Ceil taking RHS into RHS
If LHS is as big as RHS
Say Index
Break it down (Break from loop)


0

Swift 3 , 51 byte

{n in(2..<n+2).filter{Float(n%$0)>=Float($0)/2}[0]}

Vì một số lý do cực kỳ kỳ lạ, [0]không hoạt động trực tuyến. Đây là phiên bản tương thích với trình biên dịch trực tuyến (sử dụng .first!thay thế):

{n in(2..<n+2).filter{Float(n%$0)>=Float($0)/2}.first!}

Test Suite (tương thích trực tuyến).



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.