강아지 명령


20

puppy유틸리티는 파일 이름을 입력으로 취하고 강아지가 기대하는 것을 정확하게 수행합니다.

강아지

파쇄하는 방법

  1. 이빨로 페이지를 찢어 입력 파일을 개행으로 나눕니다.
  2. 발로 각 페이지를 찢습니다 (줄 바꿈 제외) 각 줄에 대해 다음 n과 같이 임의의 정수를 선택하십시오 2 <= n <= # of characters in the line. 줄을 n임의 길이의 비어 있지 않은 겹치지 않는 하위 문자열 로 분할하십시오 .
  3. 바닥 전체에 조각을 흩뿌 려라 현재 줄에서 각 줄의 각 부분 문자열을 고유 한 임의의 파일 이름 ( [a-zA-Z0-9]없음, 길이를 포함한 일정한 확장명으로 만 출력)으로 출력합니다 1 <= n <= 12. 제출을 실행하는 데 방해가되지 않는 한 현재 디렉토리 (기존 디렉토리에있는 경우 입력 파일 포함) 내에 기존 파일을 겹쳐 쓰는 것은 허용됩니다.

설명

  • 가능한 모든 파일 이름을 모두 사용할 수있는 입력은 없습니다.
  • 파일은 인쇄 가능한 ASCII (순서 32-127) 및 줄 바꿈으로 구성되며 UNIX / Linux 스타일 줄 끝 (Windows 스타일 CRLF가 아닌 LF)을 사용합니다.
  • 모든 출력 파일에 후행 줄 바꿈이있는 한 출력 파일에서 하나의 후행 줄 바꿈이 허용되지만 필수는 아닙니다. 입력 파일에 후행 줄 바꿈이 포함 될지 여부를 선택할 수 있습니다.
  • 입력의 각 줄에는 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 +, 215211 바이트

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 이상이 필요합니다 .
편집-각 문자를 개별적으로 캐스팅하는 대신 문자 배열 캐스팅을 사용하여 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것으로 시작 하므로 사용할 때마다 많이 입력 할 필요가 없습니다 . 그런 다음 입력을 하고와 루프를 통해 파이프를 파이프합니다 . 참고 줄 바꿈 (CRLF하거나 LF 중 하나)에 대한 기본 분리에 의해 의지, 우리는 거기에 추가 작업을 수행 할 필요가 없습니다.New-AliasGet-RandomGet-RandomGet-Content$args|%{...}Get-Content

루프를 반복 할 때 마다이 줄을 Ginsu 할 슬라이스를 공식화합니다 . 설정은 $t우리가 작업중인 라인에 동일하고, $l다음에서 컬렉션을 구성, 길이 같음 (0..$l). 이것은 현재 줄에서 가능한 모든 문자 인덱스를 나타냅니다. 그런 다음 선택할 수를 결정하기 위해 그 Get-Random사이 (2..$l)에서 임의의 수의 인덱스를 얻습니다 -c. 해당 지수를에 저장하십시오 $b.

우리는 또한 0and $l에 더하기 $b때문에, 우리는 라인의 시작과 끝이 인덱스 수집에 있다고 보장합니다. 파이프가 통해에 Select-Object-unique 플래그에 다음 파이프 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.