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
Réponses:
PowerShell v2 +,
215211 octetsNécessite v2 ou plus récent car la v1 n'était pas
Get-Random
disponible.Modifier - enregistré 4 octets en utilisant la conversion de tableau de caractères au lieu de convertir individuellement chaque lettre
Assez non golfé
Explication
Commence avec le réglage
d
commeNew-Alias
forGet-Random
, donc nous n'avons pas à taper àGet-Random
chaque fois que nous l'utilisons (beaucoup). Nous avons ensuiteGet-Content
de notre entrée$args
et les canaliser à travers une boucle avec|%{...}
. Notez queGet-Content
sera par défaut divisé sur les sauts de ligne (CRLF ou simplement LF), nous n'avons donc pas besoin de faire quoi que ce soit supplémentaire.À chaque itération de la boucle, nous commençons par formuler les tranches dans lesquelles cette ligne va être Ginsu'd . Définissez
$t
égal à la ligne avec laquelle nous travaillons et$l
égal à sa longueur, puis construisez une collection à partir de(0..$l)
. Cela représente tous les indices de caractères possibles dans notre ligne actuelle. Nous avons ensuiteGet-Random
entre les deux(2..$l)
pour déterminer combien sélectionner, puis obtenir un nombre aléatoire d'indices égal à ce-c
nombre. Stockez ces indices dans$b
.Nous avons ensuite ajouter aussi
0
et$l
à$b
, nous avons donc le début et la fin de notre ligne garanti dans la collection d'indices. Canalisez cela jusqu'àSelect-Object
avec le-u
drapeau nique, puis dirigez-le versSort-Object
, de sorte que nos indices sont désormais garantis pour commencer par le premier caractère et se terminer par le dernier caractère, et un certain nombre aléatoire entre les deux.Ensuite, nous parcourons tous les indices
$b
avec0..($b.count-2)|%{...}
. Chacune de ces itérations de boucle, nous découpons$t
(notre ligne de texte actuelle) puis-join
les intégrons ensemble dans une chaîne (plutôt qu'un tableau de caractères). Ceux-ci sont regroupés et laissés sur le pipeline, et nous fermons la boucle externe.Nous avons donc maintenant une collection ordonnée de tranches aléatoires de chacune des lignes de texte. (Autrement dit, à ce stade, si nous les éditions simplement
-join
ensemble, nous obtiendrons le texte d'origine moins les sauts de ligne.) Nous redirigeons ensuite cette collection via une autre boucle|%{...}
et chaque itération avec laquelle nous éditons cette tranche dans un fichier$_>...
. Le fichier est créé en prenant de 1 à 12 entiers aléatoires correspondant aux codes ASCII pour[0-9A-Za-z]
. Aucun fichier n'aura une extension, et la>
commande affichera un retour à la ligne par défaut sur chaque fichier.Exemple
la source