Найти бинарную иглу в десятичном стоге сена


41

Соревнование

Вам дано:

  • непустой, несортированный список h натуральных чисел (стог сена)
  • целое положительное число n (стрелка)

Ваша задача - вернуть список всех уникальных десятичных конкатенаций перестановок h , двоичное представление которых содержит двоичное представление n .

Примеры

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

    пример

    Есть только одна подходящая конкатенация, поэтому ожидаемый результат [321].

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

    На этот раз существует три объединения, которые содержат двоичный шаблон 111 . Ожидаемый результат [123, 231, 312].

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

    Доступны только две перестановки, и обе совпадают. Ожидаемый результат [123, 312].

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

    Единственная совпадающая конкатенация - 122 ( 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?
Мертвый Опоссум

@DeadPossum Да, это действительно.
Арно

Может ли вход стог сена быть одной строкой ("123")? В некоторых языках строка совпадает с массивом символов, поэтому я думаю, что это имеет смысл
Луис Мендо

@ LuisMendo не может, потому что ["12","3"]и ["1","23"]два разных стога сена.
Arnauld

@ Arnauld А, я думал, что это были цифры. Спасибо
Луис Мендо

Ответы:


17

05AB1E , 10 8 байт

Принимает стрелку в двоичном виде, чтобы сохранить 1 байт.

-2 байта благодаря Emigna

œ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 Спасибо, что экономит 2 байта :)
kalsowerus

11

Python 2, 90 байт

-3 байта благодаря @ Габору Фекете

Попробуйте онлайн

Принимает в качестве входного массива строки, представляющие целые числа из сена и строки, представляющие иглу в двоичном виде

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 поддерживает Monica

Ой, подождите, вход должен быть положительным.
user2357112 поддерживает Monica

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(...как лямбда - это ответ на приглашение, и для работы лямбды требуется настройка функции. Консенсус в отношении «выражений функций» является чем-то вроде «последним« выражением »вашего представления может быть« выражение функции », если при сохранении в переменной оно соответствует требованиям ответа функции« IIRC. Но это только вопрос форматирования, причем субъективный.
CAD97

@ CAD97 Я понятия не имел, что заказ имеет значение. В прошлый раз я опубликовал ответ Java 8 с двумя методами, которые я использовал, voidпотому что он был короче, чем вторая лямбда и кратный .apply. Не проверял его на этот ответ (то есть void p(List l,int k)& 2x p(l,0)против (l,k)->& 2x p.apply(l,0)). Хм ... второй кажется в этом случае на 1 байт короче. Но вы говорите, правила говорят, что вам разрешено иметь только один лямбда-метод? Все еще немного сбит с толку, почему это должно быть последним. Лично я всегда вывешиваю свои ответы в следующем порядке: imports; class-fields; main-method/lambda; other methods.
Кевин Круйссен

опять же, это в основном мнение, я бы хотел, чтобы кто-то более опытный вмешался, прежде чем действительно сказать, так или иначе. Тем не менее, я знаю, что это правда: если вам нужно вызвать метод (например, рекурсивный или вспомогательный), ему нужно иметь имя. Но что касается порядка, это не имеет значения, так как не меняет счетчик байтов. Но я заказываю какimports;helper methods;lambda
CAD97

@ CAD97 Ну конечно, так что вместо этого будет void p(List l,int k)& 2x f(l,0);против f=(l,p)->& 2x p.apply(l,0);(что означает, что текущая версия на 1 байт короче). Что касается порядка, я просто буду придерживаться этого, поскольку я сделал это со всеми моими ответами, и для меня также имеет смысл лично начать с основного метода в объяснении, а затем вспомогательного метода (ов), если Есть такие.
Кевин Круйссен

и, к сожалению, вы не можете просто сделать f=(lambda)на Java, этоjava.util.function.BiConsumer<List,Integer>f=(l,p)->{...}
CAD97

9

Japt , 15 14 13 12 10 байт

Принимает стог сена как массив целых чисел, а стрелку - как двоичную строку. Выводит массив целочисленных строк.

á 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 - я был так сосредоточен на том, чтобы посмотреть, смогу ли я сбрить любые байты, выводя каждое число в виде массива, я пропустил это простое изменение в отображении. Это âбыло быстрое исправление, когда Арнольд указал, что я забыл удалить дубликаты из окончательного массива, но, вы правы, удаление дубликатов перед запуском фильтра будет более эффективным.
Лохматый

4

Рубин , 61 59 байт

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

Попробуйте онлайн!

Интересная особенность дня: я не знал, что смогу вывести двоичное представление строки, содержащей число.

Пример:

puts "%b"%"123"

-> 1111011

3

JavaScript (ES6), 140 байт

Принимает иглу в виде двоичной строки.

(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

Брахилог , 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].
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()автоматически создает функцию, получая pстроку двоичного шаблона для поиска и xвектор с другим входом в качестве входных данных. combinat::permnсоздает все перестановки x. R.utils::intToBinхорошая и многословная версия для преобразования числового (или символьного представления числового) в двоичное число, которое уже удобно хранить в виде символа. Таким образом, применяя это ко всем перестановкам и выводя их, если двоичная строка pсодержится в двоичной версии конкатенации. Явная новая строка печатается, потому что в противном случае вывод будет 12 56 3456 34 1234 56 1234 12 56.

plyr«s 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))

Не положено.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.