Polecenie szczeniaka

20

puppyNarzędzie pobiera nazwę pliku jako wejście, a nie dokładnie to, czego można się spodziewać szczeniak zrobić: jest to strzępy!

szczeniak

Jak niszczyć

  1. Rozerwij strony zębami Podziel plik wejściowy na nowe linie.
  2. Oderwij każdą stronę łapami. Dla każdej linii (nie licząc linii) wybierz losową liczbę całkowitą, ntaką jak 2 <= n <= # of characters in the line. Podziel linię na nniepuste nie nakładające się podciągi o losowej długości.
  3. 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
Mego
źródło

Odpowiedzi:

3

PowerShell v2 +, 215 211 bajtów

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

Wymaga wersji 2 lub nowszej, ponieważ Get-Randomwersja 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

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

Wyjaśnienie

Zaczyna się od ustawienia djako New-Aliasdla Get-Random, więc nie musimy pisać za Get-Randomkażdym razem, gdy go używamy (dużo). Następnie Get-Contentnasze dane wejściowe $argsi przepuszczamy je przez pętlę za pomocą |%{...}. Zauważ, że Get-Contentdomyś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 $trówną linii, z którą pracujemy, i $lró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 wtedy Get-Randomspomiędzy (2..$l)określić, ile by wybrać, a następnie dostać losową liczbę indeksów równa tej -count. Przechowuj te wskaźniki w $b.

Wtedy też dodać na 0i $lna $b, więc mamy początek i koniec naszej linii gwarancją w zbiorze indeksów. Rura że aż do Select-Objectz -unique flagi, a następnie do rury Sort-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 $bz 0..($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 -joinzredagujemy 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

Przykładowy przebieg

AdmBorkBork
źródło