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


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.