Всі двійкові комбінації до десяткової


12

Відмова від відповідальності

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

Виклик

Дано два цілих числа Xі Y, що представляють кількість нулів ( 0) та одиниць ( 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
Чи слід сортувати вихід?
Денніс

Привіт @Dennis, так, я забув згадати, що ... вихід повинен бути відсортований. Я відповідно оновив правила.
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 на ​​загальному ринку програмування? Я помітив, що Jelly базується на цьому?
WallyWest

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

@WallyWest Його не називають часто, оскільки він найкраще підходить для середовища, яке виграє від функціонального програмування. Зазвичай тільки для дуже спеціалізованого програмування.
Conor O'Brien

7

Пітон, 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

Математика, 59 57 байт

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

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

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

Попередня версія, перед коментарем Мартіна Ендера:

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

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

1
FromDigitsзазвичай можна скоротити:#+##&~Fold~#&/@Permutations...
Мартін Ендер

@MartinEnder: Я розумію! і подивіться, як також узагальнити інші бази. Дякую, що ви навчили мене цій розумній ідіомі.
Грег Мартін

1
Кредити на те, щоб придумати це, йдуть на алефальфу . ;)
Мартін Ендер

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


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

Математика, 47 байт

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

Безіменна функція, яка бере два аргументи: кількість 1s, кількість 0s.

По суті це порт рішення Dennis's 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)

неозорий

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 байт

Порт моєї відповіді Рубі . Пропозиції з гольфу вітаються. Спробуйте в Інтернеті!

│+)'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

Гроовий 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.