该puppy
实用程序将文件名作为输入,并且完全按照您希望小狗执行的操作:将它切碎!
如何切碎
用牙齿撕开页面将输入文件换行。用爪子撕开每一页对于每一行(不包括换行符),选择一个随机整数,n
例如2 <= n <= # of characters in the line
。将行拆分n
为随机长度的非空非重叠子字符串。将碎片分散在整个地板上在当前目录中,将每行的每个子字符串输出到唯一的随机文件名([a-zA-Z0-9]
仅,任何一致的扩展名,包括none和length1 <= n <= 12
)。只要不干扰提交的运行,就可以覆盖当前目录中的现有文件(包括输入文件,如果它位于当前目录中)。
澄清说明
- 永远不会有可能耗尽所有可能的文件名的输入。
- 文件将仅包含可打印的ASCII(序号32-127)和换行符,并将使用UNIX / Linux样式的行尾(LF,而不是Windows样式的CRLF)。
- 只要每个输出文件都具有尾随换行符,就可以接受输出文件中的尾随换行符,但这不是必需的。您可以选择输入文件是否包含尾随换行符。
- 输入中的每一行将至少包含2个字符。
- 所选的随机值必须从给定的一组可能值的均匀随机分布中选择。
如果您的语言无法执行文件I / O,则可以将输入文件的内容作为输入,然后输出代表输出文件名和该文件文本的字符串对。但是,您提交的内容将不符合获奖资格。
例
参考实现:
#!/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)
示例运行:
$ 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