L' puppy
utilitaire prend un nom de fichier en entrée et fait exactement ce que vous attendez d'un chiot: il le déchiquette!
Comment déchiqueter
Déchirez les pages avec vos dentsDivisez le fichier d'entrée sur les nouvelles lignes.Déchirez chaque page avec vos pattesPour chaque ligne (sans compter le saut de ligne), choisissez un entier aléatoiren
tel que2 <= n <= # of characters in the line
. Fractionnez la ligne enn
sous-chaînes non vides non chevauchantes de longueur aléatoire.Dispersez les lambeaux sur tout le sol.Exportez chaque sous-chaîne de chaque ligne vers un nom de fichier aléatoire unique ([a-zA-Z0-9]
uniquement, toute extension cohérente, y compris aucune, longueur1 <= n <= 12
) dans le répertoire en cours. Le remplacement des fichiers préexistants dans le répertoire actuel (y compris le fichier d'entrée, s'il se trouve dans le répertoire actuel) est acceptable, tant qu'il n'interfère pas avec l'exécution de votre soumission.
Clarifications
- Il n'y aura jamais d'entrée où il est possible d'utiliser tous les noms de fichiers possibles.
- Les fichiers seront constitués uniquement de caractères ASCII imprimables (ordinaux 32-127) et de sauts de ligne, et utiliseront des fins de ligne de style UNIX / Linux (LF, pas le CRLF de style Windows).
- Une seule nouvelle ligne de fin dans les fichiers de sortie est acceptable tant que chaque fichier de sortie a une nouvelle ligne de fin, mais n'est pas obligatoire. Vous pouvez choisir si le fichier d'entrée contient ou non une nouvelle ligne de fin.
- Chaque ligne de l'entrée contiendra au moins 2 caractères.
- Les valeurs aléatoires choisies doivent être choisies parmi une distribution aléatoire uniforme sur l'ensemble donné de valeurs possibles.
Si votre langue n'est pas en mesure d'effectuer des E / S sur les fichiers, vous pouvez plutôt prendre le contenu du fichier d'entrée en entrée et produire des paires de chaînes représentant le nom du fichier de sortie et le texte de ce fichier. Cependant, votre soumission ne sera pas éligible pour gagner.
Exemple
Implémentation de référence:
#!/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)
Exemple d'exécution:
$ 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