연결된 시퀀스 정렬


17

f(n) = f(n-1)+f(n-2)시작 하는 반복 관계를 기반으로 한 시퀀스를 고려하십시오 f(1) = x1, f(2) = x2. 의 경우 x1 = 2, x2 = 1시퀀스는 다음과 같이 시작됩니다.

2  1  3  4  7  11  18  29  47  76  123  199  322  521  843

이것을 문자열로 연결하면 다음을 얻을 수 있습니다.

213471118294776123199322521843

이제이 목록을 가능한 가장 작은 숫자로 나눕니다 y(n) > y(n-1). 첫 번째 숫자로 시작한 다음 두 번째 숫자로 시작하십시오. 첫 번째 출력 숫자는 항상 한 자리 숫자 여야합니다. 마지막 숫자를 필요한 숫자 0으로 채 웁니다.

2 13 47 111 829 4776 12319 93225 218430

(x1, x2)편리한 형식으로 입력으로 두 개의 숫자를 얻을 수 있으며 정렬 된 목록을 출력해야합니다.

규칙 :

  • 기능과 프로그램은 괜찮습니다
  • 초기 시퀀스는 정확히 15 개의 숫자를 갖습니다 (마지막 숫자는 f(15)).
  • x1x2음이 아닌 (영 가능)이다.
  • 편리한 형식으로 출력 가능
  • 출력 벡터 y를 생성해야합니다 y2 > y1.
    • 먼저 가장 작은 y1, 다음 가능한 가장 작은 y2, 다음 y3등등.
  • 그렇다면 x1 = x2 = 015를 0으로 출력하십시오 (다른 출력과 같은 형식으로 000000000000000)

:

Input: 1 1
Output: 1  12  35  81  321  345  589  1442  3337 7610

Input: 3 2
Output: 3  25  71  219  315  0811 3121  23435 55898 145300
                             |
                             Optional leading zero 
Input: 0 0
Output: 0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

바이트 단위의 가장 짧은 코드가 이깁니다. 가능하면 온라인 통역사로 연결되는 링크를 포함하십시오.


"가장 작은 숫자"란 정확히 무엇을 의미합니까? 가장 작은 평균? 가장 작은 최대? 다른 것?
isaacg

@isaacg 따라서 n 번째 숫자가 (n-1) 번째보다 큽니다.
nicael

1
내 질문을 명확히하기 위해 적절한 구분은 5467무엇입니까? 54 67? 5 46 70?
isaacg


3
0은 다소 성 가시고 불필요한 예외처럼 보입니다.
Martin Ender

답변:


1

Pyth, 56 바이트

LsgM.:sMb2?sQsM.WyHX_1Z`0u?yGX_1GHaGHjkhM.u,eNsN14QYmZ15

테스트 스위트

설명:

먼저 입력이 정확하게되는지 확인합니다 0, 0. 그렇다면 15 개의 0을 인쇄하십시오.

그렇지 않으면을 사용하여 시퀀스를 생성합니다 jkhM.u,eNsN14Q. 이것은 피보나치 시퀀스의 표준 Pyth 알고리즘과 유사합니다.

다음으로이 문자열을 줄입니다. 누산기는 문자열 목록으로, 분할 된 순서로 각 숫자를 나타냅니다. 각 축소 단계에서 다음 문자를 가져 와서로 y정의 된 도우미 함수를 사용하여 누산기가 순서대로 있는지 확인합니다 LsgM.:sMb2. 입력이 고장난 경우에는 사실입니다. 순서가 맞으면 다음 문자를 목록에 고유 번호로 추가합니다. 그렇지 않은 경우 다음 문자열을 마지막 문자열 끝에 추가합니다. 이것은로 달성됩니다 u?yGX_1GHaGH ... Y.

다음으로 기능적인 while 루프를 수행합니다. 도우미 함수를 다시 사용하여 실행 목록이 정렬 될 때까지 루프가 계속됩니다. 각 단계에서 a 0가 목록의 마지막 문자열 끝에 추가됩니다. 이것은로 달성됩니다 .WyHX_1Z`0.

마지막으로 문자열은와 함께 정수로 변환되어 sM인쇄됩니다.


Pyth, 51 바이트

LsgM.:sMb2?sQsM.WyHX_1Z`0hf!yT_./jkhM.u,eNsN14QmZ15

나는 이것이 효과가 있다고 생각하지만 테스트하기에는 너무 느리다. 줄을 나누기위한 무차별 대입 솔루션이다.


X함수 를 약간 개선 할 것이지만 위의 코드는 질문이 게시되었을 때 가장 최근의 Pyth 버전에서 작동합니다.


5

자바 스크립트 ES6, 127 (135)

(a,b)=>eval("for(n=r=[],v=13,o=a+n+b;v--;a=b,b=t)o+=t=b+a;for(d of o+'0'.repeat(99))(n+=d)>+v&&(r.push(v=n),n='');+v?r:[...o]")

테스트

F=(a,b)=>eval("for(n=r=[],v=13,o=a+n+b;v--;a=b,b=t)o+=t=b+a;for(d of o+'0'.repeat(99))(n+=d)>+v&&(r.push(v=n),n='');+v?r:[...o]")

// less golfed

U=(a,b)=>{
  for(n=r=[], o=a+n+b, v=13; v--; a=b, b=t)
    o+= t= b+a;
  for(d of o+'0'.repeat(99))
    if ((n+=d) > +v)
      r.push(v=n), n='';
  return +v ? r : [...o]
}

function test(){
  var i = I.value.match(/\d+/g)
  O.textContent = i.length > 1 ? F(+i[0],+i[1]) : ''
}
test()
A,B : <input id=I value='0 1' oninput='test()'>
<pre id=O></pre>


x1 = 0, x2> 0에 대한 오류가 있습니다 (예 : 입력 "0 1").
flornquake

@flornquake가 수정되었습니다. 바이트 수는 조금에게 제로 충전 감소 된 코드, 동일하다
edc65

2

자바 스크립트 ES6, 187 180 187 184 182 179 175 172 165 160 155 154 바이트

(a,b)=>eval('d=""+a+b;for(i=-12,j=1;++i<99;)i<2?(c=b,d+=b=a+b,a=c,r=a?[d[0]]:"0,".repeat(15)):(f=+d.slice(j,i))>r[r.length-1]?(r.push(f),j=++i-1):d+=0;r')

실행할 때 비슷한 결과가 나타납니다. 1,13,2테스트 케이스 와 테스트 케이스에서 . 0,026 바이트를 초과했습니다 ...

골프 골프 + ES5 + 데모로 변환 :

function s(a, b) {
  d = "" + a + b;
  for (i = -12, j = 1; ++i < 99;)
    i < 2 ?
      (c = b, d += b = a + b, a = c, r = a ? [d[0]] : "0,".repeat(15))
    : (f = +d.slice(j, i)) > r[r.length - 1] ?
      (r.push(f), j = ++i - 1)
      : d += 0;
  return r
}
document.write(
   s(1,1)+"<br>"+
   s(3,2)+"<br>"+
   s(0,0)
)


왜 더 많은 숫자를 생성합니까? 그리고 고치기 쉽지 않습니까? 요구 사항은 n <= 15입니다.
Stewie Griffin

@Stewie 그러나 첫 번째는 12와 두 번째는 11입니다. 15보다 작습니다.
nicael

초기 시퀀스 f(n) = f(n-1)+f(n-2)의 최대 값은 정확히 15입니다. 출력 값의 수는 알고리즘에 따라 결정됩니다.
Stewie Griffin

@Stewie 좋아요, 정확히 15이어야합니다. 그런 다음 n <= 15는 입력 숫자가 15보다 작다는 것을 의미합니까?
nicael

초기 시퀀스에있는 값의 개수는 15이다 시작 값 f(1)=x1f(2)=x2출력값의 수는 상기 입력 값에 기초하여 결정된다 (15)보다 높을 수있다. 의 경우 3 2는 10이 될 것이다
스튜이 그리핀

1

자바 스크립트 (ES6), 162 바이트

(a,b)=>(k=[...Array(15).keys(y="")],p=-1,z=k.map(_=>0),a|b?[...k.map(f=n=>n--?n?f(n)+f(n-1):b:a).join``,...z].map(d=>+(y+=d)>p?(p=y,y=" ",p):"").join``:z.join` `)

설명

(a,b)=>(
  k=[...Array(15).keys(y="")],     // k = array of numbers 0 to 14, initialise y
  p=-1,                            // initialise p to -1 so that 0 is greater than p
  z=k.map(_=>0),                   // z = array of 15 zeroes
  a|b?[                            // if a and b are not 0
      ...k.map                     // for range 0 to 14
      (f=n=>n--?n?f(n)+f(n-1):b:a) // recursive sequence function (0 indexed)
      .join``,                     // join result of f(0) to f(14) as a string
      ...z                         // append zeroes for padding
    ].map(d=>                      // for each digit of concatenated result
      +(y+=d)                      // append the digit to the current number y
      >p?(                         // if the current number is greater than the previous p
        p=y,                       // set previous to the current number
        y=" ",                     // reset y (with space as a separator)
        p                          // output the current number (with space at the start)
      ):""                         // else add nothing to the output
    )
    .join``                        // return the output as a string
  :z.join` `                       // return a bunch of zeroes if a and b are 0
)

테스트


1

매스 매 티카, 192 바이트

f[{0,0}]:=0~Table~15
f@l_:=(t=0;q={};If[#>0,q~Join~{10^⌈Log10[t/#]⌉#},q]&[Last@#]&@FoldList[If[#>t,AppendTo[q,t=#];0,#]&[10#+#2]&,0,Flatten@IntegerDigits@SequenceFoldList[#+#2&,l,Range@13]])

테스트 사례 :

f[{2, 1}]
(* {2, 13, 47, 111, 829, 4776, 12319, 93225, 218430} *)
f[{3, 2}]
(* {3, 25, 71, 219, 315, 811, 3121, 23435, 55898, 145300} *)
f[{0, 0}]
(* {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} *)

함수 이름의 길이가 나를 죽이고 있습니다.


1

하스켈 165 159 152 142 141 바이트

w=take 15
x#y=x:scanl(+)y(x#y)
0%0=w[0,0..]
x%y=g(-1)(w(x#y)++0%0>>=show)(-1)
g _""_=[]
g b l@(h:t)a|b>a=b:g 0l b|1<2=g(max 0b*10+read[h])t a

사용 예 : 3 % 2-> [3,25,71,219,315,811,3121,23435,55898,145300].

온라인 데모 ( main래퍼 포함).

작동 방식 :

w=take 15
x#y=x:scanl(+)y(x#y)              -- fibonacci sequence generator for x and y

0%0=w[0,0..]                      -- special case 0%0
x%y=g(-1)(w(x#y)++0%0>>=show)(-1) -- calculate fib sequence, add some extra 0 and
                                  -- flatten all digits into a single string.
                                  -- start calculating the resulting sequence

g _""_=[]                         -- if we don't have digits left, stop.
                                  -- the final 0 in the second parameter is ignored.
g b l@(h:t)a
  |b>a=b:g 0l b                   -- if the current number is greater than the
                                  -- previous one, take it and start over.
  |1<2=g(max 0b*10+read[h])t a    -- otherwise add the next digit and retry.
                                  -- The "max" fixes the initial call with -1.

0

PowerShell, 167166 바이트

param($x,$w)if($w-lt($x-eq0)){"0`n"*15;exit}[char[]]("$x"+-join(0..13|%{$w;$w=$x+($x=$w)}))|%{$z+="$_";if(+$z-gt$y){($y=$z);$z=""}};if($z){while(+$z-lt$y){$z+="0"}$z}

$s변수 를 제거 하고 출력 루프를 직접 공급하여 바이트를 절약했습니다 .

Ungolfed 및 댓글 :

param($x,$w)           # Take input parameters as x and w
if($w-lt($x-eq0)){     # If x=0, ($x-eq0)=1, so $w-lt1 implies w=0 as well
  "0`n"*15             # Print out 15 0's separated by newlines
  exit                 # And exit program
}                      # otherwise ...
[char[]](              # Construct the sequence string as a char-array
"$x"+-join(            # Starting with x and concatenated with a joined array
  0..13|%{             # Loop
    $w                 # Add on w
    $w=$x+($x=$w)      # Recalculate for next loop iteration
  }
))|%{                  # Feed our sequence as a char-array into a loop
  $z+="$_"             # z is our output number, starts with the first digit
  if(+$z-gt$y){        # If z is bigger than y (initialized to 0)
    ($y=$z)            # Set y equal to z and print it
    $z=""              # Reset z to nothing to start building the next number
  }
}
if($z){                # If there is remaining digits, we need to pad zeroes
  while(+$z-lt$y){     # Until z is bigger than y
    $z+="0"            # Tack on a zero
  }
  $z                   # Print the final number
}

0

펄 6 , 107 바이트

{$_=@=(|@_,*+*...*)[^15].join.comb;.sum??[.shift,{last if !@$_;until (my$a~=.shift//0)>$^b {};$a}...*]!!$_} # 107

용법:

# give it a lexical name for ease of use
my &code = {...}

# use 「eager」 because the anonymous block returns a lazy array
# and 「say」 doesn't ask it to generate the values
say eager code 2, 1;
# [2 13 47 111 829 4776 12319 93225 218430]
say eager code 1, 1;
# [1 12 35 81 321 345 589 1442 3337 7610]
say eager code 3, 2;
# [3 25 71 219 315 0811 3121 23435 55898 145300]
say eager code 0, 0;
# [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
say eager code 0, 1;
# [0 1 12 35 81 321 345 589 1442 3337 7000]

설명

인수 ( @_)가 미끄러짐 ( |)으로 시작하여 피보나치와 같은 시퀀스를 생성합니다 .

|@_,*+*...*

해당 시퀀스의 처음 15 개 요소를 가져옵니다.

(…)[^15]

이를 단일 문자열 ( .join) 로 결합하고 이를 개별 문자 시퀀스 ( )로 분할 하고 시퀀스를 가변 배열로 강제 변환 한 후 익명 배열 ( ) 에 저장하여이를 .comb"기본"스칼라 ( $_)에 저장합니다@

$_=@=(…)[^15].join.comb;

기본 스칼라에서 값의 합계를 찾은 다음 0이면 기본 스칼라를 반환하며 여기에는 15 개의 0으로 구성된 배열이 포함됩니다.

.sum??  !!$_

합계가 0이 아닌 경우 기본 스칼라에서 첫 번째 요소를 먼저 이동하여 목록을 작성합니다.

.shift,  

기본 스칼라에 값이 부족한 경우 이전 값 ( $^b) 과 비교하여 나머지 값을 생성 한 다음
0을 사용하십시오 ( //0)

…,{  ;until (my$a~=.shift//0)>$^b {};$a}...*

기본 스칼라에 남아있는 요소가 없으면 중지

…,{last if !@$_;  }...*

왜 공간이 있어야 until (my$a...합니까? 인가 (특별한 구분하지?
고양이

@cat라는 서브 루틴에 대한 호출 until이며 존재하지 않습니다.
브래드 길버트 b2gills
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.