포트란 95
이 코드는 크기가 크지 만 멋진 ASCii 결과를 생성합니다.
program Rorschach
implicit none
integer :: i, j, k, l, N, seed
integer, dimension (24) :: i_zero, j_zero
real :: aux
integer, dimension (17,12) :: matrix_I = 0
character, dimension (17,12) :: matrix_C
! random seed according to system clock
call SYSTEM_CLOCK(count=k)
call RANDOM_SEED(size=N)
allocate(seed(N))
seed=k+37*(/ (i - 1, i = 1, n) /)
call RANDOM_SEED(PUT=seed)
! generating 7 random points
do i=1,7
call RANDOM_NUMBER(aux)
i_zero(i) = 15 * aux + 2 ! range = 2-16
call RANDOM_NUMBER(aux)
j_zero(i) = 11 * aux + 2 ! range = 2-12
enddo
! generating 7 large spots of ink
do i=1,7
matrix_I(i_zero(i),j_zero(i)) = 3 ! central points have ink value 3
do k=-1,1
do l=-1,1
if (.NOT.((k==0) .AND. (l==0))) then ! immediate neighbours...
if ( (((i_zero(i)+k)<=17).OR.((i_zero(i)+k)>0)) .AND. (((j_zero(i)+l)<=12).OR.((j_zero(i)+l)>0)) ) then ! ... that are inside the designed area ...
if (matrix_I(i_zero(i)+k,j_zero(i)+l) < 2) matrix_I(i_zero(i)+k,j_zero(i)+l) = 2 ! ... and that do not have ink value larger than 2 will be attributed as 2
endif
endif
enddo
enddo
enddo
! generating N little sparkles of ink
call RANDOM_NUMBER(aux)
N = int(11 * aux) + 20 ! N = 20-30
i = 0
do while (i <= N)
call RANDOM_NUMBER(aux)
i_zero(i) = 16 * aux + 1 ! range = 1-17
call RANDOM_NUMBER(aux)
j_zero(i) = 11 * aux + 1 ! range = 1-12
if (matrix_I(i_zero(i),j_zero(i)) < 1) then ! if the selected point already has more ink than 1, then cycle the loop
matrix_I(i_zero(i),j_zero(i)) = 1
else
cycle
endif
i = i + 1
enddo
! converting matrix of integers into matrix of characters
do i=1,17
do j=1,12
select case(matrix_I(i,j))
case(0)
matrix_C(i,j) = " "
case(1)
matrix_C(i,j) = "."
case(2)
matrix_C(i,j) = "+"
case(3)
matrix_C(i,j) = "@"
end select
enddo
enddo
! printing it on the screen + its reflection
do i=1,17
do j=1,12
write(*,"(A1)",advance="NO") matrix_C(i,j)
enddo
do j=12,2,-1
write(*,"(A1)",advance="NO") matrix_C(i,j)
enddo
write(*,"(A1)") matrix_C(i,1)
enddo
end program Rorschach
코드는 완전히 주석 처리되었지만 기본 아이디어는 해당 지점의 잉크 량을 나타내는 0에서 3 사이의 값을 가진 행렬을 생성한다는 것입니다. 7 개의 큰 잉크 반점 (값 3으로 값 2로 둘러싸인 반점)과 작은 "반점"(값 1)이 많이 있습니다. 그런 다음이 행렬은 다음 변환을 사용하여 문자 행렬로 변환됩니다.
0 =
1 = .
2 = +
3 = @
결과는 다음과 같습니다.
+++ . . +++
+@++++ . . ++++@+
++++@+. .+@++++
.+++ ++++ +++.
+@@+
. . . +++@@+++ . . .
. +@++++@+ .
++++++ ++++++
+@+ +@+
. ++++ ++++ .
. +@+ +@+ .
. .+++. .+++. .
. . . . . .
. . . .
. .. .. .
. .