The puppy
utilitas mengambil nama file sebagai input, dan tidak persis apa yang Anda harapkan anak anjing untuk melakukan: itu cabik itu!
Cara rusak
Merobek halaman dengan gigi Anda.Pisahkan file input pada baris baru.Robek setiap halaman dengan kaki AndaUntuk setiap baris (tidak termasuk linefeed), pilih bilangan bulat acakn
sedemikian rupa2 <= n <= # of characters in the line
. Pisahkan garis menjadin
substring non-kosong yang tidak tumpang tindih dengan panjang acak.Menyebarkan cabikan di seluruh lantai.Keluarkan setiap substring dari setiap baris ke nama file acak yang unik ([a-zA-Z0-9]
hanya, setiap ekstensi yang konsisten termasuk tidak ada, panjang1 <= n <= 12
) di direktori saat ini. Menimpa file yang sudah ada sebelumnya dalam direktori saat ini (termasuk file input, jika ada di direktori saat ini) dapat diterima, asalkan tidak mengganggu kiriman Anda yang sedang berjalan.
Klarifikasi
- Tidak akan pernah ada input di mana dimungkinkan untuk menggunakan semua nama file yang mungkin.
- File hanya akan terdiri dari ASCII (ordinals 32-127) dan printfeed yang dapat dicetak, dan akan menggunakan ujung garis gaya UNIX / Linux (LF, bukan CRLF gaya Windows).
- Satu baris baru dalam file output dapat diterima selama setiap file output memiliki baris baru, tetapi tidak diperlukan. Anda dapat memilih apakah file input berisi baris baru atau tidak.
- Setiap baris dalam input akan mengandung setidaknya 2 karakter.
- Nilai acak yang dipilih harus dipilih dari distribusi acak seragam pada set nilai yang mungkin diberikan.
Jika bahasa Anda tidak dapat melakukan file I / O, Anda dapat mengambil konten file input sebagai input, dan pasangan pasangan string yang mewakili nama file output dan teks untuk file tersebut. Namun, kiriman Anda tidak akan memenuhi syarat untuk menang.
Contoh
Implementasi referensi:
#!/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)
Contoh dijalankan:
$ 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
Jawaban:
PowerShell v2 +,
215211 byteMembutuhkan v2 atau yang lebih baru karena v1 tidak
Get-Random
tersedia.Sunting - disimpan 4 byte dengan menggunakan casting char-array alih-alih casting individual setiap huruf
Agak Tidak Diganggu
Penjelasan
Mulai dengan pengaturan
d
sebagaiNew-Alias
untukGet-Random
, jadi kita tidak perlu mengetikGet-Random
setiap kali kita menggunakannya (banyak). Kami kemudianGet-Content
dari input kami$args
dan menyalurkan melalui loop dengan|%{...}
. Perhatikan bahwaGet-Content
secara default akan dibagi pada baris baru (baik CRLF atau hanya LF), jadi kami tidak perlu melakukan apa pun tambahan di sana.Setiap iterasi dari loop, kita mulai dengan merumuskan irisan-irisan yang akan diikutsertakan dalam Ginsu . Tetapkan
$t
sama dengan garis yang kami kerjakan, dan$l
sama dengan panjangnya, lalu buat koleksi dari(0..$l)
. Ini mewakili semua kemungkinan indeks karakter di baris kami saat ini. Kami kemudianGet-Random
dari antara(2..$l)
untuk menentukan berapa banyak untuk memilih, dan kemudian mendapatkan jumlah indeks acak yang sama dengan-c
ount itu. Simpan indeks tersebut di$b
.Kami kemudian juga menambahkan
0
dan$l
untuk$b
, sehingga kami memiliki awal dan akhir dari garis kami dijamin berada dalam koleksi indeks. Pipa yang sampai keSelect-Object
dengan-u
bendera nique, lalu pipa keSort-Object
, sehingga indeks kami sekarang dijamin untuk mulai dengan karakter pertama dan berakhir dengan karakter terakhir, dan beberapa angka acak di antaranya.Selanjutnya, kami mengulang semua indeks
$b
dengan0..($b.count-2)|%{...}
. Masing-masing iterasi loop, kami mengiris$t
(baris teks kami saat ini) dan kemudian-join
menyatukannya menjadi string (bukan char-array). Mereka dibundel ke atas dan ke kiri di saluran pipa, dan kami menutup lingkaran luar.Jadi sekarang kita memiliki koleksi irisan acak masing-masing baris teks. (Artinya, pada titik ini, jika kita cukup
-join
menyatukannya kembali, kita akan mendapatkan teks asli dikurangi baris baru.) Kita kemudian menyalurkan koleksi itu melalui loop lain|%{...}
dan setiap iterasi yang kita hasilkan mengiris irisan itu ke sebuah file$_>...
. File dibuat dengan mengambil dari 1 hingga 12 bilangan bulat acak yang sesuai dengan kode ASCII untuk[0-9A-Za-z]
. Tidak ada file yang akan memiliki ekstensi, dan>
perintah akan menampilkan baris baru secara default pada setiap file.Contoh
sumber