2、3、および4で割り切れるNの後の最小の整数


22

誰にクレジットを支払うべきかをクレジットします。

客観整数を考えるとN > 0、最小の整数アウトABCなるように:

  1. 、、およびのすべてはA、よりも厳密に大きい。BCN
  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@
コナー・オブライエン

回答:


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上記の次の倍数に対して4つの7バイト式が見つかりました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ではなく)が得られます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
いい答えだ!5M2番目の代わりに(関数入力の自動クリップボード)を使用してバイトを保存できます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
時々私は頭をかきながらそれらのユニコードのマンダリノイドの基本文字をにらみつけ続けます、そして、私は「読みやすいすべてのために、それは分岐する実行可能なコードです」と言いますか?素敵なことは私の賛成票を持っている+私はすぐにmatl列車に参加します。
Abr001am

@ Agawa001あなたがすべき!Matlabについてのあなたのやり方をかなりよく知っていれば、それはかなり簡単だとわかるはずです。大きな違いはMATLがスタックベースであることです。ヘルプが必要な場合は、MATLチャットルームもあります!
デビッド

MATLのパンケーキベースの性質は、それの生MATLAB自体はそう想像し、そのハイレベルなinteractabilityに関するゴルフフレンドリー言語であることがより悪怖いknowignly作ること@デビッド....
Abr001am

6

Matlab、33バイト

別のわずかに異なるアプローチ

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

6

05AB1E、8バイト

コード:

>D(3L>%+

オンラインでお試しください!


ああ、私が持っていたものとかなり似ている05AB1Eの回答が既にあることに気づかなかった。私はそれを削除しましたが、代わりにここで-1ゴルフとして提案します±D2xŸ%α(これ2xŸはあなたの3L>;に代わるものであり、他の2つの等バイトの選択肢はƵ…Sまたはになります4L¦)。
ケビンクルーッセン




4

Mathematica、21バイト

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

これは、入力として単一の整数を取り、その倍数のリストを返す名前のない関数です。

このCeiling関数は、指定された数値の次の倍数に切り上げるように指示するオプションの2番目のパラメーターを取ります。ありがたいことに、値のリストを渡すことができるように、2番目の引数に自動的にスレッド化され、これらすべての倍数が切り上げられます。


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は、すべての1桁の数字で均等に割り切れる最小の正の整数です):

octave:83> f(2520)
ans =

   2522   2523   2524   2525   2526   2527   2528   2529


4

ラビリンス、19バイト

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

オンラインでお試しください!

これは、C, B, A改行で区切られた順序で結果を出力します。

説明

いつものように、短いラビリンスプライマー:

  • Labyrinthには、mainaux(iliary)の任意精度整数の2つのスタックがあり、最初は(暗黙の)無限量のゼロで埋められます。この回答にはmainのみを使用します。
  • ソースコードは迷路に似ており、指示ポインター(IP)が可能な場合(コーナーの周りであっても)廊下をたどります。コードは、読み取り順序の最初の有効な文字、つまりこの場合は左上隅から始まります。IPが何らかの形式のジャンクション(つまり、元のセルに加えていくつかの隣接セル)に到達すると、メインスタックの最上部に基づいて方向を選択します。基本的なルールは次のとおりです。負の場合は左に曲がり、ゼロの場合は先に進み、正の場合は右に曲がります。そして、壁があるためにこれらのいずれかが不可能な場合、IPは反対方向を取ります。IPは、行き止まりに到達したときにも向きを変えます。

"レイアウトを少し無駄にする2つのノーオペレーション()にもかかわらず、実際には制御フローが非常に微妙なので、このソリューションには非常に満足しています。

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]

Pythonの回答のポートは2 31 -5 までしか機能しないのに対し、Rubyの回答のポートは2 53 -3 まで機能するため、少し好みがあります。


)- > ]私が考えるよう
Qwertiy

@Qwertiyおっと、タイプミスでごめんなさい。
ニール

3

C、50 46バイト

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

4バイトを節約してくれたNeilとnwellnhofに感謝します!

残念ながら長い。ここに、私が知らないビットシフトのハックがあるように感じますが、まだ見つけることができません。3つの要素を保持する配列へのポインターを返します。完全なプログラム:

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のビット調整を見てみましたが、ループを展開する必要があり、全体的に1バイトのコストがかかります。
ニール

ていないn + i - n % i++未定義の動作につながりますか?
nwellnhof

またs/a[i-2]/*a++/、2バイトを節約します。
nwellnhof

@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+)STOSに1を追加31jし、スタックからデータを取得しないループの部分にジャンプします。そして利益。


その余分な空白は本当に私を悩ませています。GIFを受け取ります。

REENNNNNGGG


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/...
マーティン・エンダー

それは別の答えとして資格を得るのに十分ですか?
リーキー修道女

私は知りません、それはまだ同じ考えです、私はちょうど重複する一致を使用してリストを生成することを置き換えました。
マーティンエンダー

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

こちらをお試しください


私の最終的な答えはここに1 :(ことを基本的にcodegolf.stackexchange.com/a/80028/52795が
のBER



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か?
ニール

@ニール原因私はそれを考えていないと思います。どうもありがとう。
デビッドアレンバーグ




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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.