この番号は丘の番号ですか?


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

チャレンジ

正の整数を指定して、完全なプログラムまたは丘の数については真理を返すが、他の値については偽を返す関数を作成します。

ノート:

  • 入出力は妥当などんな形式可能です
  • これはので、各言語で最短の回答が得られます!

テストケース

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
文字列は妥当ですか?
Sanchises

@ 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私はできたらいいのに、これは明らかに許可されていません
アーナルド

仕様から、元々の強調:「入力と出力は任意の妥当な形式することができます」-通常、数字配列は整数の妥当な形式と見なされます。
シャギー

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

05AB1E19 17 13 12 バイト

¥D.±Â{RQsO_*

@lirtosiastのPyth回答のポートを作成して、-5バイト。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

¥           # 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このプログラムによると、数字は丘の数字です。最初と最後の数字が等しいかどうかをチェックするDennisの方法をコピーして、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

Mathematica / Wolfram言語、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

2番目の句は、最初と最後の数字が等しいかどうかをチェックします。

このコードを改良するためのヒントについては、@ IanMillerへの帽子のヒント。


IntegerDigitsand Differencesはかなり長い関数名であるという事実は少し面倒です。
マイケルサイフェルト

:次のように変更して5つのバイトを保存することができますSort[x=Sign@-Differences[y=IntegerDigits@#]]==x&&y[[1]]==Last@y&
イアン・ミラー


0

Retina 0.8.2、52バイト

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

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

.
$*1;$&$*1,

各桁を単項式に2回変換し、;s で区切り、sで終了し,ます。ただし、結果は最初の数字a ;、次に隣接する数字のすべてのペア、各ペアの数字、,および;sで区切られたペア、次にanother ;、最後の数字、そしてfinal と考えることができます,

(1+),\1
,

隣接する数字のペアを減算します。これにより;,;、数字が等しくなり、数字1が等しくない場合は大きい方が残ります。(これは、次の正規表現の一部として実行できますが、明らかにそれほどゴルフではありません。)

^(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ソリューションよりもはるかに長いですが、これはdefベースであり、私はそれが気に入っています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.