N之后的最小整数可被2、3和4整除


22

归功于应归功于谁

目的:给定一个整数N > 0,从最小的整数AB以及C使:

  1. 所有的AB以及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

Answers:


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的模块化算术。

我为k上面的下一个倍数找到了四个7字节表达式,n但没有一个短:

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

当复制时k=2,3,4,Any会提供34字节,如果组合则为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)

@Tim是,与所有布尔操作相同。
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\+

使用Denis的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

啊,但这只是采用Agawa / Dennis的算法,这不是我自己的想法。
大卫,

1
有时,我在挠挠头的时候总是瞪着那些unicode普通话基本字符,然后我说:“为了可读性强,这是一个可分叉的可运行代码”?大声笑有我的支持,我很快就会加入马特火车。
2016年

@ Agawa001你应该!充分了解Matlab的知识后,您应该会发现它非常简单,最大的不同是MATL基于堆栈。如果您需要任何帮助,还可以使用MATL聊天室
大卫,

@David基于煎饼的性质,使Matl变得更加邪恶,这令人生畏,因为原始Matlab本身是一种高尔夫友好型语言,具有较高的交互性,因此,请想象....
Abr001am,2016年

6

Matlab,33个字节

另一种略有不同的方法

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

6

05AB1E,8个字节

码:

>D(3L>%+

在线尝试!


啊,没有注意到已经有一个05AB1E的答案,它与我的答案非常相似。我已经删除了它,并建议在这里将其作为-1 golf:(±D2xŸ%α2xŸ只是您的替代方法3L>;其他两个等字节的替代方法可能是Ƶ…Sor 4L¦)。
凯文·克鲁伊森

5

Ruby,27个字节

将2、3和4映射到上方的下一个倍数n

->n{(2..4).map{|e|n+e-n%e}}


4

Pyke,11 9 8字节

3FODQRc+

在这里尝试!

3FODQRc+
         - Q = input()
3F       - for i in range(3): # for i in [0,1,2]
  O      -  i += 2
    Q c  -   Q-(Q%i)
       + -  i+^

4

Mathematica,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换行符分隔的顺序输出结果。

说明

与往常一样,简短的迷宫底漆:

  • 迷宫有两堆任意精度的整数,分别是mainaux(iliary),它们最初都填充了(隐式)无限数量的零。我们只会将main用于此答案。
  • 源代码类似于一个迷宫,在该迷宫中,指令指针(IP)可以(甚至在拐角处)跟随走廊。代码从阅读顺序的第一个有效字符开始,即在这种情况下从左上角开始。当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在主堆栈上有3个副本,但其深度为4。这很方便,因为这意味着我们可以在处理输入的副本时,通过堆栈深度来检索当前的乘数。

IP现在进入(顺时针)3x3循环。请注意#,它推动堆栈深度,它将始终推动一个正值,这样我们就知道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.

遍历循环(最多!)3次后,的所有副本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

Matlab,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的Ruby答案或@xnor的Python答案的结果长度相同:

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

我对Ruby Answer的端口稍有偏爱,因为它最多可以使用2 53 -3,而Python Answer的端口最多只能使用2 31 -5。


)-> ]我认为
Qwertiy

@Qwertiy糟糕,抱歉打错了。
尼尔

3

C,50 46字节

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

感谢Neil和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 '16

还要s/a[i-2]/*a++/节省两个字节。
nwellnhof '16

@nwellnhof Bah,当我展开他的循环时,我想到了这一点,但我并没有想到他仍然可以使用它。
尼尔

2
@Neil但是可以解决未定义的行为而无需增加代码。这是使用K&R函数声明的更短版本:f(a,n,i)int*a;{for(i=1;++i<5;)*a++=n+i-n%i;}
nwellnhof

3

Reng,40个字节

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

1:初始化

i1+#i2341ø

i1+#i将输入设置为1 + input; 这是因为我们要处理严格大于输入的数字。234用我们的迭代值初始化磁带,然后跳到下一行的开头。

2a:循环

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

i(将输入放入STOS,并2[使用前2个元素构成一个新堆栈。¤复制堆栈,并进行,模量计算。如果有剩余,则q!^跳出循环转到(b)。否则,我们可以打印。$删除多余的东西,]关闭堆栈,并æ很好地打印。l0wq!~如果堆栈包含零个成员,则终止。

2b:另一个循环

          >(1+)31j
        q!^

(1+)将1加到STOS,然后31j跳转到循环中不会从堆栈中取出内容的部分。和利润。


多余的空格真的让我感到困扰。拿一个GIF。

雷恩·恩格


3

视网膜,62 43 26字节

感谢@MartinBüttner提供了 17个字节。

^
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/...
马丁安德

这足以作为单独的答案吗?
Leaky Nun

我不知道,这仍然是相同的想法,我只是使用重叠匹配替换了手动生成列表。
马丁·恩德

Conor确认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)

仅在八度音阶中:

@(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字节

(由于@Neil减少了4个字节)

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

这(类似于我猜的其余答案)将2:4添加到输入中,并在对相同数字进行模运算后减少了余数。


1
由于我不懂该语言,您有不使用的理由N+2:4-N%%2:4吗?
尼尔

@Neil因为我没想到。不过谢谢
David Arenburg '16




1

其实是22个位元组

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

在线尝试!

有趣的事实:在编写此程序时,发现并修复了Actually解释器中的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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.