Знайдіть двійкову голку в десятковій копиці сіна


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 Ах, я думав, це цифри. Спасибі
Луїс Мендо

Відповіді:


17

05AB1E , 10 8 байт

Бере голку у двійковій формі, щоб зберегти 1 байт.

-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 Спасибі, що економить 2 байти :)
kalsowerus

11

Python 2, 90 байт

-3 байти завдяки @ Gábor Fekete

Спробуйте в Інтернеті

Приймає як вхідний масив рядків, що представляють вставки з сіна і рядка, представляючи голку в двійковій формі

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 Спасибі
Dead Possum

Я вважаю, що це не вдається 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",""));}

Введіть як List & binary-String, виведіть у рядках як рядки.

Пояснення:

Спробуйте тут.

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 - Я був настільки зосереджений на тому, щоб побачити, чи зможу я відточити будь-які байти, виводячи кожне число у вигляді масиву, я пропустив ту просту зміну карти. âБуло швидко виправити прикріпив на кінці , коли Arnauld вказав , що я забув видалити дублікати з кінцевого масиву , але ви маєте рацію, видалення дублікатів перед запуском фільтра буде більш ефективним.
Кудлатий

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))



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

plyr's l_plyвикористовується для придушення виведення нульового списку, крім звичайного виводу. Якщо такий вихід дозволений:

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.