連続した数字の最長実行を見つける


15

単純な課題:一連の正の整数を与えられた場合、その数字の中で最も長い連続した数字を含む数字を見つけます。トリック?実行中の数字は、可能な値(0123456789)を折り返し、逆方向に実行できます。両方ですから234589012および5432109連続した数字(ただし、有効な実行され3456765たり321090123するが、実行は、常に同じ方向にあることが必要として、3456765二つの実験として考えることができる:34567765)。同数の場合は、最初のものを返します。

テストケース:

Input:  [3274569283, 387652323, 23987654323648, 2345687913624]
Output: 23987654323648 
        (The run is 98765432; run length: 8)

Input:  [123012363672023, 098761766325432, 15890123456765]
Output: 15890123456765
        (The run is 8901234567; run length: 10)

Input:  [43, 19, 456]
Output: 456

Input:  [5, 9, 0]
Output: 5

Input:  [71232107, 7012347]
Output: 7012347

Input:  [1234, 32109876]
Output: 32109876

Input:  [9090, 123]
Output: 123

ノート:

  • 入力には少なくとも1つの数字が含まれます。
  • 入力番号には、先行ゼロを含めることができます。
  • 入力と出力は、任意の合理的な形式することができます。したがって、入力番号は文字列、数字/文字のリストとして取得できます...
  • 出力には、数字が印刷されている限り、末尾および/または先頭の空白と改行を含めることができます。
  • これはなので、各言語の最短のプログラム/機能が勝つかもしれません!


念のため、リスト自体は折り返せませんよね?(数字の折り返しをリストの折り返しと誤解していました)ので[7,8,1,6]、最大では[7,8]なくが実行されてい[6,7,8]ますか?
ジョナサンアラン

1
@JonathanAllanはい、最大の実行は78その場合です。
チャーリー

回答:


4

ゼリー、18バイト

I9,-;N¤yŒgỊS€ṀµÐṀḢ

オンラインでお試しください!

先行ゼロを保持するために、数字のリストとして取得して返します。


私と同様の問題- サイズについてこれを試してみてください(間違った結果を返すと思います-念のためテストケースとして提案しました)。
ジョナサンアラン

@JonathanAllanそれは正しい出力だと思う?(3210最初の数字があります)
エリックアウトゴルファー

ああ、これ、ごめんなさい!
ジョナサンアラン

@JonathanAllanああ、私はあなたが何を意味するかわかります...それはおそらくAそこにあるからです。
エリックアウトゴルファー

@JonathanAllan修正済み。
エリックアウトゴルファー

3

JavaScript(ES6)、104 102 98バイト

入力を数字のリストのリストとして受け取ります。最高のものを返します。

a=>a.map(s=>s.map(n=>(i=(d=(x-(x=n)+11)%10)&&d-2?0:d-p?(p=d,1):i+1)>j&&(r=s,j=i),p=x=-10),j=-1)&&r

テストケース


3

ゼリー 18 16  15 バイト

I%⁵Œg%8ċ€1ṀµÐṀḢ

数字のリストのリストを取り、記述されているように最大の実行を含む左端のリンクを返す単項リンク。

オンラインでお試しください!またはテストスイートを見る(I / Oが問題のように見えるように処理する)を。

どうやって?

I%⁵Œg%8ċ€1ṀµÐṀḢ - Link: list of lists of integers (digits) from [0-9]
           µÐṀ  - keep elements for which the link to the left is maximal:
I               -   incremental differences (i.e. [a2-a1, a3-a2, ...])
  ⁵             -   literal 10
 %              -   modulo by (i.e. [(a2-a1)%10, (a3-a2)%10, ...])
                -     this equates deltas of -9 and -1 with 1 and 9 respectively
   Œg           -   group runs of equal elements
     %8         -   modulo by 8; vectorised (9s become 1s, others unaffected)
       ċ€1      -   count number of 1s in €ach group
          Ṁ     -   maximum
              Ḣ - head (get the first one of those that were maximal)

V€それについてはわかりませんが、先行ゼロをカウントする必要があるかもしれません。
エリックアウトゴルファー

それは...しかし、私たちは数字のリストのリストがかかる場合があります参照、刺す入力の先行ゼロをカウントしない
ジョナサン・アラン

先行ゼロをサポートすることになっていると思います。
エリックアウトゴルファー

先行ゼロをサポートしています
ジョナサンアラン

1
私はそれを「それは数えません...」と読みました
エリック・ザ・アウトゴルファー

2

Python 2、118バイト

数字のリストのリストを取得しaます。リストの1つを返します。

lambda a:max(a,key=lambda l:len(max(re.findall('1+|9*',`[(x-y)%10for x,y in zip(l,l[1:])]`[1::3]),key=len)))
import re

オンラインでお試しください!


入力に失敗します[[9,0,9,0],[1,2,3]]
-Zgarb

@Zgarbおっと、あなたは正しい。古いバージョンに戻ります。
リン

1

、20バイト

←Ö¤<(→Of€1†%8gẊo%10-

数字のリストのリストを取得して返します。 オンラインでお試しください!

説明

←Ö¤<(→Of€1†%8gẊo%10-  Implicit input.
←                     Return first element of
 Ö                    the input sorted in a stable manner
   <                  in descending order
  ¤ (                 with respect to the following function:
                       Argument is list of digits, say [5,2,1,0,9,1,0].
                   -   Differences
               o%10    mod 10
              Ẋ        of all adjacent pairs: [7,9,9,9,2,1]
             g         Group adjacent equal elements: [[7],[9,9,9],[2],[1]]
          †%8          Vectorized mod 8: [[7],[1,1,1],[2],[1]]
       f€1             Keep those runs where 1 occurs: [[1,1,1],[1]]
      O                Sort in ascending order: [[1],[1,1,1]]
     →                 Take last element (gives [] on empty list): [1,1,1]
                       This is a list of 1s with length one less than
                       the longest run of consecutive digits.

1

MATLAB、130バイト

配列への入力、列の差の配列[X(2)-X(1)、...、X(n)-X(n-1)]を取得し、配列内の最も頻繁な値を確認します(1昇順-そうでない場合は1)、最も頻繁な値または-9に最も頻繁な値を掛けたインデックス(-9は昇順、それ以外の場合は9)のインデックスを取得し、連続するインデックス(つまり、差が1に等しい)を見つけて合計します遅れてください 最大を出力します。

a=input('')
t=[]
for i=1:numel(a)
b=diff(num2str(a(i))-'0')
c=mode(b)
t=[t sum(diff(find(b==c|b==-9*c))==1)]
end
[t,I]=max(t),a(I)

オンラインでお試しください!

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