배경
에이다 (Ada) 는 간결한 것으로 잘 알려져 있지 않은 프로그래밍 언어입니다.
그러나 배열 리터럴 구문은 이론적으로 상당히 간결한 배열 스펙을 허용 할 수 있습니다. 다음은 배열 리터럴 구문에 대한 간단한 EBNF 설명입니다 ( bottlecaps.de로 전달 가능) .
array ::= positional_array | named_array
positional_array ::= expression ',' expression (',' expression)*
| expression (',' expression)* ',' 'others' '=>' expression
named_array ::= component_association (',' component_association)*
component_association ::= discrete_choice_list '=>' expression
discrete_choice_list ::= discrete_choice ('|' discrete_choice)*
discrete_choice ::= expression ('..' expression)? | 'others'
단순성을 위해 정수의 1 차원 배열로 제한합니다. 이는 표현식 값에 정수만 사용한다는 것을 의미합니다. 아마도 미래의 도전에서 우리는 변수와 다차원 배열 선언과 같은 더 진보 된 것을 시도 할 수있을 것입니다. 정수 리터럴을 사용할 필요가 없습니다 .
다음은 Ada 배열 리터럴의 예와 명확성을 위해 파이썬과 동등한 표현입니다.
(1, 2, 3) = [1, 2, 3]
(1, others => 2) = [1, 2, 2, ..., 2]
(others => 1) = [1, 1, ..., 1]
(1 => 1, 2 => 3) = [1, 3]
(1|2 => 1, 3 => 2) = [1, 1, 2]
(1 => 1, 3 => 2, others => 3) = [1, 3, 2, 3, 3, ..., 3]
도전
이 과제의 목표는 주어진 입력 배열에 대해 가장 짧은 바이트 수의 Ada 배열 리터럴을 출력하는 것입니다. Ada 배열은 원하는 인덱스에서 시작할 수 있으므로 각 값이 순차적 인 한 시작 인덱스를 원하는 것을 선택할 수 있습니다. 이 예에서 나는 1에서 시작하기로 선택했는데, 이것은 Ada에 대한 관용적이지만 다른 정수에서 시작하도록 선택할 수 있습니다.
입력
입력은 편리한 형태의 정수 목록으로 구성됩니다.
산출
출력은 입력 정수 목록을 나타내는 가장 짧은 유효한 Ada 배열 리터럴을 나타내는 텍스트 문자열입니다. 이 배열에서 원하는 시작 색인을 사용할 수 있지만, 선택에 상관없이 선택 사항을 지정해야합니다 (시작 색인은 동적 일 수도 있음).
정수는 예제와 같이 부호있는 10 진수로 표시됩니다. 이 과제는 정수 값의 골프를 다루지 않습니다.
예
여기 몇 가지 예가 있어요.
Simple: [1, 2, 3] -> (1,2,3)
Range: [1, 1, 1, 1, 1, 1, 1,] -> (1..7=>1)
Others: [1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1] -> (6=>2,others=>1)
Multiple Ranges: [1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1] -> (6..10|16..20=>2,others=>1)
Tiny Ranges: [1,1,2,2,1,1,1,1,1] -> (3|4=>2,others=>1)
Far Range: [[1]*5, [2]*100, [3]*5] -> (1..5=>1,6..105=>2,others=>3)
Alternation: [1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2] -> (1|3|5|7|9|11|13|15|17=>1,others=>2)
Big Number: [1234567890,1,1234567890] -> (2=>1,1|3=>1234567890)
Big-ish Number: [1234567,1,1234567] -> (1234567,1,1234567)
Solo: [-1] -> (1=>-1)
Huge Input: [[0],[1]*1000000000] -> (0,others=>1)
Positional Others: [1, 2, 3, 3, 3, 3, 3, 3] -> (1,2,others=>3)
Range and Choice, no Others: [1,1,1,12,12,3,3,3,3,3,3,3,3,3,3,4] -> (1..3=>1,4|5=>12,6..15=>3,16=>4)
최소한의 필요 조건
최소 100 개의 숫자와 최소 256 개의 숫자를 지원합니다.
이러한 모든 입력에 대해 올바른 결과를 생성하십시오
- 마지막에 '다른 사람들'을 두는 것을 포함
- 단일 항목 배열에 대한 인덱스를 포함
1 분 안에 위의 각 입력에 대해 종료하십시오 (TIO에서 선호).
바이트 단위의 최단 솔루션이 승리합니다!
참조 구현
이 구현은 입력을 배열로 사용하며 각 문자는 숫자입니다. 대문자는 큰 값을 나타내는 특수 상수입니다. 프로그램 인수는 사용할 '시작 색인'입니다.
TIO 링크의 "코드"섹션은 문제에 대한 올바른 솔루션이며 "헤더"및 "풋터"는 테스트 구조를 구현합니다.
106..110=>3,others=>2문법이 허용하지 않는 한, 마지막 경우는 인덱스를 가질 필요가 더 이상 것) 단일 요소의 위치 배열 ( positional_array ::= expression ',' expression (',' expression)*)
(1|3=>1234567,2=>1)대한 또 다른 유효한 출력인지 확인 [1234567,1,1234567]하시겠습니까?
(-1)