Perintah anak anjing

20

The puppyutilitas mengambil nama file sebagai input, dan tidak persis apa yang Anda harapkan anak anjing untuk melakukan: itu cabik itu!

anak anjing

Cara rusak

  1. Merobek halaman dengan gigi Anda. Pisahkan file input pada baris baru.
  2. Robek setiap halaman dengan kaki Anda Untuk setiap baris (tidak termasuk linefeed), pilih bilangan bulat acak nsedemikian rupa 2 <= n <= # of characters in the line. Pisahkan garis menjadi nsubstring non-kosong yang tidak tumpang tindih dengan panjang acak.
  3. 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, panjang 1 <= 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
Mego
sumber
Terkait , Terkait .
kucing
'rick4life' rofl
Rɪᴋᴇʀ

Jawaban:

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

Membutuhkan v2 atau yang lebih baru karena v1 tidak Get-Randomtersedia.
Sunting - disimpan 4 byte dengan menggunakan casting char-array alih-alih casting individual setiap huruf

Agak Tidak Diganggu

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

Penjelasan

Mulai dengan pengaturan dsebagai New-Aliasuntuk Get-Random, jadi kita tidak perlu mengetik Get-Randomsetiap kali kita menggunakannya (banyak). Kami kemudian Get-Contentdari input kami $argsdan menyalurkan melalui loop dengan |%{...}. Perhatikan bahwa Get-Contentsecara 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 $tsama dengan garis yang kami kerjakan, dan $lsama dengan panjangnya, lalu buat koleksi dari (0..$l). Ini mewakili semua kemungkinan indeks karakter di baris kami saat ini. Kami kemudian Get-Randomdari antara (2..$l)untuk menentukan berapa banyak untuk memilih, dan kemudian mendapatkan jumlah indeks acak yang sama dengan -count itu. Simpan indeks tersebut di $b.

Kami kemudian juga menambahkan 0dan $luntuk $b, sehingga kami memiliki awal dan akhir dari garis kami dijamin berada dalam koleksi indeks. Pipa yang sampai ke Select-Objectdengan -ubendera nique, lalu pipa ke Sort-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 $bdengan 0..($b.count-2)|%{...}. Masing-masing iterasi loop, kami mengiris $t(baris teks kami saat ini) dan kemudian -joinmenyatukannya 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 -joinmenyatukannya 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

Contoh dijalankan

AdmBorkBork
sumber