Створити всі комбінації заданого списку елементів, відсортованих


13

Зробіть код, який приймає список та число як вхідні дані та генерує всі можливі комбінації із довжиною числа. Наприклад, зі списком {0,1} та числом 2 :

00
01
10
11

Вашій програмі не потрібно очікувати символів двічі чи частіше у списку, наприклад {0,0,0,0,0,1,1,5,5}

Переконайтеся, що ви роздруковуєте відсортовані комбінації у порядку списку:

Зі списком {0,1} та числом 5 (породженим частиною мого коду, який є занадто довгим для виграшу):

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

Але зі списком {1,0} та числом 2 :

11
10
01
00

Як бачимо, перевернутий список означає перевернутий порядок.

Погляньте на будову, це як дерево.

Це код-гольф, тому найкоротший код у байтах виграє!


3
Я думав, що це буде дублювати, але я не можу його знайти
Луїс Мендо

1
Як працює сортування, якщо вхідний список не сортується?
JAD

@Jarko Я б припустив, що кордони індексів введення відсортовані у виході
Луїс Мендо

1
@brad, відповідь за замовчуванням - так, якщо ОП не сказав щось інше.
Стюі Гріффін

3
Я не розумію ... що не так у використанні власного імені як імені користувача?
Стюі Гріффін

Відповіді:


16

Желе , 1 байт

TryItOnline

Вбудований атом декартової потужності, як діадичний зв'язок з лівим аргументом пунктів і правим аргументом підрахунку, або як повна програма з першим аргументом елементів і другим аргументом кількість.


1
Один байт! Це вирішило!
LMD

4
Ви знаєте що, я надішлю відповідь на байт ZERO! В JAVA! Як вам це подобається, так? :) (Серйозно, правда. Хороший гольф.)
OldBunny2800

9

Haskell, 20 байт

(mapM id.).replicate

Використання додаткове:

*Main> ( (mapM id.).replicate )  2 "01" 
["00","01","10","11"]
*Main> ( (mapM id.).replicate )  2 "10" 
["11","10","01","00"]

replicateробить nкопії 2-го параметра та mapM idбудує комбінації. Btw, mapM idте саме sequence, але на 1 байт менше.



6

Pyth, 2 байти

^F

Програма, яка приймає дані у формі list,numberта друкує список списків.

Тестовий набір

Як це працює

^F   Program. Input: Q
^FQ  Implicit input fill
 F   Fold
^    repeated Cartesian power
  Q  over Q
     Implicitly print

це, здається, вирішує це, але, мабуть, хтось ще може це зробити одним байтом?
LMD

так, хтось ще переміг (желе, один байт), але приємне рішення, все одно
LMD

6

Perl 6 , 15 байт

{[X] @^a xx$^b}

Пояснення:

{[X] @^a xx$^b}

{             } # bare block lambda

     @^a        # declare first parameter as Positional
           $^b  # declare second parameter
         xx     # list repeat 「@a」, 「$b」 times

# at this point given 「 (0,1), 5 」
# ((0 1) (0 1) (0 1) (0 1) (0 1))

 [ ]            # list reduce
  X             #    using cross meta-operator

# results in a list of lists
# ((0 0 0 0 0)
#  (0 0 0 0 1)
#  (0 0 0 1 0)
#  (0 0 0 1 1)
#  (0 0 1 0 0)
#  (0 0 1 0 1)
#  ...
#  (1 1 1 1 1))
say {[X] $^a xx$^b}( (0,1), 2 ); # ((0 0) (0 1) (1 0) (1 1))
say {[X] $^a xx$^b}( (1,0), 2 ); # ((1 1) (1 0) (0 1) (0 0))
say {[X] $^a xx$^b}( (0,1,2), 2 );
# ((0 0) (0 1) (0 2) (1 0) (1 1) (1 2) (2 0) (2 1) (2 2))

put {[X] $^a xx$^b}( (0,1), 5 )».join;
# 00000 00001 00010 00011 00100 00101 00110 00111 01000 01001 01010 01011 01100 01101 01110 01111 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111

Якщо вони коли-небудь перейдуть до випуску Rakudo після офіційного випуску Perl 6, ви зможете запустити це на Ideone .
Бред Гілберт b2gills

5

JavaScript (Firefox 30+), 55 байт

f=(a,n)=>n?[for(b of a)for(c of f(a,n-1))[b,...c]]:[[]]

Я на 99% впевнений, що рекурсія - це найкращий спосіб зробити це в JavaScript.


4

Perl, 30 байт

28 байт коду + -nlпрапор.

$"=",";say for glob"{@F}"x<>

Щоб запустити його:

perl -alE '$"=",";say for glob"{@F}"x<>' <<< "1 0
2"

Я думаю, що сприйняття введення як списку чисел є логічним для Perl. Однак, якщо дозволити фантазію та взяти вкладку з дужками та комою (як показано в питанні), ми можемо опуститися до 20 байт :

perl -nlE 'say for glob$_ x<>' <<< "{1,0}
2"

Пояснення: glob початковою метою в Perl є список і повторення через імена файлів, але коли його аргумент містить фігурні дужки, він генерує комбінації, сформовані з одного елемента кожної групи дужок.
-aautosplit на пробілці введення, а результат помістіть всередину @Fмасиву.
$"це роздільник списку: це роздільник, вставлений між елементами списку всередині рядка. Ми встановлюємо його ,так, що "{@F"}створює {.,.}(якщо @Fмістить 0 і 1).
Потім xоператор повторення рядків (і <>отримує один рядок введення).
І, нарешті, він say forповторює список, створений globі роздруковує елементи.


4

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

Tuples

Ще гірше, ніж желе :(

Використання

Tuples[{0, 1}, 5]

{{0, 0, 0, 0, 0}, {0, 0, 0, 0, 1}, {0, 0, 0, 1, 0}, {0, 0, 0, 1, 1}, {0, 0, 1, 0, 0}, {0, 0, 1, 0, 1}, {0, 0, 1, 1, 0}, {0, 0, 1, 1, 1}, {0, 1, 0, 0, 0}, {0, 1, 0, 0, 1}, {0, 1, 0, 1, 0}, {0, 1, 0, 1, 1}, {0, 1, 1, 0, 0}, {0, 1, 1, 0, 1}, {0, 1, 1, 1, 0}, {0, 1, 1, 1, 1}, {1, 0, 0, 0, 0}, {1, 0, 0, 0, 1}, {1, 0, 0, 1, 0}, {1, 0, 0, 1, 1}, {1, 0, 1, 0, 0}, {1, 0, 1, 0, 1}, {1, 0, 1, 1, 0}, {1, 0, 1, 1, 1}, {1, 1, 0, 0, 0}, {1, 1, 0, 0, 1}, {1, 1, 0, 1, 0}, {1, 1, 0, 1, 1}, {1, 1, 1, 0, 0}, {1, 1, 1, 0, 1}, {1, 1, 1, 1, 0}, {1, 1, 1, 1, 1}}


3

Пітон, 57 байт

from itertools import*
lambda o,n:list(product(*([o]*n)))

repl.it

Безіменна функція, що приймає список об'єктів oі кількість, nі повертає список комбінацій.


3

Чистий Баш, 36 років

printf -vv %$2s
eval echo ${v// /$1}

Введення параметрами командного рядка - список є розділеним комами списком у дужках, наприклад:

./elemcombo.sh "{0,1}" 2

Зверніть увагу, що список введення потрібно цитувати, щоб оболонка виклику не розгортала його занадто рано.

Ідеон .


Це, здається, не працює.
Іпор Сірсер

Він повторюється лише в n разів, не друкує всі можливі комбінації.
Іпор Сірсер

@IporSircer Я уточнив необхідний формат введення. Це працює для вас зараз?
Цифрова травма

bash a.sh "{0,1}" 2-> {0,1}{0,1}(версія 4.4.5 (1)
-випуск

1
@IporSircer Схоже, TIO, ймовірно, ставить аргументи в execve () або подібний виклик. Котирування потрібні лише тоді, коли скрипт викликається з іншої оболонки, щоб не допустити розширення дужок, що викликає. У випадку TIO, у списку не потрібні лапки. tio.run/nexus/…
Digital Trauma

3

R , 53 45 байт

function(x,n)rev(expand.grid(rep(list(x),n)))

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

rev чи відповідає вимогам запиту точного порядку сортування (що насправді не здається суттєвим для проблеми) та додає 5 байт.


Всього revна 45 байт :)
JayCe

Мав на увазі матрицю і забув, результат був насправді списком (кадром даних).
ngm

1

Ракетка 123 байти

(let p((s "")(l(map number->string(sort l <))))
(if(= n(string-length s))(displayln s)(for((i l))(p(string-append s i)l))))

Безголівки:

(define(f l n)
  (let loop ((s "")
             (l (map number->string (sort l <))))
    (if (= n (string-length s))
        (displayln s)
        (for ((i l))
          (loop (string-append s i) l)))))

Тестування:

(f '(0 1) 2)
(f '(0 1) 3)
(f '(0 1) 5)

Вихід:

00
01
10
11

000
001
010
011
100
101
110
111

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

1

PHP, 109 байт

for($o=$a=array_slice($argv,2);--$argv[1];$o=$c,$c=[])foreach($a as$n)foreach($o as$s)$c[]=$n.$s;print_r($o);

Беруть довжину як перший аргумент, а список - як будь-які подальші аргументи.
Використовуйте як:

php -r "for($o=$a=array_slice($argv,2);--$argv[1];$o=$c,$c=[])foreach($a as$n)foreach($o as$s)$c[]=$n.$s;print_r($o);" 5 0 1

Якщо ставиться запит про довжину 0, трапиться фатальна помилка "поза пам'яттю".


Вам не доведеться обробляти довжину 0.
LMD

1

05AB1E , 2 1 байт с

ã

-1 байт завдяки @Enigma .

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

Введіть як number\nlist, виведіть як список списків.

Пояснення:

     # Implicit input `a`, `b`
ã    # Take the Cartesian product of list `b` repeated `a` times

1
Вам тут не потрібно I.
Емінья

@Emigna Ну звичайно. У мене це було, Iтому що я спочатку намагався розібратися, як зробити кілька входів і змінив номер і список. Дуже дурно тримати Iтам .. Дякую!
Кевін Круїссен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.