小狗命令


20

puppy实用程序将文件名作为输入,并且完全按照您希望小狗执行的操作:将它切碎!

小狗

如何切碎

  1. 用牙齿撕开页面将输入文件换行。
  2. 用爪子撕开每一页对于每一行(不包括换行符),选择一个随机整数,n例如2 <= n <= # of characters in the line。将行拆分n为随机长度的非空非重叠子字符串。
  3. 将碎片分散在整个地板上在当前目录中,将每行的每个子字符串输出到唯一的随机文件名([a-zA-Z0-9]仅,任何一致的扩展名,包括none和length 1 <= 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


Answers:


3

PowerShell v2 +,215211字节

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

由于v1不可Get-Random用,因此需要v2或更高版本。
编辑-通过使用字符数组转换而不是单独转换每个字母来保存4个字节

有点不满意

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

说明

从将for 设置d为开始,因此我们不必每次使用时都输入(很多)。然后,我们输入内容,并使用循环处理这些内容。请注意,默认情况下会在换行符上(CRLF或仅LF)进行拆分,因此我们无需在其中进行任何其他操作。New-AliasGet-RandomGet-RandomGet-Content$args|%{...}Get-Content

循环的每次迭代,我们都从制定将要被Ginsu放入的这条线的切片开始。设置$t等于我们正在处理的线并$l等于其长度,然后从构造一个集合(0..$l)。这代表了我们当前行中所有可能的字符索引。然后Get-Random,我们从之间(2..$l)确定要选择的数量,然后获得等于该数量的随机数的索引-c。将这些索引存储在中$b

然后,我们还在0$l上添加$b,因此我们保证行的开始和结束都在索引集合中。Select-Object使用-unique标志将其传递到,然后传递至Sort-Object,因此我们现在可以保证索引从第一个字符开始,最后一个字符以及介于两者之间的一个随机数结束。

接下来,我们遍历$bwith中的所有索引0..($b.count-2)|%{...}。每一次循环迭代,我们都将切片$t(我们当前的文本行),然后将-join它们组合在一起成为一个字符串(而不是字符数组)。这些被捆绑在一起并留在管道上,我们关闭外部循环。

因此,现在我们按顺序收集了每行文本的随机片段。(这意味着,如果现在简单地将-join它们放回原处,我们将得到原始文本减去换行符。)然后,通过另一个循环通过管道传递该集合,|%{...}并使用将该迭代输出到文件中$_>...。通过从1到12个与ASCII码相对应的随机整数创建文件[0-9A-Za-z]。没有文件将具有扩展名,并且>默认情况下,该命令将在每个文件上输出尾随换行符。

运行示例

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.