O puppy
utilitário usa um nome de arquivo como entrada e faz exatamente o que você esperaria que um filhote fizesse: ele o destrói!
Como desfiar
Rasgue as páginas com os dentesDivida o arquivo de entrada em novas linhas.Rasgue cada página com suas patasPara cada linha (sem incluir o avanço de linha), escolha um número inteiro aleatório, den
modo que2 <= n <= # of characters in the line
. Divida a linha emn
substrings não sobrepostos e não sobrepostos, de comprimento aleatório.Espalhe os fragmentos por todo o pisoCrie cada substring de cada linha para um nome de arquivo aleatório exclusivo ([a-zA-Z0-9]
apenas, qualquer extensão consistente, incluindo nenhuma, comprimento1 <= n <= 12
) no diretório atual. A substituição de arquivos pré-existentes no diretório atual (incluindo o arquivo de entrada, se estiver no diretório atual) é aceitável, desde que não interfira na execução do seu envio.
Esclarecimentos
- Nunca haverá uma entrada em que seja possível usar todos os nomes de arquivos possíveis.
- Os arquivos consistirão apenas em ASCII imprimíveis (ordinais 32-127) e feeds de linha e usarão finais de linha no estilo UNIX / Linux (LF, não o CRLF no estilo Windows).
- Uma única linha nova à direita nos arquivos de saída é aceitável desde que todo arquivo de saída tenha uma nova linha à direita, mas não é necessária. Você pode escolher se o arquivo de entrada contém ou não uma nova linha à direita.
- Cada linha na entrada conterá pelo menos 2 caracteres.
- Os valores aleatórios escolhidos devem ser escolhidos a partir de uma distribuição aleatória uniforme no conjunto determinado de valores possíveis.
Se seu idioma não puder executar a E / S do arquivo, você pode usar o conteúdo do arquivo de entrada como entrada e gerar pares de cadeias de caracteres representando o nome do arquivo e o texto desse arquivo. No entanto, seu envio não será elegível para ganhar.
Exemplo
Implementação de referência:
#!/usr/bin/env python3
import random
import string
import sys
fname = sys.argv[1]
with open(fname) as f:
txt = f.read().rstrip().split('\n')
for line in txt:
n = random.randint(2, len(line))-1
idxs = [0]+random.sample(range(1, len(line)), n)+[len(line)]
idxs.sort()
splits = []
for i in range(0, len(idxs)-1):
splits.append(line[idxs[i]:idxs[i+1]])
ofnames = []
for s in splits:
flen = random.randint(1, 10)
ofname = ''
while ofname == '' or ofname in ofnames:
ofname = ''
for i in range(flen):
ofname += random.choice(string.ascii_letters+string.digits)
ofnames.append(ofname)
with open(ofname, 'w') as f:
f.write(s)
Exemplo de execução:
$ cat bestsong.txt
Never gonna give you up
Never gonna let you down
Never gonna run around
And desert you!
$ puppy bestsong.txt
$ ls
8675309
a
bestsong.txt
cSdhg
Dq762
jq7t
ret865
rick4life
weu767g
xyzzy
$ cat 8675309
esert you!
$ cat a
Never gonna let you down
$ cat cSdhg
ive y
$ cat Dq762
And d
$ cat jq7t
Never gonna g
$ cat ret865
run arou
$ cat rick4life
Never gonna
$ cat weu767g
nd
$ cat xyzzy
ou up