子犬コマンド


20

このpuppyユーティリティは入力としてファイル名を受け取り、子犬に期待することを正確に行います。

子犬

細断方法

  1. 歯でページを切り取ります入力ファイルを改行で分割します
  2. 足で各ページを切り開きます(改行を含まない)行ごとに、nなどのランダムな整数を選択し2 <= n <= # of characters in the lineます。行をn、ランダムな長さの空ではなく重複しない部分文字列に分割します。
  3. フロア全体でシュレッドを散布する各行の各部分文字列を、現在のディレクトリ内の一意のランダムなファイル名([a-zA-Z0-9]のみ、none、lengthを含む一貫した拡張子1 <= n <= 12)に出力します。現在のディレクトリ内の既存のファイル(現在のディレクトリにある場合は入力ファイルを含む)を上書きすることは、実行中のサブミッションに干渉しない限り許容されます。

明確化

  • 考えられるすべてのファイル名を使い果たすことが可能な入力はありません。
  • ファイルは、印刷可能なASCII(序数32-127)と改行のみで構成され、UNIX / Linuxスタイルの行末(LF、WindowsスタイルのCRLFではありません)を使用します。
  • すべての出力ファイルに末尾の改行がある限り、出力ファイルの単一の末尾の改行は許容されますが、必須ではありません。入力ファイルに末尾の改行を含めるかどうかを選択できます。
  • 入力の各行には、少なくとも2文字が含まれます。
  • 選択されたランダム値は、指定された一連の値の一様なランダム分布から選択する必要があります。

言語がファイルI / 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)

実行例:

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

v1にはGet-Random使用できなかったため、v2以降が必要です。
編集-各文字を個別にキャストする代わりに、char-arrayキャスティングを使用して4バイトを保存しました

ややアンゴルフ

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

説明

for dとして設定することから始めます。そのNew-AliasためGet-RandomGet-Random使用するたびに(多く)入力する必要はありません。次にGet-Content、入力を処理し$args、を使用してループにパイプし|%{...}ます。なお、Get-Content改行(CRLFまたは単にLFのいずれか)上のデフォルトの分割によって意志、私たちはそこに追加何もする必要はありません。

ループの各反復では、この行がギンスされるスライスを定式化することから始めます。セットには、$t我々が取り組んでいるラインに等しく、そして$l、その後のコレクションを構築し、その長さに等しいです(0..$l)。これは、現在の行で可能なすべての文字インデックスを表します。次にGet-Random、その間(2..$l)から選択する数を決定し、その数に等しいインデックスのランダムな数を取得します-c。それらのインデックスをに保存し$bます。

次に、on 0$lto も追加する$bため、インデックスのコレクション内に行の開始と終了が保証されます。通じているパイプSelect-Object-u、その後niqueフラグにパイプSort-Object、私たちのインデックスは、今最初の文字と最後の最後の文字で、との間でいくつかのランダムな数字で始めることが保証されるように。

次に、我々は内のすべてのインデックスを超えるループしている$b0..($b.count-2)|%{...}。これらのループの繰り返しのそれぞれで、スライス$t(現在のテキスト行)をスライス-joinし、それらを(文字配列ではなく)文字列にまとめます。それらはまとめられてパイプラインに残り、外側のループを閉じます。

これで、各テキスト行のランダムなスライスの順序正しいコレクションができました。(つまり、この時点で-joinそれらを一緒に戻すと、元のテキストから改行を除いたものが得られます。)次に、そのコレクションを別のループにパイプ処理し|%{...}、各スライスをでファイルに出力します$_>...。ファイルは、のASCIIコードに対応する1〜12個のランダムな整数を取ることで作成されます[0-9A-Za-z]。ファイルには拡張子がありません。>コマンドはすべてのファイルでデフォルトで末尾の改行を出力します。

実行例

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.