분 산성 줄무늬


31

우리는 가분성 행진 정의 할 수 있습니다 k숫자의를 n정수 가장 작은 음수가 아닌 찾아 kn+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

다양성의 행진 134

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

다양성의 행진 1201

테스트 사례 :

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.
Oliver

아, 나는보고 싶었다 +1.
Paŭlo Ebermann

답변:



17

자바 8, 44 42 41 39 바이트

44가 여전히 똑같습니다. 44; (

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

@LeakyNun 덕분에 -2 바이트 . @TheLethalCoder
덕분에 -1 바이트 . @Nevay 덕분에 -2 바이트 .

설명:

여기에서 시도하십시오.

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

자바 스크립트 (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(;/@

온라인으로 사용해보십시오!

Cubified

    ) u
    U q
I 1 % ? ; ) q U
O ( ; / @ . . .
    . .
    . .
  • I1 입력과 제수로 스택 설정
  • %? 모드 및 테스트
    • ;)qU)uqU0이면 결과를 제거하고 입력과 제수를 증가시킵니다. 돌아올 경로에 대한 라운드 비트%
    • /;(O@ 0이 아닌 경우 결과 삭제, 제수 감소, 출력 및 종료

달려 봐






2

dc , 28 바이트

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

온라인으로 사용해보십시오!

이 느낌이 정말 증가 및 최종 감소와 함께, 차선을,하지만 난 정말 그것을 개선 할 수있는 방법을 볼 수 없습니다. 기본적으로 우리 i는 value mod i가 0으로 유지되는 한 카운터 와 시작 값을 증가시키고 , 사실이 아닌 경우 하나를 빼서 i인쇄합니다.



2

J, 17 바이트

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

온라인으로 사용해보십시오!

아직 골프를 할 여지가 있다고 생각합니다.

설명 (ungolfed)

[: {.@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

캡 ( [:)은 J가 마지막 동사 ( {.@I.)를 후크의 일부로 취급하지 않도록하기위한 것 입니다.

이 답변에 대한 유일한 이상한 점은 I.실제로 0이 아닌 각 숫자의 색인을 해당 숫자의 값만큼 여러 번 복제 한다는 것입니다. 예 :

   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 컴파일러를 사용하여 C 코드에서 쉽게 호출 할 수 있습니다.

논리는 매우 간단합니다. 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

Mathematica, 40 바이트

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

온라인으로 사용해보십시오! (수학)

수학적 접근법, n + k는 n-1이 k + 1로 나눌 수있는 경우에만 k + 1로 나눌 수 있습니다. 그리고 n-1은 n으로 나눌 수 없으므로 Range@#충분한 수입니다.

원래 나는을 사용하려고 Min@Complement[Range@#,Divisors[#-1]]-1&하지만 이것도 작동합니다.


Tio의 제출물을 사용할 때 보안 문자가 나타나는 이유는 무엇입니까?
user202729

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)

온라인으로 사용해보십시오!

Mr.Xcoder 덕분에 9 바이트가 줄었습니다.


2
일반적으로 "온라인으로 시도"링크를 사용하면 머리글, 바닥 글 및 인수 조합을 정의 하여 실제로 코드를 시험해볼 수 있습니다. 즉, 재생 버튼을 누르면 출력됩니다.
피터 테일러

@PeterTaylor 순수한 추측으로, 나는 그것을 그렇게 실행하려고 시도 했으며 놀랍게도 효과가있었습니다. 테스트 가능한 버전으로 편집하려면 OP를 권장합니다.
Mr. Xcoder

46 바이트 (한 공간 제거) :n->(i=1;while isinteger(n/i) i+=1;n+=1end;i-1)
Mr. Xcoder

또 다른 순수한 추측으로 38 바이트까지 골프를 치는 것이 가능했습니다.n->(i=1;while n%i<1 i+=1;n+=1end;i-1)
Mr. Xcoder

@PeterTaylor 죄송합니다.
Goysa


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

종료하지 않아도 1 바이트를 절약 할 수 있습니다.

설명:

우리는 3 개의 스택을 사용합니다 : 왼쪽 스택은 2에서 시작하는 카운터를 보유하고, 오른쪽 스택은 주어진 수 (또는 그 증분)를 보유하고 중앙 스택은 모듈로 연산을 수행하는 데 사용됩니다. 물론 하나의 스택으로 모든 작업을 수행 할 수 있지만이 방법으로 외부 스택을 "고정"(팝업 된 값은 실제로 제거되지 않음)으로 설정하고 많은 중복 작업을 줄일 수 있습니다. 자세한 방법은 다음과 같습니다.

정수를 읽고, 증가시키고, 현재 스택을 끈적 끈적하게 만들고, 왼쪽 스택으로 "그리고 자신을"이동시킵니다.

iI
rk[

하나 더 스택을 왼쪽으로 이동하고 리터럴 2를 밀면이 스택도 고정됩니다. 코드 ( @) 에서이 위치를 기억 하고 값과 자신을 다시 중앙 스택으로 "이동"하십시오.

  @]
  k2
   (

이제 우리는 테스트합니다 : 상위 두 숫자의 모듈러스가 0이 아닙니까? 그렇다면 끝으로 건너 뛰고 그렇지 않으면 오른쪽으로 한 스택 이동하고 증가시키고 값과 우리를 중간으로 밉니다. 그런 다음 왼쪽 스택으로 이동하여 증가시키고 이전에 설정 한 표시로 건너 뜁니다.

[;`%
I)
    I(
    &

모듈로의 결과가 0이 아닌 경우 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

온라인으로 사용해보십시오!

편집 : Oliver에서 -2 자


PPCG에 오신 것을 환영합니다! 당신의 프로그램은 stdin을합니까? 온라인 F # 인터프리터가있는 TIO 를 사용할 수 있습니다 . 또한 공백을 r = if?
Oliver

1
@Oliver 감사합니다. TIO에 대한 링크를 변경 했으므로 이제 실제로 인수를 전달하여 테스트 할 수 있습니다. :)
Vladislav Khapin

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