最も近い大きい数を見つける


30

タスク

整数の配列がある場合、例えば:

[-1,476,578,27,0,1,-1,1,2]

その配列のインデックス(この例では0ベースのインデックスを使用していますが、1ベースのインデックスも使用できます)。

         index = 5
                 v
[-1,476,578,27,0,1,-1,1,2]

次に、そのインデックスの要素より大きい最も近い数値を返します。この例では、1より大きい最も近い数は27です(2インデックス離れている)。

         index = 5
                 v
[-1,476,578,27,0,1,-1,1,2]
            ^
Nearest greater number

Output = 27

仮定

  • Nearestにはラッピングは含まれません。
  • プログラムに長さ1の配列が与えられることはありません(例:)[55]
  • あなたは常に与えられた要素よりも大きい数があると仮定する必要があります。
  • 等距離にある要素よりも2つの数値が大きい場合、どちらかを返すことができます

I / Oペア

Input:
Index = 45
Array = [69, 43, 89, 93, 62, 25, 4, 11, 115, 87, 174, 60, 84, 58, 28, 67, 71, 157, 47, 8, 33, 192, 187, 87, 175, 32, 135, 25, 137, 92, 183, 151, 147, 7, 133, 7, 41, 12, 96, 147, 9, 134, 197, 3, 107, 164, 90, 199, 21, 71, 77, 62, 190, 122, 33, 127, 185, 58, 92, 106, 26, 24, 56, 79, 71, 24, 24, 114, 17, 84, 121, 188, 6, 177, 114, 159, 159, 102, 50, 136, 47, 32, 1, 199, 74, 141, 125, 23, 118, 9, 12, 100, 94, 166, 12, 9, 179, 147, 149, 178, 90, 71, 141, 49, 74, 100, 199, 160, 120, 14, 195, 112, 176, 164, 68, 88, 108, 72, 124, 173, 155, 146, 193, 30, 2, 186, 102, 45, 147, 99, 178, 84, 83, 93, 153, 11, 171, 186, 157, 32, 90, 57, 181, 5, 157, 106, 20, 5, 194, 130, 100, 97, 3, 87, 116, 57, 125, 157, 190, 83, 148, 90, 44, 156, 167, 131, 100, 58, 139, 183, 53, 91, 151, 65, 121, 61, 40, 80, 40, 68, 73, 20, 135, 197, 124, 190, 108, 66, 21, 27, 147, 118, 192, 29, 193, 27, 155, 93, 33, 129]
Output = 199

Input:
Index = 2
Array = [4,-2,1,-3,5]
Output = 4 OR 5

Input:
Index = 0
Array = [2124, -173, -155, 146, 193, -30, 2, 186, 102, 4545]
Output = 4545

Input:
Index = 0
Array = [1,0,2,3]
Output = 2

Input:
Index = 2
Array = [3,-1,-3,-2,5]
Output = -1 OR -2

結果を右ではなく左に検索するテストケースを追加できますか?すなわち1; [7,1,-4,2]
ケビンCruijssen

2; [3,-1,-3,-2,5]いいテストケースだと思います。正の数がありますが、結果は負です。
スチューウィーグリフィン

2インデックス付きを使用できますか?
タイタス

@タイタス私は本当にあなたがしたい場合
Graviton

回答:


7

MATL、10バイト

yt&y)>fYk)

これは、1ベースのインデックスを使用します。オンラインでお試しください!

説明

入力を考えてみましょう[4,-2,1,-3,5]3一例として。

y     % Take two inputs implicitly. Duplicate 2nd-top element in the stack
      % STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5]
t     % Duplicate top of the stack
      % STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5], [4,-2,1,-3,5]
&y    % Duplicate 3rd-top element in the stack
      % STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5], [4,-2,1,-3,5], 3
)     % Index: select elements from first input as indicated by second input
      % STACK: [4,-2,1,-3,5], 3, [4,-2,1,-3,5], 1
>     % Greater than, element-wise
      % STACK: [4,-2,1,-3,5], 3, [1,0,0,0,1]
f     % Find: gives indices of non-zero entries
      % STACK: [4,-2,1,-3,5], 3, [1,5]
Yk    % Closest element: gives closest element of each entry in second input
      % ([1,5]) to each entry in the first input (3). In case of a tie it 
      % gives the left-most one
      % STACK: [4,-2,1,-3,5], 1
)     % Index: select elements from first input as indicated by second input
      % STACK: 4
      % Implicitly display

2
説明がありますか?
ニッククリフォード

@NickClifford確かに!OPの説明を待っていました。説明を追加
ルイスメンドー


5

ゼリー11 12 バイト

+1バイト-ラッピングは許可されていません。

Jạż⁸ṢZṪ»\Q2ị

1インデックス。

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


前の11バイト(ラッピングインデックス)、0インデックス:

ṙżU$Fµ>ḢTḢị

たとえば、これは失敗し0 [1,0,2,3]ます。
Ørjanヨハンセン

ØrjanJohansenああ@ -それは返し3、...、離れそうええと、ええ「最も近い」定義されていない1である
ジョナサン・アラン

1
OPにそのテストケースを追加するよう依頼しました。
Ørjanヨハンセン

4

JavaScript(ES6)、57 55バイト

カリー化構文の配列aとインデックスiを取得します(a)(i)

a=>g=(i,p)=>(x=a[i-p])>a[i]||(x=a[i+p])>a[i]?x:g(i,-~p)

テストケース


|代わりに使用できません||か?
ニール

@Neilいいえ、x最初の条件が満たされたときに上書きされたくありません。
アーナルド


3

Haskell、48バイト

i%l=minimum[[j*j,x]|(j,x)<-zip[-i..]l,x>l!!i]!!1

オンラインでお試しください!ØrjanJohansenのテストフレームワーク。


リストを使用して!!1代わりに(ヘッダーでに変更Integerするだけで)バイトを保存できますInt
Ørjanヨハンセン

@ØrjanJohansenありがたいことに、私はそれを試してみましたが、なぜ型について不平を言っているのかわかりませんでした。
xnor

2

x86-64アセンブリ、40バイト

Johan du Toit2501のCソリューションの分析から着想を得て、x86-64プラットフォーム用のMASMで組み立てることができる機能は次のとおりです。

パラメーターを渡すためのMicrosoft x64呼び出し規約に従っているため、配列の全長が渡されECX、対象の位置が渡されますEDX、整数配列へのポインターが渡されますR8(64ビットプラットフォームなので、 64ビットポインター)。

結果(「最も近い最大数」)を返しますEAX

             FindNearestGreater PROC      
8B F2       \    mov     esi, edx     ; move pos parameter to preferred register
8B D9       |    mov     ebx, ecx     ; make copy of count (ecx == i; ebx == count)
            | MainLoop:
8B C6       |    mov     eax, esi     ; temp  = pos
2B C1       |    sub     eax, ecx     ; temp -= i
99          |    cdq
33 C2       |    xor     eax, edx
2B C2       |    sub     eax, edx     ; temp = AbsValue(temp)
            | 
41 8B 14 B0 |    mov     edx, DWORD PTR [r8+rsi*4]
41 39 14 88 |    cmp     DWORD PTR [r8+rcx*4], edx
7E 04       |    jle     KeepGoing    ; jump if (pValues[i] <= pValues[pos])
3B D8       |    cmp     ebx, eax
77 02       |    ja      Next         ; jump if (count > temp)
            | KeepGoing:
8B C3       |     mov     eax, ebx    ; temp = count
            | Next:
8B D8       |     mov     ebx, eax    ; count = temp
E2 E3       |     loop    MainLoop    ; equivalent to dec ecx + jnz, but smaller (and slower)
            | 
            |     ; Return pValues[temp + pos]
03 C6       |     add     eax, esi
41 8B 04 80 |     mov     eax, DWORD PTR [r8+rax*4]
C3          /     ret
             FindNearestGreater ENDP

Cコードから呼び出す場合、プロトタイプは次のようになります。

extern int FindNearestGreater(unsigned int count,
                              unsigned int pos,
                              const    int *pValues);



1

Haskell、53バ​​イト

(#)IntIntsまたはIntegers(実際には任意のOrd型)のリストを取り、リストの要素を返します。

n#l=[x|i<-[1..],x:_<-(`drop`l)<$>[n-i,n+i],x>l!!n]!!0

使い方

  • nは、指定されたインデックスでlあり、指定されたリスト/「配列」です。
  • i、1から上向きの値をとって、n現在テスト中の距離です。
  • それぞれについてi、インデックスn-in+i
  • xlテスト対象の要素です。テストに合格すると、結果のリスト内包の要素になります。
    • で任意のインデックスにインデックスを!!付けると、範囲外エラーが発生する可能性がありますが、drop代わりにリスト全体または空のリストのいずれかを返します。パターンマッチはx:_、結果が空でないことを確認します。
    • x>l!!n要素がインデックスにある要素n(存在が保証されている)よりも大きいことをテストします。
    • !!0 最後に、リスト内包表記の最初の一致/要素を返します。

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



1

Brachylog、17バイト

hH&∋₎<.&t:I≜+:H∋₍

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

説明

hH                      Call the list H
  &∋₎<.                 Output is greater than the number at the specified index
       &t:I≜            Label I (0, then 1, then -1, then 2, then -2, …)
            +           Sum I with the input Index
             :H∋₍       Output is the element of H at index <the sum>

1

Java(OpenJDK 8)、98バイト

int f(int n,int[]a){for(int s=1,i=1,x=a[n];;n+=i++*s,s=-s)if(0<=n&n<a.length&&a[n]>x)return a[n];}

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

次の合計の部分合計で指定された順序でインデックスをチェックします。

initial value + 1 - 2 + 3 - 4 + 5 - 6 + ...

私は、質問を読み、答えを書き始めるたかった...ところで、なぜされたs=1,,s=-s、それはあなたの答えには使用していません..あなたが古いアプローチからそれを削除するのを忘れましたか?
ケビンCruijssen

1
@KevinCruijssenそれは間違いであり、私は今それを修正しています。これらのすべてのテストケースでは、最も近い数値が右側にあるため、テストケースに合格しました。
リーキー修道女

1

C、69バイト

t;b;f(*d,c,p){for(b=c;c--;)d[c]>d[p]&(t=abs(p-c))<b?b=t:0;*d=d[p+b];}

最初の引数はin / out引数です。出力は最初の要素に保存されます。

オンラインでご覧ください。







0

Java、96バイト

int f(int n,int[]a){for(int s=1,i=1,x=a[n];0>(n+=i++*s)|n>=a.length||a[n]<=x;s=-s);return a[n];}

識別子には@Leaky Nunの答えのような名前が付けられます。さらに、ほとんどの部分は基本的に同じになるように調整されています。これに対して、-conditionにif置き換えられていforます(追加のセミコロンを犠牲にします)。コロンは、increment-partを条件に移動することによって削除されました(したがって、前のif文の括弧は実質的に「移動」しました)-&を|に変更します。文字数に影響はありませんでした。


0

Clojure、95バイト

#(%(nth(nth(sort-by first(for[i(range(count %)):when(>(% i)(% %2))][(Math/abs(- i %2))i]))0)1))

これは私が思いつくことができる最短です:(私もこれで遊んでみましたが、フィニッシュラインにそれをもたらすことができませんでした:

#(map(fn[f c](f c))[reverse rest](split-at %2 %))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.