Округніть мене, допоможіть мені


23

З огляду на введення n, ваша програма або функція повинна виводити найменше додатне ціле число, kтаке, що nокруглене до найближчого кратного числа kбільше, ніж n.

Приклад.

Враховуючи вхід 20, вихідне значення повинно бути 3:

  • Найближчі кратна 1IS 20, яка НЕ більше 20.

  • Найближчі кратна 2IS 20, яка НЕ більше 20.

  • Найближчі кратна 3IS 21, який є більше 20, тому вихід.

Випробування

#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

Вихід з будь-якого непарного вводу повинен бути 2.

Правила

  • n додатне ціле число менше, ніж 2^32
  • округлення виконується таким чином, що якщо два кратні одиниці kоднаково віддалені n, вибирається більший ( "круглі половинки вгору" ). Таким чином, кожен непарний результат nдає результат 2.
  • Це , тому найкоротший код на кожній мові виграє.

Я відредагував формат ваших тестових випадків, щоб полегшити його читання та стисліше. Повідомте мене, якщо у вас виникли проблеми з цим чи будь-який із нових прикладів вимкнено. :)
DJMcMayhem

@Shaggy Готово! Я зняв зі списку 500 шансів і 450 евенів.
fireflame241

Чи існує посилання для цієї послідовності?
Джеймс К

@JamesK Я не знайшов його, коли шукав раніше. Можливо, хтось із обліковим записом OEIS міг би зробити його?
fireflame241

Відповіді:



9

Japt , 6 байт

@<rX}a

Спробуйте в Інтернеті!

Пояснення:

@    <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
rце вбудований? o_o
Erik the Outgolfer

@EriktheOutgolfer: Japt також має вбудовані модулі для округлення вгору або вниз :)
Shaggy

5
Я знав, що ця функція стане корисною колись: D
ETHproductions

@Shaggy це гайки! o_o_o
Erik the Outgolfer

@Oliver: Це мене ще більше переконало зрозуміти функції функцій, тепер - моя власна версія цього становила 7 байт:o æ@<rX
Shaggy

7

MATL , 13 байт

tQ:yy/Yo*<fX<

Спробуйте в Інтернеті! Або перевірити всі входи від 1до1000 .

Пояснення

Розглянемо вхід 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 байт

n=>g=x=>n%x>=x/2?x:g(-~x)
  • 3 байти збережено завдяки Арнольду.

Перевірте це

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>

Або протестуйте всі цифри від 1-1000 (дайте хвилині для запуску):


5

Протон , 33 байти

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

Спробуйте в Інтернеті!


Я нічого не знаю про Протон, але, здається, ви можете зберегти 3 байти: Спробуйте це в Інтернеті!
jferard

Можливо, збіг обставин, але це точно так само, як і зовсім нелюдське рішення ...: p
Ерік Аутгольфер

@EriktheOutgolfer Ми розмістили його одночасно (насправді я ніндзя його за кілька секунд) з 37-байтним, тому що Гіпер захищав операторів, і коли він виправляв їх, ми обидва оновили.
Містер Xcoder

Ух, я ніндзя ти IIRC. : P
повністюлюдський

@totallyhuman Ти ніндзя зі мною ніндзя. Я опублікував 37-байтовий спочатку і за кілька секунд вас з цим ніндзя.
Містер Xcoder



3

Желе , 11 байт

÷R%1<.¬;1TṂ

Монадічне посилання, що приймає і повертає додатні цілі числа.

Спробуйте в Інтернеті! або переглянути тестовий набір .

Як?

÷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

Примітка: конкатенація 1просто обробляти випадки , коли nє одним з 1, 2або 4коли результат повинен бути n+1( ‘R÷@%1<.¬TṂтакож буде працювати).




2

Pyth, 5 байт

fgy%Q

Тестовий набір

Ніяких округлих вбудованих, просто перевірка на перше додатне ціле число T, де подвійний вхідний модуль T більший або дорівнює Т.

Пояснення:

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

машинний код x86, 17 байт

Цей код реалізує основне, ітеративне рішення у вигляді функції багаторазового використання:

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

Функція слідує умові виклику швидкого виклику , так що єдиний параметр ( n) передається в ECXрегістр. kЗвичайне значення ( ), як правило, повертається в EAXрегістр.

Спробуйте в Інтернеті!




1

Четвертий (gforth) , 45 байт

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

Спробуйте в Інтернеті!

Пояснення коду

: 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 байт

∞.ΔIs/Dò‹

Спробуйте в Інтернеті!

Пояснення

∞.Δ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 байт

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

Ви можете спробувати rockstar в Інтернеті , але вам потрібно буде скопіювати та вставити код поперек. Він запропонує ввести номер.

Я не ходив на найменший байт, тому що Rockstar, очевидно, не створений для гри в гольф, тому натомість я спробував перейти на текст пісні Rock 'n' Roll.

Пояснення:

Це засновано на тому ж самому рішенні, що й інші (python, java):

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

Спершу мені потрібно визначити функції модуля та стелі, які заради поезії називають думкою та роком.

Нижче - менш поетична версія з різними іменами змінних та поясненнями, де синтаксис незрозумілий. У дужках позначають коментарі.

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

Швидкий 3 , 51 байт

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

З деяких надзвичайно химерних причин [0]не працює в Інтернеті. Ось веб-версія, сумісна з компілятором (яка використовується .first!замість):

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

Тестовий набір (сумісний з Інтернетом).



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.