Perl, 92 90 89 84 바이트
에 +1 포함 -n
STDIN에 키를 줘 :
perl -M5.010 bolt.pl <<< 15
bolt.pl
:
#!/usr/bin/perl -n
map{$_=$;until$;=$_,s/.6|3.?/53|16*rand/eg,/3|6/>/36/;say y|3615|\\/ |r}(1x$_.6)x$_
설명
시작점 0의 오프셋 (점은 문자 상자의 모서리에 있음)을 호출하면 다음 행에서 왼쪽 또는 오른쪽으로 이동하거나 오프셋으로 끝날 수 있습니다 -1,1
. 다음 행은 -2,0,2
가능한 오프셋 등을 제공 합니다. 모두 2만큼 차이가납니다. 점의 왼쪽 하단에 문자를 호출하고 오른쪽 하단에 홀수를 지정하면 각 문자 위치에 짝수 또는 홀수를 할당하도록 확장 할 수 있습니다 짝수 및 홀수 번갈아 (실제로 전체 평면이 바둑판 패턴으로 바둑판 식으로 배열 됨). 짝수 위치가있을 수 /
또는
홀수 위치를 가질 수 있고, \
또는
.
a 직전의 문자 /
는 홀수 위치에 있으므로 \
또는
로 가능하지만 \/
금지되어 있으므로
가능합니다. 마찬가지로, 후 문자가 \
있어야합니다 수
(행 경계가 더 문제가 없습니다 있도록 행을 가정하면 왼쪽과 오른쪽에 충분한 공간으로 채워집니다). 따라서 번개는 다음 행에서 항상 a 바로 아래 \
또는 바로 아래에서 계속됩니다 /
. 두 경우 모두 아래쪽 지점이 중간에 있고 다음 행
에 /
, \
또는 /\
상위 2 자 바로 아래 중 하나가있을 수 있습니다 . 다음 행을 생성하려면 간단히 \
또는/
이 네 가지 확장 중 하나에 의해 확률이 동일합니다 (
또는 첫 번째 문자를 또는 /
두 번째 문자를
또는로 독립적으로 바꿀 수도 있음 \
). 펄에서는 다음과 같이 할 수 있습니다.
s#\\ | /#(" "," \\","/ ","/\\")[rand 4]#eg
그러나 결과 행에 \/
(금지 된 조인)이 포함되거나 전혀 /
없거나 \
(볼트가 죽고 바닥에 닿지 않는) 결과는 유효하지 않습니다. 이 경우 전체 행을 버리고 다시 시도하십시오. 유효한 연속성이 항상 존재하며 자주 시도하면 충분히 찾을 수 있습니다 (예 : 1 개의 흐름을 제외한 모든 것이 죽습니다). 이것은 제안 된 겹침 방지 알고리즘과 약간 다른 확률 분포이지만 방향성 바이어스가 없으므로 실제로 더 낫습니다. 유효성은 다음을 사용하여 골프 방식으로 테스트 할 수 있습니다.
m#\\|/#>m#\\/#
여기서 문제는 무작위 대체가 너무 looooong이며 이러한 모든 \
탈출은 바이트를 먹는다는 것입니다. 그래서 숫자의 문자열을 사용하여 내 행을 구축하여 적절한 자리 교체하기로 결정
, /
그리고 \
단지 인쇄하기 전에합니다. 기본적인 무작위 대체는
53|16*rand
어느 하나의 제공 53
, 55
, 61
또는 63
동등한 확률. 나는 그 해석 5
과 1
같은
, 3
같은 \
과 6
같은 /
. 행 인쇄에 대해 설명합니다.
say y|3615|\\/ |r
진지한 골프 대회에서 나는 대안 적으로 마술 공식을 체계적으로 탐구하기 시작하지만, 이것은 아주 좋을 것입니다 (3 바이트 이내)
프로그램의 나머지 구성 요소 :
1x$_.6
이것은 $_
높이 공간 다음에 a로 초기화됩니다 (다음 맵 참조) /
. 이것은 인쇄되는 첫 번째 행 위에 보이지 않는 행이며 필드가 충분히 넓어서 볼트의 왼쪽 공간이 절대로 부족하지 않도록하십시오.
map{ ... ; say ...}(1x$_.6)x$_
매번 새로운 행을 인쇄하는 것과 동일한 초기 문자열 높이 시간을 처리합니다.
$_=$;until$;=$_,...
에 현재 행을 저장하십시오 $;
. 대체 복원 무효로 밝혀지면 $_
에서$;
s/.6|3.?/53|16*rand/eg
실제 대체를 수행하십시오. 나는 전에 무엇인지 확인할 필요가 없습니다 /
이후 \
는 이후 있어야 공백합니다. 공백은 1
또는 로 표시 될 수 있으므로 편리합니다 5
. \
여전히 공백 이 없어도 공백을 왼쪽으로 채 웁니다. 따라서 해당 문자를 선택적으로 만드십시오
/3|6/>/36/
새 행이 유효한지 확인
Stay safe and have fun golfing!
또한 EAS가 타격을 받으면 모든 것을 버리고 명령을 따를 것을 명기하십시오! 이러한 상황에서는 골프 코드가 우선 순위가 아닙니다.