Генерация упорядоченных комбинаций с повторением


9

Учитывая строку различных символов и число n, сгенерируйте все упорядоченные комбинации с повторением, длиной от 1 до n, используя эти символы.

Другой способ определить это состоит в том, чтобы видеть данные символы как «пользовательские» цифры в базе (основание) числа символов, тогда программа должна сгенерировать все «числа» от 1 до n цифр в этой базе, однако ведущие "нули" тоже включены.

Комбинации должны быть упорядочены по длине (сначала 1 символ, затем 2 и т. Д.), Но они могут быть в любом порядке. Вы можете выбрать наиболее удобные способы обработки ввода и вывода. Самый короткий код выигрывает.

Примеры:

ab, 3-> a,b,aa,ab,ba,bb,aaa,aab,aba,baa,abb,bab,bba,bbb
0123456789, 2->0,1,2,3,4,5,6,7,8,9,00,01,...,09,10,11,...,99


Шутки в сторону? «Граф»?
— Питер Тейлор

@PeterTaylor что ты имеешь в виду?
— Aditsu уйти, потому что SE зла

2
В проблеме вы понимаете, что просто просите людей сосчитать. Вы не думаете, что это немного непривычно?
— Питер Тейлор

3
@PeterTaylor Ну, это не простой подсчет, даже при использовании десятизначных цифр. Я хотел бы увидеть, как это сделать в кратчайшем коде. Это не должно быть сложно. Я тоже видел более тривиальные вопросы и не думаю, что это должно быть проблемой.
— Aditsu уйти, потому что SE зла

Кроме того, есть по крайней мере пара проблем, где я могу применить это :)
— aditsu уйти, потому что SE - ЗЛО

Ответы:



5

Python 2, 56 байт

nэто максимальная длина и, sкак ожидается, будет список символов. Мне не ясно, являются ли n = 0 или пустой список символов допустимыми входными данными, но эта функция также обрабатывает их правильно.

f=lambda s,n:n*s and s+[x+c for x in f(s,n-1)for c in s]

4

J, 41 символ

   f=.}:@;@({@(,&(<',')@(]#<@[))"1 0>:@i.@])

   'ab' f 3
a,b,aa,ab,ba,bb,aaa,aab,aba,abb,baa,bab,bba,bbb

3

APL (31)

{,/⍺∘{↓⍉⍺[1+(⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺]}¨⍳⍵}

Использование: левый аргумент - это строка, а правый аргумент - это число, например:

    'ab'{,/⍺∘{↓⍉⍺[1+(⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺]}¨⍳⍵}3
b  a  ab  ba  bb  aa  aab  aba  abb  baa  bab  bba  bbb  aaa  

Выходные данные упорядочены по длине, но в группах длин они смещены на одну влево, это было проще всего.

Объяснение:

  • ,/⍺∘{... }¨⍳⍵: для 1..⍵, примените функцию к ⍺ и объедините результаты вместе.
  • (⍵⍴⍴⍺)⊤⍳⍵*⍨⍴⍺: для каждого числа от 1 до (⍵ = (текущая длина)) ^ (⍴⍺ = (количество символов)) преобразовать в базу ⍴⍺, используя ⍵ цифр.
  • 1+: добавьте один, потому что массивы 1-индексированы.
  • ⍺[... ]: использовать их как указатели в строке
  • ↓⍉: поверните матрицу, чтобы «числа» находились в строках, а не в столбцах, а затем разбили матрицу по строкам.

1
APL имеет однобайтовую кодировку для своих символов?
— Aditsu бросить, потому что SE зла

@aditsu: Dyalog APL использует Unicode, я думаю, все другие современные APL делают то же самое. Однако до появления Unicode вы использовали кодовую страницу, так что это возможно.
— Marinus

Я в основном спрашиваю, потому что я беспокоюсь о нет. байтов против нет. персонажей. Я не знаю, сколько разных символов использует APL.
— Aditsu бросить, потому что SE зла

Если я не забыл некоторые или неправильно учел, Dyalog APL имеет 74 символа функций и операторов, которые отлично вписались бы в байт вместе с 7-битным ASCII. И есть также некоторое совпадение между этими и обычными персонажами, как ?!/\-+*~&=,.|и, возможно, еще больше. Существуют однобайтовые кодировки APL, но Unicode проще в использовании.
— Маринус

3

Хаскель, 34 персонажа

x%n=do k<-[1..n];mapM(\_->x)[1..k]

Простое использование списка монады. Единственный реальный гольф - это использование mapMвместо более идиоматического (и более короткого), replicateMчто потребовало бы импорта Control.Monad.

Применение

> "ab" % 3
["a","b","aa","ab","ba","bb","aaa","aab","aba","abb","baa","bab","bba","bbb"]

2

Питон, 97 94

from itertools import*
s,n=input()
L=t=[]
exec"t=t+[s];L+=map(''.join,product(*t));"*n
print L

t=t+[s]не может быть сокращено до, t+=[s]потому что L и T будут указывать на тот же список.

Входные данные: 'ab', 3

Вывод:

['a', 'b', 'aa', 'ab', 'ba', 'bb', 'aaa', 'aab', 'aba', 'abb', 'baa', 'bab', 'bb
a', 'bbb']

2

Mathematica 29 19 28

Join@@(i~Tuples~#&/@Range@n)

Применение

i={a, 4, 3.2};n=3;

Join@@(i~Tuples~#&/@Range@n)

{{a}, {4}, {3.2}, {a, a}, {a, 4}, {a, 3.2}, {4, a}, {4, 4}, {4, 3.2}, { 3.2, a}, {3.2, 4}, {3.2, 3.2}, {a, a, a}, {a, a, 4}, {a, a, 3.2}, {a, 4, a}, { a, 4, 4}, {a, 4, 3.2}, {a, 3.2, a}, {a, 3.2, 4}, {a, 3.2, 3.2}, {4, a, a}, {4, a, 4}, {4, a, 3.2}, {4, 4, a}, {4, 4, 4}, {4, 4, 3.2}, {4, 3.2, a}, {4, 3.2, 4}, {4, 3.2, 3.2}, {3.2, a, a}, {3.2, a, 4}, {3.2, a, 3.2}, {3.2, 4, a}, {3.2, 4, 4} , {3.2, 4, 3.2}, {3.2, 3.2, a}, {3.2, 3.2, 4}, {3.2, 3.2, 3.2}}


Можно ли запустить это без покупки Mathematica? Кроме того, не могли бы вы сгладить вывод, чтобы он не группировался по длине?
— Aditsu уйти, потому что SE зла

Вам необходимо приобрести Mathematica. (В принципе, код можно протестировать на WolframAlpha.com, но по какой-то причине связывание не работает должным образом.)
— DavidC

Купить Mathematica? Извините, этого не произойдет: p Код не работает без изменений на wolframalpha, но я мог видеть некоторые выходные данные по одной из ваших предыдущих ссылок, так что в любом случае я предпочитаю принять его как кратчайший ответ.
— Aditsu бросить, потому что SE зла

2

MATL, 9 8 байт

x:"1G@Z^

Попробуйте это на MATL Online!

(MATL был создан после того, как этот вызов был опубликован, но я полагаю, что это нормально при мета-консенсусе в наши дни.)

(-1 байт благодаря @Luis Mendo.)

x - удалить строку ввода из стека (автоматически копирует его в буфер обмена G)

:" - неявный ввод числа n, цикл от 1 до n

1G - вставить обратно строку ввода из буфера обмена G в стек

@ - нажать текущий индекс итерации цикла

Z^- декартова сила: декартово произведение ввода с собой @число раз

Результаты декартовой мощности ( @-значные «числа» в заданной базе) накапливаются в стеке и неявно отображаются в конце.


1
Вы можете сохранить 1 байт с помощьюx:"1G@Z^
— Луис Мендо

@LuisMendo Обновлено (наконец-то!). Спасибо.
— sundar - Восстановить Монику

1

Питон - 106

Простое, нетворческое решение. Если вы найдете существенные улучшения, пожалуйста, отправьте в качестве отдельного ответа.

s,n=input()
l=len(s)
for i in range(1,n+1):
 for j in range(l**i):t='';x=j;exec't+=s[x%l];x/=l;'*i;print t

Вход: "ab",3
Выход:

a
b
aa
ba
ab
bb
aaa
baa
aba
bba
aab
bab
abb
bbb

1

Питон, 100

Полученный из раствора @ aditsu в .

s,n=input()
L=len(s)
i=0
while i<n:i+=1;j=0;exec"x=j=j+1;t='';exec't+=s[x%L];x/=L;'*i;print t;"*L**i

Входные данные: 'ab', 3

Вывод:

b
a
ba
ab
bb
aa
baa
aba
bba
aab
bab
abb
bbb
aaa


1

Pyth, 6 байт

s^LQSE

Ожидается набор символов в качестве 1-го ввода, количество цифр в качестве 2-го. Байт можно было бы сохранить, если бы существовал однобайтовый метод для повторного доступа ко второму входу, но, увы ...

Попробуйте это онлайн здесь .

s^LQSE   Implicit: Q=input 1, E=evaluate next input
    SE   Range [1,2,...,E]
 ^LQ     Perform repeated cartesian product of Q for each element of the above
s        Flatten


0

PHP 180

Понятия не имею ... Мне лень.

<?php $f=fgetcsv(STDIN);$l=strlen($f[1]);$s=str_split($f[1]);for($i=1;$i<=$f[0];$i++)for($j=0;$j<pow($l,$i);$j++){$o="";$x=$j;for($q=0;$q<$i;$q++){$o.=$s[$x%$l];$x/=$l;}echo"$o ";}


0

Эрланг 89 (118)

Версия модуля:

-module(g).
-export([g/2]).
h(_,0)->[[]];h(X,N)->[[A|B]||A<-X,B<-h(X,N-1)].
g(X,N)->[V||Y<-lists:seq(1,N),V<-h(X,Y)].

Символы учитываются без обязательного учета (модуль и экспорт).




0

Желе , 6 байт

WẋŒpƤẎ

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

Передача функции, принимая список цифр в качестве первого аргумента и количество цифр в качестве второго. Сами по себе цифры могут быть любыми типами данных Jelly, но я использовал целые числа в ссылке TIO выше, потому что она дает лучший результат в автоматической обертке «function → full program».

объяснение

WẋŒpƤẎ                      (called with arguments, e.g. [1,2,5], 3)
Wẋ       Make {argument 2} copies of {argument 1}  (e.g. [[1,2,5],[1,2,5],[1,2,5])
    Ƥ    For each prefix:                          (e.g. 1-3 copies of [1,2,5])
  Œp       take Cartesian product of its elements
     Ẏ   Flatten one level

Декартово произведение эффективно дает нам все числа с заданным количеством цифр (в соответствии с каким префиксом мы работаем). Таким образом , мы в конечном итоге со списком списков комбинаций (сгруппированных по длине), и может выравниваться , что один уровень для того , чтобы получить список, не сгруппированных (но по - прежнему сортируются по длине, как этого требует вопрос, как и ẎБезразлично не меняйте относительный порядок элементов и Ƥсначала пытайтесь использовать более короткие префиксы).


0

05AB1E , 6 байтов

「˜Ùé

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

ã         # Cartesian product of the second input repeated the first input amount of times
          #  i.e. 3 and 'ab' → ['aaa','aab','aba','abb','baa','bab','bba','bbb']
 €Œ       # Take all the substrings for each of those results
          #  i.e. 'aba' → ['a','ab','aba','b','ba','a']
   ˜      # Flatten the list of lists
    Ù     # Remove all duplicated values
     é    # Sort the list by length

6-байтовая альтернатива:

ПРИМЕЧАНИЕ. Гибкий вывод: выводит новый список для каждой длины, все на одной и той же линии печати.
Преобразование его в один список будет на 2 байта длиннее: Lv²yã`})( Попробуйте онлайн ).

Lv²yã?

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

Lv        # Loop `y` in the range [1, integer_input]
  ²yã     #  Take the second input and create an `y` times repeated cartesian product of it
          #   i.e. y=2 and 'ab' → ['aa','ab','ba','bb']
     ?    #  Print this list (without new-line)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.