puppy
Утилита принимает имя файла в качестве входных данных, и делает именно то , что можно было бы ожидать щенка делать: он измельчает его!
Как измельчить
Вырвать страницы зубами.Разбить входной файл на новые строки.Разрывайте каждую страницу своими лапами.Для каждой строки (не включая перевод строки) выберите случайное целое число,n
такое что2 <= n <= # of characters in the line
. Разбейте строку наn
непустые неперекрывающиеся подстроки случайной длины.Разбросайте клочья по всему полу.Выведите каждую подстроку каждой строки в уникальное случайное имя файла ([a-zA-Z0-9]
только с любым последовательным расширением, не включая ни одной длины1 <= n <= 12
) в текущем каталоге. Перезапись уже существующих файлов в текущем каталоге (включая входной файл, если он находится в текущем каталоге) допустима, если это не мешает выполнению отправки.
Разъяснения
- Там никогда не будет ввода, где можно использовать все возможные имена файлов.
- Файлы будут состоять только из печатного ASCII (порядковые номера 32-127) и перевода строки и будут использовать окончания строк в стиле UNIX / Linux (LF, а не CRLF в стиле Windows).
- Одна конечная новая строка в выходных файлах допустима, если в каждом выходном файле есть конечная новая строка, но это не обязательно. Вы можете выбрать, будет ли входной файл содержать завершающий перевод строки.
- Каждая строка во входных данных будет содержать не менее 2 символов.
- Выбранные случайные значения должны выбираться из равномерного случайного распределения на заданном наборе возможных значений.
Если ваш язык не может выполнить файловый ввод / вывод, вы можете вместо этого взять содержимое входного файла в качестве входного и вывести пары строк, представляющих имя выходного файла и текст для этого файла. Тем не менее, ваша заявка не будет иметь право на победу.
пример
Эталонная реализация:
#!/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
Ответы:
PowerShell v2 +,
215211 байтТребуется версия v2 или новее, поскольку версия v1
Get-Random
недоступна.Edit - сохранил 4 байта, используя приведение к массиву символов вместо индивидуального приведения каждой буквы
Несколько Ungolfed
объяснение
Начинается с установки
d
какNew-Alias
дляGet-Random
, так что нам не нужно печататьGet-Random
каждый раз, когда мы его используем (много). ЗатемGet-Content
мы вводим данные$args
и передаем их через цикл с помощью|%{...}
. Обратите внимание, чтоGet-Content
по умолчанию будет разделяться на новые строки (или CRLF или просто LF), поэтому нам не нужно делать ничего дополнительного там.Каждую итерацию цикла мы начинаем с формулировки срезов, в которые эта строка будет добавлена Джинсу . Установите значение
$t
равное линии, с которой мы работаем, и$l
равное ее длине, затем создайте коллекцию из(0..$l)
. Это представляет все возможные индексы символов в нашей текущей строке. ЗатемGet-Random
из промежутка между(2..$l)
определить , сколько выбрать, а затем получить случайное число индексов , равный-c
р а ф. Храните эти индексы в$b
.Затем мы также добавляем
0
и$l
к$b
, так что у нас есть начало и конец нашей строки, которые гарантированно находятся в коллекции индексов. Труба , которая доSelect-Object
с-u
Nique флагом, то трубами кSort-Object
, так что наши показатели в настоящее время гарантированы начать с первым символом и концом с последним символом и некоторым случайным числом между ними.Далее мы перебираем все индексы
$b
с0..($b.count-2)|%{...}
. Каждую из этих итераций цикла мы разделяем$t
(наша текущая строка текста) и затем-join
объединяем их в строку (а не в массив символов). Они собираются и оставляются на конвейере, и мы закрываем внешний цикл.Итак, теперь у нас есть упорядоченная коллекция случайных фрагментов каждой из строк текста. (Это означает, что на данном этапе, если мы просто
-join
отредактируем их вместе, мы получим исходный текст минус переводы строки.) Затем|%{...}
мы передаем эту коллекцию через другой цикл и на каждой итерации мы выводим этот фрагмент в файл$_>...
. Файл создается путем взятия от 1 до 12 случайных целых чисел, соответствующих кодам ASCII для[0-9A-Za-z]
. Ни один файл не будет иметь расширения, и>
команда будет выводить завершающий символ новой строки по умолчанию для каждого файла.пример
источник