L' puppy
utilità prende un nome file come input e fa esattamente quello che ti aspetteresti da un cucciolo: lo distrugge!
Come distruggere
Strappare le pagine con i dentiDividere il file di input su nuove righe.Strappa ogni pagina con le tue zampePer ogni riga (escluso il linefeed), scegli un numero intero casualen
tale che2 <= n <= # of characters in the line
. Dividi la linea inn
sottostringhe non vuote non sovrapposte di lunghezza casuale.Spargi i frammenti su tutto il pavimento.Invia ogni sottostringa di ogni riga a un nome file casuale univoco ([a-zA-Z0-9]
solo, qualsiasi estensione coerente incluso nessuno, lunghezza1 <= n <= 12
) nella directory corrente. La sovrascrittura di file preesistenti all'interno della directory corrente (incluso il file di input, se presente nella directory corrente) è accettabile, purché non interferisca con l'inoltro in esecuzione.
chiarimenti
- Non ci sarà mai un input in cui è possibile utilizzare tutti i nomi file possibili.
- I file saranno costituiti solo da ASCII stampabili (ordinali 32-127) e avanzamenti di riga e utilizzeranno terminazioni di linea in stile UNIX / Linux (LF, non CRLF in stile Windows).
- È accettabile una singola riga finale finale nei file di output, purché ogni file di destinazione abbia una nuova riga finale, ma non è necessaria. È possibile scegliere se il file di input contiene o meno una nuova riga finale.
- Ogni riga nell'input conterrà almeno 2 caratteri.
- I valori casuali scelti devono essere scelti da una distribuzione casuale uniforme sull'insieme dato di possibili valori.
Se la tua lingua non è in grado di eseguire l'I / O del file, puoi invece prendere il contenuto del file di input come input e generare coppie di stringhe che rappresentano il nome del file di output e il testo per quel file. Tuttavia, il tuo invio non sarà idoneo alla vincita.
Esempio
Implementazione di riferimento:
#!/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)
Esempio di esecuzione:
$ 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