Генерация всех комбинаций данного списка элементов, отсортированных


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, ответ по умолчанию - да, если OP не сказал что-то еще.
Стьюи Гриффин

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

Ответы:


16

Желе , 1 байт

TryItOnline

Встроенный в декартову степень атом, как двоичная связь с левым аргументом элементов и правым аргументом count, или как полная программа с первым аргументом элементов и вторым аргументом count.


1
Один байт! Это решило это!
LMD

4
Знаете что, я отправлю нулевой байтовый ответ! В ЯВА! Как тебе это нравится, а? :) (Серьезно, хотя. Хорошая игра в гольф.)
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строит комбинации. Кстати, 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 - это список и перебор имен файлов, но когда его аргумент содержит фигурные скобки, он генерирует комбинации, сформированные из одного элемента каждой группы скобок.
-aавтоматически разделяет пробелы на входе и помещает результат в @Fмассив.
$"является разделителем списка: это разделитель, вставленный между элементами списка внутри строки. Мы устанавливаем это ,, поэтому "{@F"}производит {.,.}(если @Fсодержит 0 и 1).
Затем xоператор повтора строки (и <>получает одну строку ввода).
И, наконец, say forперебирает список, созданный globи печатает элементы.


4

Mathematica, 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

Python, 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

Обратите внимание, что список ввода должен быть заключен в кавычки, чтобы вызывающая оболочка не раскрыла его слишком рано.

Ideone .


Это не похоже на работу.
Ипор Сирсер

Он только повторяет ввод n раз, не печатает все возможные комбинации.
Ипор Сирсер

@IporSircer Я уточнил необходимый формат ввода. Это работает для вас сейчас?
Цифровая травма

bash a.sh "{0,1}" 2-> {0,1}{0,1}(версия 4.4.5 (1) -релиз)
Ipor Sircer

1
@IporSircer Похоже, что TIO, вероятно, помещает аргументы в вызов execve () или аналогичный. Кавычки нужны только тогда, когда скрипт вызывается из другой оболочки, чтобы предотвратить выполнение скобок вызывающей оболочкой. В случае TIO, список не нуждается в кавычках. tio.run/nexus/…
цифровая травма

3

R , 53 45 байт

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

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

rev должен соответствовать точному порядку сортировки, который запрашивается (что на самом деле не кажется существенным для проблемы) и добавляет 5 байтов.


Всего revза 45 байтов :)
JayCe

Имел матрицу на уме и забыл, что результатом был фактически список (фрейм данных).
НГМ

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

Ungolfed:

(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

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