언덕 수는 첫 번째와 마지막 숫자가 같은 숫자 이지만 그게 전부는 아닙니다. 언덕 수에서 첫 번째 숫자는 엄격하게 증가 하고 마지막 숫자는 엄격하게 감소합니다. 최대 자릿수를 반복 할 수 있습니다 .
언덕 수의 예는 다음과 같습니다.
12377731 | 1237... | ...731
^ same ^ | strictly increasing | strictly decreasing
---------+---------------------+---------------------
12377731
^^^ okay because largest digit can be repeated
이것은 아닙니다 :
4588774 | ...8774
| ^^ not the largest digit
| so this has to be strictly decreasing
| but it's not, so not a hill number
도전
양의 정수가 주어지면 전체 프로그램 또는 언덕 수에 대해서는 진실을 반환하지만 다른 값에는 거짓을 반환하는 함수를 작성하십시오.
노트:
- 입력 및 출력은 임의의 합리적인 형식 일 수 있습니다 .
- 이것은 코드 골프 이므로 각 언어에서 가장 짧은 대답이 승리합니다!
테스트 사례
12321 -> Truthy
1233321 -> Truthy
99 -> Truthy
3 -> Truthy
234567992 -> Truthy
1232 -> Falsy
778896 -> Falsy
23232 -> Falsy
45566554 -> Falsy
5645 -> Falsy
답변
젤리 , 8 바이트
_ƝṠÞ+SƊƑ
작동 원리
_ƝṠÞ+SƊƑ Main link. Argument: n (integer)
_Ɲ Take the differences of neighboring digits.
This maps n = abcd to [a-b, b-c, c-d].
Ƒ Fixed; apply the link to the left and return 1 if the result is equal to
its argument, 0 if not.
Ɗ Drei; combine the three links to the left into a monadic chain.
ṠÞ Sort the differences by their signs (negative, zero, positive).
S Take the sum of the differences, yielding 0 if and only if the
first digit is equal to the last.
+ Add the sum to each difference.
답변
자바 스크립트 (ES6), 62 54 바이트
입력을 문자열로받습니다. 부울 값을 반환합니다.
s=>s[-[...s].some(p=q=n=>q>(q=Math.sign(p-(p=n))))]==p
댓글
s => // s = input string
s[ // we will eventually access either s[0] or s[-1]
-[...s].some( // depending on the result of this some()
p = q = // initialize p and q to non-numeric values
n => // for each digit n:
q > ( // compare q with
q = // the new value of q,
Math.sign( // defined as the sign of
p - (p = n) // the difference between the current digit and the previous one
)) // yield true if the previous q is greater than the new q
) // s[-1] being undefined, a truhty some() will force the test to fail
] == p // otherwise: test if the 1st digit s[0] is equal to the last digit p
자바 스크립트 (ES6), 65 바이트
정규식을 사용하는 솔루션. 입력을 문자열로받습니다.
0또는
1반환합니다 .
s=>/N(,-\d+)*(,0)*[^0-]*$/.test([...s].map(p=v=>p-(p=v)))&p==s[0]
어떻게?
우리는 처음에 페어 자리의 차이점 목록에 번호를 변환
[−9,9]:
[...s].map(p = v => p - (p = v))
예:
"234567992" --> [ NaN, -1, -1, -1, -1, -1, -2, 0, 7 ]
이 배열은 문자열로 강제 변환되어 다음을 제공합니다.
"NaN,-1,-1,-1,-1,-1,-2,0,7"
다음 정규식을 적용합니다.
+-----------------------> the second 'N' of 'NaN'
| +------------------> a sequence of negative numbers
| | +------------> a sequence of zeros
| | | +------> a sequence of positive numbers
| | | | +---> end of string
| | | | |
|/¨¨¨¨¨¨\/¨¨¨\/¨¨¨¨\|
/N(,-\d+)*(,0)*[^0-]*$/
마지막으로, 마지막 숫자 p
가 첫 번째 숫자와 같은지 테스트합니다 s[0]
.
답변
Pyth, 16 바이트
&SI_._MJ.+jQT!sJ
jQT input in base 10
J.+ J = differences: [3,1,4,1] -> [-2,3,-3]
._M Signs of each element of J
_ Reverse the list
SI and check if it is Invariant under Sorting.
If this is true, J consists of some positive numbers,
followed by some 0s, followed by some negative numbers,
which is what we want.
!sJ Now we check the other hill condition by ensuring
sum(differences) = 0; i.e. the first and last digit are equal.
& We take the logical AND of both conditions.
답변
젤리 , 11 바이트
DIµṠNṢƑaS¬$
설명:
D Convert to a list of Digits.
I Increments; compute differences between successive elements.
µ Start new µonadic link.
Ṡ Find Ṡign of each increment
N then negate;
ṢƑ is the result invariant under Ṣorting?
If so, the increments consist of some positive numbers,
followed by some 0s, followed by some negative numbers,
which is what we want.
a Logical AND this result with
S¬$ logical NOT of the Sum of the increments.
If the sum of the increments is zero, first and last digits are equal.
답변
펄 6 , 39 바이트
{.[0]==.tail&&[<=] $_ Z<=>.skip}o*.comb
설명
{ ... }o.comb # Split into digits and feed into block
.[0]==.tail # First element equals last
&& # and
$_ Z<=>.skip # Pairwise application of three-way comparator
[<=] # Results never decrease