간단한 과제 : 일련의 양의 정수가 주어지면 연속 숫자 중 가장 긴 연속 숫자를 포함하는 숫자를 찾으십시오. 트릭? 런의 숫자가 가능한 값을 감싸고 ( 0123456789
) 뒤로 이동할 수 있습니다. 모두 그래서 2345
, 89012
및 5432109
연속적인 숫자 (그러나 유효한 실행됩니다 3456765
도 321090123
있지만 실행이 같은 방향으로 항상 있어야로 3456765
2 실점으로 간주 될 수 있습니다 34567
와 765
). 관계의 경우 첫 번째 것을 반환하십시오.
테스트 사례 :
Input: [3274569283, 387652323, 23987654323648, 2345687913624]
Output: 23987654323648
(The run is 98765432; run length: 8)
Input: [123012363672023, 098761766325432, 15890123456765]
Output: 15890123456765
(The run is 8901234567; run length: 10)
Input: [43, 19, 456]
Output: 456
Input: [5, 9, 0]
Output: 5
Input: [71232107, 7012347]
Output: 7012347
Input: [1234, 32109876]
Output: 32109876
Input: [9090, 123]
Output: 123
노트:
- 입력에 하나 이상의 숫자가 있습니다.
- 입력 숫자는 선행 0을 포함 할 수 있습니다.
- 입력 및 출력 형식은 합리적입니다 . 따라서 입력 번호는 문자열, 숫자 / 문자 목록으로 사용할 수 있습니다 …
- 숫자가 인쇄되는 한 출력에는 후행 및 / 또는 선행 공백 및 줄 바꿈이 포함될 수 있습니다.
- 이것은 code-golf 이므로 각 언어마다 가장 짧은 프로그램 / 기능이 이길 수 있습니다!
답변
답변
자바 스크립트 (ES6), 104 (102) 98 바이트
숫자 목록의 목록으로 입력을받습니다. 가장 좋은 것을 반환합니다.
a=>a.map(s=>s.map(n=>(i=(d=(x-(x=n)+11)%10)&&d-2?0:d-p?(p=d,1):i+1)>j&&(r=s,j=i),p=x=-10),j=-1)&&r
테스트 사례
let f =
a=>a.map(s=>s.map(n=>(i=(d=(x-(x=n)+11)%10)&&d-2?0:d-p?(p=d,1):i+1)>j&&(r=s,j=i),p=x=-10),j=-1)&&r
console.log(JSON.stringify(f([[3,2,7,4,5,6,9,2,8,3], [3,8,7,6,5,2,3,2,3], [2,3,9,8,7,6,5,4,3,2,3,6,4,8], [2,3,4,5,6,8,7,9,1,3,6,2,4]])))
console.log(JSON.stringify(f([[1,2,3,0,1,2,3,6,3,6,7,2,0,2,3], [0,9,8,7,6,1,7,6,6,3,2,5,4,3,2], [1,5,8,9,0,1,2,3,4,5,6,7,6,5]])))
console.log(JSON.stringify(f([[4,3], [1,9], [4,5,6]])))
console.log(JSON.stringify(f([[5], [9], [0]])))
답변
젤리 , 18 16 15 바이트
I%⁵Œg%8ċ€1ṀµÐṀḢ
숫자 목록을 가져 와서 설명 된대로 최대 런을 포함하는 가장 왼쪽을 반환하는 모나드 링크.
온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오(문제가있는 것처럼 I / O를 보이도록 처리합니다).
어떻게?
I%⁵Œg%8ċ€1ṀµÐṀḢ - Link: list of lists of integers (digits) from [0-9]
µÐṀ - keep elements for which the link to the left is maximal:
I - incremental differences (i.e. [a2-a1, a3-a2, ...])
⁵ - literal 10
% - modulo by (i.e. [(a2-a1)%10, (a3-a2)%10, ...])
- this equates deltas of -9 and -1 with 1 and 9 respectively
Œg - group runs of equal elements
%8 - modulo by 8; vectorised (9s become 1s, others unaffected)
ċ€1 - count number of 1s in €ach group
Ṁ - maximum
Ḣ - head (get the first one of those that were maximal)
답변
파이썬 2 , 118 바이트
자릿수 목록을 가져옵니다 a
. 목록 중 하나를 반환합니다.
lambda a:max(a,key=lambda l:len(max(re.findall('1+|9*',`[(x-y)%10for x,y in zip(l,l[1:])]`[1::3]),key=len)))
import re
답변
껍질 , 20 바이트
←Ö¤<(→Of€1†%8gẊo%10-
자릿수 목록을 가져와 리턴합니다.
온라인으로 사용해보십시오!
설명
←Ö¤<(→Of€1†%8gẊo%10- Implicit input.
← Return first element of
Ö the input sorted in a stable manner
< in descending order
¤ ( with respect to the following function:
Argument is list of digits, say [5,2,1,0,9,1,0].
- Differences
o%10 mod 10
Ẋ of all adjacent pairs: [7,9,9,9,2,1]
g Group adjacent equal elements: [[7],[9,9,9],[2],[1]]
†%8 Vectorized mod 8: [[7],[1,1,1],[2],[1]]
f€1 Keep those runs where 1 occurs: [[1,1,1],[1]]
O Sort in ascending order: [[1],[1,1,1]]
→ Take last element (gives [] on empty list): [1,1,1]
This is a list of 1s with length one less than
the longest run of consecutive digits.
답변
MATLAB, 130 바이트
배열, 열 차이 배열 [X (2) -X (1), …, X (n) -X (n-1)]에 배열을 입력하고 배열에서 가장 빈번한 값을 확인하십시오 (1 오름차순- 1이 아닌 경우), 가장 빈번한 값 또는 -9에 가장 빈번한 값을 곱한 값을 구하고 (-9는 오름차순으로 발생하고, 9는 그렇지 않음) 연속 인덱스를 찾아 (즉, 차이가 1 인 경우) 합산하십시오. 늦었으니 제발 가장 큰 출력.
a=input('')
t=[]
for i=1:numel(a)
b=diff(num2str(a(i))-'0')
c=mode(b)
t=[t sum(diff(find(b==c|b==-9*c))==1)]
end
[t,I]=max(t),a(I)