Das Welpenkommando


20

Das puppyDienstprogramm nimmt einen Dateinamen als Eingabe und tut genau das, was Sie von einem Welpen erwarten: Es zerfetzt ihn!

Hündchen

Wie wird geschreddert?

  1. Rippen Sie die Seiten mit den Zähnen aus . Teilen Sie die Eingabedatei in Zeilenumbrüche.
  2. Zerreißen Sie jede Seite mit Ihren Pfoten. Wählen Sie für jede Zeile (ohne Zeilenvorschub) eine zufällige Ganzzahl, nso dass 2 <= n <= # of characters in the line. Teilen Sie die Zeile in nnicht leere, nicht überlappende Teilzeichenfolgen mit zufälliger Länge.
  3. 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änge 1 <= 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:


3

PowerShell v2 +, 215 211 Byte

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))))}

Benötigt v2 oder neuer, da v1 nicht Get-Randomverfügbar war.
Bearbeiten - Speichert 4 Bytes, indem Zeichenarray-Casting verwendet wird, anstatt jeden Buchstaben einzeln zu casten

Etwas ungolfed

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))))
}

Erläuterung

Beginnt mit dem Setzen dvon a New-Aliasfür Get-Random, damit wir nicht Get-Randomjedes Mal (viel) tippen müssen, wenn wir es verwenden. Wir geben dann Get-Contentunseren Input ein $argsund leiten diese durch eine Schleife mit |%{...}. Beachten Sie, dass Get-Contentstandardmäß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 $tWert auf die Zeile, mit der wir arbeiten, und den $lWert 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 dann Get-Randomvon dazwischen (2..$l), wie viele ausgewählt werden sollen, und erhalten dann eine zufällige Anzahl von Indizes, die dieser -cAnzahl entsprechen. Speichern Sie diese Indizes in $b.

Wir fügen Sie dann auch auf 0und $lzu $b, so dass wir den Anfang und das Ende unserer Linie haben garantiert in der Sammlung von Indizes sein. Pipe das durch Select-Objectmit der -uNiqueflagge, dann Pipe zu Sort-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 $bmit 0..($b.count-2)|%{...}. Bei jeder dieser Schleifeniterationen schneiden wir $t(unsere aktuelle Textzeile) und -joinfü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 -joinsie 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

Beispiellauf

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.