Щенячья команда


20

puppyУтилита принимает имя файла в качестве входных данных, и делает именно то , что можно было бы ожидать щенка делать: он измельчает его!

щенок

Как измельчить

  1. Вырвать страницы зубами. Разбить входной файл на новые строки.
  2. Разрывайте каждую страницу своими лапами. Для каждой строки (не включая перевод строки) выберите случайное целое число, nтакое что 2 <= n <= # of characters in the line. Разбейте строку на nнепустые неперекрывающиеся подстроки случайной длины.
  3. Разбросайте клочья по всему полу. Выведите каждую подстроку каждой строки в уникальное случайное имя файла ( [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


Ответы:


3

PowerShell v2 +, 215 211 байт

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

Требуется версия v2 или новее, поскольку версия v1 Get-Randomнедоступна.
Edit - сохранил 4 байта, используя приведение к массиву символов вместо индивидуального приведения каждой буквы

Несколько 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))))
}

объяснение

Начинается с установки 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с -uNique флагом, то трубами к Sort-Object, так что наши показатели в настоящее время гарантированы начать с первым символом и концом с последним символом и некоторым случайным числом между ними.

Далее мы перебираем все индексы $bс 0..($b.count-2)|%{...}. Каждую из этих итераций цикла мы разделяем $t(наша текущая строка текста) и затем -joinобъединяем их в строку (а не в массив символов). Они собираются и оставляются на конвейере, и мы закрываем внешний цикл.

Итак, теперь у нас есть упорядоченная коллекция случайных фрагментов каждой из строк текста. (Это означает, что на данном этапе, если мы просто -joinотредактируем их вместе, мы получим исходный текст минус переводы строки.) Затем |%{...}мы передаем эту коллекцию через другой цикл и на каждой итерации мы выводим этот фрагмент в файл $_>.... Файл создается путем взятия от 1 до 12 случайных целых чисел, соответствующих кодам ASCII для [0-9A-Za-z]. Ни один файл не будет иметь расширения, и >команда будет выводить завершающий символ новой строки по умолчанию для каждого файла.

пример

Пример запуска

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.