Вокруг меня, помоги мне


23

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

Пример.

Учитывая вход 20, выходное значение должно быть 3:

  • Ближайшим кратным 1является 20, который не больше чем 20.

  • Ближайшим кратным 2является 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

@ Шэгги Готово! Я удалил из списка 500 шансов и 450 событий.
fireflame241

Есть ли ссылка oeis для этой последовательности?
Джеймс К

@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такое встроенный? о_о
Эрик Outgolfer

@EriktheOutgolfer: у Japt также есть встроенные модули для округления вверх или вниз :)
Shaggy

5
Я знал, что эта функция когда-нибудь пригодится: D
ETHproductions

@ Шэгги, это безумие! o_o_o
Эрик 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]

Попробуйте онлайн!


Я ничего не знаю о Proton, но кажется, что вы можете сэкономить 3 байта: попробуйте онлайн!
jferard

Может быть, это совпадение, но это точно то же самое, что и полностью человеческое решение ...: p
Эрик Outgolfer

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

Я ниндзя, ты IIRC. : P
полностью человек

@totallyhuman Вы ниндзя со мной 41 байт. Сначала я опубликовал 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 больше или равен 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

Функция следует соглашению о вызовах fastcall , так что единственный параметр ( n) передается в ECXрегистр. Возвращаемое значение ( k), как правило, возвращается вEAX регистр.

Попробуйте онлайн!


2

Java 8, 42 байта

Лямбда из Integerв Integer.

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

Попробуйте онлайн

Подтверждения

  • -1 байт благодаря Кевину Круйссену

4
Вы можете сохранить байт, запустив f=1и использовав ++fпервый f, например:n->{for(int f=1;;)if(n%++f*2>=f)return f;}
Кевин Круйссен

1

Perl 5 , 24 + 1 (-p) = 25 байт

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

Попробуйте онлайн!

Пытается каждое целое число, $kначиная с 1, пока не найдет остаток, который составляет не менее половины $k.


1

Forth (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

рокзвезда , 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 явно не предназначен для игры в гольф, поэтому вместо этого я попытался перейти к текстам рок-н-ролла.

Объяснение:

Это основано на том же решении, что и другие (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

Swift 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!}

Test Suite (онлайн-совместимый).



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.