십진 건초 더미에서 이진 바늘 찾기


41

도전

당신은 주어진 :

  • 비어 있지 않은 분류되지 않은 양의 정수 h 목록 (건초 더미)
  • 양의 정수 n (바늘)

이진 표현에 이진 표현 n이 포함 된 h 의 순열에 대한 모든 고유 한 10 진수 연결 목록을 반환해야합니다 .

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

    예

    일치하는 연결이 하나뿐이므로 예상 출력은 [321]입니다.

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

    이번에는 이진 패턴 ( 111) 을 포함하는 3 개의 연결이있다 . 예상 출력은 [123, 231, 312]입니다.

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

    두 개의 순열 만 사용할 수 있으며 둘 다 일치합니다. 예상 출력은 [123, 312]입니다.

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

    일치하는 유일한 연결은 122 ( 2 진의 1111010 , 1111 포함 )이므로 예상 출력은 [122]입니다. 두 개의 순열은 실제로 122로 이어지지 만 출력 할 수는 없습니다[122, 122] .

설명 및 규칙

  • 바늘을 정수 ( 65), 십진수 값 ( "65")을 나타내는 문자열 또는 이진 값 ( "1000001")을 나타내는 문자열로 사용할 수 있습니다.
  • 건초 더미를 정수 [11,12,13]의 기본 배열 / 객체 / 세트 ( ["11","12","13"]), 소수 값 ( )을 나타내는 기본 배열 / 오브젝트 / 문자열 또는 분리 된 십진수 값 ( "11 12 13"또는 "11,12,13")으로 사용할 수 있습니다. 숫자 배열 (예 :)을 사용하여 변형을 선택할 수도 있습니다 [[1,1],[1,2],[1,3]].
  • 출력은 건초 더미에 대해 위에서 설명한 형식 중 하나를 따라야하지만 반드시 같은 것은 아닙니다.
  • 귀하의 언어에서 가장 높은 십진 연결이 부호없는 정수보다 큰 건초 더미를 처리해서는 안됩니다.
  • 그 외에도 코드는 충분한 시간과 메모리가 있다고 가정하면 이론적으로 모든 입력을 지원해야합니다.
  • 이다 스파르타! 이므로 바이트 단위의 최단 답변이 승리합니다!

테스트 사례

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합니까 아니면 제거해야 합니까?
Dead Possum

@DeadPossum 예, 유효합니다.
Arnauld

건초 더미 입력이 단일 문자열 ( "123") 일 수 있습니까? 나는 그것이 것이라고 생각 때문에 일부 언어에서는 문자열, 문자의 배열과 동일한 의미가 있습니다
루이스 Mendo에게

@LuisMendo 그것은 할 수없는 때문에 ["12","3"]그리고 ["1","23"]두 가지 건초 더미입니다.
Arnauld

@Arnauld Ah, 나는 그들이 숫자라고 생각했습니다. 감사합니다
루이스 Mendo

답변:


17

05AB1E , 10 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

1
“JÙʒbŒIå 도 잘 작동합니다.
Emigna

@Emigna 감사합니다, 그것은 2 바이트를 절약합니다 :)
kalsowerus

11

파이썬 2, 90 바이트

@ Gábor Fekete 덕분에 -3 바이트

온라인으로 사용해보십시오

건초와 문자열의 정수를 나타내는 이진수로 바늘을 나타내는 문자열의 입력 배열로 사용합니다.

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

4
{...}대신 쓰면 set(...)3 바이트 가 절약됩니다.
Gábor Fekete

1
@ GáborFekete 나는 항상 잊어 버리고, {}은 (는) 설정되어 있습니다 : D Thanks
Dead Possum

나는 이것이 실패한다고 믿는다 H=['1'], N='0'.
user2357112

잠깐, 입력은 양수 여야합니다.
user2357112

10

자바 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(...람다 프롬프트에 대한 응답이며, 기능이 작동에 람다에 대한 설정을 필요로. "함수 표현식"에 대한 합의는 "제출의 마지막 '표현'이 변수에 저장 될 때 함수 응답의 요구 사항을 충족하는 경우 '함수 표현식"이 될 수 있습니다 "IIRC와 같은 것입니다. 그러나 그것은 단지 형식 문제이며, 주관적인 문제입니다.
CAD97

@ CAD97 주문이 중요하다는 것을 몰랐습니다. 지난번에 나는 두 void번째 람다와 배수보다 짧았 기 때문에 두 가지 방법으로 Java 8 답변을 게시했다 .apply. 이 답변에 대해 확인하지 않았습니다 (예 : void p(List l,int k)& 2x p(l,0)vs (l,k)->& 2x p.apply(l,0)). 흠 ..이 경우에는 1 바이트가 더 짧은 것 같습니다. 그러나 규칙에 따르면 하나의 람다 방법 만 사용할 수 있습니까? 왜 마지막이되어야하는지 아직도 혼란 스러웠습니다. 개인적으로 나는 항상 다음 순서로 답변을 게시 imports; class-fields; main-method/lambda; other methods합니다.
케빈 크루이 센

다시 말하지만, 그것은 대부분의 의견입니다. 누군가가 실제로 어떤 식 으로든 말하기 전에 더 경험이 많은 사람을 원합니다. 그러나 이것이 사실이라는 것을 알고 있습니다. 메소드를 호출 해야하는 경우 (예 : 재귀 적 또는 도우미) 이름이 있어야합니다. 그러나 순서 는 바이트 수를 변경 하지 않으므로 실제로 중요하지 않습니다. 그러나 나는 다음과 같이 주문한다imports;helper methods;lambda
CAD97

@ CAD97 Ah 물론, 따라서 void p(List l,int k)& 2x f(l,0);f=(l,p)->& 2x가 p.apply(l,0);됩니다 (즉, 현재 버전이 1 바이트 짧습니다). 순서에 관해서는, 나는 모든 대답으로 그렇게 했으므로 이것을 고수 할 것입니다. 설명에서 주요 방법으로 시작한 다음 도우미 방법 (들)을 시작하는 것이 개인적으로 의미가 있습니다. 있습니다.
Kevin Cruijssen

불행히도 f=(lambda)Java java.util.function.BiConsumer<List,Integer>f=(l,p)->{...}
로만

9

Japt , 15 14 13 12 10 바이트

건초 더미를 정수 배열로, 바늘을 2 진 문자열로 사용합니다. 정수 문자열의 배열을 출력합니다.

á 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Ã매핑에 바이트를 저장합니다. (나는 또한 â두 번째를 제거하기 위해 프로그램의 중간으로 이동 했다 Ã; 바이트를 저장하지 않지만 조금 더 효율적이고 약간 더 좋아 보인다)
ETHproductions

감사합니다. @ETHproductions-나는 매번 숫자를 배열로 출력하여 바이트를 줄일 수 있는지 확인하는 데 집중하여 매핑에 대한 간단한 변경을 놓쳤습니다. 는 â좀 더 효율적으로 될 것이다 필터를 실행하기 전에 중복 제거, 맞아, Arnauld 내가 최종 배열에서 중복을 제거하기 위해 잊었다 것을 지적 할 때 마지막에 식은 빠른 수정했지만.
Shaggy

4

루비 , 61 59 바이트

->a,n{a.permutation.select{|s|"%b"%s.join=~/#{"%b"%n}/}|[]}

온라인으로 사용해보십시오!

오늘의 멋진 기능 : 숫자가 포함 된 문자열의 이진 표현을 출력 할 수 있다는 것을 몰랐습니다.

예:

puts "%b"%"123"

-> 1111011

3

자바 스크립트 (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

매쓰, 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]있습니다.
Yytsi

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()받는 함수 와 다른 입력을 입력으로하는 벡터를 자동으로 생성합니다 . 의 모든 순열을 만듭니다 . 숫자 (또는 숫자의 문자 표현)를 이미 문자로 편리하게 저장된 이진수로 변환하는 멋지고 장황한 버전입니다. 따라서 모든 순열에 이것을 적용하고 이진 문자열 이 연결의 이진 버전에 포함되어 있으면 출력합니다 . 그렇지 않으면 출력은이므로 명시적인 줄 바꿈이 인쇄 됩니다.pxcombinat::permnxR.utils::intToBinp12 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))

허용되지 않습니다.


0

펄 6 , 69 바이트

{set @^a.permutations».join.grep(*.fmt('%b').contains($^b.base(2)))}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.