> <> (생선) 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
). 스택의 길이를에서 가져오고 스택 의 끝에 l
a 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
이해하기 쉬워야합니다. 기본적으로 ti
0이면을 사용하여 함수를 종료하고 v
그렇지 않으면 실행 !
하고 건너 뜁니다.v
(다른 루프 수행).
경우 ti
약간 임의의 문자를 출력 0이고 우리가 완료, 우리는 실행 v
및 참조 :
v ~}}r]~<
.43<
여기서 너무 멋진 것은 없습니다. ti
를 통해 스택에서 제거 합니다 ~
. 그런 다음 ]
새로운 것입니다. 스택에서 모든 값을 가져 와서 오래된 스택에 놓습니다! 우리가 역 반전 문제 때문에 r
, 다음에 바로 두 번 스택을 이동 }}~
우리를주고, 오른쪽으로 스택을 shufting, [ m
, i
, s
]는이 ~
중복 추가 제거하는 s[0]
경우에 우리가 필요할 것 같은 기능의 대비를 우리는 루프를하고있었습니다 (그러나 우리는하지 않습니다, 우리는 종료됩니다).v
아래 수영으로하는 물고기를 알려줍니다 >34.
단순히 왼쪽 수영과에 물고기를 알려줍니다 (실행 순서를 보여 반전) 3, 4
합니다 (때문에.
점프 !). 3, 4
실제로 시작의 오른쪽에 있습니다whitespaceTrimmer
우리가 왼쪽으로 여행하고 있기 때문에 완벽합니다.
이 모든 논리에 따라 스택이 완전히 비워지고 프로그램 whitespaceTrimmer
이 실행 된 직후에 프로그램이 종료 될 때까지 피쉬를 따라갈 수 있습니다 .