Найменші цілі числа після N ділиться на 2, 3 і 4


22

Надайте кредит тому, кому належить кредит .

Мета Дано ціле число N > 0, з найменших цілих чисел A, Bі Cтаким чином , щоб:

  1. Все A, Bі Cстрого більше N;
  2. 2ділить A;
  3. 3ділить B;
  4. і 4ділить C.

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

Тестові кейси

N => A, B, C
1 => 2, 3, 4
4 => 6, 6, 8
43 => 44, 45, 44
123 => 124, 126, 124
420 => 422, 423, 424
31415 => 31416, 31416, 31416
1081177 => 1081178, 1081179, 1081180

Чи можемо ми (послідовно) виводити результати в іншому порядку (наприклад C B A), якщо це чітко визначено у відповіді?
Мартін Ендер

@ MartinBüttner, що прийнятно
Conor O'Brien

Відповіді:


17

Желе , 8 байт

~%2r4¤+‘

Спробуйте в Інтернеті! або перевірити всі тестові випадки .

Як це працює

~%2r4¤+‘  Main link. Argument: n (integer)

~         Bitwise NOT; yield ~n = -(n + 1).
     ¤    Combine the three links to the left into a niladic chain:
  2         Yield 2.
   r4       Yield the range from 2 to 4, i.e., [2, 3, 4].
 %        Yield the remainder of the division of ~n by 2, 3 and 4.
          In Python/Jelly, -(n + 1) % k = k - (n + 1) % k if n, k > 0.
       ‘  Yield n + 1.
      +   Add each modulus to n + 1.

26

Python 2, 32 байти

lambda n:[n+2&-2,n/3*3+3,n+4&-4]

Бітова арифметика для 2 і 4, модульна арифметика для 3.

Я знайшов чотири 7-байтних вирази для наступного кратного kвище, nале жодного коротшого:

n-n%k+k
~n%k-~n
n/k*k+k
~n/k*-k

Будь-який дає 34 байти при копії для k=2,3,4та 33 байти у поєднанні:

[n/2*2+2,n/3*3+3,n/4*4+4]
[n/k*k+k for k in 2,3,4]

Але 2 і 4 - це потужності 2, які дозволяють бітовим трюкам нульову кількість останніх 1 або 2 байтів.

n+2&-2
n+4&-4

Це дає 6 байт (замість 7) для отримання наступного кратного, за 32 байти в цілому, побиття for k in 2,3,4.

На жаль, першочергове n|1+1і n|3+1доповнення зроблено спочатку, тож збільшення результату займає дужки.


1
З можливих варіантів, на які я віддаю перевагу n+k-n%k.
Ніл

Чи n&3+1робиться додавання спочатку теж?
Тім

@Tim Yup, те саме з усіма булевими операціями.
xnor


12

MATL, 15 10 9 байт

2:4+t5M\-

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

Пояснення:

2:4          #The array [2, 3, 4]
   +         #Add the input to each element, giving us [12, 13, 14]
    t        #Duplicate this array
     5M      #[2, 3, 4] again
       \     #Modulus on each element, giving us [0, 1, 2]
        -    #Subtract each element, giving us [12, 12, 12]

3
Гарна відповідь! Ви можете зберегти байт, використовуючи 5M(автоматичний буфер входів функцій) замість другого 2:4.
Девід

@David Дякую за пораду!
DJMcMayhem

12

MATL, 8 байт

Qt_2:4\+

Використовує алгоритм Jelly Jelly, я здивований, що це однакова довжина!

Спробуйте в Інтернеті або перевірити всі тестові випадки .

Q    % takes implicit input and increments by one
t_   % duplicate, and negate top of stack (so it's -(n+1))
2:4  % push vector [2 3 4]
\    % mod(-(n+1),[2 3 4])
+    % add result to input+1
     % implicit display

Ну, чорт. Я дуже пишався своїм 10-байтним рішенням, але не можу цього перемогти. Також веселі дрібниці: Це саме мій 300-й голос. = D
DJMcMayhem

Ааа, але це було лише з використанням алгоритму Агава / Денніса, це не моя власна ідея.
Девід

1
Іноді я продовжую вдивлятися в ті елементарні символи мандариноїдів Unicode, коли дряпаюсь по голові, то я кажу: "заради всього читаного - це роздвоєний код, який можна виконати"? кохана приємна річ, я підняла свою пропозицію + я приєднаюся до поїзду Matl Sooon.
16001

@ Agawa001 Ви повинні! Зважаючи на те, що ви добре знаєте свій шлях навколо Matlab, вам слід знайти це досить просто, велика різниця полягає в тому, що MATL працює на стеці. Також є чат MATL, якщо вам потрібна допомога!
Девід

@ Уважайте, що матовий характер на основі млинців робить зліснішими страшні знання, що саме сирий матлаб - це готова мова для гольфу щодо його
взаємоздатності на

6

Матлаб, 33 байти

Ще один дещо інший підхід

@(a)feval(@(x)a+1+mod(-a-1,x),2:4)

6

05AB1E , 8 байт

Код:

>D(3L>%+

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


Ах, не помітили, що вже була відповідь 05AB1E, яка досить схожа на те, що я. Я видалив його, і запропонував би його як -1 гольф тут: ±D2xŸ%α( 2xŸце лише альтернатива вашому 3L>; і дві інші рівнобайтові альтернативи можуть бути Ƶ…Sабо 4L¦).
Кевін Круїссен




4

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

Ceiling[#+1,{2,3,4}]&

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

CeilingФункція приймає необов'язковий другий параметр , який говорить йому , щоб округлити до наступного кратного заданого числа. На щастя, він також автоматично передає свій другий аргумент таким чином, що ми можемо надати йому список значень, і, в свою чергу, ми отримаємо округлені кратні для всіх цих.


4

Октава, 20 байт

@(n)n-mod(n,d=2:4)+d

Приклади:

octave:60> f(123)
ans =

   124   126   124

octave:61> f(1081177)
ans =

   1081178   1081179   1081180

octave:62> f(420)
ans =

   422   423   424

Варто зазначити, що ми можемо це зробити до 9, не додаючи зайвих байтів:

@(n)n-mod(n,d=2:9)+d

Вихід (2520 - найменше додатне ціле число, рівномірно розділене всіма одноцифровими числами):

octave:83> f(2520)
ans =

   2522   2523   2524   2525   2526   2527   2528   2529


4

Лабіринт , 19 байт

:?
:
#/)
\ #
!"*@
"

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

Це виводить результати в порядку, C, B, Aрозділеному каналами рядків.

Пояснення

Як завжди, короткий лабіринт:

  • Лабіринт має два штабеля довільної точності цілих чисел, основний і AUX (iliary), які спочатку заповнені (неявне) нескінченну кількість нулів. Для цієї відповіді ми будемо використовувати лише основне .
  • Вихідний код нагадує лабіринт, де вказівник інструкції (IP) слідує за коридорами, коли може (навіть за кутами). Код починається з першого дійсного символу в порядку читання, тобто у верхньому лівому куті в цьому випадку. Коли IP доходить до будь-якої форми з'єднання (тобто декількох суміжних комірок на додаток до тієї, з якої він увійшов), він вибере напрямок на основі верхньої частини основного стеку. Основні правила: поверніть ліворуч при негативі, продовжуйте рухатись вперед, коли нуль, поверніть праворуч, коли позитивно. І коли одне з них неможливо, тому що є стіна, то IP буде приймати протилежний бік. ІС також обертається, коли потрапляє в тупики.

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

IP починається у верхньому лівому куті :справа. Він негайно потрапить у тупик на ?і повернеться, так що програма насправді починається з цього лінійного фрагмента коду:

:   Duplicate top of main stack. This will duplicate one of the implicit zeros
    at the bottom. While this may seem like a no-op it actually increases
    the stack depth to 1, because the duplicated zero is *explicit*.
?   Read n and push it onto main.
:   Duplicate.
:   Duplicate.

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

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

Тіло циклу таке:

#   Push the stack depth, i.e. the current multiplier k.
/   Compute n / k (rounding down).
)   Increment.
#   Push the stack depth again (this is still k).
*   Multiply. So we've now computed (n/k+1)*k, which is the number
    we're looking for. Note that this number is always positive so
    we're guaranteed that the IP turns west to continue the loop.
"   No-op.
!   Print result. If we've still got copies of n left, the top of the 
    stack is positive, so the IP turns north and does another round.
    Otherwise, see below...
\   Print a linefeed.
    Then we enter the next loop iteration.

Після того, як цикл пройшов (до !) три рази, всі копії nвикористовуються і виявляється нуль під ним. Через "нижню частину (яка інакше здається досить марною) ця позиція є стиком. Це означає, що з нулем на вершині стека, IP намагається йти прямо вперед (на захід), але, оскільки там є стіна, вона насправді робить поворот на 180 градусів і рухається назад на схід, ніби потрапила в глухий кут.

Як результат, зараз виконується наступний біт:

"   No-op.
*   Multiply two zeros on top of the stack, i.e. also a no-op.
    The top of the stack is now still zero, so the IP keeps moving east.
@   Terminate the program.

3

Матлаб, 50 байт

@(a)arrayfun(@(k)find(~rem(a+1:a+k,k))+a,[2 3 4])

Принаймні, ви можете використовувати 2:4замість цього [2 3 4].
Suever


3

JavaScript (ES6), 26 байт

Цікаво, що або відповідь Рубі @ KevinLau, або відповідь Python @ xnor дає однакову довжину:

n=>[2,3,4].map(d=>n+d-n%d)
n=>[n+2&-2,n+3-n%3,n+4&-4]

Я маю перевагу перед портом відповіді Ruby, оскільки він працює до 2 53 -3, тоді як порт відповіді Python працює лише до 2 31 -5.


)-> ]як я думаю
Квертій

@Qwertiy Whoops, вибачте за друкарські помилки.
Ніл

3

C, 50 46 байт

i;f(int*a,int n){for(i=1;++i<5;*a++=n+i-n%i);}

Дякуємо Нілу та nwellnhof за збереження 4 байтів!

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

i;f(int*a,int n){for(i=1;++i<5;*a++=n+i-n%i);}

int main()
{
    int array[3];
    int n=10;
    f(array, n);
    printf("A:%d\tB:%d\tC:%d\n",array[0],array[1],array[2]);
    return 0;
}

Я переглянув біт-подвійність @ xnor, але вам потрібно розкрутити цикл для того, що в кінцевому рахунку коштуватиме вам загальний байт.
Ніл

Це не n + i - n % i++призводить до невизначеної поведінки?
nwellnhof

Також s/a[i-2]/*a++/зберегти два байти.
nwellnhof

@nwellnhof Ба, я подумав про це, коли я розкрутив його петлю, але мені не прийшло в голову, що він все одно може її використовувати.
Ніл

2
@Neil Але невизначене поведінку можна обійти, не збільшуючи код. Ось ще коротша версія з використанням декларацій функції K&R:f(a,n,i)int*a;{for(i=1;++i<5;)*a++=n+i-n%i;}
nwellnhof

3

Ренг, 40 байт

i1+#i2341ø>(1+)31j
i(2[¤,  q!^$]æl0eq!~

1: ініт

i1+#i2341ø

i1+#iвстановлює вхід до 1 + input; це тому, що ми повинні працювати над числами, строго більшими за вхідні. 234ініціалізує стрічку з нашими значеннями ітерації та переходить до початку наступного рядка.

2а: петля

i(2[¤,  q!^$]æl0eq!~

i(ставить вхід на STOS і 2[робить новий стек з верхніми 2 елементами. ¤дублює стек і ,робить модуль. Якщо є залишок, q!^вирветься з циклу, щоб перейти до (b). Інакше ми добре друкуємо. $видаляє зайві речі, ]закриває стопку і æдобре друкує. l0wq!~завершує, якщо стек містить нульові члени.

2b: та інша петля

          >(1+)31j
        q!^

(1+)додає 1 до STOS і 31jпереходить до тієї частини циклу, яка не бере матеріал із стека. І прибуток.


Цей додатковий пробіл дійсно мене турбує. Візьміть GIF.

REENNNNGGGG


3

Сітківка, 62 43 26 байт

17 байт завдяки @Martin Büttner .

^
1111:
M! & `(11 +): (\ 1 *)
:

(Зверніть увагу на останній рядок.)

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

Введення в одинаковому в 1, виведення в одинарне в 1розділених новими рядками.

Попередня 43-байтна версія:

.+
11:$&;111:$&;1111:$&
\b(1+):(\1*)1*
$1$2

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

Введення в одинаковому, вихід у унарному, розділеному крапкою з двокрапкою ( ;).

Попередня 62-байтна версія:

.+
$&11;$&111;$&1111
((11)+)1*;((111)+)1*;((1111)+)1*
$1;$3;$5

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

Введення в одинаковому, вихід у унарному, розділеному крапкою з двокрапкою ( ;).


26, якщо дозволено вихід у зворотному порядку: retina.tryitonline.net/… ... Інакше 33, хоча я думаю, що повинен бути коротший шлях, що дозволяє уникнути зворотного сортування: retina.tryitonline.net/…
Мартін Ендер

Цього достатньо, щоб кваліфікувати як окрему відповідь?
Лина монашка

Я не знаю, це все одно та сама ідея, я просто замінив генерування списку вручну використанням збігів, що перекриваються.
Мартін Ендер

Конор підтвердив, що 26-байтне рішення є дійсним.
Мартін Ендер

3

Октава, 27 22 20 байт

MATLAB і Octave:

f=2:4;@(x)f.*ceil((x+1)./f)

Краще (рішення еквівалентні, але одне може перевершити інше при подальшій гольфінгу), MATLAB та Octave:

@(x)x-rem(x,2:4)+(2:4)
f=2:4;@(x)x+f-rem(x,f)

Тільки в Octave:

@(x)x-rem(x,h=2:4)+h

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


Мій остаточну відповідь, в основному , що один тут :( codegolf.stackexchange.com/a/80028/52795
Берс



2

Mathematica 28 байт

f@n_:=n-n~Mod~#+#&/@{2,3,4}

f[1]
f[4]
f[43]
f[123]
f[420]
f[31415]
f[1081177]

{2, 3, 4}

{6, 6, 8}

{44, 45, 44}

{124, 126, 124}

{422, 423, 424}

{31416, 31416, 31416}

{1081178, 1081179, 1081180}


Загальний випадок дає загальну відповідь:

f[r]

{2 + r - Mod [r, 2], 3 + r - Mod [r, 3], 4 + r - Mod [r, 4]}


2

R, 30 26 байт

(Скорочено на 4 байти завдяки @Neil)

N=scan();cat(N+2:4-N%%2:4)

Це (подібно до решти відповідей, які я думаю) додає 2: 4 до вхідних даних і зменшує залишок після запуску модуля на тих самих числах.


1
Оскільки я не знаю мови, є причина, яку ви не використовуєте N+2:4-N%%2:4?
Ніл

@Neil Причина, я не думаю про це, я думаю. Спасибі, хоча.
Девід Аренбург

2

УГЛ , 51 31 25 24 байт

icu$l_u^^/%_u^*ocO$dddd:

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

Попередня 25-байтна версія:

iRcu$l_u$r^/%_u*ocO$dddd:

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

Попередня 31-байтна версія:

iRcuuulu$cuuuuuu%-r^/%_u*oddcO:

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

Попередня 51-байтна версія:

i$$cuuu/%_ucuuu*@cuuuu/%_ucuuuu*@cuu/%_ucuu*ocOocOo

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




1

Власне, 22 байти

╗52x"╝1`;╛@%Y@╜<*`╓"£M

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

Забавний факт: під час написання цієї програми було виявлено та виправлено 3 помилки у перекладачі власне.

Не такий цікавий факт: ці 3 помилки завадили цьому рішенню значно скоротитися.

Пояснення:

╗52x"╝1`;╛@%Y@╜<*`╓"£M
╗                       push input to reg0
 52x                    push range(2,5) ([2,3,4])
    "╝1`;╛@%Y@╜<*`╓"£M  map (for n in [2,3,4]):
     ╝                    push n to reg1
      1`;╛@%Y@╜<*`╓       find the smallest integer k where:
        ;╛@%Y               k is divisible by n and...
             @╜<*           is greater than the input

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