Чи є це число номером пагорба?


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

Виклик

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

Примітки:

  • Введення та вихід можуть бути у будь-якому розумному форматі .
  • Це тому найкоротша відповідь на кожній мові виграє!

Випробування

12321 -> Truthy
1233321 -> Truthy
99 -> Truthy
3 -> Truthy
234567992 -> Truthy
1232 -> Falsy
778896 -> Falsy
23232 -> Falsy
45566554 -> Falsy
5645 -> Falsy

5
Про що 222222222? Це номер плоского пагорба?
frarugi87

1
222222222- це число пагорбів, найбільша цифра - 2, і таким чином його можна повторити
u_ndefined

1
Чи є рядок розумним?
Санчіз

@ frarugi87 Дивіться коментар вище.
Денніс

Чи 1230321є номер пагорба?
HelloGoodbye

Відповіді:


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


Ви можете зберегти 5 байт, взявши введення як масив цифр.
Shaggy

@Shaggy Я б хотів, але міг, але це, мабуть, не дозволено .
Арнольд

З специфікації, з оригінальним наголосом: "Введення та вихід може бути у будь-якому розумному форматі " - ми зазвичай вважаємо цифровий масив розумним форматом для цілого числа.
Shaggy

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.

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.

Спробуйте в Інтернеті!





2

05AB1E , 19 17 13 12 байт

¥D.±Â{RQsO_*

-5 байт, створивши порт відповіді Pyli @lirtosiast .

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

¥           # 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

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

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]

Приймає введення як рядок і повертає булеве значення.

Спробуйте в Інтернеті!


Ой, я боліла головою годинами і навіть не могла придумати щось коротше, ніж комбіноване число байтів у ваших 2 рішеннях! Ура.
etene

1

Математика / Мова Вольфрама, 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&
Ян Міллер


0

Сітківка 0,8,2 , 52 байти

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

Спробуйте в Інтернеті! Посилання включає тестові випадки. Пояснення:

.
$*1;$&$*1,

Перетворіть кожну цифру в одинакову двічі, розділену ;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

0

C # (Visual C # Interactive Compiler) , 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. Переконайтеся, що цифри перед першим появою найбільшої цифри збільшуються

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, але це засноване на дефініції, і мені це подобається.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.