puppy
Narzędzie pobiera nazwę pliku jako wejście, a nie dokładnie to, czego można się spodziewać szczeniak zrobić: jest to strzępy!
Jak niszczyć
Rozerwij strony zębamiPodziel plik wejściowy na nowe linie.Oderwij każdą stronę łapami.Dla każdej linii (nie licząc linii) wybierz losową liczbę całkowitą,n
taką jak2 <= n <= # of characters in the line
. Podziel linię nan
niepuste nie nakładające się podciągi o losowej długości.Rozrzuć strzępy na podłodze.Wyjmij każdy podciąg każdego wiersza do unikalnej losowej nazwy pliku ([a-zA-Z0-9]
tylko dowolne spójne rozszerzenie, w tym brak, długość1 <= n <= 12
) w bieżącym katalogu. Nadpisywanie wcześniej istniejących plików w bieżącym katalogu (w tym pliku wejściowego, jeśli znajduje się on w bieżącym katalogu) jest dopuszczalne, pod warunkiem, że nie zakłóca działania przesyłania.
Wyjaśnienia
- Nigdy nie będzie danych wejściowych, w których można wykorzystać wszystkie możliwe nazwy plików.
- Pliki będą się składały tylko z drukowanych znaków ASCII (porządek 32-127) i kanałów oraz będą używać zakończeń linii w stylu UNIX / Linux (LF, a nie CRLF w stylu Windows).
- Pojedynczy znak nowej linii w plikach wyjściowych jest dopuszczalny, o ile każdy plik wyjściowy ma znak nowej linii, ale nie jest wymagany. Możesz wybrać, czy plik wejściowy zawiera końcowy znak nowej linii.
- Każda linia na wejściu będzie zawierać co najmniej 2 znaki.
- Wybrane wartości losowe należy wybrać z jednolitego rozkładu losowego na danym zestawie możliwych wartości.
Jeśli twój język nie jest w stanie wykonać operacji wejścia / wyjścia pliku, możesz zamiast tego wziąć zawartość pliku wejściowego jako dane wejściowe i wyprowadzić pary ciągów znaków reprezentujących wyjściową nazwę pliku i tekst dla tego pliku. Twoje zgłoszenie nie będzie jednak kwalifikować się do wygrania.
Przykład
Referencyjne wdrożenie:
#!/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)
Przykładowy przebieg:
$ 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
Odpowiedzi:
PowerShell v2 +,
215211 bajtówWymaga wersji 2 lub nowszej, ponieważ
Get-Random
wersja 1 nie była dostępna.Edytuj - zapisano 4 bajty przy użyciu rzutowania według tablicy znaków zamiast oddzielnego przesyłania każdej litery
Nieco niepohamowany
Wyjaśnienie
Zaczyna się od ustawienia
d
jakoNew-Alias
dlaGet-Random
, więc nie musimy pisać zaGet-Random
każdym razem, gdy go używamy (dużo). NastępnieGet-Content
nasze dane wejściowe$args
i przepuszczamy je przez pętlę za pomocą|%{...}
. Zauważ, żeGet-Content
domyślnie podzieli się na nowe wiersze (CRLF lub tylko LF), więc nie musimy robić nic więcej.Przy każdej iteracji pętli zaczynamy od sformułowania plasterków, w które ta linia zostanie przeznaczona dla Ginsu . Ustaw
$t
równą linii, z którą pracujemy, i$l
równą jej długości, a następnie stwórz kolekcję z(0..$l)
. To reprezentuje wszystkie możliwe wskaźniki znaków w naszej bieżącej linii. My wtedyGet-Random
spomiędzy(2..$l)
określić, ile by wybrać, a następnie dostać losową liczbę indeksów równa tej-c
ount. Przechowuj te wskaźniki w$b
.Wtedy też dodać na
0
i$l
na$b
, więc mamy początek i koniec naszej linii gwarancją w zbiorze indeksów. Rura że aż doSelect-Object
z-u
nique flagi, a następnie do rurySort-Object
, więc nasze indeksy są obecnie gwarantowane na początek pierwszego znaku i na końcu z ostatniego znaku i pewnej liczby losowej pomiędzy.Następnie mamy do pętli na wszystkie indeksy w
$b
z0..($b.count-2)|%{...}
. Każda z tych iteracji pętli kroimy$t
(nasz bieżący wiersz tekstu), a następnie-join
łączymy je w ciąg (zamiast w tablicę znaków). Te zostają powiązane i pozostawione na rurociągu, a my zamykamy zewnętrzną pętlę.Więc teraz mamy uporządkowany zbiór losowych plasterków każdego z wierszy tekstu. (Oznacza to, że w tym momencie, jeśli po prostu
-join
zredagujemy je z powrotem razem, otrzymamy oryginalny tekst minus nowe linie). Następnie przepuszczamy tę kolekcję przez kolejną pętlę|%{...}
i każdą iterację, z której wypisujemy ten wycinek do pliku$_>...
. Plik tworzony jest przez pobranie od 1 do 12 losowych liczb całkowitych odpowiadających kodom ASCII dla[0-9A-Za-z]
. Żaden plik nie będzie miał rozszerzenia, a>
polecenie wyświetli domyślnie nowy wiersz dla każdego pliku.Przykład
źródło