Lệnh cún con


20

Các puppytiện ích có một tên tập tin như là đầu vào, và thực hiện chính xác những gì bạn mong chờ một con chó con để làm: nó từng mảnh nó!

cún yêu

Làm thế nào để cắt nhỏ

  1. Xé các trang bằng răng của bạn Tách tệp đầu vào trên dòng mới.
  2. Xé từng trang bằng bàn chân của bạn Đối với mỗi dòng (không bao gồm nguồn cấp dữ liệu), hãy chọn một số nguyên ngẫu nhiên nsao cho 2 <= n <= # of characters in the line. Tách dòng thành ncác chuỗi không chồng lấp không có độ dài ngẫu nhiên.
  3. Phân tán các mảnh vụn trên khắp sàn Xuất ra từng chuỗi con của mỗi dòng thành một tên tệp ngẫu nhiên duy nhất ( [a-zA-Z0-9]chỉ, bất kỳ phần mở rộng nhất quán nào bao gồm không có, độ dài 1 <= n <= 12) trong thư mục hiện tại. Ghi đè các tệp có sẵn trong thư mục hiện tại (bao gồm cả tệp đầu vào, nếu nó nằm trong thư mục hiện tại) có thể chấp nhận được, miễn là nó không can thiệp vào việc gửi của bạn đang chạy.

Làm rõ

  • Sẽ không bao giờ có đầu vào trong đó có thể sử dụng hết tất cả các tên tệp có thể.
  • Các tệp sẽ chỉ bao gồm ASCII có thể in (thứ tự 32-127) và nguồn cấp dữ liệu và sẽ sử dụng các kết thúc dòng theo kiểu UNIX / Linux (LF, không phải CRLF kiểu Windows).
  • Một dòng mới duy nhất trong các tệp đầu ra có thể được chấp nhận miễn là mọi tệp đầu ra có một dòng mới, nhưng không bắt buộc. Bạn có thể chọn xem tệp đầu vào có chứa một dòng mới hay không.
  • Mỗi dòng trong đầu vào sẽ chứa ít nhất 2 ký tự.
  • Các giá trị ngẫu nhiên được chọn phải được chọn từ phân phối ngẫu nhiên thống nhất trên tập hợp các giá trị có thể có.

Nếu ngôn ngữ của bạn không thể thực hiện I / O tệp, thay vào đó, bạn có thể lấy nội dung của tệp đầu vào làm đầu vào và các cặp chuỗi đầu ra đại diện cho tên tệp đầu ra và văn bản cho tệp đó. Tuy nhiên, trình của bạn sẽ không đủ điều kiện để giành chiến thắng.

Thí dụ

Thực hiện tham khả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)

Chạy ví dụ:

$ 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


Câu trả lời:


3

PowerShell v2 +, 215 211 byte

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

Yêu cầu v2 hoặc mới hơn kể từ v1 không có Get-Randomsẵn.
Chỉnh sửa - đã lưu 4 byte bằng cách sử dụng phép truyền mảng char thay vì truyền riêng từng chữ cái

Hơi bất ngờ

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

Giải trình

Bắt đầu với cài đặt dNew-Aliasdành cho Get-Random, vì vậy chúng tôi không phải gõ Get-Randommỗi lần chúng tôi sử dụng nó (rất nhiều). Chúng tôi sau đó Get-Contentđầu vào của chúng tôi $argsvà dẫn những người thông qua một vòng lặp với |%{...}. Lưu ý rằng Get-Contenttheo mặc định sẽ phân chia trên các dòng mới (CRLF hoặc chỉ là LF), vì vậy chúng tôi không cần phải làm gì thêm ở đó.

Mỗi lần lặp của vòng lặp, chúng ta bắt đầu với việc xây dựng các lát mà dòng này sẽ được Ginsu'd nhập vào. Đặt $tbằng với dòng chúng tôi đang làm việc và $lbằng với độ dài của nó, sau đó tạo một bộ sưu tập từ đó (0..$l). Điều này đại diện cho tất cả các chỉ số nhân vật có thể trong dòng hiện tại của chúng tôi. Chúng tôi sau đó Get-Randomtừ giữa (2..$l)để xác định có bao nhiêu để chọn, và sau đó nhận được một số chỉ số ngẫu nhiên bằng với -count đó . Lưu trữ các chỉ số trong $b.

Sau đó chúng tôi cũng thêm 0$lvào $b, vì vậy chúng tôi có điểm đầu và điểm cuối của dòng chúng tôi được đảm bảo nằm trong bộ sưu tập các chỉ số. Đường ống xuyên qua Select-Objectvới -ucờ nique, rồi ống tới Sort-Object, vì vậy các chỉ số của chúng ta hiện được đảm bảo bắt đầu bằng ký tự đầu tiên và kết thúc bằng ký tự cuối cùng và một số ngẫu nhiên ở giữa.

Tiếp theo, chúng ta lặp qua tất cả các chỉ số trong $bvới 0..($b.count-2)|%{...}. Mỗi lần lặp lại đó, chúng tôi sẽ cắt $t(dòng văn bản hiện tại của chúng tôi) và sau đó -joinghép chúng lại thành một chuỗi (chứ không phải là một mảng char). Những cái đó được bó lại và để lại trên đường ống, và chúng tôi đóng vòng lặp bên ngoài.

Vì vậy, bây giờ chúng tôi có một bộ sưu tập theo thứ tự các lát ngẫu nhiên của từng dòng văn bản. (Có nghĩa là tại thời điểm này, nếu chúng ta đơn giản chỉnh sửa -joinchúng lại với nhau, chúng ta sẽ nhận được văn bản gốc trừ đi các dòng mới.) Sau đó, chúng ta chuyển bộ sưu tập đó qua một vòng lặp khác |%{...}và mỗi lần lặp chúng ta sẽ đưa ra lát cắt đó vào một tệp $_>.... Tệp được tạo bằng cách lấy từ 1 đến 12 số nguyên ngẫu nhiên tương ứng với mã ASCII cho [0-9A-Za-z]. Không có tệp nào có phần mở rộng và >lệnh sẽ xuất ra một dòng mới theo mặc định trên mỗi tệp.

Thí dụ

Chạy ví dụ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.