아름다운 패턴 서랍 (리틀 큐브 포함)


18

아름다운 패턴 서랍

좋은 아침 PPCG!

다른 날, Stack Overflow에서 누군가를 돕기 위해 노력했을 때, 그의 문제 중 일부는이 도전에 대한 아이디어를주었습니다.

먼저 다음 모양을 확인하십시오.

여기에 이미지 설명을 입력하십시오

모든 검은 색 숫자는 모양의 점의 색인이고 모든 진한 파란색 숫자는 점 사이의 링크 색인입니다.

이제 0x00000 ~ 0xFFFFF에 16 진수가 주어지면 문자 공간과 "■"만 사용하여 콘솔에 도형을 그려야합니다 ( "o"문자 사용도 괜찮습니다).

다음은 16 진수가 입력되고 모양이 출력되는 몇 가지 예입니다.

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

작동 방식에 대한 설명은 다음과 같습니다.

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

여기에는 20 비트가 있으며 각 비트는 링크의 존재 여부를 나타냅니다.

MSB (Most Significant Bit)의 인덱스는 0 (그림 참조)이거나 LSB (Least Significant Bit)는 19 (그림 참조)입니다.

다음은 예제로 주어진 첫 번째 모양에서 작동하는 방법입니다.

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

즉, 0,1,2,8,9,14,17,19와 같은 기존 링크가 있습니다.

참조 그림에서 해당 숫자로 선을 강조 표시하면 다음과 같은 모양이됩니다.

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

도움이 더 필요한 경우 간단하고 골프화되지 않은 Python 구현은 다음과 같습니다.

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)

물론 그것은 완벽하지 않으며 그것이해야 할 일에 꽤 오래 걸리기 때문에 이것이 당신이 여기에있는 정확한 이유입니다!

이 프로그램을 엄청나게 짧게 만들기 :)

이것은 코드 골프이므로 최단 답변이 승리합니다!


줄에 단일 후행 공백을 인쇄 할 수 있습니까? 당신의 예는 그것들을 포함합니다.
orlp

네 :) 허용됩니다
Sygmei

4
그래픽 출력이 허용됩니까?
12Me21

1
16 진수 입력이 필요합니까, 10 진수가 괜찮습니까?
Titus

1
어쩌면 모든 코드 골프가 나에게 다가 가고 있지만 그 코드는 읽기 힘들다.
Lynn

답변:


8

자바 스크립트 (ES6) 202 188 187 바이트

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))

작동 원리

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

우리 g는 10 자의 9 행의 그리드 에서 작업 합니다. 그리드는 처음에 공백으로 채워져 있으며 10 번째 문자마다 LineFeed가 있습니다.

각 세그먼트는 시작 위치와 방향으로 정의됩니다.

방향은 다음과 같이 인코딩됩니다.

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

각 세그먼트는 정수로 인코딩됩니다.

  • 방향은 비트 # 0 및 # 1에 저장됩니다.
  • 시작 위치는 비트 # 2 ~ # 8에 저장됩니다.

예를 들어, 세그먼트 # 3은 위치 55에서 시작하여 세 번째 방향을 사용합니다. 따라서로 인코딩됩니다 (55 << 2) | 3 == 223.

다음은 세그먼트 # 19에서 세그먼트 # 0까지의 정수 결과 목록입니다.

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

356에서 시작하여 델타 인코딩되면 다음과 같이됩니다.

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

마지막으로 다음과 같이 인코딩됩니다.

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

죄송합니다. 사이의 공백을 잊어 버렸습니다. 고치기.
Arnauld

5

파이썬 3, 289 바이트

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)))

똑똑하지도 않고 단지 하드 코딩.


할 수 없습니다 "trq|t...a|eca".split("|")"tqr t...a eca".split()?
Loovjo

@Loovjo Nope는 .split()파괴한다 ||.
orlp

3

루비, 116 바이트

->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}

이것은 내가 관찰 한 몇 가지 패턴에 의존합니다. 먼저, 9 줄마다 패턴이 반복됩니다. 둘째, 수평선의 시작점이 적절하게 선택되면 x 방향이 오른쪽, 왼쪽, 직선으로 연속적으로 순환합니다.

테스트 프로그램에서 언 골프

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],'---------'}

20 문자 문자열과 20 줄의 매개 변수를 정의하기 위해 일부 디코딩을 사용하는 112 바이트 솔루션이 있다고 생각합니다. 시간이 있으면 나중에 다시 시도하겠습니다.


좋은 설명!
Sygmei

2

PHP, 142 (150) 149 바이트

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);

필요한만큼 모양을 인쇄합니다. 즉, 하부가 비어 있으면 절단됩니다.
로 실행하십시오 php -nr '<code>' <input>. 접두사 입력하지 마십시오

온라인 테스트

자르지 않도록 11 바이트 추가 : ,$r[80]=" "이후에 삽입하십시오 $r="".

인코딩 설명

모든 선은 시작점과 네 방향 중 하나로 설명 할 수 있습니다.
가운데 9X9 격자 그리기 시작 위치가 범위 0,08,4; 또는에서로 결합 0됩니다 8*9+4=76. 운 좋게도 모든 시작점 [0,4,8,36,40,44,72,76]은 4로 나눌 수 있습니다. 따라서 방향 코드 [0..3]를 비트 0과 1로 압축 할 수 있습니다.

커서 이동을 쉽게 계산하기 0위해 동쪽 (수직 이동이없는 방향 만)과 [1,2,3]남서쪽, 남쪽, 남동쪽에서 오프셋이 9(수직 이동의 경우) 더하기 [-1,0,1]-> [8,9,10]->로 계산 delta=code?code+7:1됩니다.

첫 줄과 마지막 줄의 방향이 동쪽이므로 0에서 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]. 각 값의 비트 단위 xor 96은 인쇄 가능하고 문제가없는 ASCII 코드 [96,100,98,99,101,102,103,105,106,68, 72,70,71,73,74,75,77,78,40,44]->를 생성 `dbcefgijDHFGIJKMN(,합니다. 이 코드는 비트 0에 LSB를 사용하는 반면, 라인 0은 MSB에 해당하므로 문자열을 바꿔야합니다. 피니 토.

고장

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

일부 골프 설명

  • 이후 ^96하위 두 비트에 아무런 영향을 미치지 않는다 방향을 추출 할 때, 무시 될 수있다; 따라서 변수에 값을 저장할 필요가 없으므로 커서 init에 5 바이트가 저장됩니다.
  • ~3대신에를 사용 124하면 1 바이트 를 절약하고 다음 골프를 할 수 있습니다.
  • 할당 $k=3내 에서 루핑 카운터를 초기화 $p하면 2 바이트가 절약
    되고 전제 조건을 손상시키지 않습니다 (상위 값에는 여전히 1 자리 숫자가 있으므로).
  • 결과에 문자열을 사용하면 초기화 및 플로팅이 가장 짧습니다. 문자가 문자열의 끝을 넘어 설정되면 PHP는 누락 된 문자를 공백으로 암시 적으로 설정합니다. 그리고 줄 chunk_split바꿈을 삽입하는 가장 짧은 방법입니다.
    나는 다른 어떤 것이 더 필요할지 알고 싶지도 않습니다.
  • 7+($c&3?:-6)보다 1 바이트 짧습니다 $c&3?$c%4+7:1.
  • hexdec()입력 제한을 충족시키기 위해 (8 바이트)가 추가되었습니다 .

2

자바 스크립트, 184 183 178 168 167 바이트

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>

원래 206 바이트 였지만 @Arnauld의 대답은 1 차원 배열 솔루션을 조사하도록 영감을주었습니다. 편집 : @ edc65 덕분에 1 바이트가 절약되었습니다. 저장 5 15 @Arnauld 덕분에 바이트. 문자 선택을 조정하여 추가 바이트를 절약했습니다.


[0,1,2,3,4]더 짧습니다
edc65

[67,65,52,36,51,50,34,49,48,35,33,20,4,19,18,2,17,16,3,1]and[0,2,4,6,8].map(i=>a[(e&102)*4+(e&17||15)*i]='o')
Arnauld

1
또는 당신은 사용할 수 있습니다 [..."ecVFUTDSREC6&54$32%#"][0,2,4,6,8].map(i=>a[(e&102)*4+(e&17||15)*i]='o',e=e.charCodeAt()-34)10 개의 바이트를 저장합니다.
Arnauld 2012 년

@Arnauld 당신은 1로 저축을 과소 계산 한 것으로 보였고 ~대신에 여분의 바이트를 사용하여 골프를 치기도했습니다 -34(슬프게도 나는`\`의 파울입니다.
Neil

이 '\'를 ASCII 문자 # 220으로 바꿀 수 있는지 궁금합니다.
Arnauld

1

배치, 491 바이트

@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 

참고 : 마지막 줄은 공백으로 끝납니다. 루프 if안에 변수가 있는 조건부를 for배치하는 것은 배치를 넘어서므로 자체 서브 루틴이 필요합니다. 그것은 아무것도 보이지 않기 때문에 빠져 나가기 위해 빠져 나갑니다. ~외부 루프에서 문자열 의 인용을 해제하면 내부 루프가 숫자 위로 반복됩니다. 숫자는 단순히 os를 그려야 하는 모든 장소에 대한 비트 마스크입니다 .


1

C, 267 262 260 256 자

1 자로 이스케이프 계산

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는 'o'를 넣을 상자를 나타내는 조회입니다.

온라인으로 사용해보십시오!


1

펀칭, 468 바이트

~: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%

온라인으로 사용해보십시오!

첫 번째 줄은 stdin에서 문자열을 읽고 16 진수로 평가합니다. 나머지 코드는 기본적으로 그리드의 x / y 좌표에 대한 이중 루프 o이며 각 위치에 대해 출력 해야하는지 여부를 결정하는 방대한 부울 계산 입니다.

기본적으로 20 개의 그리드 포인트 각각에 대해 별도의 조건이 있습니다 (예 : 처음 네 개).

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

그런 다음 20 개를 모두 계산하면 로트를 함께 계산하고 결과가 참이면 a를 출력하고 o그렇지 않으면 공백을 출력합니다.

Befunge는 비트 조작 작업에 어떤 것도 가지고 있지 않으므로 입력에서 비트를 추출하기 위해 반복적으로 평가 n%2하고 n/=220 조건 계산을 진행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.