소개
다음 f A\/
과 같은 문자의 그리드를 고려하십시오
f f f
A
A / \
\ / A
A \/
/
\/
어디:
f
아래로 물을 붓는 수도꼭지를 나타냅니다A
정확히 절반은 왼쪽으로 가고 정확히 절반은 오른쪽으로갑니다.\
물의 흐름을 오른쪽으로 한 단위 씩 이동/
물의 흐름을 한 단위 씩 왼쪽으로 이동- 이 조합
\/
은 무한한 용량의 물통을 생성하여 그 위의 물 흐름을 수집합니다. [space]
물이 지나갈 수있는 것보다 빈 공간입니다
이것으로부터 우리는 *
수도꼭지에서 나오는 물통 ( )이 물마루로 들어가거나 격자 영역에서 떨어지는 경로를 상상할 수 있습니다.
f f f <-- first second and third faucets
* * *A*
* *A*/ \*
\*/ * *A <-- a '*' is not drawn to the right of this A because it would be out of the 9×7 bounds
* *A*\/ <-- upper trough
**/ *
\/ * <-- lower trough
3 개의 수도꼭지가 한 번에 같은 양의 물을 출력한다고 가정하면
- 첫 번째 수도꼭지의 물은 모두 하단 통으로 이동합니다.
- 두 번째 수도꼭지 물의 절반이 하단 트로프로 이동하고 나머지 절반이 하단 트로프 사이에서 분리되어 그리드에서 떨어집니다.
- 세 번째 수도꼭지 물의 1/4은 하단 트로프로 가고, 1/4은 그리드 바닥에서 떨어지고, 1/4은 상단 트로프로 떨어지고, 1/4은 그리드에서 오른쪽으로 떨어집니다.
이것으로부터 우리는 (1 + 3/4 + 1/4 + 1/4) / 3 = 75%
물이 물마루에 걸리고 (1/4 + 1/4 + 1/4) / 3 = 25%
그리드에서 떨어 졌다는 것을 알 수 있습니다 .
도전 과제
이 ASCII 수류 설정과 관련하여 이러한 과제 중 일부 또는 전부를 완료 할 수 있습니다. 그것들은 모두 코드 골프이며, 각 도전에 대한 최단 답변이 승자입니다. 허용되는 답변은 전체 코드 길이가 타이 브레이커 인 가장 어려운 과제를 완수 한 사람입니다.
도전 과제 1
주어진 그리드에 물마루로 흐르는 물의 일부를 출력하는 프로그램을 작성하십시오. 위 예제의 결과는 간단합니다 0.75
.
도전 과제 2
그리드가 주어 졌을 *
때 위에서했던 것처럼 물이 흐르는 곳에서를 그리는 프로그램을 작성하십시오 . 공백 문자 이외의 것은 덮어 쓰지 말아야하며 격자 크기는 바뀌지 않아야합니다. 그래서 같은
f
/A
물이 A의 양쪽으로 흐르지 만 물을 제거하지 않고 왼쪽 /
으로 끌 수 없으며 2x2 격자를 더 크게 만들지 않으면 오른쪽으로 끌 수 없습니다.
도전 과제 3 (업데이트 됨)
두 개의 음이 아닌 정수, 총 T와 K를 유지하는 양 (T> = K)을 취하는 프로그램을 작성하십시오. f
수도꼭지가 T 단위의 물을 부을 때 정확히 K가 물마루로 흘러 들어가도록 정확히 하나의 그리드를 생성하고 그립니다 . 특정 (T, K) 쌍에 대해 유한 그리드에서이를 수행 할 수없는 경우 '불가'를 출력하십시오.
설명 (모든 과제에 적용)
- 입력은 stdin, 파일 또는 그리드의 문자열 표현에 대한 함수 호출을 통해 이루어질 수 있습니다. 다른 입력을 실행하는 방법을 분명히하십시오.
- 출력은 stdout으로 이동해야합니다.
\A
과A/
와 것은AA
예상대로 또한 쓰루 있습니다.- w by h 그리드는 항상 줄 바꿈을 계산하지 않는 w * h 문자의 올바른 형식의 사각형입니다. 누락 된 후행 공백과 발생이 없습니다
*
. - 격자 치수는 1 × 1 정도로 작고 임의로 클 수 있습니다. (이유 내에서 임의로 큰 int.maxValue 등은 허용되는 한계입니다. T와 K도 마찬가지입니다.)
f
바로 위의 흐름이 흐릅니다.- 수도꼭지는 맨 위 줄뿐만 아니라 어디든지 될 수 있습니다.
A
항상 물을 붓는 양을 정확히 반으로 나눕니다.
참고 : 유사 /A
하고 //
완벽하게 유효합니다. 물 은 캐릭터들 사이에서 자유롭게 흐릅니다. (도전 2에는 그것을 그릴 공간이 충분하지 않습니다.)
설정에서
ff
/A
왼쪽 f
스트림이 쏟아져 내려와 /
왼쪽으로 이동합니다. 오른쪽 f
스트림은, 아래로 부어 명중 A
절반 잘 가고 절반은 사이 왼쪽으로 간다 A
하고 /
.
예 :
ff
**
*/A*
** *
** *
/A
경우 물이에 떨어지는 경우 와 같이 입력을 처리하는 방법을 지정해야 합니다 A
. 모든 문제에 \A
대해 여물통 인지 명확히하는 것이 좋습니다 . 세 번째 도전 과제에 대해, 3 개의 유닛 A
이 분할 되는 것으로 가정 해야하는지 1.5 / 1.5
(따라서 입력은 실제로 단일 합리적인 수) 2 / 1
, 어느 쪽이 2
?
A
양쪽 모두 1.5가됩니다. float 정밀도가 문제가되지 않도록하는 것은 코더에 달려 있습니다.)
f
초 이기 때문에 올바른 답변이 아닙니다.