이 과제는 전체 파일을 메모리로 읽지 않고 잠재적으로 큰 파일에서 임의의 행을 읽는 것입니다.
입력
n
텍스트 파일 의 정수 및 이름입니다.
산출
n
대체하지 않고 무작위로 균일하게 선택된 텍스트 파일의 행.
n
파일의 1-행 수 범위에 있다고 가정 할 수 있습니다 .
n
당신이 얻는 대답이 균일 한 범위에서 무작위로 숫자를 샘플링 할 때주의하십시오 . rand()%n
예를 들어 C에서 균일하지 않다. 모든 결과는 똑같이 가능해야합니다.
규칙과 제한
텍스트 파일의 각 줄은 같은 문자 수를 가지며 80자를 넘지 않습니다.
코드는 다음을 제외하고 텍스트 파일의 내용을 읽지 않아야합니다.
- 그 라인이 출력합니다.
- 텍스트 파일에 한 줄에 몇 개의 문자가 있는지 알아내는 첫 번째 행.
텍스트 파일의 각 문자는 정확히 1 바이트를 사용한다고 가정 할 수 있습니다.
줄 구분자는 1 바이트 길이 인 것으로 가정합니다. 솔루션은 이러한 요구를 지정하는 경우에만 2 바이트 길이의 줄 구분 기호를 사용할 수 있습니다. 마지막 줄이 줄 구분자로 끝나는 것으로 가정 할 수도 있습니다.
답변은 완전한 프로그램이어야하지만 편리한 방법으로 입력을 지정할 수 있습니다.
언어와 라이브러리
원하는 언어 나 라이브러리를 사용할 수 있습니다.
노트
파일의 줄 수를 계산하는 데 문제가있었습니다. nimi가 주석에서 지적한 것처럼 파일 크기와 줄 당 문자 수에서 이것을 추론 할 수 있습니다.
자극
채팅에서 일부 사람들은 이것이 "Y없이 X로"질문인지 물었습니다. 나는 제한이 비정상적으로 인공적인지를 묻기 위해 이것을 해석합니다.
거대한 파일에서 무작위로 라인을 샘플링하는 작업은 드문 일이 아니며 실제로 내가해야 할 일입니다. 이를 수행하는 한 가지 방법은 bash입니다.
shuf -n <num-lines>
그러나 전체 파일을 읽을 때 큰 파일의 경우 속도가 매우 느립니다.
fseek
에서는 불가능합니다. 또한 n
파일의 줄 수보다 크면 어떻게됩니까?
sum()
입니다. 파일을 메모리로 읽지 않는 것은 명확하고 일관된 제한 사항이며, 이는 결코 임의적이지 않습니다. 언어 차이로 해결할 수없는 메모리보다 큰 파일로 테스트 할 수 있습니다. 또한 실제 응용 프로그램이 있습니다 (골프에는 필요하지 않지만 ...).