10進数の干し草の山でバイナリ針を見つける


41

挑戦

あなたが与えられている:

  • 正の整数の空ではない、ソートされていないリストh(haystack)
  • 正の整数n(針)

あなたの仕事は、バイナリ表現がnのバイナリ表現を含むhの順列のすべての一意の 10進連結のリストを返すことです。

  1. h = [1、2、3]
    n = 65

    例

    一致する連結は1つしかないため、予想される出力は[321]です。

  2. h = [1、2、3]
    n = 7

    今回は、バイナリパターン111を含む3つの連結があります。予想される出力は[123, 231, 312]です。

  3. h = [12、3]
    n = 7

    2つの順列のみが使用可能で、両方が一致しています。予想される出力は[123, 312]です。

  4. h = [1、2、2]
    n = 15

    唯一のマッチング連結である1221111010含むバイナリで1111予想出力されるように、) [122]。2つの順列は実際には122になりますが、出力することはできません[122, 122]

明確化と規則

  • 針は、整数(65)、10進数値を表す文字列()、"65"または2進値を表す文字列("1000001")として使用できます。
  • haystackは、ネイティブ配列/オブジェクト/整数のセット([11,12,13])、ネイティブ配列/オブジェクト/ 10進値を表す文字列のセット(["11","12","13"])、または10進値の区切り文字列("11 12 13"または"11,12,13")として取得できます。数字の配列(など[[1,1],[1,2],[1,3]])を使用してバリアントを選択することもできます。
  • 出力は、上記のhaystackの形式のいずれかに従う必要がありますが、必ずしも同じ形式である必要はありません。
  • 最高の10進連結が、言語で表現可能な最高の符号なし整数より大きいhaystacksを処理することは想定されていません。
  • それとは別に、十分な時間とメモリが与えられていると仮定すると、コードは理論的にはすべての入力をサポートする必要があります。
  • これはスパルタです! なので、バイト単位の最短回答が勝ちます!

テストケース

Haystack             | Needle   | Output
---------------------+----------+-----------------------------------
[ 1, 2, 3 ]          | 65       | [ 321 ]
[ 1, 2, 3 ]          | 7        | [ 123, 231, 312 ]
[ 12, 3 ]            | 7        | [ 123, 312 ]
[ 1, 2, 2 ]          | 15       | [ 122 ]
[ 1, 2 ]             | 7        | []
[ 12, 34, 56 ]       | 21       | [ 125634, 341256, 345612, 563412 ]
[ 1, 2, 3, 4, 5 ]    | 511      | [ 53241 ]
[ 1, 3, 5, 7, 9 ]    | 593      | [ 37519, 51793, 75913, 75931 ]
[ 11, 12, 13, 14 ]   | 12141311 | [ 12141311 ]
[ 1, 2, 1, 2, 1, 2 ] | 1015     | [ 221112 ]

1
私のソリューションの出力はのようなものset([(1, 2, 2)])です。それが有効であるか、私は取り除く必要がありますか set
デッドポッサム

@DeadPossumはい、有効です。
アーナルド

haystack入力は単一の文字列( "123")にできますか?一部の言語では、文字列は文字の配列と同じであるため、理にかなっていると思います
ルイスメンドー

@LuisMendo 2つの異なる干し草の山であるため["12","3"]、できません["1","23"]
アーナウルド

@Arnauldああ、数字だと思った。ありがとう
ルイスメンドー

回答:


17

05AB1E10 8バイト

バイナリで針を取り、1バイトを節約します。

Emignaのおかげで-2バイト

œJÙʒbŒIå

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

œJÙʒbŒIå   Arguments: a, n
œJÙ        Get all unique permutations of a
   ʒ       Filter: Keep if following code returns true
    b      Convert to binary
     Œ     Get all substrings
      Iå   Check if substrings contain n
           Implicit output of filtered list


@Emignaおかげで、2バイト節約できます:)
kalsowerus

11

Python 2、90バイト

@GáborFeketeのおかげで-3バイト

オンラインで試す

入力文字列の配列として、干し草と文字列のintを表し、バイナリで針を表す

from itertools import*
lambda H,N:{i for i in permutations(H)if N in bin(int(''.join(i)))}

4
{...}代わりに書き込むと、set(...)3バイト節約されます。
ガボールフェケテ

1
@GáborFekete私はいつも{}が設定されていることを忘れています。Dありがとう
デッドポッサム

これは失敗すると思うH=['1'], N='0'
user2357112

ああ、ちょっと待って、入力は正である必要があります。
user2357112

10

Java 10、320 312 305 297 292バイト

import java.util.*;Set s=new HashSet();l->n->{Long q=0;p(l,0);for(var x:s)if(q.toString(q.decode(x+""),2).contains(n))System.out.println(x);}void p(List l,int k){int i=k,x=l.size();for(Collections C=null;i<x;p(l,k+1),C.swap(l,k,i++))C.swap(l,i,k);if(k>x-2)s.add((l+"").replaceAll("\\D",""));}

リストとバイナリ文字列として入力し、改行文字列として出力します。

説明:

ここで試してみてください。

import java.util.*;           // Required import for Set, HashSet, List, and Collections

Set s=new HashSet();          // Class-level Set

l->n->{                       // Method (1) with List and String parameters and no return-type
  Long q=0;                   //  Number-object is required for two static method-calls below
  p(l,0);                     //  Determine all permutations of given list and put it in the Set
  for(var x:s)                //  Loop over these permutations
    if(q.toString(q.decode(x+""),2)
                              //   If the binary String of the current permutation
        .contains(n))         //   contains the binary String of the input integer
      System.out.println(x);} //    Print this permutation

void p(List l,int k){         // Method (2) with List and integer parameters and no return-type
  int i=k,x=l.size();         //  Two temp integers
  for(Collections C;          //  Collections-object is required for two static method-calls below
      i<x                     //  Loop `i` in the range [`k`, list-size)
      ;                       //    After every iteration:
       p(l,k+1),              //     Do a recursive-call to this method with `k+1`
       Collections.swap(l,k,i++))
                              //     And swap the items at indices `k` and `i` back
    Collections.swap(l,i,k);  //   Swap the items at indices `i` and `k`
  if(k>x-2)                   //  If `k` is now equal to the size of the list - 1
    s.add((l+"").replaceAll("\\D",""));}
                              //   Add this permutation to the Set

個人的に私はラムダがプロンプトに対する答えであり、機能がラムダが機能するためにセットアップが必要であるため、l->n->{...後に置きましたvoid p(...。「関数式」に関するコンセンサスは、「あなたの提出の最後の「式」は、変数に保存されたときに関数回答の要件を満たせば「関数式」になります」というようなものです。しかし、それは単なるフォーマットの問題であり、主観的な問題です。
CAD97

@ CAD97順序が重要であるとは思いもしませんでした。前回voidは、2番目のラムダとその倍数よりも短いため、使用した2つの方法でJava 8の回答を投稿しました.apply。この回答を確認していません(つまりvoid p(List l,int k)&2x p(l,0)(l,k)->&2x p.apply(l,0))。うーん、この場合、2番目は1バイト短くなっているようです。しかし、ルールでは、ラムダメソッドを1つだけ持つことができると述べていますか?なぜ最後のものでなければならないのか、まだ少し混乱しています。個人的には、常に次の順序で回答を投稿しますimports; class-fields; main-method/lambda; other methods
ケビンCruijssen

繰り返しになりますが、それは主に意見であり、実際に何らかの方法で発言する前に、より経験豊富な誰かがチャイムを鳴らして欲しいと思います。しかし、私はこれが真実であることを知っています:メソッドを呼び出す必要がある場合(たとえば、再帰的またはヘルパーとして)、名前が必要です。ただし、順序については、バイトカウントを変更しないため、実際には問題になりません。しかし、私のためとしてimports;helper methods;lambda
CAD97

@ CAD97ああ、もちろんvoid p(List l,int k)&2x f(l,0);vs f=(l,p)->&2xになりp.apply(l,0);ます(つまり、現在のバージョンは1バイト短くなります)。順序については、すべての回答を行ったのでこれに固執します。また、説明のメインメソッドから始めて、ヘルパーメソッドの場合は個人的にも理にかなっていますあります。
ケビンCruijssen

残念ながらf=(lambda)、Javaでできることはありません。それはjava.util.function.BiConsumer<List,Integer>f=(l,p)->{...}
97年

9

Japt15 14 13 12 10バイト

haystackを整数の配列として、針をバイナリ文字列として受け取ります。整数文字列の配列を出力します。

á m¬f_°¤øV

それを試してみてください


説明

á m¬â f_°¤øV
              :Implicit input of array U=haystack and string V=needle
á             :Unique permutations of U
  m           :Map
   ¬          :  Join to a string
    f_        :Filter
      °       :  Postfix increment current element to cast it to an integer
       ¤      :  Convert to base-2 string
        øV    :  Does that contain V?
              :Implicit output of resulting array

とてもいい、私がやったことについて。®¬nÃマッピングにバイトを保存します。(またâ、2番目を取り除くためにプログラムの中央に移動しÃます。バイトを節約しませんが、少し効率的で、少し良く見えます)
ETHproductions

ああ、@ ETHproductionsに感謝します-私は各番号を配列として出力することでバイトを削ることができるかどうかを確認することに集中しました。âあなたは、より効率的であるフィルタを実行する前に、重複を削除、正しい、アルノーは、私が最終的配列から重複を削除し忘れていことを指摘したときに最後にタッククイックフィックスだったけど。
シャギー


3

JavaScript(ES6)、140バイト

needleをバイナリ文字列として受け取ります。

(h,n,S=new Set,p=(a,m='')=>a.length?a.map((_,i)=>p(A=[...a],m+A.splice(i,1))):S.add(+m),_=p(h))=>[...S].filter(d=>~d.toString(2).indexOf(n))


3

Brachylog、15バイト

{hpc.ḃs~ḃ~t?∧}ᵘ

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

説明

{            }ᵘ    Find all unique outputs, given [h, n], of:
 hpc.                The Output is the concatenation of a permutation of h
    .ḃs              Take a substring of the binary representation of the Output
       ~ḃ            Convert it back to a decimal number
         ~t?∧        This decimal number must me n

2

Mathematica、170 156バイト

(t={};l=Length;v=IntegerDigits;j=v[#2, 2];s=FromDigits/@Flatten/@v@Permutations@#1;Table[If[l@SequenceCases[v[s[[i]],2],j]>0,t~AppendTo~s[[i]]],{i,l@s}];t)&


入力

[{12、34、56}、21]

出力

{125634、341256、345612、563412}


に空白がありv[#2, 2]ます。
イッツィー

1

CJam、23 22 21 19バイト

{e!{si2b1$2b#)},\;}

これはn h、スタック上の入力を受け取り、スタック上の配列として出力を残すブロックです。

説明:

                   e# Stack:                      | 65 [1 2 3]
e!                 e# Unique Permutations:        | 65 [[1 2 3] [1 3 2] [2 1 3] [2 3 1] [3 1 2] [3 2 1]]
  {                e# Filter where block is true: | 65 [3 2 1]
   s               e#   Convert to string:        | 65 "321"
    i              e#   Convert to int:           | 65 321
     2b            e#   Convert to binary:        | 65 [1 0 1 0 0 0 0 0 1]
       1$          e#   Copy behind:              | 65 [1 0 1 0 0 0 0 0 1] 65
         2b        e#   Convert to binary:        | 65 [1 0 1 0 0 0 0 0 1] [1 0 0 0 0 0 1]
           #       e#   Find array in another:    | 65 2
            )      e#   Increment:                | 65 3
             },    e# End filter                  | 65 [321]
               \;  e# Delete back:                | [321]

1

R、114バイト

pryr::f(plyr::l_ply(combinat::permn(x),function(y)if(grepl(p,R.utils::intToBin(paste(y,collapse=""))))cat(y,"\n")))

多数のパッケージを使用します。pryr::f()は、p検索するバイナリパターンの文字列と、x入力として他の入力を持つベクトルを使用して、関数を自動的に作成します。combinat::permnのすべての順列を作成しますxR.utils::intToBin数値(または数値の文字表現)を2進数に変換するための素敵で冗長なバージョンで、既に文字として便利に保存されています。したがって、これをすべての順列に適用し、バイナリ文字列pがバイナリバージョンの連結に含まれている場合は出力します。そうでない場合、出力はになるため、明示的な改行が印刷されます12 56 3456 34 1234 56 1234 12 56

plyrさんは、l_ply定期的な出力のほかに、ヌルリストを出力surpressに使用されています。このような出力が許可されている場合:

3 2 1 
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL

[[6]]
NULL

次に、lapply代わりに次を使用して数バイトを節約できます。

108バイト:

pryr::f(lapply(combinat::permn(x),function(y)if(grepl(p,R.utils::intToBin(paste(y,collapse=""))))cat(y,"\n")))

このような出力が許可されている場合:

[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
[1] 3 2 1

[[5]]
NULL

[[6]]
NULL

それからもっと短くすることができます:

101バイト:

pryr::f(lapply(combinat::permn(x),function(y)if(grepl(p,R.utils::intToBin(paste0(y,collapse=""))))y))

禁じられている。


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