Các ngăn kéo hoa văn đẹp (Bao gồm các hình khối nhỏ)


18

Ngăn kéo hoa văn đẹp

Chào buổi sáng PPCG!

Vào một ngày khác, khi tôi đang cố gắng giúp ai đó trên Stack Overflow, một phần vấn đề của anh ấy đã cho tôi một ý tưởng cho thử thách này.

Trước hết, kiểm tra hình dạng sau:

nhập mô tả hình ảnh ở đây

Trong đó tất cả các số màu đen là chỉ số của các điểm trong hình và tất cả các số màu xanh đậm là chỉ số của các liên kết giữa các điểm.

Bây giờ, được cung cấp một số thập lục phân cho 0x00000 đến 0xFFFFF, bạn cần vẽ một hình dạng trong bảng điều khiển chỉ sử dụng không gian ký tự và "■" (sử dụng ký tự "o" cũng không sao).

Dưới đây là một số ví dụ trong đó số thập lục phân là đầu vào và hình dạng là đầu ra:

0xE0C25 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
■               ■ 
■               ■ 
■               ■ 
■ ■ ■ ■ ■       ■ 
        ■       ■ 
        ■       ■ 
        ■       ■ 
        ■ ■ ■ ■ ■
0xC1043 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
              ■   
            ■     
          ■       
        ■         
      ■           
    ■             
  ■               
■ ■ ■ ■ ■ ■ ■ ■ ■ 
0xE4F27 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
■       ■       ■ 
■       ■       ■ 
■       ■       ■ 
■ ■ ■ ■ ■ ■ ■ ■ ■ 
■       ■       ■ 
■       ■       ■ 
■       ■       ■ 
■ ■ ■ ■ ■ ■ ■ ■ ■ 
0xF1957 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
■ ■           ■ ■ 
■   ■       ■   ■ 
■     ■   ■     ■ 
■       ■       ■ 
■     ■   ■     ■ 
■   ■       ■   ■ 
■ ■           ■ ■ 
■ ■ ■ ■ ■ ■ ■ ■ ■ 
0xD0C67 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
  ■             ■ 
    ■           ■ 
      ■         ■ 
■ ■ ■ ■ ■       ■ 
      ■ ■       ■ 
    ■   ■       ■ 
  ■     ■       ■ 
■ ■ ■ ■ ■ ■ ■ ■ ■ 
0x95E30 :
■ ■ ■ ■ ■       ■ 
  ■     ■     ■ ■ 
    ■   ■   ■   ■ 
      ■ ■ ■     ■ 
■ ■ ■ ■ ■ ■ ■ ■ ■ 
        ■ ■       
        ■   ■     
        ■     ■   
        ■       ■ 
0x95622 :
■ ■ ■ ■ ■       ■ 
  ■     ■     ■   
    ■   ■   ■     
      ■ ■ ■       
■ ■ ■ ■ ■ ■ ■ ■ ■ 
        ■         
        ■         
        ■         
■ ■ ■ ■ ■         
0xC5463 : 
■ ■ ■ ■ ■ ■ ■ ■ ■ 
        ■     ■   
        ■   ■     
        ■ ■       
■ ■ ■ ■ ■         
      ■ ■         
    ■   ■         
  ■     ■         
■ ■ ■ ■ ■ ■ ■ ■ ■ 
0xE5975 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
■       ■     ■ ■ 
■       ■   ■   ■ 
■       ■ ■     ■ 
■       ■       ■ 
■     ■ ■ ■     ■ 
■   ■   ■   ■   ■ 
■ ■     ■     ■ ■ 
■       ■ ■ ■ ■ ■ 
0xB5E75 :
■ ■ ■ ■ ■       ■ 
■ ■     ■     ■ ■ 
■   ■   ■   ■   ■ 
■     ■ ■ ■     ■ 
■ ■ ■ ■ ■ ■ ■ ■ ■ 
      ■ ■ ■     ■ 
    ■   ■   ■   ■ 
  ■     ■     ■ ■ 
■       ■ ■ ■ ■ ■ 
0xF4C75 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
■ ■     ■       ■ 
■   ■   ■       ■ 
■     ■ ■       ■ 
■ ■ ■ ■ ■       ■ 
      ■ ■ ■     ■ 
    ■   ■   ■   ■ 
  ■     ■     ■ ■ 
■       ■ ■ ■ ■ ■
0xF5D75 :
■ ■ ■ ■ ■ ■ ■ ■ ■ 
■ ■     ■     ■ ■ 
■   ■   ■   ■   ■ 
■     ■ ■ ■     ■ 
■ ■ ■ ■ ■       ■ 
■     ■ ■ ■     ■ 
■   ■   ■   ■   ■ 
■ ■     ■     ■ ■ 
■       ■ ■ ■ ■ ■ 

Dưới đây là một số giải thích về cách thức hoạt động:

0xFFFFF(16) = 1111 1111 1111 1111 1111(2)

Bạn ở đây có 20 bit, mỗi bit cho biết một liên kết có tồn tại hay không.

Chỉ số của Bit đáng kể nhất (MSB) là 0 (tham chiếu hình ảnh) hoặc Bit ít đáng kể hơn (LSB) là 19 (tham chiếu lại hình ảnh).

Đây là cách nó hoạt động cho hình dạng đầu tiên được đưa ra làm ví dụ:

0xE0C25(16) = 1110 0000 1100 0010 0101(2)

Có nghĩa là bạn sẽ có các liên kết hiện có sau: 0,1,2,8,9,14,17,19.

Nếu bạn làm nổi bật các dòng trên hình ảnh tham chiếu với những con số đó, nó sẽ cho bạn hình dạng này:

■ ■ ■ ■ ■ ■ ■ ■ ■ 
■               ■ 
■               ■ 
■               ■ 
■ ■ ■ ■ ■       ■ 
        ■       ■ 
        ■       ■ 
        ■       ■ 
        ■ ■ ■ ■ ■

Đây là một triển khai Python đơn giản và không có kiến ​​thức nếu bạn cần thêm trợ giúp:

patterns = [
  0xE0C25, 0xC1043, 0xE4F27, 0xF1957, 
  0xD0C67, 0x95E30, 0x95622, 0xC5463, 
  0xE5975, 0xB5E75, 0xF4C75, 0xF5D75
]

def printIfTrue(condition, text = "■ "):
  if condition:
    print(text, end="")
  else:
    print(" "*len(text), end="")

def orOnList(cube, indexes):
  return (sum([cube[i] for i in indexes]) > 0)

def printPattern(pattern):
  cube = [True if n == "1" else False for n in str(bin(pattern))[2::]]
  for y in range(9):
    if y == 0: printIfTrue(orOnList(cube, [0, 2, 3]))
    if y == 4: printIfTrue(orOnList(cube, [2, 4, 9, 11, 12]))
    if y == 8: printIfTrue(orOnList(cube, [11, 13, 18]))
    if y in [0, 4, 8]:
      printIfTrue(cube[int((y / 4) + (y * 2))], "■ ■ ■ ")
      if y == 0: printIfTrue(orOnList(cube, [0, 1, 4, 5, 6]))
      if y == 4: printIfTrue(orOnList(cube, [3, 5, 7, 9, 10, 13, 14, 15]))
      if y == 8: printIfTrue(orOnList(cube, [12, 14, 16, 18, 19]))
      printIfTrue(cube[int((y / 4) + (y * 2)) + 1], "■ ■ ■ ")
    elif y in [1, 5]:
      for i in range(7):
        if i in [2, 5]:
          print(" ", end=" ")
        printIfTrue(cube[y * 2 + (1 - (y % 5)) + i])
    elif y in [2, 6]:
      for i in range(5):
        if i in [1, 2, 3, 4]:
          print(" ", end=" ")
        if i in [1, 3]:
          if i == 1 and y == 2:
            printIfTrue(orOnList(cube, [3, 4]))
          elif i == 3 and y == 2:
            printIfTrue(orOnList(cube, [6, 7]))
          if i == 1 and y == 6:
            printIfTrue(orOnList(cube, [12, 13]))
          elif i == 3 and y == 6:
            printIfTrue(orOnList(cube, [15, 16]))
        else:
          printIfTrue(cube[(y * 2 - (1 if y == 6 else 2)) + i + int(i / 4 * 2)])
    elif y in [3, 7]:
      for i in range(7):
        if i in [2, 5]:
          print("  ", end="")
        ri, swap = (y * 2 - 2) + (1 - (y % 5)) + i, [[3, 6, 12, 15], [4, 7, 13, 16]]
        if ri in swap[0]: ri = swap[1][swap[0].index(ri)]
        elif ri in swap[1]: ri = swap[0][swap[1].index(ri)]
        printIfTrue(cube[ri])
    if y == 0: printIfTrue(orOnList(cube, [1, 7, 8]))
    if y == 4: printIfTrue(orOnList(cube, [6, 8, 10, 16, 17]))
    if y == 8: printIfTrue(orOnList(cube, [15, 17, 19]))
    print()

for pattern in patterns:
  printPattern(pattern)

Tất nhiên nó không hoàn hảo và nó khá dài cho những gì nó nên làm, và đó là lý do chính xác tại sao bạn ở đây!

Làm cho chương trình này ngắn một cách lố bịch :)

Đây là môn đánh gôn, vì vậy câu trả lời ngắn nhất sẽ thắng!


Chúng ta có thể in một dấu cách duy nhất trên các dòng không? Ví dụ của bạn có chứa chúng.
orlp

Yup :) Được phép
Sygmei

4
Được cho phép đầu ra đồ họa?
12Me21

1
Bạn có yêu cầu đầu vào thập lục phân hay thập phân ok?
Tít

1
Có thể tất cả các mã golf chỉ đến với tôi, nhưng mã đó thật đau đớn khi đọc sách
Lynn

Câu trả lời:


8

JavaScript (ES6), 202 188 187 byte

let f =

n=>`0${x=',16,-54,21,-26,21,21,-26,21,166'}${x},16`.split`,`.map((d,i)=>(k-=d,n)>>i&1&&[..."ooooo"].map(c=>g[p-=(k&3||9)^8]=c,p=k>>2),g=[...(' '.repeat(9)+`
`).repeat(9)],k=356)&&g.join``

console.log(f(0xE0C25))
console.log(f(0xC1043))
console.log(f(0xE4F27))
console.log(f(0xF1957))

Làm thế nào nó hoạt động

n =>                                                 // given 'n':
  `0${x = ',16,-54,21,-26,21,21,-26,21,166'}${x},16` // build the list of delta values
  .split`,`.map((d, i) =>                            // split the list and iterate
    (k -= d, n) >> i & 1 &&                          // update 'k', test the i-th bit of 'n'
    [..."ooooo"].map(c =>                            // if the bit is set, iterate 5 times:
      g[                                             // 
        p -= (k & 3 || 9) ^ 8                        // compute the direction and update 'p'
      ] = c,                                         // write a 'o' at this position
      p = k >> 2                                     // initial value of 'p'
    ),                                               //
    g = [...(' '.repeat(9) + `\n`).repeat(9)],       // initialization of the 'g' array
    k = 356                                          // initial value of 'k'
  )                                                  //
  && g.join``                                        // yield the final string

Chúng tôi làm việc trên một lưới ggồm 9 hàng gồm 10 ký tự. Lưới ban đầu được lấp đầy bởi các khoảng trắng, với LineFeed cứ 10 ký tự.

Mỗi phân đoạn được xác định bởi một vị trí bắt đầu và một hướng.

Các hướng được mã hóa như sau:

ID | Dir.| Offset
---|-----|-------
 0 |  W  |  -1        Offset encoding formula:
 1 | NE  |  -9        -((ID || 9) ^ 8)
 2 |  N  |  -10
 3 | NW  |  -11

Mỗi phân đoạn được mã hóa dưới dạng một số nguyên:

  • hướng được lưu trữ trong các bit # 0 và # 1
  • vị trí bắt đầu được lưu trữ trong các bit # 2 đến # 8

Chẳng hạn, đoạn số 3 bắt đầu ở vị trí 55 và sử dụng hướng thứ 3. Do đó, nó được mã hóa thành (55 << 2) | 3 == 223.

Dưới đây là danh sách kết quả của các số nguyên, từ phân đoạn # 19 đến phân đoạn # 0:

356,340,394,373,399,378,357,383,362,196,180,234,213,239,218,197,223,202,36,20

Khi được mã hóa delta, bắt đầu từ 356, nó sẽ trở thành:

0,16,-54,21,-26,21,21,-26,21,166,16,-54,21,-26,21,21,-26,21,166,16

Cuối cùng được mã hóa thành:

`0${x=',16,-54,21,-26,21,21,-26,21,166'}${x},16`

Rất tiếc ... Quên khoảng trống ở giữa. Sửa cái đó.
Arnauld

5

Python 3, 289 byte

def f(n):
 for r in range(9):print(*(" o"[any(n&1<<ord(c)-97for c in"trq|t|t|t|tspon|s|s|s|sml|r|q||p|o|n||m|l|r||qp||o||nm||l|r|p||q|o|m||n|l|rpkih|k|k|k|qomkjgfe|j|j|j|nljdc|i|h||g|f|e||d|c|i||hg||f||ed||c|i|g||h|f|d||e|c|igb|b|b|b|hfdba|a|a|a|eca".split("|")[r*9+c])]for c in range(9)))

Không có gì thông minh, chỉ cần mã hóa.


Không thể "trq|t...a|eca".split("|")trở thành "tqr t...a eca".split()?
Loovjo

@Loovjo Không, .split()phá hủy ||.
orlp

3

Ruby, 116 byte

->n{s=[' '*17]*9*$/
20.times{|i|j=i%9
n>>19-i&1>0&&5.times{|k|s[i/9*72+(j>1?~-j/3*8+k*18:j*16)+k*(2--j%3*2)]=?O}}
s}

Điều này dựa trên một vài mẫu tôi quan sát được. Đầu tiên, mô hình lặp lại cứ sau 9 dòng. Thứ hai, nếu các điểm bắt đầu của các đường nằm ngang được chọn một cách thích hợp, thì các hướng x sẽ quay vòng liên tục qua phải, trái, thẳng.

Ungolfed trong chương trình thử nghiệm

f=->n{
   s=[' '*17]*9*$/                    #Setup a string of 9 newline separated lines of 17 spaces.
   20.times{|i|                       #For each of the 20 bits..
     j=i%9                            #The pattern repeats every 9 bits.
     n>>19-i&1>0&&                    #If the relevant bit is set,
     5.times{|k|                      #draw each of the 5 points on the relevant line.
       s[i/9*72+                      #There are 9 lines starting on each row. Row y=0 starts at 0 in the string, row y=1 at 72, etc.
       (j>1?~-j/3*8+k*18:j*16)+       #~-j=j-1. For j=2..8, the starting x coordinates are (0,0,1,1,1,2,2)*8. For j=0 and 1 starting x coordinates are 0 and 16. 
       k*(2--j%3*2)                   #From the starting points, draw the lines right,left,straight. Down movement if applicable is given by conditional k*18 above.
       ]=?O                           #Having described the correct index to modify, overwrite it with a O character.
     }
   }
s}                                    #Return the string.


[0xE0C25, 0xC1043, 0xE4F27, 0xF1957, 
  0xD0C67, 0x95E30, 0x95622, 0xC5463, 
  0xE5975, 0xB5E75, 0xF4C75, 0xF5D75].map{|m|puts f[m],'---------'}

Tôi tin rằng có một giải pháp 112 byte sử dụng chuỗi 20 ký tự và một số giải mã để xác định các tham số của 20 dòng. Tôi sẽ thử điều này sau nếu tôi có thời gian.


Giải thích tốt đẹp!
Sygmei

2

PHP, 142 150 149 byte

for($r="";$c=ord(",(NMKJIGFHDjigfecbd`"[$i]);)if(hexdec($argv[1])>>$i++&1)for($p=96^$c&~$k=3;$k++<8;$p+=7+($c&3?:-6))$r[$p]=o;echo chunk_split($r,9);

in hình càng xa càng tốt; tức là nếu phần dưới trống rỗng, nó sẽ bị cắt.
Chạy với php -nr '<code>' <input>. Không nhập tiền tố

Kiểm tra trực tuyến

Thêm 11 byte để không cắt: Chèn ,$r[80]=" "sau $r="".

giải thích mã hóa

Mỗi dòng có thể được mô tả với một điểm bắt đầu và một trong bốn hướng.
Vẽ trên lưới 9x9, vị trí bắt đầu dao động từ 0,0đến 8,4; hoặc, kết hợp, từ 0đến 8*9+4=76. May mắn thay, tất cả các điểm bắt đầu [0,4,8,36,40,44,72,76]chia hết cho 4; do đó mã hướng [0..3]có thể được nén thành các bit 0 và 1 -> không cần dịch chuyển chút nào.

Để dễ dàng tính toán chuyển động con trỏ, 0được lấy theo hướng đông (chỉ hướng không có chuyển động thẳng đứng) và [1,2,3]cho hướng tây nam, nam, đông nam, trong đó phần bù là 9(đối với chuyển động thẳng đứng) cộng với [-1,0,1]-> [8,9,10]-> delta=code?code+7:1.

Hướng cho các dòng đầu tiên và cuối cùng là hướng đông, dẫn đến các mã nằm trong khoảng từ 0 đến 76 [0+0,4+0,0+2,0+3,4+1,4+2,4+3,8+1,8+2,...,44+1,44+2,72+0,76+0]; và bitwise xor 96 trên mỗi giá trị dẫn đến mã ascii có thể in và không hiệu quả [96,100,98,99,101,102,103,105,106,68, 72,70,71,73,74,75,77,78,40,44]-> `dbcefgijDHFGIJKMN(,. Mã sử ​​dụng LSB cho bit 0, trong khi dòng 0 tương ứng với MSB, do đó chuỗi phải được đảo ngược. Finito.

phá vỡ

for($r="";                  // init result string, loop through line codes
    $c=ord(",(NMKJIGFHDjigfecbd`"[$i]);)
    if(hexdec($argv[1])>>$i++&1)// if bit $i is set, draw line 19-$i:
        for($p=96^$c&~$k=3          // init $k to 3, init cursor to value&~3
            ;$k++<8;                // loop 5 times
            $p+=7+($c&3?:-6)            // 2. map [0,1,2,3] to [1,8,9,10], move cursor
        )
            $r[$p]=o;                   // 1. plot
echo chunk_split($r,9);     // insert a linebreak every 9 characters, print

một số giải thích golf

  • ^96không có ảnh hưởng đến hai bit thấp hơn, nên có thể bỏ qua khi trích xuất hướng; do đó không cần lưu trữ giá trị trong một biến, giúp tiết kiệm 5 byte trên con trỏ init.
  • Sử dụng ~3thay vì 124tiết kiệm một byte và cho phép chơi gôn tiếp theo:
  • Khởi tạo bộ đếm vòng lặp $k=3bên trong $pgán sẽ lưu hai byte
    và nó không làm tổn thương điều kiện trước (vì giá trị trên vẫn có một chữ số).
  • Sử dụng một chuỗi cho kết quả có khả năng khởi tạo và vẽ sơ đồ ngắn nhất có thể: Khi một ký tự được đặt ngoài cuối chuỗi, PHP sẽ đặt các ký tự bị thiếu thành không gian. Và chunk_splitlà cách ngắn nhất để chèn các ngắt dòng.
    Tôi thậm chí không muốn biết bao nhiêu thứ nữa sẽ mất.
  • 7+($c&3?:-6)ngắn hơn một byte so với $c&3?$c%4+7:1.
  • Đã thêm hexdec()(8 byte) để đáp ứng hạn chế đầu vào.

2

JavaScript, 184 183 178 168 167 byte

f=
n=>[...`<>K[LM]NO\\^k{lm}no|~`].map((e,i)=>n>>i&1&&[0,2,4,6,8].map(i=>a[(e&102)*4+(e&17||15)*i]=`o`,e=~e.charCodeAt()),a=[...(` `.repeat(31)+`
`).repeat(9)])&&a.join``
<input oninput=o.textContent=f(+this.value)><pre id=o>

Ban đầu là 206 byte nhưng câu trả lời của @ Arnauld đã truyền cảm hứng cho tôi điều tra một giải pháp mảng một chiều. Chỉnh sửa: Đã lưu 1 byte nhờ @ edc65. Đã lưu 5 15 byte nhờ @Arnauld. Đã lưu thêm một byte bằng cách điều chỉnh sự lựa chọn của các ký tự.


[0,1,2,3,4]ngắn hơn
edc65

Tôi nghĩ bạn có thể tiết kiệm 4 byte bằng cách sử dụng [67,65,52,36,51,50,34,49,48,35,33,20,4,19,18,2,17,16,3,1][0,2,4,6,8].map(i=>a[(e&102)*4+(e&17||15)*i]='o')
Arnauld

1
Hoặc bạn có thể sử dụng [..."ecVFUTDSREC6&54$32%#"][0,2,4,6,8].map(i=>a[(e&102)*4+(e&17||15)*i]='o',e=e.charCodeAt()-34)để lưu thêm 10 byte.
Arnauld

@Arnauld Dường như bạn đã vượt quá mức tiết kiệm của mình bằng 1 và tôi cũng đã xoay sở để loại bỏ một byte thừa bằng cách sử dụng ~thay vì -34(đáng buồn là tôi đã phạm lỗi với `\`, đó là lý do tại sao tôi không lưu 2 byte).
Neil

Tôi tự hỏi nếu bạn có thể thay thế '\' này bằng ký tự ASCII # 220.
Arnauld

1

Mẻ, 491 byte

@set n=%1
@for %%i in ("720896 524288 524288 524288 843776 262144 262144 262144 268288" "131072 65536 0 32768 16384 8192 0 4096 2048" "131072 0 98304 0 16384 0 12288 0 2048" "131072 32768 0 65536 16384 4096 0 8192 2048" "165248 1024 1024 1024 89312 512 512 512 10764" "256 128 0 64 32 16 0 8 4" "256 0 192 0 32 0 24 0 4" "256 64 0 128 32 8 0 16 4" "322 2 2 2 171 1 1 1 17")do @set s=&(for %%j in (%%~i)do @set/am=%1^&%%j&call:c)&call echo(%%s%%
:c
@if %m%==0 (set s=%s%  )else set s=%s%o 

Lưu ý: Dòng cuối cùng kết thúc bằng một khoảng trắng. Đặt một ifđiều kiện với một biến trong một forvòng lặp là vượt quá lô để cần chương trình con của chính nó. Vì nó không có gì có thể nhìn thấy nên tôi rơi vào đó để thoát ra. Việc ~bỏ các chuỗi trong vòng lặp bên ngoài cho phép vòng lặp bên trong lặp qua các số. Các con số chỉ đơn giản là bitmasks cho tất cả các vị trí ocần vẽ.


1

C, 267 262 260 256 ký tự

Đếm số lần thoát là 1 ký tự

void f(int i){char*k="\0\x1\x2\x3\x4\x4\x5\x6\x7\x8\0\x9\x12\x1b\x24\0\xa\x14\x1e\x28\x4\xc\x14\x1c\x2d\x4\xd\x16\x1f\x28\x4\xe\x18\x22\x2c\x8\x10\x18\x20\x28\x8\x11\x1a\x23\x2c\x24\x25\x26\x27\x28\x28\x29\x2a\x2b\x2c\x24\x2d\x36\x3f\x48\x24\x2e\x38\x42\x4c\x28\x30\x38\x40\x48\x28\x31\x3a\x43\x4c\x28\x31\x3a\x43\x4c\x28\x32\x3c\x46\x50\x2c\x35\x3e\x47\x50\x48\x49\x4a\x4b\x4c\x4c\x4d\x4e\x4f\x50";for(int n=0,s,l;n<81;!(++n%9)&&putchar(10))for(s=l=0;s<20;!(++l%5||++s^20)&&putchar(32))if(i<<s&1<<19&&k[l]==n&&putchar(111))break;}

k là một tra cứu đề cập đến những hộp để đặt 'o' vào.

Hãy thử trực tuyến!


1

Befunge, 468 byte

~:85+`!#v_86*-:9`7*-48*%\82**+
3%2:/2\<$v0%2:/2\*g02*!g03%2:/2\*!+4g07%2:/2\*g02*!-8g06%2:/2\*g02*!-4g0
g!*20g*^00>50g*\2/:2%00g8-!*40g*\2/:2%30g8-!*20g*\2/:2%60g66+-!*\2/:2%70
`\5:p00:<g^*!-8g00%2:\-10:\p07-g00:p06+g00:p05`3:p04`\5:p03:<0\p02`3:p01
#o 8`#@_^4>*50g*\2/2%00g!*40g*0\>:#<1#\+_$!1+4g,48*,\1+:8`!#^_55+,$\1+:
g03%2:/2<-^!g00%2:/2\*g01*!g03%2:/2\*g01*!g07%2:/2\*!-4g06%2:/2\*g01*!-4
70g4-!*\^>!*50g*\2/:2%00g4-!*40g*\2/:2%30g8-!*10g*\2/:2%60g8-!*10g*\2/:2%

Hãy thử trực tuyến!

Dòng đầu tiên đọc một chuỗi từ stdin, đánh giá nó là số thập lục phân. Phần còn lại của mã về cơ bản chỉ là một vòng lặp kép trên tọa độ x / y của lưới, với phép tính boolean lớn xác định xem có onên xuất ra cho mỗi vị trí hay không.

Về cơ bản, có một điều kiện riêng cho mỗi trong số 20 điểm lưới, ví dụ (bốn điểm đầu tiên):

(y==0) * (x<5) * bit0
(y==0) * (x>3) * bit1
(x==0) * (y<5) * bit2
(x==y) * (y<5) * bit3

Và sau đó, khi chúng tôi đã tính toán tất cả 20 trong số chúng, chúng tôi HOẶC rất nhiều cùng nhau, và nếu kết quả đó là đúng, chúng tôi sẽ tạo ra một o, nếu không chúng tôi sẽ tạo ra một khoảng trắng.

Befunge không có bất cứ điều gì trong cách vận hành thao tác bit, vì vậy để trích xuất các bit từ đầu vào, chúng ta chỉ cần lặp đi lặp lại n%2và sau đó n/=2khi chúng ta thực hiện theo 20 tính toán điều kiện.

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.