Команда цуценя


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 або новіша Get-Randomверсія, оскільки v1 не була доступна.
Редагувати - збережено 4 байти, використовуючи кастинг char-масиву, а не окремо вводячи кожну букву

Дещо безгосподарний

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з'єднуємо їх у рядок (а не в масив char). Вони збираються і залишаються на трубопроводі, і ми закриваємо зовнішню петлю.

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

Приклад

Приклад виконання

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.