> <> (생선) 107 106 103 바이트
<v}:{r&" "
1xv+
2<v+
v}<
<~v!?=&:&:
6.>ol2-?!;a
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o-+
^3<v ~}}r]~<
.40<
온라인으로 사용해보십시오!
그것은 슈퍼 무작위가 아니지만 무작위입니다. 문자열과 정수를 스택에 놓기 만하면됩니다 (예 : "Hello world!", 5).
Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d
전체 설명
설명을 업데이트 할 때까지 약간 오래된 버전의 코드입니다. 대부분 동일하며 읽기가 더 쉽습니다.
< v}:{r&" "
+1xv
+2<v
}
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
문자열 매개 변수는 is s이고 정수 매개 변수는 i입니다.
< v}:{r&" "
는 <주위를 감싸고 왼쪽으로 바로 이동하는 물고기, 알 " "스택에 characted 공간을 추가합니다. 그런 다음 물고기가 위로 이동 &하여 레지스터에 공간을 추가합니다. r스택을 {:}뒤집고 스택을 왼쪽으로 이동 (스택 i끝에 놓음 )하고 스택 끝에 값을 복사 한 다음 오른쪽으로 이동합니다. v물고기가 아래쪽으로 움직이기 시작합니다.
+1xv
+2<v
}
x물고기에게 임의의 방향으로 움직이게하여 결국에는 물고기가 똑바로 가고 아래쪽으로 계속되거나 지나치 1+거나 2+미리 지나갑니다 . 스택 끝에있는 숫자에 각각 1 또는 2를 더합니다. 물고기가 위로 이동하면 v다시 쳐서 다시 내려갑니다. }스택을 오른쪽으로 이동 한 다음 스택의 i위치 1에 있고이 새 변수는 위치 0에 있습니다 (이것을 호출합니다 m).
:&:<~ v!?=&
이 부분은 함수 입니다. whitespaceTrimmer 라고하겠습니다 . 어디에서 시작됩니다 <. 공백이 아닌 문자가 될 때까지 스택의 끝 부분 (문자열의 시작 부분)에있는 공백을 제거합니다.
따라서 물고기는 즉시 수영 <을하며 왼쪽으로 이동해야합니다. 그런 다음:&:& 스택 끝의 값을 복사하고 레지스터에서 스택 끝까지의 공간을 배치 한 다음 복사 한 다음 다시 레지스터에 배치합니다.
그리고 물고기 히트 =?!v ~더 구체적으로, 또는은 =, 스택의 오프 마지막 두 값을 (두 우리가 방금 만든) 팝업을 비교, 스택의 끝 부분에 1을 배치하는 경우들이있는 거와 동일하고, 0에 스택의 끝이 다른 경우 은 ?그것이 0이 다음 명령이 경우에는 인이 실행되지 않는 경우, 적층 체의 단부로부터 떨어져서 새로운 값을 팝 !, 그 대신에 실행하는 v물고기가 하향 이동 명령 (함수 종료 참조).
그러나 1이면 공간을 찾았으므로 !어느 것이 트램폴린인지 실행하고 그로 인해 다음 명령 인을 건너 뛰어 v물고기는 계속됩니다. 물고기 앞에는 ~스택에서 마지막 값을 띄우도록 지시합니다 (공백으로 확인 됨). 물고기는 계속되고 기능을 다시 실행합니다.
?!;a6.>ol2-
물고기는 바로 오른쪽으로 수영을하라고 >한 후 출력하여 스택의 마지막 문자 o(의 첫 번째 문자 인이 처음 실행, s). 스택의 길이를에서 가져오고 스택 의 끝에 la 2를 배치 한 다음에서 -2를 뺍니다 l. 그것은 ?!;무엇을 기억하고 , 스택이 비었 ?을 때 물고기가 건너 뛰도록 하고 프로그램을 끝내는 !착륙 ;합니다.
스택에 여전히 문자가있는 경우 다음을 실행 !하여 물고기가 바운스 ;및 실행 a6.하고 a(AKA 10) 를 저장 6하고 스택의 끝에서 x, y좌표를 계산 .하여 끝에서 튀어 나옵니다. 스택 한 다음 물고기를로 순간 이동시키고 10, 6해당 위치 오른쪽에있는 명령을 실행합니다 (물고기가 올바르게 수영 할 때).
y위치 6이이 라인 아래에 있다는 것을 알면 들리는 것보다 덜 복잡합니다 . x그러면 위치 10이 v이고 오른쪽이 이며 이는 no-op입니다. 이것은 물고기가 계속 수영을하고 실제로 줄의 시작 부분에서 실행을 시작합니다 ...
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
문자 사이에 임의의 텍스트를 추가하는 기능입니다. 그것은 약간 한 입이지만, 그것은 조금 더 무작위로 만들려고했기 때문입니다. 이 genRandomChars 라고합시다 .
는 :{{:}l1-[rv실제 함수에 대한 설정 및 실제 함수 자체의 일부 덜 수 있도록한다. 물고기는 먼저 수영 :{{하여 스택 끝에있는 값을 복사 한 다음 왼쪽으로 두 번 이동합니다. i스택의 1 번 위치에 있다는 것을 기억한다면 , i이제 스택의 끝에 있다는 것을 알게 될 것 입니다.
그런 다음 물고기는 :}어떤 복사본 을 헤엄 쳐 다니면서 i스택 i의 시작과 끝에 스택을 오른쪽으로 이동시킵니다 . l1-[물고기가 스택의 끝에 길이를두고 스택에서 1을 뺀 다음 [새 스택 을 만들고 l-1(스택 길이-1) 값을 새 스택으로 옮깁니다 ( i오래된 스택을 그대로 둡니다 ). 그런 다음 물고기가 단순히 rv스택을 다시 뒤집습니다 (새 스택을 만들면 어떤 이유로 되돌릴 수 있다고 생각 <합니다). 아래 에서 기능을 시작하여 물고기가 한 번 더 아래쪽으로 수영하도록 명령합니다 .
그래서 현재 스택의 끝이 m우리의 일시적 i우리가 전화 할게있는 ti. 물고기는 즉시 수영하여 1-}1을 빼고 ti스택의 시작 부분으로 옮깁니다. 그런 다음 :}단순히 복사 m하여 스택의 시작 부분으로 옮깁니다.ti 스택 위치 1에 ).
우리가이 작은 일에 부딪쳤을 때입니다.
v2<
<1x|!
^3<
이것은 실제로 간단합니다. 이로 !인해 물고기가 건너 뛰어 |실행 x됩니다. 무엇을 기억하는지 x, 우리는 이것이 물고기를 4 방향으로 움직인다는 것을 기억합니다. |단순히 거울이며 물고기가x 합니다. 따라서 기본적으로 물고기는 스택의 끝에 1, 2 또는 3을 배치하고 계속 왼쪽으로 이동하면서 줄 바꿈합니다.
그런 다음 피쉬가 실행 *+o되어 스택의 마지막 두 값이 튀어 나와 곱한 다음 결과가 다시 푸시되고 추가와 동일한 결과가 나오고 최종 값이 스택에서 튀어 나와로 출력됩니다 o. 우리의 스택이 지금 막 들어 다시 비교적 정상이다 m, ti, s].
:}}:스택의 끝에있는 값 (기본적으로 s위치 0)을 복사 한 다음 스택을 오른쪽으로 두 번 이동 한 다음 ( ti앞면을 다시 배치 ) ti복사합니다. ?!v이해하기 쉬워야합니다. 기본적으로 ti0이면을 사용하여 함수를 종료하고 v그렇지 않으면 실행 !하고 건너 뜁니다.v (다른 루프 수행).
경우 ti약간 임의의 문자를 출력 0이고 우리가 완료, 우리는 실행 v및 참조 :
v ~}}r]~<
.43<
여기서 너무 멋진 것은 없습니다. ti를 통해 스택에서 제거 합니다 ~. 그런 다음 ]새로운 것입니다. 스택에서 모든 값을 가져 와서 오래된 스택에 놓습니다! 우리가 역 반전 문제 때문에 r, 다음에 바로 두 번 스택을 이동 }}~우리를주고, 오른쪽으로 스택을 shufting, [ m, i, s]는이 ~중복 추가 제거하는 s[0]경우에 우리가 필요할 것 같은 기능의 대비를 우리는 루프를하고있었습니다 (그러나 우리는하지 않습니다, 우리는 종료됩니다).v아래 수영으로하는 물고기를 알려줍니다 >34.단순히 왼쪽 수영과에 물고기를 알려줍니다 (실행 순서를 보여 반전) 3, 4합니다 (때문에. 점프 !). 3, 4실제로 시작의 오른쪽에 있습니다whitespaceTrimmer우리가 왼쪽으로 여행하고 있기 때문에 완벽합니다.
이 모든 논리에 따라 스택이 완전히 비워지고 프로그램 whitespaceTrimmer이 실행 된 직후에 프로그램이 종료 될 때까지 피쉬를 따라갈 수 있습니다 .