순차적으로 나눌 수 있음


24

때로는 잠들기 위해 가능한 한 높은 숫자로 계산하지만, 사각형 이 아닌 숫자는 건너 뜁니다 . 행에서 여러 숫자를 건너 뛸 때 약간의 스릴을 얻습니다. 예를 들어, 48,49,50모두 제곱이 아닙니다 (48은 2 ^ 2, 49는 7 ^ 2, 50은 5 ^ 2로 나눌 수 있음).

이것은 몇 개의 임의의 제수로 나눌 수있는 인접 숫자의 가장 빠른 예에 대해 궁금해했습니다.

입력

입력은 하나 a = [a_0, a_1, ...]이상의 요소를 포함하는 엄격하게 양의 정수 로 정렬 된 목록 입니다.

산출

출력은 나누기 , 나누기 및보다 일반적으로 나누는 n속성을 가진 가장 작은 양의 정수 입니다 . 그러한 것이 존재 하지 않으면 , 기능 / 프로그램의 동작은 정의되지 않습니다.a_0na_1n+1a_kn+kn

테스트 사례

[15] -> 15
[3,4,5] -> 3
[5,4,3] -> 55
[2,3,5,7] -> 158
[4,9,25,49] -> 29348
[11,7,5,3,2] -> 1518

채점

이것은 . 가장 짧은 결과 (언어 당)가 자랑 할 권리를 얻습니다. 일반적인 허점은 제외됩니다.


답변:



6

껍질 , 7 바이트

VδΛ¦⁰ṫN

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

설명

VδΛ¦⁰ṫN  Input is a list x.
      N  The list [1,2,3...
     ṫ   Tails: [[1,2,3...],[2,3,4...],[3,4,5...]...
V        Index of first tail y satisfying this:
  Λ       Every element
    ⁰     of x
   ¦      divides
 δ        the corresponding element of y.

5

MATL , 11 바이트

`Gf@q+G\a}@

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

`           % Do ....
 Gf         %   Convert input to [1,2,...,]
   @q+      %   Add current iteration index minus one, to get [n, n+1, ....]
      G\    %   Elementwise mod([n,n+1,...],[a_0,a_1,...])
        a   % ...while any of the modular remainders is nonzero.
         }  % Finally:
          @ %   Output the iteration index.

속도에 정확하게 최적화되지는 않았습니다 ... 가장 큰 테스트 케이스는 MATL을 사용하는 데 1 분이 걸리고 MATLAB에서는 약 0.03이 걸립니다. MATL이 약간 더 많은 오버 헤드를 가질 가능성은 적습니다.


아, 나는 n:q`QtG\a]1)12 바이트를 가지고 있었지만 n:분명히 f여기 와 동일 합니다. 나는 항상 그 점을 잊어 버렸으므로 11 번 대안으로 추가 할 수 있습니다.
주세페

1
@Giuseppe Too bad fq`QtG\a}@는 불필요한 입력 사본을 반환합니다.
Sanchises

5

자바 스크립트, 42 40 바이트

솔루션이 없거나 솔루션이 너무 큰 경우 재귀 오류가 발생합니다.

a=>(g=y=>a.some(x=>y++%x)?g(++n):n)(n=1)

Rick Hitchcock 의 포인터로 2 바이트 저장


시도 해봐

쉼표로 구분 된 숫자 목록을 입력하십시오.

o.innerText=(f=
a=>(g=y=>a.some(x=>y++%x)?g(++n):n)(n=1)
)(i.value=[5,4,3]);oninput=_=>o.innerText=f(i.value.split`,`.map(eval))
<input id=i><pre id=o>


좋은 접근 방법이지만 예를 들어와 같이 재귀 제한을 초과하면 실패합니다 [4,9,25,49].
Chas Brown

1
@ChasBrown은 코드 골프를 위해 무한 메모리를 가정 할 수 있습니다.
얽히고 설킨

나는 이것이 38 바이트에서 작동 할 것이라고 생각한다 : (a,y=n=0)=>a.some(x=>y++%x)?f(a,++n):n
Rick Hitchcock

잘 했어, @RickHitchcock-고마워. f=그러나 잊지 마십시오 .
얽히고 설킨

아 물론 이죠 40 바이트입니다.
Rick Hitchcock





3

Pyth , 11 바이트

f!s.e%+kTbQ 

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


f!s.e%+kTbQ         Full program - inputs list from stdin and outputs to stdout
f                   First number T such that
   .e     Q         The enumerated mapping over the Input Q
      +kT           by the function (elem_value+T)
     %   b          mod (elem_index)
 !s                 has a false sum, i.e. has all elements 0

2마지막에 필요 합니까? 나는 여기에 더 많은 것을 구할 것이라 확신하지만 Pyth를 모른다.
얽히고 설킨

@Shaggy와 @Giuseppe, 둘 다 맞으며 결말을 삭제 2하면 문제가 해결됩니다
Dave

2

J , 23 바이트

[:I.0=]+/@:|"1#]\[:i.*/

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


좋은. 입력의 결과 만 확인할 수있는 수학적 사실은 무엇입니까? 그 이상의 해결책이 없다는 것을 어떻게 알 수 있습니까? 또한 I.1 개의 결과 만 반환 한다는 것을 어떻게 알 수 있습니까? 여러 개가 가능하지 않습니까?
요나

1
@Jonah-항상 작동하는지 모르겠습니다. 내가 한 모든 테스트는이 한계에있었습니다.
Galen Ivanov

2

R , 51 바이트

function(l){while(any((F+1:sum(l|1))%%l))F=F+1
F+1}

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

의 사용은 any발생 k에 암시 적 변환에 대한 경고 logical, k반환 값입니다.



@plannapus 나는 것으로 간주하지만, 불행하게도 실패 l=c(15)하기 때문에, seq(l)==1:l그 경우이다. seq그런 성가신입니다!
Giuseppe

실제로 arf seq_along는 너무 강합니다 .
plannapus

그러나 sum대신 any경고를 제거 하는 대신 FYI를 사용하십시오.
plannapus


2

APL (Dyalog Unicode) , 24 23 22 바이트

{∨/×⍺|⍵+⍳⍴⍺:⍺∇⍵+1⋄⍵}∘1

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

기술적으로 이것은 암묵적인 기능입니다. 허용되는 유일한 입력은 정수 목록이므로 그렇게해야했습니다. 사용 ⎕IO←0(0- 인덱싱)

n존재하지 않으면 함수가 시간 초과된다는 점에 주목할 가치가 있습니다.

1 바이트마다 @ngn 및 @ H.PWiz 덕분입니다.

방법?

{∨/×⍺|⍵+⍳≢⍺:⍺∇⍵+1⋄⍵}∘1  Main function. ⍺=input; ⍵=1.
{                   }∘1  Using 1 as right argument and input as left argument:
           :             If
        ⍳≢⍺              The range [0..length(⍺)]
      ⍵+                 +⍵ (this generates the vector ⍵+0, ⍵+1,..., ⍵+length(⍺))
    ⍺|                   Modulo 
   ×                     Signum; returns 1 for positive integers, ¯1 for negative and 0 for 0.
 ∨/                      Logical OR reduction. Yields falsy iff the elements of the previous vector are all falsy.
            ⍺∇⍵+1        Call the function recursively with ⍵+1.
                 ⋄⍵      Else return ⍵.


1

apt, 10 바이트

undefined솔루션이 존재하지 않으면 브라우저가 먼저 충돌하지 않으면 결국 출력 됩니다.

@e_X°vZÃ}a

시도 해봐


설명

               :Implicit input of array U
@       }a     :Loop and output the first integer X that returns true.
 e_    Ã       :For every element Z in U
   X°          :X, postfix increcemnted
     vZ        :Is it divisible by Z?



1

표준 ML (MLton) , 96 바이트

open List;fun$n% =if all hd(tabulate(length%,fn i=>[1>(n+i)mod nth(%,i)]))then n else$(n+1)%;$1;

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

언 골프 드 :

open List
fun f n l = 
    if all (fn x=>x)
           (tabulate ( length l
                     , fn i => (n+i) mod nth(l,i) = 0))
    then n 
    else f (n+1) l
val g = f 1

온라인으로 사용해보십시오! 로 시작 n=1하면 함수 는 -condition이 충족 될 때까지 f증가 하며이 경우 리턴됩니다.nalln

tabulate(m,g)정수 m와 함수 g를 사용하여 목록을 작성합니다 [g 0, g 1, ..., g m]. 우리의 조건 tabulate에서 입력 목록의 길이 l와 나누기 의 ith 요소 를 확인하는 함수 로 호출됩니다 . 이는 부울 목록을 생성하므로 identity 함수를 사용하면 모든 요소가 true인지 확인합니다.ln+iallfn x=>x

나는 4 바이트로이 경우의 ID 기능을 단축 할 수있는 좋은 골프 트릭을 발견 대신 람다의 (fn x=>x)빌드 - 인 기능이 hd목록의 첫 번째 요소를 반환하는 데 사용됩니다, 그 결과 bools의가 tabulate에 싸여있다 []에 싱글 톤 목록을 만듭니다.


1

PowerShell , 65 62 바이트

for(){$o=1;$i=++$j;$args[0]|%{$o*=!($i++%$_)};if($o){$j;exit}}

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

PowerShell을은에 해당하지 않습니다 any또는 some우리가 약간 다른 접근 방식을 필요로하므로, 같은 또는를.

이것은 입력 $args[0]을 배열로 취한 후 무한 for루프 로 들어갑니다 . 각 반복 $o1(나중에 설명)로 설정하고로 설정 $i했습니다 ++$j. 증가 $j는 제안 된 솔루션의 첫 번째 숫자에 대한 탭을 유지 $i하고 나머지는 제안 된 솔루션에서 증가합니다.

그런 다음 입력의 각 요소를 루프 $args[0]로 보냅니다 ForEach-Object. 내부 루프 안에서 $o계산 결과에 부울 곱셈을 합니다. 이렇게하면 값에 대한 계산이 실패하면가로 $o바뀝니다 0. 계산은 !($i++%$_)이거나 모듈로 연산의 부울이 아닙니다. 제로가 아닌 값 PowerShell의 truthy이기 때문에, 이에 의해 회전하는 falsey 값으로 임의의 나머지 변 $o0.

내부 루프 외부에서 if $o0이 아닌 우리가 증가하는 솔루션을 발견했습니다되는 작품, 출력 우리는 그렇게 $j하고 exit.


1

tinylisp , 108 바이트

(load library
(d ?(q((L N)(i L(i(mod N(h L))0(?(t L)(inc N)))1
(d S(q((L N)(i(? L N)N(S L(inc N
(q((L)(S L 1

마지막 행은 이름이없는 람다 함수로, 목록을 가져와 정수를 반환합니다. 온라인으로 사용해보십시오!

언 골프

(load library)

(comment Function to check a candidate n)
(def sequentially-divisible?
 (lambda (divisors start-num)
  (if divisors
   (if (divides? (head divisors) start-num)
    (sequentially-divisible? (tail divisors) (inc start-num))
    0)
   1)))

(comment Function to check successive candidates for n until one works)
(def search
 (lambda (divisors start-num)
  (if (sequentially-divisible? divisors start-num)
   start-num
   (search divisors (inc start-num)))))

(comment Solution function: search for candidates for n starting from 1)
(def f
 (lambda (divisors)
  (search divisors 1)))


1

파이썬 2, 78 바이트

def f(a,c=0):
 while [j for i,j in enumerate(a) if(c+i)%j<1]!=a:c+=1
 return c

편집 : @Chas Brown 덕분에 -26


좋은! 루프 종료 조건을 돌리고 78 바이트 를 얻도록 아이디어를 향상시킬 수 있습니다 .
Chas Brown

@ChasBrown 감사합니다, 나는 그런 식으로 생각하지 않았습니다. 변경되었습니다!
sonrad10


0

APL NARS, 140 바이트, 70 자

r←f w;i;k
i←r←1⊃,w⋄k←¯1+⍴w⋄→0×⍳k=0
A:→0×⍳0=+/(1↓w)∣(k⍴r)+⍳k⋄r+←i⋄→A

테스트

  f 15
15
  f 3 4 5
3
  f 5 4 3
55
  f 2 3 5 7
158
  f 4 9 25 49
29348
  f 11 7 5 3 2 
1518

0

자바 8, 82 75 바이트

a->{for(int r=1,i,f;;r++){i=f=0;for(int b:a)f+=(r+i++)%b;if(f<1)return r;}}

설명:

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

a->{                 // Method with integer-array parameter and integer return-type
  for(int r=1,       //  Return-integer, starting at 1
          i,         //  Index-integer
          f;         //  Flag-integer
      ;r++){         //  Loop indefinitely, increasing `r` by 1 after every iteration
    i=f=0;           //   Reset both `i` and `f` to 0
    for(int b:a)     //   Inner loop over the input-array
      f+=(r+i++)%b;  //    Increase the flag-integer by `r+i` modulo the current item
    if(f<1)          //   If the flag-integer is still 0 at the end of the inner loop
      return r;}}    //    Return `r` as result

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