La commande chiot


20

L' puppyutilitaire prend un nom de fichier en entrée et fait exactement ce que vous attendez d'un chiot: il le déchiquette!

chiot

Comment déchiqueter

  1. Déchirez les pages avec vos dents Divisez le fichier d'entrée sur les nouvelles lignes.
  2. Déchirez chaque page avec vos pattes Pour chaque ligne (sans compter le saut de ligne), choisissez un entier aléatoire ntel que 2 <= n <= # of characters in the line. Fractionnez la ligne en nsous-chaînes non vides non chevauchantes de longueur aléatoire.
  3. 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, longueur 1 <= 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:


3

PowerShell v2 +, 215 211 octets

nal d Get-Random;gc $args[0]|%{$b=d(0..($l=($t=$_).length)) -C(d(2..$l));$b=$b+0+$l|select -u|sort;0..($b.count-2)|%{-join($t[$b[$_]..($b[$_+1]-1)])}}|%{$_>(-join[char[]](d(48..57+65..90+97..122) -c(d(1..12))))}

Nécessite v2 ou plus récent car la v1 n'était pas Get-Randomdisponible.
Modifier - enregistré 4 octets en utilisant la conversion de tableau de caractères au lieu de convertir individuellement chaque lettre

Assez non golfé

Get-Content $args[0]|ForEach-Object{
  $t=$_
  $l=$t.length
  $b=Get-Random(0..$l) -Count(Get-Random(2..$l))
  $b=$b+0+$l|Select-Object -unique|Sort-Object
  0..($b.count-2)|ForEach-Object{
    -join($t[$b[$_]..($b[$_+1]-1)])
  }
}|ForEach-Object{
  $_>(-join[char[]](Get-Random(48..57+65..90+97..122) -count(Get-Random(1..12))))
}

Explication

Commence avec le réglage dcomme New-Aliasfor Get-Random, donc nous n'avons pas à taper à Get-Randomchaque fois que nous l'utilisons (beaucoup). Nous avons ensuite Get-Contentde notre entrée $argset les canaliser à travers une boucle avec |%{...}. Notez que Get-Contentsera 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 ensuite Get-Randomentre les deux (2..$l)pour déterminer combien sélectionner, puis obtenir un nombre aléatoire d'indices égal à ce -cnombre. Stockez ces indices dans $b.

Nous avons ensuite ajouter aussi 0et $là $b, nous avons donc le début et la fin de notre ligne garanti dans la collection d'indices. Canalisez cela jusqu'à Select-Objectavec le -udrapeau nique, puis dirigez-le vers Sort-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 $bavec 0..($b.count-2)|%{...}. Chacune de ces itérations de boucle, nous découpons $t(notre ligne de texte actuelle) puis -joinles 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 -joinensemble, 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

Exemple d'exécution

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.