リストの詳細検索


19

このチャレンジでは、リストが完全に整数と有効なリスト(再帰的定義\ o /)で構成されている場合にのみ、リストは有効と見なされます。このチャレンジでは、有効なリストと整数を指定して、整数が見つかるすべての深さのリストを返します。

list [1, [2, [3, [1, 2, 3], 4], 1], 1]とintegerを考えてみましょう1。次に、次のようにリストを引き出します。

Depth 0 1 2 3
Num   1
        2
          3
            1
            2
            3
          4
        1
      1

あなたはそれ1が深さで現れることに気付くでしょう0, 1, 3。したがって、出力は0, 1, 3適切な形式にする必要があります(順序は関係ありません)。

深さは0インデックスまたは1インデックスのどちらでもかまいませんが、提出の際にどちらを指定するかを指定してください。

テストケース(0インデックス付き)

リストの場合[1,[2,[3,4],5,[6,7],1],[[[[5,2],4,[5,2]]],6],3]

1 -> [0, 1]
2 -> [1, 4]
3 -> [0, 2]
4 -> [2, 3]
5 -> [1, 4]
6 -> [1, 2]
7 -> [2]

リストの場合[[[[[1],0],1],0],1]

0 -> 1, 3
1 -> 0, 2, 4

リストの場合[11,22,[33,44]]

11 -> [0]
22 -> [0]
33 -> [1]
44 -> [1]

検索語がリスト内のどこにも存在しない場合、空のリストを返します。

負の値とゼロの値は、入力リストと用語で有効です。


整数が1つの深さに複数回現れる場合、その深さの数値を一度だけ返す必要がありますか?
ジュゼッペ

@ジュゼッペはい、それは正しいです。
ハイパーニュートリノ

1
@Adámまあ、私のテストケースの1つにゼロがあることを考えると、いいえ。また、負の整数は公平なゲームであると付け加えます。
ハイパーニュートリノ

1
複数桁の数字も発生する場合は、テストケースに追加する必要があります。
Zgarb

1
@KevinCruijssenはい、はい、いいえ、そしてはい。したがって、両方の入力を文字列として受け取ることができ、任意の順序で深さを表示できますが、複数回はできません。
ハイパーニュートリノ

回答:


7

Mathematica、25バイト

Tr/@Union[1^Position@##]&

(1インデックスの出力を返します)

説明

                         test  {1, {2, {3, {1, 2, 3}, 4}, 1}, 1}
             Position[test,1]  {{1}, {2, 2, 2, 1}, {2, 3}, {3}}
           1^Position[test,1]  {{1}, {1, 1, 1, 1}, {1, 1}, {1}}
    Union[1^Position[test,1]]  {{1}, {1, 1}, {1, 1, 1, 1}}
Tr/@Union[1^Position[test,1]]  {1, 2, 4}

7

Haskell102 93 80 76バイト

いくつかのバイトを保存してくれたBruce Forteと、さらに保存してくれたLaikoniに感謝します。

4バイトを保存してくれた4castleに感謝します。

Haskellにはこの種のリストのデータ型がないため、独自に作成しました。

このソリューションは 1-indexed

import Data.List
data T=E Int|L[T]
E n%x=[0|x==n]
L s%x=nub$map(+1).(%x)=<<s

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

最初に(再帰的に)データ型を定義します T

TタイプE Int(タイプの単一要素Int)またはL[L](タイプのリスト)のいずれかを持ちますT

(%)2typeの引数をとる関数で、T検索対象のリストとx、検索対象のリストIntです。

(%)単一の要素E nであるものを見つけるたびに、True とn等しいかどうかをチェックしx、戻ります0

場合(%)に適用されるL s(ここで、sタイプが持って[T])それが実行され(%)、すべての要素にs(我々は内部を見ているので、深さが増加しているようにインクリメント結果s)、その結果を連結します。

nub 次に、リストから重複を削除します

NB。import Data.Listはのみですnub


81バイトの非常に似たソリューションを思い付きました。オンラインで試してみてください。
ライコニ

@Laikoniとてもいいですね、自分で投稿したいですか、それとも更新することを提案しますか?
H.PWiz

回答を自由に更新してください。:)
ライコニ

NBに関して:インポートを削除しようとしましたが、88バイトで終わりました:オンラインで試してみてください!
ライコニ

2
E nおよびの周りの括弧を削除できL sます。
4castle



4

ゼリー11 8バイト

WẎÐĿċ€IT

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

使い方

WẎÐĿċ€IT  Main link. Left argument: A (array). Right argument: n (integer)

W         Wrap; yield [A].
  ÐĿ      Repeatedly apply the link to the left until the results are no longer
          unique. Yield the array of all unique results.
 Ẏ          Concatenate all elements at depth 1 in the array.
          The last array of the array of results is completely flat.
    ċ€    Count the occurrences of n in each intermediate result.
      I   Compute all forward differences.
       T  Truth; yield the array of all indices of non-zero differences.

実行例

左引数用

[1, [2, [3, [1, 2, 3], 4], 1], 1]

W 最初に次の配列が生成されます。

[[1, [2, [3, [1, 2, 3], 4], 1], 1]]

ẎÐĿ繰り返しの深さでのすべての要素連結する1によってアレイの深さを減少させる、1ステップごとに。これにより、次の一連の中間結果が生成されます。

[
 [[1, [2, [3, [1, 2, 3], 4], 1], 1]],
 [ 1, [2, [3, [1, 2, 3], 4], 1], 1 ],
 [ 1,  2, [3, [1, 2, 3], 4], 1,  1 ],
 [ 1,  2,  3, [1, 2, 3], 4,  1, 1  ],
 [ 1,  2,  3,  1, 2, 3,  4,  1, 1  ]
]

右引数1の場合、各中間結果の1ċ€の出現をカウントします。

[0, 2, 3, 3, 4]

I 現在、すべての前方差分を取ります。

[2, 1, 0, 1]

ゼロ以外の差異は、深さ1に少なくとも1つの他の1が追加されたステップに対応します。したがって、インデックスkでの非ゼロの差は、深さkでの1の存在を示します。すべての真理値要素のインデックスを検索し、目的の結果を生成します。T

[1, 2, 4]

\ o /これは、JellyとPythonを比較するときの正確な解決策でした。わーい!:P
ハイパーニュートリノ

4

R101 95 92100バイト

f=function(L,n,d=0)unique(unlist(Map(function(x)if(n%in%unlist(x))"if"(is.list(x),f(x,n,d+1),d),L)))

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

再帰的ソリューション; バイトでは非常に非効率的ですが、Rを使用するのlistsは非常に面倒です。

基本的に、とりL、各要素のためxL、(Aいずれかであるlistか、atomic一つの要素のベクトル)は、か否かをチェックnされ%in% x、次にか否かをチェックxですlist。そうでない場合はx==n、深度を返しdます。そうでない場合は、我々は、再帰的に呼び出すfxインクリメントd

これは、もちろん、返しlistた我々 、unlist及びunique(整数深さのベクトルを返す)右出力を確保します。NULLinvalidに対して(空のリスト)を返しますn

どうやら、私が思っ%in%listように再帰的に検索しないのでunlist(x)、+ 8バイト必要です:(


3

APL(Dyalog)、39バイト*

完全なプログラム。リストを要求し、次に番号を要求します。1から始まるリストをSTDOUTに出力します。

2÷⍨⍸∨⌿⍞⍷⎕FMTJSON'Compact'0⊢⎕

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

 リストのプロンプト

 収率は、(分離し0そして

⎕JSON⍠'Compact'0 改行でインデントされたJSON文字列に変換します

⎕FMT マトリックスに変換(行ごとに改行で区切られた1行)

⍞⍷ 文字列として数値を入力し、その開始位置を示します

∨⌿ 垂直OR縮小(つまり、どの列で始まるか)

 それらの始まりのインデックス

2÷⍨ 半分に(レベルは2つのスペースでインデントされます)

 切り捨て(最初のデータ列は列3であるため)


* Dyalog Classicでは⎕U2378としてカウントし⎕OPTます。



2

JavaScript(ES6)、79 68バイト

f=(a,n,r=new Set,d=0)=>a.map(e=>e.map?f(e,n,r,d+1):e-n||r.add(d))&&r

Setを返します。これが受け入れられない場合は&&[...r]、5バイトのコストで使用してください。


1

ゼリー 17  16 バイト

⁴e®;©ȧ⁸ḟ⁴ẎµÐĿȧ®T’

リストとチェックする要素の2つのコマンドライン引数を取り、要素が存在する深さ(ある場合)を出力する完全なプログラム。結果は1から始まります。

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

どうやって?

⁴e®;©ȧḟ⁴ẎµÐĿȧ®T’ - Main link: list, L
          µÐĿ    - loop, collecting updated values of L, until a fixed point is reached:
⁴                -   4th argument (2nd program input) = the number
 e               -   exists in (the current version of) L?
  ®              -   recall value from the register (initially 0)
   ;             -   concatenate the two
    ©            -   (copy this result to the register)
       ⁴         -   4th argument (2nd program input) again
      ḟ          -   filter out (discard any instances of the number)
     ȧ           -   logical and (non-vectorising)
        Ẏ        -   tighten (flatten the filtered L by one level to create the next L)
             ®   - recall value from the register
            ȧ    - logical and (non-vectorising)
              T  - truthy indexes (1-indexed)
               ’ - decrement (account for the leading zero from the initial register)

いいね!面白い事実:非常に似たアプローチを使用することにより、物事の順序を少し変更することで、8バイトを取得できます。編集のアプローチは実際には少し異なります、nvm
HyperNeutrino

これはまったく機能しません:tio.run
##y0rNyan8//9R45ZU60MrD607sfxR446HO@YDBR7u6ju09fCEI

書き込み中にバグが見つかりました...今のところ削除しています。
ジョナサンアラン

ああ、私は何らかの形で私の連結の順序を変更していました:/今作業する必要があります
ジョナサンアラン

1

JavaScript(ES6)、73 74バイト

f=(a,n,i=0,o={})=>a.map(e=>e.pop?f(e,n,i+1,o):e-n||o[i]++)&&Object.keys(o)

説明:

f=(a,                             //input array
   n,                             //input number to search
   i=0,                           //start at first level
   o={}                           //object to store the finds
  )=>
    a.map(                        //loop through the array
      e => e.pop ?                //is this element an array?
             f(e, n, i+1, o) :    //if so, recurse on it to the next level
             e-n || o[i]++        //otherwise, update o if element equals the number
    ) &&
    Object.keys(o)                //return o's keys

テストケース


[まだ]テストケースはありませんが、質問を読んだところ、e[0]ゼロであることが有効であり、テストが失敗することが示唆されています。
ニール

@ニール、素晴らしい点。e.pop1バイトの損失に変更されました。
リックヒッチコック

1

Pythonの3123の 86 82バイト

def f(a,n,l=[],d=0):
 for e in a:l+=[d]*(e==n);0*e==[]and f(e,n,l,d+1)
 return{*l}

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

Hyper Neutrinoとovsのおかげで-37バイト

ジョナサンフレッシュのおかげで-4バイト


試しif type(a[i])!=intに-1バイト
HyperNeutrino

l+=[d]-5バイトで試す
HyperNeutrino

l+=[d]*(a[i]==n)-whatever_number_of_bytes_it_isをお試しください
HyperNeutrino

1
[]==a[i]*0短いタイプのチェックのために
OVS

反復してみa代わりに範囲のと使用してgetitem〜20バイト-のためにそんなに
HyperNeutrino


0

オクターブ126 122バイト

function n=r(p,t,l)n=[];if nargin<3
l=0;end
for x=p
if iscell(q=x{1})a=r(q,t,l+1);else
a=l*find(q==t);end
n=union(n,a);end

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

読みやすくするために;、可能な場合はスペースまたは'を行末に置き換えました。改変されていないコードの説明:

function n=r(p,t,l) % Declare function with list p, integer t and optional recursion depth l
n=[];
if nargin<3
    l=0;            % If l is not given (first iteration), set l to zero (or one for 1-indexing)
end
for x=p             % Loop over list
if iscell(q=x{1})   % If loop variable x is a cell, we must go down one level.
     a=r(q,t,l+1);  % So recurse to l+1.
else
    a=l*find(q==t); % Empty if q~=t (because find(false)==[], and l*[]==[]), else equal to l*1==l.
end
n=union(n,a);       % Append to list of levels, make sure we only get distinct values.
end

0

Java、154 + 19 = 173バイト

import java.util.*;

Set<Long>f(List l,long n){Set s=new HashSet();if(l.contains(n))s.add(0l);for(Object o:l)if(o instanceof List)for(long d:f((List)o,n))s.add(d+1);return s;}

オンラインで試す

非ゴルフ法

Set<Long> f(List l, long n) {
    Set s = new HashSet();
    if (l.contains(n))
        s.add(0l);
    for (Object o : l)
        if (o instanceof List)
            for (long d : f((List) o, n))
                s.add(d + 1);
    return s;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.