N 다음에 2, 3, 4로 나눌 수있는 가장 작은 정수


22

신용이 필요한 사람에게 신용을 제공하십시오 .

목표 정수가 주어지면 N > 0가장 작은 정수 A, 및는 다음 BC같습니다.

  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

파이썬 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

모두 복사시 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 바이트를 0으로 만들 수 있습니다.

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

이렇게하면 다음 배수를 얻기 위해 6 바이트 (7 대신)가 제공됩니다 (전체적으로 32 바이트) for k in 2,3,4.

불행히도, 유망한 모양 n|1+1n|3+1추가가 먼저 완료되었으므로 출력을 증가시키는 데 괄호가 필요합니다.


1
가능한 변형 중 내 선호는입니다 n+k-n%k.
Neil

않습니다 n&3+1첫째도 추가합니까?
Tim

@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

@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

Auh 그러나 이것은 단지 Agawa / Dennis의 알고리즘을 취한 것일뿐입니다.
David

1
때때로 나는 내 머리를 긁는 동안 그 유니 코드 만다로 노이드 기본 문자를 계속 눈부신 다음 "읽을 수있는 모든 것을 위해 포크 실행 가능한 코드입니다"라고 말합니까? 롤 좋은 일이 내 공감 + matl 기차 곧 가입합니다.
Abr001am

@ Agawa001 당신은해야합니다! Matlab을 잘 알고 있다면 상당히 간단하다는 것을 알 수 있습니다. 큰 차이점은 MATL이 스택 기반이라는 것입니다. 있습니다 MATL 채팅 방 당신이 어떤 도움을 필요로 너무 경우가!
David

수 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>, 그리고 다른 두 동일한 바이트 대안이 될 수 Ƶ…S또는 4L¦).
Kevin Cruijssen

5

루비, 27 바이트

위의 다음 배수로 2, 3 및 4를 매핑 n합니다.

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



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줄 바꿈으로 구분 된 순서대로 결과가 출력 됩니다.

설명

평소와 같이 짧은 미로 프라이머 :

  • Labyrinth에는 mainaux (iliary) 라는 두 개의 임의 정밀도 정수 스택 이 있으며 처음에는 (암시 적) 무한한 양의 0으로 채워집니다. 이 답변에는 main 만 사용 합니다.
  • 소스 코드는 미로와 유사하며, 명령 포인터 (IP)는 가능할 때 (모퉁이를 돌 때) 복도를 따라갑니다. 코드는 첫 번째 유효한 문자에서 읽기 순서로 시작합니다 (예 :이 경우 왼쪽 상단). IP가 어떤 형태의 접합 (즉, 여러 개의 인접 셀에서 나온 것)에 도달하면 메인 스택의 상단을 기준으로 방향을 선택합니다. 기본 규칙은 다음과 같습니다. 음수이면 왼쪽으로 돌리고 0이면 계속 진행하고 양수이면 오른쪽으로 돌리십시오. 벽이있어이 중 하나를 사용할 수없는 경우 IP는 반대 방향으로 진행됩니다. 데드 엔드를 칠 때 IP도 돌아갑니다.

"레이아웃을 약간 낭비하게 만드는 두 개의 no-ops ( ) 에도 불구하고 제어 흐름이 실제로 미묘하기 때문에이 솔루션에 매우 만족합니다.

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.

루프가 !세 번 (최대 ) 순회 된 후 모든 사본이 n모두 사용되며 그 아래에 0이 표시됩니다. 때문에에 "(그렇지 않으면 꽤 쓸모없는 것 같다) 하단에이 위치는 접합이다. 즉, 스택 상단에 0이 있으면 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

자바 스크립트 (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]

파이썬 답변의 포트는 2 31 -5 까지만 작동하는 동안 Ruby 답변의 포트는 2 53 -3 까지 약간 선호합니다 .


)-> ]내가 생각하는대로
Qwertiy

@ Qwertiy Whoops, 오타가 유감입니다.
Neil

3

C, 50 46 바이트

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

4 바이트를 절약 한 Neil과 nwellnhof에게 감사드립니다!

실망스럽게 길다. 여기에 내가 모르는 비트 시프트 해킹이 있다고 생각하지만 아직 찾을 수는 없습니다. 세 요소를 포함하는 배열에 대한 포인터를 반환합니다. 전체 프로그램 :

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의 비트 비틀 링을 보았지만 전체 바이트 비용이 드는 루프를 풀어야합니다.
Neil

n + i - n % i++정의되지 않은 동작이 발생 하지 않습니까?
nwellnhof

또한 s/a[i-2]/*a++/2 바이트를 절약합니다.
nwellnhof

@nwellnhof Bah, 나는 그의 루프를 풀 때 어쨌든 그것을 사용할 수 있다고 생각하지 않았습니다.
Neil

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!~스택에 멤버가 0이면 종료합니다.

2b : 다른 루프

          >(1+)31j
        q!^

(1+)STOS에 1을 추가 31j하고 스택에서 물건을 가져 가지 않는 루프 부분으로 이동합니다. 그리고 이익.


여분의 공백은 실제로 나를 귀찮게합니다. GIF를 가져 가라.

REENNNNNGGG


3

레티 나, 62 43 26 바이트

@Martin Büttner 덕분에 17 바이트 .

^
1111 :
남! &`(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/…
Martin Ender

별도의 답변으로 충분합니까?
Leaky Nun

모르겠습니다. 여전히 같은 생각입니다. 겹치는 일치 항목을 사용하여 수동으로 목록 생성을 대체했습니다.
마틴 엔더

Conor는 26 바이트 솔루션이 유효 함을 확인했습니다.
마틴 엔더

3

옥타브, 27 22 20 바이트

MATLAB 및 옥타브 :

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이
BER들



2

매스 매 티카 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

@Neil 원인 나는 그것을 생각하지 않았다고 생각합니다. 그래도 고마워.
David Arenburg


2

자바 70 57

a->System.out.print(a/2*2+2+" "+(a/3*3+3)+" "+(a/4*4+4))

Java를 모르지만 아마도 공백을 제거 할 수 있습니다 =.int a = new Integer(z[0]);
Conor O'Brien


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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.