Das puppy
Dienstprogramm nimmt einen Dateinamen als Eingabe und tut genau das, was Sie von einem Welpen erwarten: Es zerfetzt ihn!
Wie wird geschreddert?
Rippen Siedie Seiten mit den Zähnen aus. TeilenSiedie Eingabedatei in Zeilenumbrüche.Zerreißen Sie jede Seite mit Ihren Pfoten. Wählen Siefür jede Zeile (ohne Zeilenvorschub) eine zufällige Ganzzahl,n
so dass2 <= n <= # of characters in the line
. Teilen Sie die Zeile inn
nicht leere, nicht überlappende Teilzeichenfolgen mit zufälliger Länge.Verteile die Schnipsel über den ganzen Boden.Gib jeden Teilstring jeder Zeile in einem eindeutigen zufälligen Dateinamen ([a-zA-Z0-9]
nur jede konsistente Erweiterung, einschließlich keine, Länge1 <= n <= 12
) im aktuellen Verzeichnis aus. Das Überschreiben bereits vorhandener Dateien im aktuellen Verzeichnis (einschließlich der Eingabedatei, sofern diese sich im aktuellen Verzeichnis befindet) ist zulässig, sofern dies nicht die Ausführung Ihrer Übermittlung beeinträchtigt.
Klarstellungen
- Es wird niemals eine Eingabe geben, bei der es möglich ist, alle möglichen Dateinamen zu verbrauchen.
- Dateien bestehen nur aus druckbarem ASCII (Ordnungszahlen 32-127) und Zeilenvorschüben und verwenden Zeilenenden im UNIX / Linux-Stil (LF, nicht Windows-CRLF).
- Eine einzelne abschließende Zeile in Ausgabedateien ist zulässig, solange jede Ausgabedatei eine abschließende Zeile enthält, dies ist jedoch nicht erforderlich. Sie können wählen, ob die Eingabedatei einen nachgestellten Zeilenumbruch enthält oder nicht.
- Jede Zeile in der Eingabe enthält mindestens 2 Zeichen.
- Die ausgewählten Zufallswerte müssen aus einer gleichmäßigen Zufallsverteilung für den gegebenen Satz möglicher Werte ausgewählt werden.
Wenn Ihre Sprache keine Datei-E / A ausführen kann, können Sie stattdessen den Inhalt der Eingabedatei als Eingabe verwenden und Zeichenfolgenpaare ausgeben, die den Ausgabedateinamen und den Text für diese Datei darstellen. Ihr Beitrag ist jedoch nicht gewinnberechtigt.
Beispiel
Referenzimplementierung:
#!/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)
Beispiellauf:
$ 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
Antworten:
PowerShell v2 +,
215211 ByteBenötigt v2 oder neuer, da v1 nicht
Get-Random
verfügbar war.Bearbeiten - Speichert 4 Bytes, indem Zeichenarray-Casting verwendet wird, anstatt jeden Buchstaben einzeln zu casten
Etwas ungolfed
Erläuterung
Beginnt mit dem Setzen
d
von aNew-Alias
fürGet-Random
, damit wir nichtGet-Random
jedes Mal (viel) tippen müssen, wenn wir es verwenden. Wir geben dannGet-Content
unseren Input ein$args
und leiten diese durch eine Schleife mit|%{...}
. Beachten Sie, dassGet-Content
standardmäßig Zeilenumbrüche (entweder CRLF oder nur LF) aufgeteilt werden, sodass dort keine zusätzlichen Schritte erforderlich sind.Bei jeder Iteration der Schleife beginnen wir mit der Formulierung der Slices, in die diese Zeile ginsuiert werden soll. Setzen Sie den
$t
Wert auf die Zeile, mit der wir arbeiten, und den$l
Wert auf die Länge, und erstellen Sie dann eine Sammlung aus(0..$l)
. Dies sind alle möglichen Zeichenindizes in unserer aktuellen Zeile. Wir bestimmen dannGet-Random
von dazwischen(2..$l)
, wie viele ausgewählt werden sollen, und erhalten dann eine zufällige Anzahl von Indizes, die dieser-c
Anzahl entsprechen. Speichern Sie diese Indizes in$b
.Wir fügen Sie dann auch auf
0
und$l
zu$b
, so dass wir den Anfang und das Ende unserer Linie haben garantiert in der Sammlung von Indizes sein. Pipe das durchSelect-Object
mit der-u
Niqueflagge, dann Pipe zuSort-Object
, so dass unsere Indizes jetzt garantiert mit dem ersten Zeichen beginnen und mit dem letzten Zeichen enden und eine zufällige Zahl dazwischen.Als nächstes durchlaufen wir alle Indizes
$b
mit0..($b.count-2)|%{...}
. Bei jeder dieser Schleifeniterationen schneiden wir$t
(unsere aktuelle Textzeile) und-join
fügen sie dann zu einer Zeichenfolge zusammen (und nicht zu einem Zeichen-Array). Diese werden gebündelt und in der Pipeline belassen, und wir schließen die äußere Schleife.Jetzt haben wir also eine geordnete Sammlung von zufälligen Schnitten in jeder der Textzeilen. (Wenn wir
-join
sie an diesem Punkt einfach wieder zusammenfügen, erhalten wir den Originaltext abzüglich der Zeilenumbrüche.) Wir leiten diese Auflistung dann durch eine weitere Schleife|%{...}
und geben diese Schicht bei jeder Iteration in eine Datei mit aus$_>...
. Die Datei wird erstellt, indem 1 bis 12 zufällige Ganzzahlen verwendet werden, die den ASCII-Codes für entsprechen[0-9A-Za-z]
. Keine Datei hat eine Erweiterung, und der>
Befehl gibt standardmäßig für jede Datei eine nachgestellte neue Zeile aus.Beispiel
quelle