Серія розділення


31

Ми можемо визначити рядок поділу kчисла n, знайшовши найменше невід’ємне ціле число kтаке, яке n+kне ділиться на k+1.

Виклик

Мовою, що вибираєте, напишіть програму або функцію, яка виводить або повертає смугу поділу вашого вводу.

Приклади:

n=13:
13 is divisible by 1 
14 is divisible by 2 
15 is divisible by 3 
16 is divisible by 4 
17 is not divisible by 5

Смуга розділення 13є4

n=120:
120 is divisible by 1 
121 is not divisible by 2 

Смуга розділення 120є1

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

n      DS
2      1
3      2
4      1
5      2
6      1
7      3
8      1
9      2
10     1
2521   10

Більше тестових випадків можна знайти тут .

Примітки

Правила

  • Можна припустити, що вхід більший за 1.

Оцінка балів

: подання з найнижчим балом виграє.


Я пропоную змінити "найменше додатне ціле число" на "найменше невід'ємне ціле число". Це зовсім не змінює виклик, але, згідно з поточним описом, це означає, що нам не потрібно перевіряти подільність на 1 (що нам технічно не повинно бути). Або це, або ви могли видалити подільність за допомогою 1 перевірки з опису.
TehPers

Найменше додатне ціле число дорівнює 1, а k + 12, де kнайменше додатне ціле число. Вибачте за нітпік.
TehPers

Хіба це не те, що знайти найменшого, kякий не розділяє n-1?
Paŭlo Ebermann

@ PaŭloEbermann Візьміть n=7де k=3: n-1ділиться на k.
Олівер

Ах, я пропустив +1.
Paŭlo Ebermann

Відповіді:



17

Java 8, 44 42 41 39 байт

Закреслений 44 все ще є регулярним 44; (

n->{int r=0;for(;~-n%--r<1;);return~r;}

-2 байти завдяки @LeakyNun .
-1 байт завдяки @TheLethalCoder .
-2 байти завдяки @Nevay .

Пояснення:

Спробуйте тут.

n->{                 // Method with integer as parameter and return-type
  int r=0;           //  Result-integer (starting at 0)
  for(;~-n%--r<1;);  //  Loop as long as `n-1` is divisible by `r-1`
                     //   (after we've first decreased `r` by 1 every iteration)
  return~r;          //  Return `-r-1` as result integer
}                    // End of method


1
41 байт Щойно поголив байт із пропозиції LeakyNun.
TheLethalCoder





4

JavaScript (ES6), 28 байт

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

Перевірте це

o.innerText=(f=

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

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





3

Cubix , 17 байт

)uUqI1%?;)qUO(;/@

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

Кубіфікований

    ) u
    U q
I 1 % ? ; ) q U
O ( ; / @ . . .
    . .
    . .
  • I1 налаштування стека з входом та дільником
  • %? робити мод і тестувати
    • ;)qU)uqUякщо 0 видалити введення результатів та збільшення ділення та дільник. Трохи навколо шляху, щоб повернутися%
    • /;(O@ якщо не 0, результат падіння, дільник декременту, вихід та вихід

Дивіться, як це працює




2

Швидкий 4 , 56 байт

Це повна функція f, з цілим параметром, iякий друкує вихід.

func f(i:Int){var k=0;while(i-1)%(k+1)<1{k+=1};print(k)}

Спробуйте тут.

Швидкий 4 , 56 байт

Це анонімна функція, яка повертає результат.

{var k=0;while($0-1)%(k+1)<1{k+=1};return k}as(Int)->Int

Спробуйте тут.

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



2

постійний струм , 28 байт

1si[1+dli1+dsi%0=M]dsMxli1-p

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

Це відчуває себе дійсно Субоптимальне, з приростом і остаточного декремента, але я не можу бачити спосіб поліпшити його. В основному ми просто збільшуємо лічильник iі стартове значення до тих пір, поки мод значення iпродовжує дорівнювати нулю, і як тільки це не відповідає дійсності, ми віднімаємо його iта друкуємо.



2

J, 17 байт

[:{.@I.>:@i.|i.+]

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

Я думаю, що тут ще є місце для гри в гольф.

Пояснення (невольф)

[: {.@I. >:@i. | i. + ]
                 i. + ]  Range [n,2n)
                 i.       Range [0,n)
                    +     Added to each
                      ]   n
         >:@i. | i. + ]  Divisibility test
         >:@i.            Range [1,n+1)
               |          Modulo (in J, the arguments are reversed)
                 i. + ]   Range [n,2n)
    {.@I.                Get the index of the first non-divisible
       I.                 Indices of non-zero values
    {.                    Head

Cap ( [:) є, щоб переконатися, що J не звертається до останнього дієслова ({.@I. ) як до частини гачка.

Єдиний різновид дивної речі щодо цієї відповіді полягає в тому, що I.насправді дублюється індекс кожного ненульового числа стільки разів, скільки значення цього числа. напр

   I. 0 1 0 2 3
1 3 3 4 4 4

Але це не має значення, оскільки ми хочемо перший індекс все-таки (і з тих пір i. дає висхідний діапазон, ми знаємо, що перший індекс буде найменшим значенням).

Нарешті, ось дуже короткий доказ того, що перевіряти поділ справедливо лише до n.

Ми починаємо перевіряти подільність 1 | n, тому припускаючи, що смуга йде так далеко, як тільки ми переходимо до перевірки подільності, яку nми n | 2n - 1ніколи не буде правдою ( 2n - 1 ≡ n - 1 (mod n)). Тому смуга закінчиться на цьому.



2

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

49                 dec    ecx        ; decrement argument
31 FF              xor    edi, edi   ; zero counter

                Loop:
47                 inc    edi        ; increment counter
89 C8              mov    eax, ecx   ; copy argument to EAX for division
99                 cdq               ; use 1-byte CDQ with unsigned to zero EDX
F7 FF              idiv   edi        ; EDX:EAX / counter
85 D2              test   edx, edx   ; test remainder
74 F6              jz     Loop       ; keep looping if remainder == 0

4F                 dec    edi        ; decrement counter
97                 xchg   eax, edi   ; move counter into EAX for return
C3                 ret               ;  (use 1-byte XCHG instead of 2-byte MOV)

Вищевказана функція приймає єдиний параметр n, в ECXрегістрі. Він обчислює свою смугу поділу kта повертає це через EAXрегістр. Він відповідає 32-розрядному режиму виклику швидких дзвінків , тому його легко можна звати з коду С за допомогою компіляторів Microsoft або Gnu.

Логіка досить проста: вона просто робить ітераційний тест, починаючи з 1. Він функціонально ідентичний більшості інших відповідей тут, але вручну оптимізований за розміром. Багато хороших інструкції 1 байт там, в тому числі INC, DEC, CDQ, і XCHG. Жорстко закодовані операнди для поділу трохи нашкодили нам, але не дуже страшно.

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



1

SOGL V0.12 , 8 байт

]e.-ē⁴I\

Спробуйте тут!

Непогано для мови, яка створена для зовсім іншого типу викликів.

Пояснення:

]         do .. while top of the stack is truthy
 e          push the variable E contents, by default user input
  .-        subtract the input from it
    ē       push the value of the variable E and then increase the variable
     ⁴      duplicate the item below one in the stack
      I     increase it
       \    test if divides
            if it does divide, then the loop restarts, if not, outputs POP which is `e-input`

1

Математика, 40 байт

Min@Complement[Range@#,Divisors[#-1]-1]&

Спробуйте в Інтернеті! (Математика)

Математичний підхід, n + k ділиться на k + 1, якщо і лише тоді, коли n-1 ділиться на k + 1. І n-1 не ділиться на n, такRange@# достатня кількість.

Спочатку я маю намір використовувати Min@Complement[Range@#,Divisors[#-1]]-1&, але це теж працює.


Чому капчу з’являється, коли я використовую подання від tio?
користувач202729

1
Тому що ви надто швидко набрали (скопіювали та вставили). Це не про TIO.
Leaky Nun

1

Julia 0.6.0 (47 байт) (38 байт)

n->(i=1;while isinteger(n/i) i+=1;n+=1 end;i-1)

n->(i=1;while n%i<1 i+=1;n+=1end;i-1)

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

9 байт було вирізано завдяки Mr.Xcoder


2
Зазвичай посилання "Спробуйте в Інтернеті" дозволяє людям реально спробувати код, визначивши комбінацію заголовка, колонтитула та аргументів, що означає, що натискання кнопки відтворення дає результат.
Пітер Тейлор

@PeterTaylor По чистому припущенню, я спробував запустити його як такий , і на мій подив, це спрацювало. Я рекомендую ОП для редагування у тестовій версії.
Містер Xcoder

46 байт (видаливши один пробіл):n->(i=1;while isinteger(n/i) i+=1;n+=1end;i-1)
Містер Xcoder

Ще однією чистою здогадкою було дозволено n->(i=1;while n%i<1 i+=1;n+=1end;i-1)
пограти

@PeterTaylor Вибачте, забув!
Гойса


1

Пакетна, 70 байт

@set/an=%1-1,i=0
:l
@set/ai+=1,r=n%%~i
@if %r%==0 goto l
@echo %i%

Все це робиться - це пошук найбільшого iтакого, що LCM(1..i)розділяє n-1.



1

Ацето , 28 27 байт

[;`%
I)@]
iIk2I(D(
rk[(&Xpu

Я міг би зберегти один байт, якщо мені не доведеться виходити.

Пояснення:

Ми використовуємо три стеки: лівий стек містить лічильник, починаючи з 2, правий тримає задане число (або його кроки), центральний стек використовується для виконання модульних операцій. Ми, звичайно, могли б зробити все за один стек, але таким чином ми можемо встановити зовнішні стеки "липкими" (значення, що з'являються, насправді не видаляються) і заощадити собі багато операцій дублювання. Ось метод детально:

Прочитайте ціле число, збільште його, зробіть поточний стек липким і "перемістіть" його (і ми самі) до стеку зліва:

iI
rk[

Перейдіть ще один стек ліворуч, натисніть буквене позначення 2, також зробіть цей стек липким. Запам'ятайте цю позицію в коді (@ ) і перенесіть значення і знову до центрального стеку.

  @]
  k2
   (

Тепер ми перевіряємо: чи модуль двох перших чисел не дорівнює 0? Якщо так, перескочіть до кінця, інакше перейдіть по одній стеці вправо, з кроком і натисніть значення і нас на середину. Потім переходимо до лівої стеки, збільшуючи її теж, і переходимо назад до позначки, яку ми встановили раніше.

[;`%
I)
    I(
    &

Коли результат модуля не дорівнював нулю, ми перевертаємо позицію, в якій рухається IP, переходимо на один стек ліворуч (де живе наш лічильник), зменшуємо його та друкуємо значення, а потім виходимо.

      D(
     Xpu


1

F #, 86 байт 84 байт

let s n = 
    let rec c n1 d r=if n1%d=0 then c(n1+1)(d+1)(r+1)else r
    c n 1 0

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

Редагувати: -2 символи від Олівера


Ласкаво просимо до PPCG! Чи приймає ваша програма stdin? Ви можете використовувати TIO , який має онлайн-перекладач F #. Також, чи можна видалити пробіл у r = if?
Олівер

1
@Oliver Дякую, я змінив посилання на TIO, тому тепер ви можете передати аргумент, щоб перевірити його. :)
Владислав Хапін

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