Все двоичные комбинации в десятичные


12

отказ

Этот вопрос не является дубликатом этого вопроса . Я не считаю конкретные цифры, так как они уже установлены в исходных параметрах. Этот вопрос сосредоточен на десятичных числах, которые могут быть построены из двоичных строк на основе предоставленных цифр.

Вызов

С учетом двух целых чисел Xи Y, представляющих количество нулей ( 0) и ones ( 1) соответственно, вычисляются все возможные десятичные эквиваленты, которые можно определить из создания двоичных строк, используя только предоставленные нули и единицы, и отображают их в качестве выходных данных.

Пример 1:

Входные данные: 0 1

Выход: 1

Объяснение: Только один 1для учета, который может быть преобразован только одним способом.

Пример 2:

Входные данные: 1 1

Выход: 1,2

Пояснение: 01конвертирует в 1, 10конвертирует в 2.

Пример 3:

Входные данные: 3 2

Выход: 3,5,6,9,10,12,17,18,20,24

Пояснение: Три 0с и два 1с делают 00011(3), 00101(5), 00110(6), 01001(9), 01010(10), 01100(12), 10001(17), 10010(18), 10100(20), 11000(24)

Ограничения и правила

  • Я только ожидаю, что ваш код будет работать там, где 0 < X + Y <= 16максимальное число в выводе может быть получено только за 16 1с, то есть параметры 0и 16.
  • В результате вышеприведенного ограничения диапазон чисел, которые мы ожидаем в выводе, от 0и 65535.
  • Я приму функции или код, при условии, что будет получен итоговый вывод, будь то список, разделенный запятыми, массив, список, выводимый в STDOUT и т. Д. Единственный критерий, который я должен подчеркнуть, - это то, что он должен быть отсортирован.
  • Это код гольфа, минимум байтов получит максимальную славу.
  • Мы не потерпим глупых лазеек

1
Нужно ли сортировать вывод?
Деннис

Привет @ Денис, да, я забыл упомянуть, что ... выходные данные должны быть отсортированы. Я обновил правила соответственно.
WallyWest

2
Нужно ли нам заниматься делом 0 0?
ETHproductions

@ETHproductions Я упомянул выше, что 0 <= X + Y <= 16да, потому что 0 0это будет считаться допустимым вводом, который удовлетворяет этому правилу.
WallyWest

2
В таком случае, для чего нужен ожидаемый результат 0 0? Число 0 может быть представлено нулем, одним или несколькими нулями.
Деннис

Ответы:


5

Желе , 8 байт

0,1xŒ!ḄQ

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

Как это устроено

0,1xŒ!ḄQ Main link. Argument: [x, y]

0,1x     Repeat 0 x times and 1 y times.
    Œ!   Compute all permutations of the result.
      Ḅ   Unbinary; convert each permutation from base 2 to integer.
       Q  Unique; deduplicate the results.

Это довольно впечатляюще ... Есть ли спрос на J на ​​общем рынке программирования? Я заметил, что желе основано на этом?
WallyWest

1
У него есть база пользователей в некоторых конкретных приложениях (в основном математика / статистика), но я, честно говоря, не знаю. Я не использовал J вне кодового гольфа.
Деннис

@WallyWest Это не требуется часто, потому что это лучше всего подходит для среды, которая выиграет от функционального программирования. Обычно только для очень специализированного программирования.
Конор О'Брайен,

7

Python, 60 байт

lambda x,y:[n for n in range(1<<x+y)if bin(n).count('1')==y]

Проверьте это на Ideone .

Как это устроено

Все положительные числа, которые могут быть представлены в двоичном виде с x нулями и y , явно меньше 2 x + y , поскольку каноническое двоичное представление последних имеет x + y + 1 цифру.

Лямбда просто перебирает целые числа в [0, 2 x + y ) и сохраняет все целые числа n в этом диапазоне, которые имеют y . Поскольку n <2 x + y , можно представить с x (или менее) нулями.


5

Mathematica, 59 57 байт

Обычный результат с Mathematica: функции высокого уровня = хорошие, длинные имена функций = плохие.

#+##&~Fold~#&/@Permutations@Join[0&~Array~#,1&~Array~#2]&

Join[0&~Array~#,1&~Array~#2]создает список с правильным количеством 0s и 1s. Permutationsгенерирует все перестановки этого списка, без повторений (как я узнал) и в отсортированном порядке. #+##&~Fold~#(версия для гольфа #~FromDigits~2) преобразует список цифр base-2 в целое число, которое они представляют.

Предыдущая версия, перед комментарием Мартина Эндера:

#~FromDigits~2&/@Permutations@Join[0&~Array~#,1&~Array~#2]&

1
Тем не менее, хорошо наблюдаемые и задокументированные ... Mathematica отлично подходит для обработки чисел, не так хороша для гольф-кода ... ну, иногда ...
WallyWest

1
FromDigitsобычно может быть сокращено:#+##&~Fold~#&/@Permutations...
Мартин Эндер

@MartinEnder: я понял! и посмотреть, как обобщать и на другие базы. Спасибо, что научили меня этой умной идиоме.
Грег Мартин

1
Кредиты для того, чтобы придумать это, идут к alephalpha . ;)
Мартин Эндер

1
Оказывается, что переход к подходу Денниса короче:Select[Range[2^+##]-1,x=#;DigitCount[#,2,1]==x&]&
Мартин Эндер

5

CJam ( 15 14 байт)

{As.*s:~e!2fb}

Это анонимный блок (функция), который принимает входные данные в виде массива [number-of-ones number-of-zeros]и возвращает выходные данные в виде массива.

Онлайн демо


Долгий путь от цели, но более интересный : это без встроенных перестановок или преобразования базы:

{2\f#~1$*:X;[({___~)&_2$+@1$^4/@/|_X<}g;]}

Это бы хорошо работало, когда разворачивался GolfScript.


Я пытался заменить ee{)*}/с чем - то , используя .*и придумал это 14-байтовое решением: выглядит немного неэффективную сейчас , хотя. {As.*s:~e!2fb}s:~
Мартин Эндер

1
@MartinEnder, я на самом деле начал с .*и решил, что это eeбыло лучше, чем, например 2,:a.*e_. Я не осознавал, что e!это даст одинаковый результат независимо от порядка его аргумента.
Питер Тейлор


4

Japt , 16 байт

'0pU +'1pV)á mn2

Проверьте это онлайн!

Как это устроено

                  // Implicit: U = first integer, V = second integer
'0pU              // Repeat the string "0" U times.
     +'1pV)       // Concatenate with the string "1" repeated V times.
           á      // Take all unique permutations.
             mn2  // Interpret each item in the resulting array as a binary number.
                  // Implicit: output last expression

Альтернативная версия, 17 байт

2pU+V o f_¤è'1 ¥V
                   // Implicit: U = first integer, V = second integer
2pU+V              // Take 2 to the power of U + V.
      o            // Create the range [0, 2^(U+V)).
        f_         // Filter to only items where
           è'1     //  the number of "1"s in
          ¤        //  its binary representation
               ¥V  //  is equal to V. 
                   // Implicit: output last expression

Я пытался продвигать оба варианта игры в гольф, но я просто не могу найти слабины ...


Это выглядит потрясающе ... и прекрасно работает! Однако интерпретатор не показывает перенесенный код справа? Я хотел бы видеть, как это оказывает?
WallyWest

@WallyWest Это распространяется примерно на ("0".p(U)+"1".p(V)).á().m("n",2); каждая из .x()функций определена в исходном файле .
ETHproductions

3

Рубин, 63 байта

Простая реализация. Предложения по игре в гольф приветствуются.

->a,b{(?0*a+?1*b).chars.permutation.map{|b|(b*'').to_i 2}.uniq}

Ungolfing

def f(a,b)
  str = "0"*a+"1"*b                   # make the string of 0s and 1s
  all_perms = str.chars.permutation   # generate all permutations of the 0s and 1s
  result = []
  all_perms.do each |bin|             # map over all of the permutations
    bin = bin * ''                    # join bin together
    result << bin.to_i(2)             # convert to decimal and append
  end
  return result.uniq                  # uniquify the result and return
end

3

Pyth - 11 байт

{iR2.psmVU2

Тестовый пакет .

{                Uniquify
 iR2             Map i2, which converts from binary to decimal
  .p             All permutations
   s             Concatenate list
    mV           Vectorized map, which in this case is repeat
     U2          0, 1
     (Q)         Implicit input

2

Python 2 - 105 99 байт

+8 байт, потому что наш вывод должен быть отсортирован

lambda x,y:sorted(set(int("".join(z),2)for z in __import__('itertools').permutations("0"*x+"1"*y)))

Впечатляющее редактирование!
WallyWest

1
Спасибо, я понятия не имел, что вы можете импортировать модули в лямбда-функции.
Джереми

Я всегда думал, что вам разрешено иметь отдельное заявление на импорт для целей кода гольф. (Очевидно, вам все еще нужно указать его длину.) Это может сэкономить вам байт или два?
Нил

2

Mathematica, 47 байт

Cases[Range[2^+##]-1,x_/;DigitCount[x,2,1]==#]&

Безымянная функция, принимающая два аргумента: число 1s, число 0s.

По сути это порт решения Python Дениса . Мы создаем диапазон от 0до и затем сохраняем только те числа, количество битов которых равно первому вводу. Наиболее интересный бит, вероятно, использует магию последовательности, чтобы избежать скобок вокруг добавления двух аргументов.2x+y-112^+##


2

MATLAB 57 + 6

@(a,b)unique(perms([ones(1,a) zeros(1,b)])*2.^(0:a+b-1)')

бегать, используя

ans(2,3)

ungolfed

function decimalPerms( nZeros, nOnes )
  a = [ones(1,nOnes) zeros(1,nZeros)];  % make 1 by n array of ones and zeros
  a = perms(a);                         % get permutations of the above 
  powOfTwo = 2.^(0:nOnes+nZeros-1)';    % powers of two as vector
  a = a * powOfTwo;                     % matrix multiply to get the possible values
  a = unique(a)                         % select the unique values and print

1
Для чего плюс 6 байтов?
mbomb007

Я собирался спросить то же самое
WallyWest

2

MATL , 9 байт

y+:<Y@XBu

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

объяснение

Подход похож на тот, что дан в ответе Денниса «Желе» .

y     % Implicitly take two inputs (say 3, 2). Duplicate the first.
      %   STACK: 3, 2, 3
+     % Add
      %   STACK: 3, 5
:     % Range
      %   STACK: 3, [1 2 3 4 5]
<     % Less  than
      %   STACK: [0 0 0 1 1]
Y@    % All permutations
      %   STACK: [0 0 0 1 1; 0 0 0 1 1; ...; 0 0 1 0 1; ...; 1 1 0 0 0]
XB    % Binary to decimal
      %   STACK: [3 3 ... 5 ... 24]
u     % Unique
      %   STACK: [3 5 ... 24]
      % Implicitly display

1

На самом деле, 21 байт

Порт моего Ruby-ответа . Предложения по игре в гольф приветствуются. Попробуйте онлайн!

│+)'1*@'0*+╨`εj2@¿`M╔

Как это устроено

          Implicit input of a and b.
│+)       Duplicate a and b, add, and rotate to bottom of stack. Stack: [b a a+b]
'1*@      "1" times b and swap with a.
'0*+      "0" times a and add to get "0"*a+"1"*b.
╨`...`M   Take all the (a+b)-length permutations of "0"*a+"1"*b
          and map the following function over them.
  εj        Join the permutation into one string
  2@¿       Convert from binary to decimal
╔         Uniquify the resulting list and implicit return.

1

Groovy 74 байта, 93 байта или 123 байта

Я не знаю, какой из них вы считаете более полно отвечает на вопрос, но ...

74 байтовое решение

​{a,b->((1..a).collect{0}+(1..b).collect{1}).permutations().unique()}(1,2)

Для входа 1,2 вы получаете:

[[1,0,1], [0,1,1], [1,1,0]]

93-байтовое решение

{a,b->((1..a).collect{0}+(1..b).collect{1}).permutations().collect{it.join()}.unique()}(1,2)​

Для входа 1,2 вы получаете:

[101, 011, 110]

123-байтовое решение

{a,b->((1..a).collect{0}+(1..b).collect{1}).permutations().collect{it.join()}.unique().collect{Integer.parseInt(it,2)}}(1,2)

Для входа 1,2 вы получаете:

[5, 3, 6]

Попробуйте это здесь:

https://groovyconsole.appspot.com/edit/5143619413475328


Я бы посчитал 123-байтовое решение, поскольку оно соответствует типу вывода, упомянутому в кратком изложении. Отлично сработано.
WallyWest

1

JavaScript (Firefox 48), 85 76 74 71 70 байт

Сохранено 3 байта благодаря @Neil.

(m,n,g=x=>x?g(x>>1)-x%2:n)=>[for(i of Array(1<<m+n).keys())if(!g(i))i]

Понимание массива потрясающее. Жаль, что они еще не вошли в официальную спецификацию ECMAScript.

JavaScript (ES6), 109 87 79 78 71 70 байт

(m,n,g=x=>x?g(x>>1)-x%2:n)=>[...Array(1<<m+n).keys()].filter(x=>!g(x))

Теперь должно работать во всех браузерах, соответствующих ES6. На этом сохранено 7 байт, также благодаря @Neil.


@ETHProductions, по какой-то причине я получаю его undefinedпри каждом тестовом прогоне ...?
WallyWest

@WallyWest Убедитесь, что вы сначала присваиваете его переменной, например f=(m,n)=>..., затем вызываете его следующим образом f(3,2). Если это то, что вы делаете, какой браузер вы используете?
ETHproductions

Chrome 52 ... У меня нет Firefox на этой машине, поэтому я мог протестировать только версию ES6 без Firefox ...
WallyWest

Попытка запустить его в консоли браузера.
WallyWest

О, хм. Я вижу эту проблему и в Chrome. Попробуйте эту evalверсию без использования (делает то же самое, но на 3 байта длиннее):(m,n)=>{a="";for(i=0;i<1<<m+n;i++)if(i.toString(2).split(1).length==n+1)a+=i+" ";return a}
ETHproductions

1

Groovy 80 байт

основываясь на ответе @carusocomputing

его 123-байтовое решение может быть сжато до 80 байт:

80-байтовое решение

{a,b->([0]*a+[1]*b).permutations()*.join().collect{Integer.parseInt(it,2)}}(1,2)

Для входа 1,2 вы получаете:

[5, 3, 6]

1

C (gcc) , 72 68 байт

f(a,b){for(a=1<<a+b;a--;)__builtin_popcount(a)^b||printf("%d\n",a);}

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

К сожалению, в стандартной библиотеке нет popcount (), но GCC предоставляет его как «встроенную функцию». Вывод отсортирован, но в обратном порядке.

Спасибо @ceilingcat за 4 бритья!


Все еще приемлемо. Хорошо сделано!
WallyWest

0

PHP, 80 или 63 байта

в зависимости от того, должен ли я использовать $argvили могу использовать $xи $yвместо этого.

for($i=1<<array_sum($argv);$i--;)echo$argv[2]-substr_count(decbin($i),1)?_:$i._;

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

нет встроенных, 88 или 71 байт

for($i=1<<array_sum($argv);$i--;print$c?_:$i._)for($n=$i,$c=$argv[2];$n;$n>>=1)$c-=$n&1;

добавьте один байт каждый только для одного подчеркивания после каждого числа.

@WallyWest: Вы были правы. Сохраняет 3 байта для меня отfor($i=-1;++$i<...;)


0

Perl 6 ,  64 62  49 байтов

{(0 x$^a~1 x$^b).comb.permutations.map({:2(.join)}).sort.squish}
{[~](0,1 Zx@_).comb.permutations.map({:2(.join)}).sort.squish}
{(^2**($^x+$^y)).grep:{.base(2).comb('1')==$y}}

Объяснение:

# bare block lambda with two placeholder parameters 「$^x」 and 「$^y」
{
  # Range of possible values
  # from 0 up to and excluding 2 to the power of $x+$y
  ( ^ 2 ** ( $^x + $^y ) )

  # find only those which
  .grep:

  # bare block lambda with implicit parameter of 「$_」
  {

    # convert to base 2
    # ( implicit method call on 「$_」 )
    .base(2)

    # get a list of 1s
    .comb('1')

    # is the number of elements the same
    ==

    # as the second argument to the outer block
    $y
  }
}
say {(0..2**($^x+$^y)).grep:{.base(2).comb('1')==$y}}(3,2)
# (3 5 6 9 10 12 17 18 20 24)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.