우리 모두 알다시피, 현대 운영 체제에는 스레드 스케줄러가있어 코드가 특권이없는 내부 논리를 기반으로 스레드를 예약하기 위해 다른 순서를 선택할 수 있습니다. 일반적으로 다중 스레드 코드를 설계하여 사용자에게 부과 된 비결정론이 출력에 의미있는 영향을 미치지 않도록합니다.
여기서 목표는 반대입니다. [0,99] 간격으로 정수를 인쇄하지만 OS 스레드 스케줄러로 인해 실행마다 다른 순서로 프로그램을 생성하십시오.
다음과 같이 정의 된 "충분한 비결정론"을 달성해야합니다.
순차적으로 10 번의 10 번의 시행에서 프로그램은 각 시행 내에서 최소 9 개의 순열을 생성해야합니다. 성공한 연속 10 개 중 어느쪽에 든 합당한 수의 실패한 시도 세트가있을 수 있습니다.
또는 달리 말하면, 10 개의 런의 각 블록에는 최대 2 개의 런이있어 동일한 것을 출력하는 프로그램의 100 개의 런이 필요합니다.
따라서 때때로 98과 99를 교체해도 문제가 해결되지 않습니다.
이것은 code-golf 이므로 가장 적은 바이트를 사용하는 답이 이깁니다.
사소한 점
- 출력을 한 줄에 하나씩 stdout에 기록하십시오.
- 두 개의 스레드가 stdout에 문자 쓰기를 인터리브하여 (때로는) 3 자리 숫자 또는 빈 줄과 같은 결과로 형식을 엉망으로 만들면 결과가 유효하지 않습니다
- 위의 규칙에 대한 유일한 예외는 마지막으로 필요한 숫자를 인쇄 한 후 빈 줄을 하나 만들 수 있다는 것입니다 (환영합니다).
- 필요한 값을 놓치거나 복제하면 결과가 유효하지 않습니다
- 단일 코어 프로세서에서 프로그램이 비 결정적 일 필요 는 없습니다 (만약 괜찮다면)
- 프로그램은 여전히 챌린지의 다른 요구 사항을 충족하고 스레딩 시스템이 언어의 일부이거나 언어의 표준 라이브러리 인 경우 OS 커널에서 실제로 관리하지 않는 녹색 스레드 / 섬유를 사용할 수 있습니다.
- 최신 프로세서에서 프로그램의 런타임은 5 초 미만이어야합니다.
- 대기 또는 설정 변경과 같이 프로그램 외부에서 발생하는 환경 변경은 지정할 수 없습니다. 프로그램은 100ish 시간을 다시 연속으로 실행하거나 각 실행 사이에 1 시간 또는 100ish 시간을 병렬로 실행해야합니다.
- GPU 또는 Xeon Phi와 같은 보조 프로세서 및 작업을위한 자체 내부 스케줄링 메커니즘을 사용할 수 있습니다. 규칙은 녹색 스레드에 적용되는 것과 동일한 방식으로 적용됩니다.
- 이 게시물에 지정된 규칙을 준수하는 한 모든 수면, 수율 및 기타 트릭으로 스케줄러를 자극하십시오.
금지 된 운영
스케줄러가 스레드 실행을 스케줄 할 때 비결 정성 소스 만 사용할 수 있습니다. 다음 목록은 전체가 아니며 다른 비결정론 적 출처를 인정하므로 귀하가 할 수없는 것들의 예를 제공하기위한 것입니다.
- 모든 종류의 PRNG 또는 하드웨어 RNG 기능에 직접 또는 간접적으로 액세스 (스케줄러의 고유 한 부분이 아닌 경우).
- 모든 종류의 입력 (시스템 시간, 파일 시스템, 네트워크 등)으로 읽기
- 스레드 ID 또는 프로세스 ID 읽기
- OS 스케줄러 사용자 정의 주류 OS에서 표준 OS 스케줄러를 사용해야합니다
- 녹색 실 / 섬유 스케줄러를 사용자 정의하는 것도 금지됩니다. 즉,이 과제에 대한 언어를 작성 하려면 OS 스레드 를 사용해야합니다.
답변 검증
바람직하게는 대답은 폭 넓은 지원에 비례하여 칭찬을받는 모든 일반적인 OS 및 최신 프로세서에서 작동합니다. 그러나 이것은 도전의 요구 사항이 아닙니다. 최소한 하나의 최신 SMP 프로세서와 최신 OS를 지원해야합니다. 하드웨어 가용성의 범위까지 최고의 답변을 테스트합니다.
- 항목이 Windows 10 v1607 x64를 실행하는 i7 5960x에서 필요한 출력을 생성하지 않으면 필요한 환경을 지정하십시오.
- VMWare Workstation으로 쉽게 재현 할 수있는 경우 정확한 OS 및 VM 사양을 제공하십시오.
- 이러한 조건 중 하나에서 생성 할 수없는 경우, 헤더 섹션에 설명 된대로 테스트의 동시 화면 캡처와 마우스 및 키보드 상호 작용 (또는 비표준 계산 제어 방식을 사용하여 화면의 핸드 헬드 비디오 녹화)을 기록하십시오. 기기 사용)를 명확하게 표시하고 답변과 함께 두 동영상을 게시하고 작동 이유에 대한 설명을 포함합니다.
- 또는, 일치하는 하드웨어를 보유한 평판이 좋은 오랜 사용자 (귀하가 아닌)를 확보하여 결과를 재현하고 보증하십시오.
- 항목이 이국적인 프로그래밍 언어로되어있어 일반적인 개발자가 컴파일 / 지트 / 통역하도록 설정되지 않은 경우 설정 지침을 제공하십시오.
- 항목이 특정 버전의 JVM / Python 인터프리터 / 기타에 의존하는 경우 다음을 지정하십시오.
- 내 테스트에서 10 번의 연속적인 시련 세트를 얻는 데 10 분 이상의 연속적인 실행이 실패하면 실패합니다 (특히 성공 조건이 이상한 경우가 아닙니다) 런타임 바운드)