Este número é um número elevado?

17

Um número de colina é um número que tem o mesmo dígito no primeiro e no último , mas isso não é tudo. Em um número de colina, os primeiros dígitos estão aumentando estritamente e os últimos dígitos estão diminuindo estritamente. O dígito maior pode ser repetido .

Aqui está um exemplo de um número de colina:

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

Isto não é :

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

Desafio

Dado um número inteiro positivo, escreva um programa completo ou uma função que retorne verdade para números de colinas, mas que seja falso em outros valores.

Notas:

  • Entrada e saída podem estar em qualquer formato razoável .
  • Este é o e a resposta mais curta em cada idioma vence!

Casos de teste

12321 -> Truthy
1233321 -> Truthy
99 -> Truthy
3 -> Truthy
234567992 -> Truthy
1232 -> Falsy
778896 -> Falsy
23232 -> Falsy
45566554 -> Falsy
5645 -> Falsy
Indefinido
fonte
5
Que tal 222222222? É um número de colina plana?
frarugi87
1
222222222é um número colina, maior dígito é 2 e, portanto, pode ser repetido
u_ndefined
1
Uma string é razoável?
Sanchises
@ frarugi87 Ver comentário acima.
Dennis
É 1230321um número de colina?
hellogoodbye

Respostas:

10

Geléia , 8 bytes

_ƝṠÞ+SƊƑ

Experimente online!

Como funciona

_ƝṠÞ+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.
Dennis
fonte
6

JavaScript (ES6), 62 54 bytes

Recebe a entrada como uma sequência. Retorna um valor booleano.

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

Experimente online!

Comentado

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 bytes

0 01

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

Experimente online!

Quão?

[-9,9]

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

Exemplo:

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

Essa matriz é coagida a uma string, que fornece:

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

Aplicamos a seguinte expressão regular:

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

Por fim, também testamos se o último dígito pé igual ao primeiro dígito s[0].

Arnauld
fonte
Você pode salvar 5 bytes usando a entrada como uma matriz de dígitos.
Shaggy
@ Shaggy Eu gostaria de poder, mas isso aparentemente não é permitido .
Arnauld
Pela especificação, com ênfase original: "Entrada e saída podem estar em qualquer formato razoável " - geralmente consideramos uma matriz de dígitos um formato razoável para um número inteiro.
Shaggy
4

Pitão, 16 bytes

&SI_._MJ.+jQT!sJ

Experimente a suíte de testes .

          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
fonte
4

Gelatina , 11 bytes

DIµṠNṢƑaS¬$

Explicação:

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.

Experimente online!

lirtosiast
fonte
4

Perl 6 , 39 bytes

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

Experimente online!

Explicação

{ ... }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
fonte
Eu estava literalmente segundos longe de postar isso lol.
Jo rei
3

Python 2 , 114 112 bytes

lambda n:all((n[0]==n[-1])*sorted(set(x))==list(x)[::d]for x,d in zip(n.split(max(n)*n.count(max(n)),1),[1,-1]))

Experimente online!

TFeld
fonte
3

R , 65 bytes

Toma seqüências de caracteres. Tomou a idéia de verificar a invariância de classificação da resposta Pyth.

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

Experimente online!

J.Doe
fonte
2

05AB1E , 19 17 13 12 bytes

¥D.±Â{RQsO_*

-5 bytes através da criação de uma porta de @lirtosiast resposta Pyth 's .

Experimente online ou verifique todos os casos de teste .

Explicação:

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

Â{RQComo alternativa, pode ser (Â{Qpara a mesma contagem de bytes, onde (nega cada sinal: Experimente on-line .

Kevin Cruijssen
fonte
2

J, 23 bytes

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

Idéia roubada das respostas Jelly. Só queria ver o quão curto eu poderia fazer em J.

Experimente online!

Jonah
fonte
2

MATL , 12 bytes

dZSd1<AGds~*

Experimente online!

Explicação

Entrada é uma sequência de dígitos. A saída é um 1ou 0. O número 222222é um número de colina de acordo com este programa. Economizou 2 bytes copiando o método de Dennis para verificar a igualdade do primeiro e do último dígito.

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
fonte
1

Python 2 , 53 bytes

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

Recebe a entrada como uma sequência. A saída é via presença ou ausência de uma exceção .

Experimente online!


Python 2 , 62 bytes

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

Pega a entrada como uma string e retorna um booleano.

Experimente online!

Dennis
fonte
Uau, estou machucando minha cabeça há horas e não consegui nem pensar em algo mais curto do que a contagem combinada de bytes de suas 2 soluções! Felicidades.
etene
1

Linguagem Mathematica / Wolfram, 69 64 bytes

Função pura. Recebe a entrada como um número inteiro, retorna Trueou False.

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

Explicação:

A primeira cláusula verifica a "colina":

  • IntegerDigits: Obtém dígitos do número inteiro. Armazenar em y.
  • -Differences: Faça sucessivas diferenças e vire sinais.
  • Sign: Substitua cada entrada por +1 se positivo, 0 se zero e -1 se negativo. Armazenar em x.
  • Sort: Classifique a lista de +1, 0, -1 do menor para o maior. Compare com a lista original em x.

A segunda cláusula verifica se o primeiro e o último dígito são iguais.

Uma dica do chapéu para @IanMiller para obter dicas sobre como refinar esse código.

Michael Seifert
fonte
O fato de que IntegerDigitse Differencessão nomes de função bastante longos é um pouco irritante.
Michael Seifert
Pode salvar 5 bytes com as seguintes alterações:Sort[x=Sign@-Differences[y=IntegerDigits@#]]==x&&y[[1]]==Last@y&
Ian Miller
1

Japonês, 11 bytes

Recebe a entrada como uma matriz de dígitos.

ä-
eUñg)«Ux

Experimente ou execute todos os casos de teste

             :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
Shaggy
fonte
0

Retina 0.8.2 , 52 bytes

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

Experimente online! O link inclui casos de teste. Explicação:

.
$*1;$&$*1,

Converta cada dígito em unário duas vezes, separados por se ;terminados por ,s. No entanto, você pode pensar no resultado como o primeiro dígito, a ;, todos os pares de dígitos adjacentes, os dígitos de cada par separados por ,e os pares separados por ;s, depois outro ;, o último dígito e o final ,.

(1+),\1
,

Subtraia os pares de dígitos adjacentes. Isso deixa ;,;dígitos iguais 1es no lado maior para dígitos desiguais. (Isso pode ser feito como parte da seguinte expressão regular, mas obviamente isso não seria tão positivo.)

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

Combine o primeiro dígito, depois qualquer número de pares de dígitos ascendentes, qualquer número de pares de dígitos iguais, qualquer número de pares de dígitos descendentes e, em seguida, combine o primeiro dígito novamente no final.

Neil
fonte
0

Vermelho , 181 bytes

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

Experimente online!

Mais legível:

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)
]
Galen Ivanov
fonte
0

Powershell, 77 bytes

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

Script de teste com menos golfe:

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

Resultado:

True: True
True: True
True: True
True: True
True: True
True: False
True: False
True: False
True: False
True: False
confuso
fonte
0

C # (compilador interativo do Visual C #) , 161 bytes

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

Experimente online!

Aqui está uma visão geral de como isso funciona ...

  1. A entrada está na forma de um string
  2. Encontre o maior dígito
  3. Verifique se o primeiro e o último dígito são os mesmos
  4. Verifique se os dígitos após a última ocorrência do dígito maior estão diminuindo
  5. Verifique se os dígitos entre a primeira e a última ocorrência do maior dígito são iguais ao maior dígito
  6. Garanta que os dígitos antes que a primeira ocorrência do maior dígito esteja aumentando
dana
fonte
0

Python 3 , 114 bytes

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]

Experimente online!

Muito mais tempo do que algumas soluções Python 2, mas esta é baseada em def e eu gosto.

eteno
fonte
0

Ruby , 47 bytes

->n{(r=n.each_cons(2).map{|a,b|a<=>b})==r.sort}

Experimente online!

Entrada como matriz de dígitos, a saída é booleana.

GB
fonte