O terminal pode calcular combinações?

0

Eu gostaria de saber se o terminal ubuntu pode calcular combinações diferentes (como nCr em matemática). Mas eu não quero apenas o número de combinações possíveis, mas as combinações em si.

Atualização: depois de mais pesquisas, descobri que não preciso de uma calculadora de combinação, mas sim de uma permutação.

    
por Rickie Hammonds 26.09.2015 / 20:18

2 respostas

3

O próprio shell tem um utilitário para gerar várias combinações. Eu não tenho certeza do termo técnico para isso, mas aqui está como funciona:

$ echo {1,2,3}{1,2,3}{1,2,3}                                
111 112 113 121 122 123 131 132 133 211 212 213 221 222 223 231 232 233 311 312 313 321 322 323 331 332 333

$ echo {a,b,c}{a,b,c}{a,b,c}                                
aaa aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc caa cab cac cba cbb cbc cca ccb ccc

$ echo {0,1}{0,1}{0,1}{0,1}
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
Não é ideal, porém, se bem me lembro, eu estava tentando gerar uma lista de números de telefone ucranianos (para fins científicos, é claro), e acabei com erros. Então shell tem seus limites. Uma ferramenta escrita em uma linguagem de programação específica pode ser de melhor uso.

    
por Sergiy Kolodyazhnyy 26.09.2015 / 23:23
2

Eu não conheço nenhuma ferramenta de linha de comando para isso, mas você pode escrever facilmente usando a biblioteca itertools do python. Por exemplo, acabei de escrever este script:

#!/usr/bin/env python2

"""
Script based in part on StackOverflow answer at:
http://stackoverflow.com/questions/17434070/generating-all-combinations-of-a-list-in-python
"""

import sys
import itertools

if len(sys.argv) <= 1:
    print 'No arguments provided; exiting.'
    sys.exit()

args = sys.argv[1:]
count = 0

for combolength in range(0, len(args) + 1):
    for subset in itertools.combinations(args, combolength):
        print '#' + str(count) + ': ' + ' '.join(subset)
        count += 1

Assumindo que você tenha o python2.3 + instalado, você pode colar esse script em um arquivo chamado 'combinações.py' e então executar este comando em um terminal enquanto estiver no diretório de contenção:

python combinations.py arg1 arg2 arg3 arg4 arg5

Ele aceita qualquer número de argumentos.

Por exemplo, se eu quiser todas as combinações dos números 1, 2, 3 e 4, posso executar:

python combinations.py 1 2 3 4

E eu vou pegar:

#0: 
#1: 1
#2: 2
#3: 3
#4: 4
#5: 1 2
#6: 1 3
#7: 1 4
#8: 2 3
#9: 2 4
#10: 3 4
#11: 1 2 3
#12: 1 2 4
#13: 1 3 4
#14: 2 3 4
#15: 1 2 3 4

Não precisa ser números. Você pode tentar:

python combinations.py pig cow duck

e obtenha:

#0: 
#1: pig
#2: cow
#3: duck
#4: pig cow
#5: pig duck
#6: cow duck
#7: pig cow duck

Espero que tenha ajudado!

P.S. Se você está perdendo python por algum motivo, você pode instalá-lo com:

sudo apt-get install python

A versão padrão deve estar bem.

Atualização: Fiz alguns pequenos erros de digitação na primeira vez, então não deixe de rever a minha resposta se você ficar confuso no começo.

    
por Ben Wiley 26.09.2015 / 23:11