Bạn thấy gì trong một vết mực? Thế hệ Rorschach '[đóng]


12

Vì vậy, tôi muốn bạn cố gắng tạo hình ảnh Rorschach như hình ảnh dưới đây:

Hình ảnh Rorschach giả

Đây là một liên kết để truyền cảm hứng hơn nữa.

Đây là một cuộc thi phổ biến, nhưng tôi sẽ nói rằng màu sắc có thể phổ biến hơn màu đen và trắng, cũng như kết cấu.

Hình ảnh Rorschach được tạo ra bằng cách gấp giấy bằng mực để một tiêu chí là đối xứng.

Nghệ thuật ASCII là hợp lệ, nhưng sẽ tuân theo các tiêu chí giống như trên.


1
Vì vậy, đó là, golf-code, hoặc cuộc thi phổ biến?
David Wilkins

2
<quote Richard Feynman> Có một vết mực vô nghĩa và những người khác hỏi bạn bạn nghĩ gì, nhưng khi bạn nói với họ, họ bắt đầu tranh cãi với bạn! </ quote>
user80551 13/03/2016


1
Tôi rất thích nhìn thấy một bản lập thể cho điều này.
Justin

1
Nó nhắc tôi về một hình ảnh tôi thấy gần đây
VX

Câu trả lời:


11

Pháo đài 95

Mã này là loại lớn, nhưng nó tạo ra kết quả ASCii (ish) đẹp:

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

Mã được nhận xét đầy đủ, nhưng ý tưởng cơ bản là nó tạo ra một ma trận có giá trị từ 0 đến 3, đại diện cho lượng mực ở vị trí đó. Có 7 điểm mực lớn (một điểm có giá trị 3 được bao quanh bởi các giá trị 2) và rất nhiều "lấp lánh" (giá trị 1). Ma trận này sau đó được chuyển đổi thành ma trận ký tự, sử dụng chuyển đổi sau:

0 =  
1 = .
2 = +
3 = @

Đây là một kết quả:

 +++      .  .      +++ 
 +@++++   .  .   ++++@+ 
 ++++@+.        .+@++++ 
   .+++   ++++   +++.   
          +@@+          
. .   . +++@@+++ .   . .
.       +@++++@+       .
     ++++++  ++++++     
     +@+        +@+     
.    ++++      ++++    .
   .  +@+      +@+  .   
  .  .+++.    .+++.  .  
 . .   .        .   . . 
    .    .    .    .    
   .   ..      ..   .   
 .                    . 

1
GIỚI THIỆU! Một yêu thích cá nhân.
Pureferret

2
Cảm ơn bạn! Thông thường mã của Fortran + người mới bắt đầu không có cơ hội ở đây, nhưng chàng trai, tôi đã học được rất nhiều về lập trình kể từ khi tôi bắt đầu tham gia trang web này!
gilbertohasnofb

1
! FORTRAN là vua của các danh sách trong mắt tôi và đây chỉ là danh sách để tôi không thấy bạn có thể sai như thế nào.
Pureferret

1
Fortran không quá nóng cho sự ngắn gọn, nhưng hiệu suất là đúng.
Jonathan Van Matre

12

Con trăn

Không hẳn là tốt nhất hay trơn tru nhất, nhưng đây là một giải pháp python:

from PIL import Image
import random
import sys

imgsize = (int(sys.argv[1]), int(sys.argv[2]))
color = (0, 0, 0)
img = Image.new("RGB", imgsize, "white")

for j in range(0,int(sys.argv[3])):
    start = (random.randrange(0, imgsize[0]/2), random.randrange(0, imgsize[1]))
    point = start
    img.putpixel(point, color)

    blotsize = random.randrange(0, int(sys.argv[4]))
    for i in range(blotsize):
        directions = [(point[0], point[1]+1), (point[0], point[1]-1), (point[0]+1, point[1]), (point[0]-1, point[1])]
        toremove = []
        for direction in directions:
            if direction[0]>=(imgsize[0]/2) or direction[1]>=imgsize[1] or direction[0]<0 or direction[1]<0:
                toremove.append(direction)
        for d in toremove:
            directions.remove(d)
        point = random.choice(directions)
        img.putpixel(point, color)

cropped = img.crop((0, 0, imgsize[0]/2, imgsize[1]))
img = img.transpose(Image.FLIP_LEFT_RIGHT)
img.paste(cropped, (0, 0, imgsize[0]/2, imgsize[1]))

img.save("blot.png")

Nó chỉ tạo ra một "con đường lang thang" cho một đốm, và tạo ra một vài trong số đó.

Một ví dụ sử dụng:

py inkblot.py width height blots blotsize
py inkblot.py 512 512 20 10000

Và một số hình ảnh ví dụ: blot1 blot2


Chào mừng đến với PPCG! Chúng tôi khuyến khích người đăng để tạo một tiêu đề nổi bật cho biết ngôn ngữ họ đã sử dụng. Bạn có thể sử dụng cú pháp Markdown trong trình soạn thảo để làm như vậy, ví dụ như## Python
Jonathan Van Matre

5
Có thể thay vì các pixel đơn lẻ, bạn có thể sử dụng các đĩa (kích thước ngẫu nhiên).
Howard

1
Chào mừng bạn Bạn có một số kết quả rất tốt đẹp ở đây.
gilbertohasnofb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.