Köpek yavrusu komutu


20

Yardımcı puppyprogram girdi olarak bir dosya adı alır ve bir köpek yavrusu yapmasını beklediğiniz şeyi tam olarak yapar: onu parçalara ayırır!

köpek yavrusu

Parçalama

  1. Sayfaları dişlerinizle sökün Giriş dosyasını satırsonlarına ayırın.
  2. Pençelerinden ile her sayfayı Yırt , (satır besleme hariç) her satırı için rasgele bir tamsayı almak nşekildedir 2 <= n <= # of characters in the line. Çizgiyi n, rastgele uzunlukta, boş olmayan, çakışmayan alt dizelere ayırın.
  3. Parçalamaları zemine dağıtın Her satırın her bir alt dizesini geçerli dizinde benzersiz bir rastgele dosya adına ( [a-zA-Z0-9]yalnızca, hiçbiri, uzunluk dahil olmak üzere herhangi bir tutarlı uzantıya) gönderin 1 <= n <= 12. Geçerli dizinde önceden varolan dosyaların üzerine yazma (geçerli dizinde ise giriş dosyası da dahil), gönderiminizin çalışmasını etkilemediği sürece kabul edilebilir.

Açıklamalar

  • Olası dosya adlarının tümünü kullanmanın mümkün olduğu hiçbir zaman bir girdi olmayacaktır.
  • Dosyalar yalnızca yazdırılabilir ASCII (sıra 32-127) ve satır beslemelerinden oluşacak ve UNIX / Linux tarzı satır sonlarını (Windows tarzı CRLF değil LF) kullanacaktır.
  • Çıktı dosyalarındaki tek bir son satırsonu, her çıktı dosyası bir satırsonu satırına sahip olduğu sürece kabul edilebilir, ancak zorunlu değildir. Girdi dosyasının sondaki bir yeni satır içerip içermediğini seçebilirsiniz.
  • Girişteki her satır en az 2 karakter içerecektir.
  • Seçilen rasgele değerler, verilen olası değerler kümesi üzerindeki homojen rasgele dağılımdan seçilmelidir.

Diliniz dosya G / Ç gerçekleştiremiyorsa, girdi dosyasının içeriğini girdi olarak ve çıktı dosya adını ve bu dosyanın metnini temsil eden çıktı dizeleri çiftlerini alabilirsiniz. Ancak, gönderiminiz kazanmak için uygun olmayacaktır.

Misal

Referans uygulaması:

#!/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)

Örnek çalışma:

$ 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


Yanıtlar:


3

PowerShell v2 +, 215 211 bayt

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-Randommevcut olmadığından v2 veya daha yenisini gerektirir .
Düzenle - her harfi ayrı ayrı dökmek yerine char-array döküm kullanarak 4 bayt kaydedildi

Biraz Kanunsuz

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

açıklama

For dolarak ayarlamakla başlar , bu yüzden her kullandığımızda yazmamız gerekmez (çok). Biz daha sonra girdilerimizi ve bunları bir döngü üzerinden geçiriyoruz . Varsayılan olarak yeni satırlara (CRLF veya sadece LF) bölüneceğini unutmayın , bu nedenle orada başka bir şey yapmamız gerekmiyor.New-AliasGet-RandomGet-RandomGet-Content$args|%{...}Get-Content

Döngünün her yinelemesi, bu çizginin Ginsu'd'a gireceği dilimleri formüle ederek başlıyoruz . Set $tBirlikte çalıştığımız hattına eşit ve $lo andan itibaren bir koleksiyon oluşturmak, kendi uzunluğuna eşit (0..$l). Bu, mevcut satırımızdaki tüm olası karakter indekslerini temsil eder. Sonra Biz Get-Randomarasından (2..$l)seçmek için kaç belirlemek ve ardından endeks rastgele bir sayı almak için o kadar eşit -cayesi. Bu dizinleri $b.

Sonra da eklemek 0ve $liçin $bbiz endekslerin koleksiyonunda olması garanti eden hattın başını ve sonunu zorunda. Boru o aracılığıyla Select-Objectile -unique bayrak, daha sonra boru Sort-Objectbizim endeksleri şimdi ilk karakteri ve sonunda son karakteri ile de aradaki bazı rasgele sayı ile başlamak garanti edilir, böylece.

Sonra, tüm indeksleri üzerinde döngü ediyoruz $bile 0..($b.count-2)|%{...}. Bu döngü yinelemelerinin her biri, dilimliyoruz $t(mevcut metin -joinsatırımız ) ve sonra bunları bir karakter dizisi yerine bir dize haline getiriyoruz. Bunlar toplanıp boru hattında bırakılır ve dış döngüyü kapatırız.

Şimdi, metin satırlarının her birinin rastgele dilimlerden oluşan sıralı bir koleksiyonumuz var. (Yani, bu noktada, -joinonları tekrar birlikte düzenlersek, orijinal metni eksi yeni satırlar alırız.) Sonra bu koleksiyonu başka bir döngüden |%{...}ve bu dilimi bir dosyaya çıkardığımız her bir yinelemeyle birleştiririz $_>.... Dosya, ASCII kodlarına karşılık gelen 1 ila 12 rasgele tam sayı alınarak oluşturulur [0-9A-Za-z]. Hiçbir dosya bir uzantıya sahip olmaz ve >komut her dosyada varsayılan olarak bir satırsonu çıkarır.

Misal

Örnek çalışma

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.