Это число номер холма?

17

Номер холма - это число с одинаковыми цифрами в первом и последнем , но это еще не все. В числе холмов первые цифры строго возрастают , а последние цифры строго убывают. Самая большая цифра может быть повторена .

Вот пример номера холма:

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

Вызов

Если задано положительное целое число, напишите полную программу или функцию, которая возвращает true для чисел холмов, но ошибочно принимает другие значения.

Примечания:

  • Ввод и вывод может быть в любом разумном формате .
  • Это поэтому выигрывает самый короткий ответ на каждом языке!

Тестовые случаи

12321 -> Truthy
1233321 -> Truthy
99 -> Truthy
3 -> Truthy
234567992 -> Truthy
1232 -> Falsy
778896 -> Falsy
23232 -> Falsy
45566554 -> Falsy
5645 -> Falsy
u_ndefined
источник
5
Как насчет 222222222? Это плоский номер холма?
frarugi87
1
222222222является числом холма, наибольшая цифра равна 2 и, таким образом, может повторяться
u_ndefined
1
Строка разумна?
Санчиз
@ frarugi87 Смотрите комментарий выше.
Денис
Номер 1230321холма?
Здравствуйте, до свидания,

Ответы:

10

Желе , 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.
Деннис
источник
6

JavaScript (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

JavaScript (ES6), 65 байт

01

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].

Arnauld
источник
Вы можете сохранить 5 байтов, взяв входные данные в виде массива цифр.
лохматый
@ Шэгги: Я бы хотел, но это, по- видимому, запрещено .
Арно
Из спецификации, с оригинальным акцентом: «Ввод и вывод может быть в любом разумном формате » - мы обычно считаем массив цифр приемлемым форматом для целого числа.
лохматый
4

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.
lirtosiast
источник
4

Желе , 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.

Попробуйте онлайн!

lirtosiast
источник
4

Perl 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
nwellnhof
источник
Я был буквально в нескольких секундах от публикации этого лол.
Джо Кинг,
3

R 65 байт

Принимает строки. Взял идею проверки неизменности сортировки из ответа Pyth.

function(a)!sum(d<-diff(utf8ToInt(a)))&all(sort(k<-sign(d),T)==k)

Попробуйте онлайн!

j.doe
источник
2

05AB1E , 19 17 13 12 байт

¥D.±Â{RQsO_*

-5 байт путем создания порта @lirtosiast «s Pyth ответ .

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

¥           # Push the deltas of the digits of the (implicit) input
            #  i.e. 4588774 → [1,3,0,-1,0,-3]
 D          # Duplicate this list
          # Get the sign of each
            #  [1,3,0,-1,0,-3] → [1,1,0,-1,0,-1]
    Â       # Bifurcate (short for DR: Duplicate and Reverse copy)
            #  i.e. [1,1,0,-1,0,-1] → [-1,0,-1,0,1,1]
     {      # Sort the copy
            #  i.e. [-1,0,-1,0,1,1] → [-1,-1,0,0,1,1]
      R     # Reverse it
            #  i.e. [1,1,0,0,-1,-1]
       Q    # And check if they are equal
            #  i.e. [1,1,0,-1,0,-1] and [1,1,0,0,-1,-1] → 0 (falsey)
s           # Swap to get the list of deltas again
 O          # Take the sum
            #  i.e. [1,3,0,-1,0,-3] → 0
  _         # And check if it's exactly 0
            #  0 → 1 (truthy)
*           # Check if both are truthy (and output implicitly)
            #  i.e. 0 and 1 → 0 (falsey)

Â{RQальтернативно может быть (Â{Qдля того же количества байтов, где (отрицает каждый знак: попробуйте это онлайн .

Кевин Круйссен
источник
2

J, 23 байта

[:((0=+/)**-:*/:*)2-/\]

Идея украденная из желе отвечает. Просто хотел посмотреть, как быстро я смогу сделать это в J.

Попробуйте онлайн!

Ион
источник
2

MATL , 12 байт

dZSd1<AGds~*

Попробуйте онлайн!

объяснение

Ввод представляет собой строку цифр. Выход является 1или 0. Номер 222222является номером холма в соответствии с этой программой. Сэкономили 2 байта, скопировав метод Денниса для проверки равенства первой и последней цифр.

d               % Takes the difference between digits
 ZS             % Calculate the sign. 
   d            % Take the difference again. 
    1<          % A number is a hill number if these differences are < 1.
      A         % Truthy iff above is all true OR if array is empty (necessary for short inputs)
       Gds      % Push the input, and sum all the differences.
          ~     % Negate
           *    % Multiply the two tests (=logical AND).
Sanchises
источник
1

Python 2 , 53 байта

def f(s):x=map(cmp,s,s[1:]);s[:sorted(x)==x]!=s[-1]>_

Принимает ввод в виде строки. Вывод осуществляется через наличие или отсутствие исключения .

Попробуйте онлайн!


Python 2 , 62 байта

lambda s:s[:eval('<='.join(map(str,map(cmp,s,s[1:]))))]==s[-1]

Принимает ввод в виде строки и возвращает логическое значение.

Попробуйте онлайн!

Деннис
источник
Вау, у меня болит голова часами, и я даже не могу придумать что-то более короткое, чем общее количество байтов ваших двух решений! Приветствия.
января
1

Mathematica / Wolfram Language, 69 64 байта

Чистая функция. Принимает ввод как целое число, возвращает Trueили False.

Sort[x=Sign@-Differences[y=IntegerDigits@#]]==x&&y[[1]]==Last@y&

Объяснение:

Первый пункт проверяет «горность»:

  • IntegerDigits: Получить цифры от целого числа. Магазин в y.
  • -Differences: Возьмите последовательные различия и переверните знаки.
  • Sign: Заменить каждую запись +1, если положительный, 0, если ноль, и -1, если отрицательный. Магазин вx .
  • Sort: Сортировка списка +1, 0, -1 от наименьшего к наибольшему. Сравните с оригинальным списком в x.

Второе предложение проверяет, равны ли первая и последняя цифры.

Совет от @IanMiller для получения советов по уточнению этого кода.

Майкл Сейферт
источник
Тот факт, что IntegerDigitsи Differencesявляются довольно длинными именами функций, немного раздражает.
Майкл Сейферт
Может сохранить 5 байтов со следующими изменениями:Sort[x=Sign@-Differences[y=IntegerDigits@#]]==x&&y[[1]]==Last@y&
Ян Миллер
1

Japt, 11 байт

Принимает ввод в виде массива цифр.

ä-
eUñg)«Ux

Попробуйте или запустите все тесты

             :Implicit input of digit array U
ä-           :Deltas
\n           :Reassign to U
 Uñ          :Sort U
   g         :  By signs
e   )        :Check for equality with U
     «       :Logical AND with the negation of
      Ux     :U reduced by addition
мохнатый
источник
0

Сетчатка 0.8.2 , 52 байта

.
$*1;$&$*1,
(1+),\1
,
^(1+);(,1+;)*(,;)*(1+,;)*\1,$

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:

.
$*1;$&$*1,

Преобразуйте каждую цифру в одинарный дважды, разделив ее ;символом s и заканчивая символом ,s. Тем не менее, вы можете представить результат как первую цифру, а ;затем все пары соседних цифр, цифры каждой пары, разделенные ,и пары, разделенные; s, s, затем еще один символ.; , затем о последней цифре, затем о последней ,.

(1+),\1
,

Вычтите пары соседних цифр. Это оставляет;,; для равных цифр и 1s на большей стороне для неравных цифр. (Это может быть сделано как часть следующего регулярного выражения, но, очевидно, это не будет так уж и плохо).

^(1+);(,1+;)*(,;)*(1+,;)*\1,$

Сопоставьте первую цифру, затем любое количество пар восходящих цифр, затем любое количество пар равных цифр, затем любое количество пар нисходящих цифр, затем снова сопоставьте первую цифру в самом конце.

Нил
источник
0

Красный , 181 байт

func[n][m: last sort copy t: s: form n
parse t[opt[copy a to m(a: sort unique a)]copy b thru any m
opt[copy c to end(c: sort/reverse unique c)]](s = rejoin[a b c])and(s/1 = last s)]

Попробуйте онлайн!

Более читабельно:

f: func[n][
    t: s: form n                                    
    m: last sort copy t                             
    parse t [ opt [ copy a to m (a: sort unique a) ] 
              copy b thru any m
              opt [ copy c to end (c: sort/reverse unique c) ]
            ]
    (s = rejoin [ a b c ]) and (s/1 = last s)
]
Гален Иванов
источник
0

Powershell, 77 байт

($x=-join("$($args|%{"-$_;$_"})"|iex))-match'^(-\d)+0*\d+$'-and$x[1]-eq$x[-1]

Менее гольф тестовый скрипт:

$f = {
                                           # $args = 1,2,3,3,3,2,1
$a=$args|%{"-$_;$_"}                       # "-1;1","-2;2","-3;3","-3;3","-3;3","-2;2","-1;1"
$d="$a"                                    # "-1;1 -2;2 -3;3 -3;3 -3;3 -2;2 -1;1"
$x=-join($d|Invoke-Expression)             # "-1-1-100111"
$x-match'^(-\d)+0*\d+$'-and$x[1]-eq$x[-1]  # $true or $false

}

@(
    ,($True , 1,2,3,2,1 )
    ,($True , 1,2,3,3,3,2,1 )
    ,($True , 9,9 )
    ,($True , 3 )
    ,($True , 2,3,4,5,6,7,9,9,2 )
    ,($False, 1,2,3,2 )
    ,($False, 7,7,8,8,9,6 )
    ,($False, 2,3,2,3,2 )
    ,($False, 4,5,5,6,6,5,5,4 )
    ,($False, 5,6,4,5 )
) | % {
    $expected,$a = $_
    $result = &$f @a
    "$($result-eq$expected): $result"
}

Выход:

True: True
True: True
True: True
True: True
True: True
True: False
True: False
True: False
True: False
True: False
Mazzy
источник
0

C # (интерактивный компилятор Visual C #) , 161 байт

s=>{var m=s.OrderBy(c=>c).Last();return s[0]==s.Last()&Enumerable.Range(1,s.Length-1).All(i=>i>s.LastIndexOf(m)?s[i-1]>s[i]:i>s.IndexOf(m)?m==s[i]:s[i-1]<s[i]);}

Попробуйте онлайн!

Вот краткий обзор того, как это работает ...

  1. Ввод в форме string
  2. Найти самую большую цифру
  3. Убедитесь, что первая и последняя цифры совпадают
  4. Убедитесь, что цифры после последнего появления самой большой цифры уменьшаются
  5. Убедитесь, что цифры между первым и последним вхождением самой большой цифры равны самой большой цифре
  6. Убедитесь, что цифры до первого появления самой большой цифры увеличиваются
Dana
источник
0

Python 3 , 114 байт

def f(r):
 l=[*r]
 for i in-1,0:
  while 1<len(l)and l[i]<l[(1,-2)[i]]:l.pop(i)
 return 2>len({*l})and r[0]==r[-1]

Попробуйте онлайн!

Гораздо дольше, чем некоторые решения Python 2, но это основано на def, и мне это нравится.

etene
источник