Round Me, Tolong Saya

23

Diberikan input n, program atau fungsi Anda harus menampilkan bilangan bulat positif terkecil ksehingga ndibulatkan ke kelipatan terdekat klebih besar dari n.

Contoh.

Diberikan input 20, nilai output harus 3:

  • Kelipatan terdekat 1adalah 20, yang tidak lebih besar dari 20.

  • Kelipatan terdekat 2adalah 20, yang tidak lebih besar dari 20.

  • Beberapa terdekat dari 3yaitu 21, yang adalah lebih besar dari 20, sehingga output.

Uji Kasus

#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

Output yang diberikan input ganjil harus 2.

Aturan

  • n adalah bilangan bulat positif kurang dari 2^32
  • pembulatan dilakukan sedemikian rupa sehingga jika dua kelipatan ksama jauhnya dari n, yang lebih besar dipilih ( "babak separuh" ). Dengan cara ini, setiap ganjil nmenghasilkan output 2.
  • Ini adalah , sehingga kode terpendek di setiap bahasa menang.
fireflame241
sumber
Saya telah mengedit format kotak uji untuk membuatnya lebih mudah dibaca, dan lebih ringkas. Beri tahu saya jika Anda memiliki masalah dengan ini, atau jika ada contoh baru tidak aktif. :)
DJMcMayhem
@Shaggy Done! Saya menghapus 500 peluang dan 450 bahkan dari daftar.
fireflame241
Apakah ada tautan oeis untuk urutan ini?
James K
@ JamesK saya tidak menemukan satu ketika saya mencari sebelumnya. Mungkinkah seseorang dengan akun OEIS dapat membuatnya?
fireflame241

Jawaban:

12

Python 3 , 48 38 byte

Edit: -10 byte dengan menggunakan rekursi

l=lambda x,y=2:y*(x%y>=y/2)or l(x,y+1)

Cobalah online!

Halvard Hummel
sumber
9

Japt , 6 byte

@<rX}a

Cobalah online!

Penjelasan:

@    <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
Oliver
sumber
2
rApakah builtin? o_o
Erik the Outgolfer
@EriktheOutgolfer: Japt juga memiliki built-in untuk membulatkan ke atas :)
Shaggy
5
Saya tahu fitur ini akan berguna suatu hari nanti: D
ETHproduksi
@ Shaggy itu gila! o_o_o
Erik the Outgolfer
@Oliver: Ini membuat saya lebih yakin untuk memahami metode fungsi, sekarang - versi saya sendiri adalah 7 byte:o æ@<rX
Shaggy
7

MATL , 13 byte

tQ:yy/Yo*<fX<

Cobalah online! Atau verifikasi semua input dari 1hingga1000 .

Penjelasan

Pertimbangkan input 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
Luis Mendo
sumber
5

JavaScript (ES6), 28 25 byte

n=>g=x=>n%x>=x/2?x:g(-~x)
  • 3 byte disimpan berkat Arnauld.

Menguji

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>

Atau uji semua angka mulai 1-1000 (Beri waktu sebentar untuk menjalankan):

Shaggy
sumber
5

Proton , 33 byte

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

Cobalah online!

Tuan Xcoder
sumber
Saya tidak tahu apa-apa tentang Proton, tetapi sepertinya Anda dapat menghemat 3 byte: Cobalah secara online!
jferard
Mungkin kebetulan, tapi ini persis sama dengan solusi yang benar-benar manusiawi ...: p
Erik the Outgolfer
@EriktheOutgolfer Kami mempostingnya pada waktu yang sama (sebenarnya saya meninjaunya beberapa detik) dengan 37-byter, karena Hyper membobol operator, dan ketika dia memperbaikinya kami berdua memperbarui.
Tn. Xcoder
Uhh, aku ninja kan IIRC. : P
totallyhuman
@totallyhuman Anda ninja saya dengan 41-byter. Saya memposting 37-byter pertama dan ninja Anda dengan yang oleh beberapa detik.
Tn. Xcoder
4

Proton , 33 byte

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

Cobalah online!

benar-benar manusiawi
sumber
FWIW, mengapa Anda menghapus <!-- language: lang-python -->?
Tn. Xcoder
3

Jelly , 11 byte

÷R%1<.¬;1TṂ

Tautan monadik yang mengambil dan mengembalikan bilangan bulat positif.

Cobalah online! atau lihat test suite .

Bagaimana?

÷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

Catatan: Rangkaian 1ini hanya untuk menangani kasus-kasus di mana nsalah satu 1, 2atau 4ketika hasilnya perlu n+1( ‘R÷@%1<.¬TṂjuga akan bekerja).

Jonathan Allan
sumber
3

Haskell , 33 32 byte

f n=[i|i<-[1..],2*mod n i>=i]!!0

Cobalah online!

Disimpan satu byte berkat w0lf

jferard
sumber
Anda dapat menggunakan !!0sebagai gantinyahead
Cristian Lupascu
2

Pyth, 5 byte

fgy%Q

Suite uji

Tidak ada pembulatan bawaan, hanya memeriksa untuk bilangan bulat positif pertama T, di mana gandakan input mod T lebih besar dari atau sama dengan T.

Penjelasan:

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
isaacg
sumber
2

Kode Mesin x86, 17 byte

Kode ini mengimplementasikan solusi dasar yang berulang dalam bentuk fungsi yang dapat digunakan kembali:

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

Fungsi ini mengikuti konvensi pemanggilan cepat , sehingga parameter tunggal ( n) dilewatkan dalam ECXregister. Nilai pengembalian ( k) adalah, seperti biasa, dikembalikan dalam EAXregister.

Cobalah online!

Cody Grey
sumber
2

Java 8, 42 byte

Lambda dari Integerke Integer.

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

Cobalah secara Online

Ucapan Terima Kasih

  • -1 byte terima kasih kepada Kevin Cruijssen
Jakob
sumber
4
Anda dapat menyimpan byte dengan memulai f=1dan menggunakan byte ++fpertama f, seperti ini:n->{for(int f=1;;)if(n%++f*2>=f)return f;}
Kevin Cruijssen
1

Perl 5 , 24 + 1 (-p) = 25 byte

1while$_%++$k<$k/2;$_=$k

Cobalah online!

Mencoba setiap bilangan bulat $kmulai dari 1 hingga menemukan sisa yang setidaknya setengah $k.

Xcali
sumber
1

Keempat (gforth) , 45 byte

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

Cobalah online!

Penjelasan Kode

: 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
reffu
sumber
1

05AB1E , 9 byte

∞.ΔIs/Dò‹

Cobalah online!

Penjelasan

∞.Δ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
Black Owl Kai
sumber
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

Kamu bisa mencoba rockstar online , tetapi Anda harus menyalin dan menempelkan kode. Ini akan meminta Anda untuk memasukkan nomor.

Saya tidak menggunakan hitungan byte terendah, karena Rockstar jelas tidak dibuat untuk bermain golf, jadi saya mencoba mencari lirik Rock 'n' Roll.

Penjelasan:

Ini didasarkan pada solusi yang sama dengan yang lain (python, java):

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

Pertama saya perlu mendefinisikan fungsi modulus dan langit-langit, yang demi puisi disebut Thought and Rock.

Di bawah ini adalah versi yang kurang puitis dengan nama variabel yang berbeda, dan penjelasan di mana sintaksanya tidak jelas. Tanda kurung menunjukkan komentar.

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)
IMP1
sumber
0

Jelly , 18 byte

ɓ÷Ḟ,¥Ċ$×ạÐṂ⁸Ṁ>⁸µ1#

Cobalah online!

Program lengkap.

Erik the Outgolfer
sumber
3
Full program.Kapan bukan?
totallyhuman
@totallyhuman Terkadang ini juga berfungsi sebagai fungsi.
Erik the Outgolfer
0

Swift 3 , 51 byte

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

Untuk beberapa alasan yang sangat aneh, [0]tidak berfungsi secara online. Berikut ini adalah versi yang kompatibel dengan kompiler online (yang menggunakan .first!sebagai gantinya):

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

Test Suite (kompatibel online).

Tuan Xcoder
sumber