N- 보나 치 시퀀스 역 엔지니어


15

편집 : 나는 2016 년 2 월 15 일 월요일 답변을 수락 할 것입니다. 바이트가 당신에게 유리할 수 있기를 바랍니다!

그의 "N- 보나 치 시퀀스 인쇄"챌린지 에서 @DJMcGoathem 은 N- 보나 치 시퀀스를 설명하는데, 여기서 피보나치 시퀀스의 전통적인 2 개 ( " 듀오 나치 시퀀스"라고 함) 대신 이전 N 개의 숫자가 합산됩니다 . 그런 다음 X와 N이라는 두 개의 입력을 취한 다음 X 번째 N- 나치 수 를 출력하도록 요청했습니다 .

나는 그 반대를 제안한다.
시퀀스가 주어지면 N -nacci 시퀀스가 ​​하위 집합임을 출력하십시오 . 나는 "서브셋"이라고 말합니다 :

  • A)이 시퀀스는 무한하다
  • B) 시퀀스의 시작이 주어지면 선행 1의 수를 셀 수 있습니다.

다수의 N- 나치 서열에 속할 수있는 경우 가장 낮은 것을 선택하십시오. N-nacci 시퀀스
에 속하지 않는 경우 , 프로그램은 출력으로 오인 될 수있는 것을 인쇄하는 것 이외의 다른 작업을 수행 할 수 있습니다. 이러한 동작에는 무한 루프, 오류, 충돌, 자체 삭제 (* 기침 기침 * 경계 * 기침 기침 *) 또는 블랙홀 생성 (이 블랙홀이 발생할 수있는 것을 생성하지 않는 한 )이 포함됩니다 (이에 국한되지 않음). 유효한 출력으로 오해하십시오).
이러한 도전을 위해, 이들 서열은 1로 시작한다. 이것은 N- 나치 서열이 N으로 시작 한다는 것을 의미 한다. 또한 N양의 정수 여야합니다. 따라서 -1 -nacci 등은 없습니다 .

테스트 사례 :

1,1,1 -> 1
49, 97 -> 7
55, 89, 144 -> 2
1 -> 1
6765 -> 2
12, 23, 45, 89 -> 12
100, 199 -> 100

1
create a black hole (as long as this black hole does not produce anything that could be mistaken for valid output).블랙홀의 나선은 황금 비율로 수렴하고 있습니다! 그것은 해야한다 duoacci 순서 유효 출력!
코너 O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ 아름다운 황금비 일지 모르지만 블랙홀 근처에 가지 마십시오! youtube.com/watch?v=TTUQyEr-sg0
Level River St

1
오,이게 원래 생각했던 것보다 훨씬 더
어려워요

@ mbomb007 양의 정수와 자연수의 차이점은 무엇입니까?
아니 Charles

1
@ mbomb007 아. 나는 1이 첫 번째 자연수라고 생각했다. 나는 숫자를 세는 것에 대해 생각하고 있었을 것입니다
Charles Charles

답변:


7

루비, 94

나는 같은 알고리즘 내에서 이것을 얼마나 멀리 골프화시킬 수 있었는지 매우 놀랐습니다! 나는 200 이상으로 시작했습니다!

->a{1.step.find{|s|x=[1]*(s+z=a.size)
x<<x[-s,s].inject(:+)while x.max<a.max&&s>1
x[-z,z]==a}}

언 골프 드 :

l=->a{
    # ooh! a built-in infinite incrementer!
    1.step.find{|s|
        # if n == 1, z is important, otherwise s.
        x=[1]*(s+z=a.size)
        ## add the next nacci number until we hit or overshot max. 
        ## if s == 1, we don't increment, so don't bother
        x<<x[-s,s].inject(:+)while x.max<g&&s>1
        # eval to true if there's a match, false if not
        x[-z,z]==a
    }
}

x=[1]*(s+z=a.size)정확히 어떻게 작동합니까?
Cyoce

@Cyoce 만약 그렇다면 n == 1, 우리는 증가하지 않을 것이므로, 입력이 길지만 1의 배열이 필요하다. 인 경우 시퀀스 n > 1에 최소 n1이 필요합니다. 그래서 s+a.size커버 n == 1의 길이 a가 다른 시퀀스의 시작을 다루고, 우리는 추가 할 수 있습니다 있도록 s배트 떨어져 자리. 말이 돼?
찰스

@Cyoce 및 다른 질문을하는 경우 Ruby에서 [1]*number길이가 1 인 배열을 제공합니다 number. 그래서 x=[1]*(s+z=a.size)양수인 a.size에게 z로, 다음 양수인 x(1)의 길이의 배열 s+z.
찰스

3

파이썬 2, 176 바이트

def r(n,x):i,f=n,[1]*n;exec"f+=sum(f[i-n:]),;i+=1;"*(x-n);return f
l=input()
m=max(l)+len(l)
for i in range(1,m):
 if any(l==r(i,m)[b:b+len(l)]for b in range(m)):print i;break;

여기에는 다음 형식의 입력이 필요합니다.

[1, 1, 2, 3...]

오히려

1, 1, 2, 3...

물건을 구르기 위해 아주 간단한 해결책입니다. 다른 사람이 대답하면 골프를 치는 데 더 많은 노력을 기울일 것입니다. 이것은 @ Data 's answer 에서 약간 수정 된 N-Bonnaci 생성기 버전을 사용하므로 그에게 전파 됩니다. 그런 다음 입력 범위의 각 N-Bonnaci에 대해 입력이 그 하위 시퀀스인지 확인합니다.


내가 그에게 준 같은 방법을 시도해보십시오 : 변화 f.append를위한f+=
Cyoce

@Cyoce oh duh. 나는 그 기본적인 것을 놓쳤다는 것을 믿을 수 없다. fp
DJMcMayhem

후행이 ;필요합니까?
Cyoce

1

루아, (324) 323 바이트

다른 제출을 볼 때 코드에 문제가있는 것 같습니다 ...하지만 Lua라는 것을 기억하고 이러한 멋진 기능이 모두 없습니다 : '(

그것은 많은 재미이었다, 실제로 시간이 좀 걸렸다.

편집 : 간단한 트릭으로 1 바이트를 절약했습니다. ::label::+ goto label대신 무한 루프를 사용하십시오 while''.

function f(l)c=2 y,z=table.remove,os.exit while(l[1]<2)do y(l,1)if(#l<1)then print(1)z()end end ::q:: a={}for i=1,c do a[i]=1 end b={}for i=1,#l do b[i]=l[i]end while(a[#a]<b[1])do x=0 for i=(#a-c+1>0 and #a-c+1 or 1),#a do x=x+a[i]end a[#a+1]=x if a[#a]==b[1]then y(b,1)end if #b<1 then print(c)z()end end c=c+1 goto q end

언 골프 및 설명

Lua는 집합 / 집합을 정의하거나 배열 / 테이블에 색인 / 키를 사용하지 않고 값이 포함되어 있는지 확인할 방법이 없습니다. 그것이 내가 매개 변수로 취하는 배열에서 요소를 제거하기로 결정한 이유입니다. 이것이 내가 이미 계산 한 요소와 일치하는 요소를 기록하는 방법입니다.

  function f(l)
  c=2
  y,z=table.remove,os.exit           -- Create pointers on table.remove and os.exit
                                     -- saves a total of 9 bytes
  while(l[1]<2)                      -- loop used to remove leading 1
  do 
    y(l,1)
    if(#l<1)                         -- we also check if it was a 1-only array
    then 
      print(1)                       -- if so, we print 1 and exit
      z()
    end 
  end

  ::q::                              -- label q, start of the infinite loop
    a={}for i=1,c do a[i]=1 end      -- fill an array with c 1s
    b={}for i=1,#l do b[i]=l[i]end   -- copy the sequence array
    while(a[#a]<b[1])                -- while max(a)<min(b)
    do
      x=0 for i=(#a-c+1>0            -- iterate from index a.length-c to
                    and #a-c+1       -- to a.length
                    or 1),#a 
      do 
        x=x+a[i]                     -- summing a's elements
      end
      a[#a+1]=x                      -- append x to a
      if a[#a]==b[1]then y(b,1)end   -- if x is equal ot a member of the sequence
                                     -- remove it
      if #b<1 then print(c)z()end    -- if b is empty, it means the subset is in a
                                     -- we print c and exit
    end                              -- else we loop again
    c=c+1                            -- with c+1
  goto q                             -- return to the start of this block
end

Lua online을 사용해 볼 수 있으며 다음 코드 샘플을 복사 / 붙여 넣기하여 테스트를 실행할 수 있습니다. 이 함수가 답을 찾으면 종료되므로 (그렇지 않으면 무한 루프), test[]사용 된 인덱스를 변경해야합니다 (루아가 1 인덱싱 된 것을 잊지 마십시오 :).

function f(l)c=2 y,z=table.remove,os.exit while(l[1]<2)do y(l,1)if(#l<1)then print(1)z()end end ::q:: a={}for i=1,c do a[i]=1 end b={}for i=1,#l do b[i]=l[i]end while(a[#a]<b[1])do x=0 for i=(#a-c+1>0 and #a-c+1 or 1),#a do x=x+a[i]end a[#a+1]=x if a[#a]==b[1]then y(b,1)end if #b<1 then print(c)z()end end c=c+1 goto q end

test={{1,1,1},
{49, 97},
{55, 89, 144},
{1},
{6765},
{12, 23, 45, 89},
{100, 199}}

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