Czy ta liczba to numer wzgórza?


17

Numer wzgórza to liczba, która ma tę samą cyfrę na pierwszym i ostatnim , ale to nie wszystko. W liczbach na wzgórzu pierwsze cyfry ściśle się zwiększają , a ostatnie cyfry ściśle się zmniejszają. Największa cyfra może zostać powtórzona .

Oto przykład numeru wzgórza:

12377731 | 1237...             | ...731
^ same ^ | strictly increasing | strictly decreasing 
---------+---------------------+---------------------
12377731
   ^^^ okay because largest digit can be repeated

To nie jest :

4588774 | ...8774
        |     ^^ not the largest digit
        |        so this has to be strictly decreasing
        |        but it's not, so not a hill number

Wyzwanie

Biorąc pod uwagę dodatnią liczbę całkowitą, napisz pełny program lub funkcję, która zwraca wartość prawda dla liczb wzgórz, ale fałszuje inne wartości.

Uwagi:

  • Dane wejściowe i wyjściowe mogą być w dowolnym rozsądnym formacie .
  • To jest więc wygrywa najkrótsza odpowiedź w każdym języku!

Przypadki testowe

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

5
Co 222222222? Czy to jest płaski numer wzgórza?
frarugi87,

1
222222222jest numerem wzgórza, największa cyfra to 2 i dlatego może być powtórzona
u_definicja

1
Czy łańcuch jest rozsądny?
Sanchises,

@ frarugi87 Zobacz komentarz powyżej.
Dennis,

Czy 1230321numer wzgórza?
HelloGoodbye

Odpowiedzi:


10

Galaretka , 8 bajtów

_ƝṠÞ+SƊƑ

Wypróbuj online!

Jak to działa

_ƝṠÞ+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 bajty

Pobiera dane wejściowe jako ciąg. Zwraca wartość logiczną.

s=>s[-[...s].some(p=q=n=>q>(q=Math.sign(p-(p=n))))]==p

Wypróbuj online!

Skomentował

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 bajtów

Rozwiązanie wykorzystujące wyrażenie regularne. Pobiera dane wejściowe jako ciąg. Zwraca 0 lub 1 .

s=>/N(,-\d+)*(,0)*[^0-]*$/.test([...s].map(p=v=>p-(p=v)))&p==s[0]

Wypróbuj online!

W jaki sposób?

Najpierw konwertujemy liczbę na listę różnic cyfr par w [9,9] :

[...s].map(p = v => p - (p = v))

Przykład:

"234567992" --> [ NaN, -1, -1, -1, -1, -1, -2, 0, 7 ]

Ta tablica jest wymuszana na ciąg znaków, co daje:

"NaN,-1,-1,-1,-1,-1,-2,0,7"

Stosujemy następujące wyrażenie regularne:

 +-----------------------> 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-]*$/

Na koniec testujemy również, czy ostatnia cyfra pjest równa pierwszej cyfrze s[0].


Możesz zapisać 5 bajtów, przyjmując dane wejściowe jako tablicę cyfr.
Shaggy

@Shaggy Chciałbym móc, ale najwyraźniej nie jest to dozwolone .
Arnauld,

Ze specyfikacji, z oryginalnym naciskiem: „Dane wejściowe i wyjściowe mogą być w dowolnym rozsądnym formacie ” - zwykle uważamy tablicę cyfr za rozsądny format liczby całkowitej.
Shaggy

4

Pyth, 16 bajtów

&SI_._MJ.+jQT!sJ

Wypróbuj zestaw testowy .

          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

Galaretka , 11 bajtów

DIµṠNṢƑaS¬$

Wyjaśnienie:

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.

Wypróbuj online!


4

Perl 6 , 39 bajtów

{.[0]==.tail&&[<=] $_ Z<=>.skip}o*.comb

Wypróbuj online!

Wyjaśnienie

{ ... }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

Byłem dosłownie kilka sekund od opublikowania tego lol.
Jo King


3

R , 65 bajtów

Bierze sznurki. Wpadłem na pomysł sprawdzenia niezmienności sortowania z odpowiedzi Pyth.

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

Wypróbuj online!


2

05AB1E , 19 17 13 12 bajtów

¥D.±Â{RQsO_*

-5 bajtów, tworząc port odpowiedzi Pyth @lirtosiast .

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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

Â{RQmoże alternatywnie być (Â{Qdla tej samej liczby bajtów, gdzie (neguje każdy znak: Wypróbuj online .


2

J, 23 bajty

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

Pomysł skradziony z galaretki odpowiada. Chciałem tylko zobaczyć, jak krótko potrafię to zrobić w J.

Wypróbuj online!


2

MATL , 12 bajtów

dZSd1<AGds~*

Wypróbuj online!

Wyjaśnienie

Dane wejściowe to ciąg cyfr. Dane wyjściowe to a 1lub 0. Liczba 222222jest numerem wzgórza według tego programu. Zaoszczędzono 2 bajty, kopiując metodę Dennisa do sprawdzania równości pierwszej i ostatniej cyfry.

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 bajty

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

Pobiera dane wejściowe jako ciąg. Wyjście odbywa się poprzez obecność lub brak wyjątku .

Wypróbuj online!


Python 2 , 62 bajty

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

Pobiera dane wejściowe jako ciąg znaków i zwraca wartość logiczną.

Wypróbuj online!


Whoa, raniłem sobie głowę od wielu godzin i nie mogłem nawet wymyślić czegoś krótszego niż łączna liczba bajtów twoich 2 rozwiązań! Twoje zdrowie.
etene

1

Język Mathematica / Wolfram, 69 64 bajtów

Czysta funkcja. Pobiera dane wejściowe jako liczbę całkowitą, zwraca Truelub False.

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

Wyjaśnienie:

Pierwsza klauzula sprawdza „górzystość”:

  • IntegerDigits: Uzyskaj cyfry z liczby całkowitej. Przechowywać w y.
  • -Differences: Weź kolejne różnice i odwróć znaki.
  • Sign: Zamień każdy wpis na +1, jeśli jest dodatni, 0, jeśli zero, i -1, jeśli ujemny. Przechowywać w x.
  • Sort: Sortuj listę +1, 0, -1 od najmniejszej do największej. Porównaj z oryginalną listą w x.

Druga klauzula sprawdza, czy pierwsza i ostatnia cyfra są równe.

Wskazówka dla @IanMiller, która zawiera wskazówki dotyczące udoskonalenia tego kodu.


Fakt, że IntegerDigitsi Differencessą dość długie nazwy funkcji jest nieco irytujące.
Michael Seifert,

Można zapisać 5 bajtów z następującymi zmianami:Sort[x=Sign@-Differences[y=IntegerDigits@#]]==x&&y[[1]]==Last@y&
Ian Miller

1

Japt, 11 bajtów

Pobiera dane wejściowe jako tablicę cyfr.

ä-
eUñg)«Ux

Wypróbuj lub uruchom wszystkie przypadki testowe

             :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

Retina 0.8.2 , 52 bajty

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

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

.
$*1;$&$*1,

Konwertuj każdą cyfrę na unary dwukrotnie, oddzielając je ; si i zakończone ,s. Możesz jednak pomyśleć o wyniku jako o pierwszej cyfrze, a ;, a następnie o wszystkich parach sąsiednich cyfr, o cyfrach każdej pary oddzielonych przez ,i parach oddzielonych przez ;s, następnie o drugiej ;, a następnie o ostatniej cyfrze, a następnie o końcu ,.

(1+),\1
,

Odejmij pary sąsiednich cyfr. Pozostawia to ;,;równe cyfry 1is po większej stronie nierówne cyfry. (Można to zrobić w ramach następującego wyrażenia regularnego, ale oczywiście nie byłoby to tak golfowe).

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

Dopasuj pierwszą cyfrę, następnie dowolną liczbę par cyfr rosnących, następnie dowolną liczbę par równych cyfr, a następnie dowolną liczbę par cyfr malejących, a następnie dopasuj pierwszą cyfrę ponownie na samym końcu.


0

Czerwony , 181 bajtów

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

Wypróbuj online!

Bardziej czytelny:

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 bajtów

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

Skrypt testu mniej golfowego:

$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"
}

Wynik:

True: True
True: True
True: True
True: True
True: True
True: False
True: False
True: False
True: False
True: False

0

C # (interaktywny kompilator Visual C #) , 161 bajtów

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]);}

Wypróbuj online!

Oto przegląd tego, jak to działa ...

  1. Dane wejściowe mają postać string
  2. Znajdź największą cyfrę
  3. Upewnij się, że pierwsza i ostatnia cyfra są takie same
  4. Upewnij się, że cyfry po ostatnim wystąpieniu największej cyfry maleją
  5. Upewnij się, że cyfry między pierwszym a ostatnim wystąpieniem największej cyfry są równe największej cyfrze
  6. Upewnij się, że liczba cyfr przed pierwszym wystąpieniem największej cyfry rośnie

0

Python 3 , 114 bajtów

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]

Wypróbuj online!

Znacznie dłużej niż niektóre rozwiązania Python 2, ale to jest oparte na def i bardzo mi się podoba.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.