2013-04-30 5 views
2

일련의 숫자에서 특정 반복 위치를 계산하는 수학 공식을 결정해야합니다. 숫자 목록은 무한 반복되며이 목록에있는 숫자는 모두 n입니다. 그래서 * n * 항목을 반복 목록에 찾으십시오. y 숫자입니다.고정 된 항목의 반복 목록에서 n 번째 항목 찾기

예를 들어, 내 목록에 7 자리 (y = 7)가 있고 다섯 번째 항목 (n = 5)마다 필요한 경우 어떻게 해당 항목을 찾을 수 있습니까? 목록은 (내가보기의 편의를 위해 파이브로 분류 한 함)과 같이 될 것이다 :

12345 67123 45671 23456 71234 56712 34567 

나는 첫 번째 그룹 번호 5 찾을 필요, 다음 두 번째 그룹 번호 한 후 3, 1에서 다음 제

YN 위해 임의의 개수의 작동해야 다음 2 제 3 그룹 후 6 일 후 4 일. 나는 보통 숫자가 증가하고 재설정되지 않을 때만 * n * 번째 항목을 찾기 위해 계수를 사용합니다.

브라우저 기반 문제로 Javascript 또는 JQuery에서이 작업을 수행하려고 시도하고 있지만 수학적 문제가 아니므로 문제를 해결하는 데 어려움이 있습니다.

감사합니다.


편집 : 내가 이상적으로 이에 대한 수학적 솔루션을 찾고 있어요 그러나 나는이 문제에 대해 좀 더 설명 할 것이다, 그러나 그것은 단지 혼란을 추가 할 수 있습니다. 나는 회전 목마 배열에있는 품목의 명부가있다. 나의 예에서는 7 개의 고유 항목이 있지만 (실제로는 숫자가 될 수 있음) 실제 목록의 크기는 내가 만든 중복 집합 4 개가 포함 된 실제 크기의 5 배 (위의 5 개 그룹과는 무관 함)입니다.

무한대로 스크롤하는듯한 느낌을주기 위해 '마지막'페이지에서 목록 위치가 재설정됩니다 (이 예에서는 항목 1 ~ 7이 항목 5 개의 와이드 뷰포트에 걸쳐 있습니다). 위의 그룹은 예제에서 페이지 당 5 개의 항목이 있으므로 페이지를 나타냅니다. 복제물은 다음 페이지로 이동할 때 발생할 수있는 공백을 채우기 위해 필요한 패딩을 제공합니다 (2 페이지는 예를 들어 6 및 7로 시작하지만 중복 된 1,2 및 3의 페이지가 아닌 경우에는 비어있게됩니다). 삼). 페이지가 마지막 페이지를 넘을 때 (그래서 3 페이지로 이동하려고 시도하면) 페이지 1로 목록에서 다시 위치를 조정하지만 오프셋으로 인해 앞으로 계속 영원히 진행되는 것처럼 보입니다.

이 때문에 배열 인덱스를 사용할 수 없으며 왜 수학 솔루션을 갖는 것이 유용할까요? 거기에 내가 수행하려고하는 것과 비슷한 작업을 수행하는 회전식 캐 러셀이 있다는 것을 알지만, 가지고있는 것을 사용해야합니다!그래서 같은

+0

당신이 당신의 목록을 게시 할 수있는, 또는 json으로서의 그 일부? 어떤 유형의 데이터가 포함되어 있는지 불분명합니다. – georg

+0

그룹화 된 숫자는 항상 공백으로 구분됩니까? – Corey

+0

정말 그런 목록은 없습니다. 나의 예에서 (나는 바뀔 것이다) 나는 7 개의 아이템,리스트의 양쪽에 패딩을위한 4 개의 복제본, 5 개의 아이템의 슬라이딩 뷰포트 중 하나의 '진짜'리스트를 가지고있다. 나는 기본적으로 autotimer가 시작될 때 페이지가 다음 5 개 항목으로 이동해야 할 때를 예측하려고합니다. 수동으로 다음을 선택하는 것이 좋습니다. 모든 작업이 정상적으로 처리되었습니다. 나는 1 ~ 7 번 항목의 활성 색인에만 액세스 할 수 있습니다. 나는 희망을 갖고 있습니다! –

답변

3

그냥 루프 매 5 자 :

var data = "12345671234567123456712345671234567"; 
var results = []; 

for(var i = 4; i < data.length; i += 5){ 
    results.push(data[i]); 
} 

//results = [5, 3, 1, 6, 4, 2, 7] 

이 같을 것이다 루프 다음을 변수 x = 5;를 사용하려면 :

for(var i = x - 1; i < data.length; i += x){... 

알 필요가 없습니다 y

+0

죄송합니다. 그런 식으로 목록에 내 데이터가 없기 때문에 솔루션이 수학적이어야한다는 것은 분명하지 않았습니다. –

+0

@StuartRadley : 오, 지금 무슨 뜻인지 알 겠어. 루프가 얼마나 오래 지속되어야합니까? 얼마나 많은 결과를 원하십니까? – musefan

-1
var data = "12345 67123 45671 23456 71234 56712 34567"; 
var x = 5; 
var y = 7; 
var results = []; 
var i = x - 1; // enumeration in string starts from zero 

while (i <= data.length){ 
    results.push(data[i]); 
    i = i + x + 1;// +1 for spaces ignoring 
} 
+0

실제 데이터에 공백이 포함되어 있는지 확신 할 수 없지만 잘못된 것일 수 있습니다. – musefan

+0

'i = i + x + 1; 공백이없는 경우'i = i + x; '에 대체해야 함 –

+0

아니요, 실제 데이터는 성가신 복잡하고 전통적인 방식으로 존재하지 않습니다 : D –

0

입력 시퀀스가 ​​종료되지 않으면 각 n 번째 항목을 출력하면 결과적으로 자체 반복 시퀀스가 ​​생성됩니다. 이 반복의 기간 (길이)은 입력 시퀀스의 기간 중 가장 낮은 공배수 (y)와 항목 출력에 사용되는 단계 크기 (x)가됩니다.

당신이 출력에 첫 번째 반복을 원하는 경우,이 같은 무언가가 (검증되지 않은) 트릭 수행해야합니다

var sequence = "1234567"; 
var x = 5; 
var y = sequence.length; 
var count = lcm(x, y); 
var offset = 4; 

var output = []; 
for (var i = 0; i < count; i += x) 
{ 
    j = (offset + i) % y; 
    output.push(sequence[j]); 
} 

당신은 비교적 쉽게 두 정수의 LCM을 계산하기위한 알고리즘을 찾을 수 있어야합니다을 .

+0

흠 ... 당신의 답변을 제외하고 다른 모든 게시물은 downvoted입니까? – musefan

+0

이 coule이 유용 할 것입니다. 나는 지금 그것을 조사하고있다. 주어진 순서 (1에서 N까지 항상 1이 될 것입니다.)에 따라 다섯 번째 항목을 찾기 위해 그룹 크기 (5)와 전체 항목 (7)을 지정할 수 있습니까? –

+0

@musefan 당신은 그 결론을 이끌어 낼 건가요? –

0

순전히 수학적 정의입니까? 오류 ...

T(n) = T(n-1) + K For all n > 0. 
T(1) = K // If user wants the first element in the series, you return the Kth element. 
T(0) = 0 // If the user want's a non-existent element, they get 0. 

Where K denotes the interval. 
n denotes the desired term. 
T() denotes the function that generates the list. 

Lets assume we want every Kth element. 

T(1) = T(0) + K = K 
T(2) = T(1) + K = 2K 
T(3) = T(2) + K = 3K 

T(n) = nk. // This looks like a promising equation. Let's prove it: 

So n is any n > 1. The next step in the equation is n+1, so we need to prove that 

T(n + 1) = k(n + 1). 

그럼 가자.

T(n+1) = T(N+1-1) + K. 
T(n+1) = T(n) + K 
Assume that T(n) = nk. 

T(n+1) = nk + k 
T(n+1) = k(n + 1). 

귀하의 증거에 따르면, T(n) = nk입니다.

당신이 얻는만큼 수학적입니다.

아주 간단한 반복적 인 관계로 아주 잘 설명됩니다. I 다른 용액을 편집 한 후

0

)

var n = 5, y = 7; 


for (var i = 1; i<=y; i++) { 
    var offset = (i*y - (i-1)*n) % y; 
    var result = 0; 
    if (offset === n) { 
     result = y; 
    } else { 
     result = (n - offset) > 0 ? n - offset : offset; 
    } 
    console.log(result); 
} 

[5, 3, 1, 6, 4, 2, 7]에 출력한다.

JSFIDDLE :http://jsfiddle.net/mcrLQ/4/

0
function get(x, A, B) { 
    var r = (x * A) % B; 
    return r ? r : B; 
} 

var A = 5; 
var B = 7; 
var C = []; 

for (var x = 1; x <= B; ++x) { 
    C.push(get(x, A, B)); 
} 

console.log(C); 

결과 : [5, 3, 1, 6, 4, 2, 7]

http://jsfiddle.net/xRFTD/

+0

이 함수는 모든 양수 x, A, B에서 작동합니다. – jgroenen

관련 문제