ลิ้นชักรูปแบบที่สวยงาม (รวมลูกบาศก์เล็ก ๆ น้อย ๆ )


18

ลิ้นชักลวดลายสวยงาม

อรุณสวัสดิ์ PPCG!

เมื่อวันก่อนตอนที่ฉันพยายามช่วยเหลือใครบางคนใน Stack Overflow ปัญหาส่วนหนึ่งของเขาทำให้ฉันมีความคิดสำหรับความท้าทายนี้

ก่อนอื่นให้ตรวจสอบรูปร่างต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

โดยที่ตัวเลขสีดำทั้งหมดเป็นดัชนีของจุดในรูปร่างและตัวเลขสีน้ำเงินเข้มทั้งหมดเป็นดัชนีของลิงก์ระหว่างจุด

ตอนนี้เมื่อกำหนดตัวเลขฐานสิบหกสำหรับ 0x00000 ถึง 0xFFFFF คุณต้องวาดรูปร่างในคอนโซลโดยใช้พื้นที่อักขระเท่านั้นและ "■" (การใช้อักขระ "o" ก็โอเคเช่นกัน)

นี่คือตัวอย่างบางส่วนที่ตัวเลขฐานสิบหกคืออินพุตและรูปร่างเป็นเอาต์พุต:

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

นี่คือคำอธิบายเกี่ยวกับวิธีการทำงาน:

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

คุณอยู่ที่นี่มี 20 บิตแต่ละบิตบอกว่ามีลิงก์อยู่หรือไม่

ดัชนีบิตที่สำคัญที่สุด (MSB) คือ 0 (การอ้างอิงรูปภาพ) หรือบิตที่มีนัยสำคัญน้อยกว่า (LSB) คือ 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
คุณต้องการอินพุตฐานสิบหกหรือเป็นทศนิยม?
ติตัส

1
บางทีโค้ดกอล์ฟทั้งหมดเพิ่งจะมาถึงฉัน แต่โค้ดนั้นเจ็บปวดที่จะอ่าน ...
ลินน์

คำตอบ:


8

JavaScript (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ของ 9 แถว 10 ตัวอักษร กริดนั้นเต็มไปด้วยช่องว่างในตอนแรกด้วย LineFeed ทุกตัวละครที่ 10

แต่ละส่วนจะถูกกำหนดโดยตำแหน่งเริ่มต้นและทิศทาง

เส้นทางจะถูกเข้ารหัสดังนี้:

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 และใช้ทิศทางที่ 3 ดังนั้นจึงเข้ารหัสเป็น(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

Python 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

Ruby, 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 จะวนอย่างต่อเนื่องผ่านทางขวา, ซ้าย, ตรง

Ungolfed ในโปรแกรมทดสอบ

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

ฉันเชื่อว่ามีวิธีแก้ปัญหา 112 ไบต์โดยใช้สตริง 20 อักขระและการถอดรหัสบางอย่างเพื่อกำหนดพารามิเตอร์ของ 20 บรรทัด ฉันจะลองในภายหลังถ้าฉันมีเวลา


คำอธิบายที่ดี!
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,0ไป8,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 พิมพ์และ unproblematic ->[96,100,98,99,101,102,103,105,106,68, 72,70,71,73,74,75,77,78,40,44] `dbcefgijDHFGIJKMN(,รหัสใช้ LSB สำหรับบิต 0 ในขณะที่บรรทัด 0 สอดคล้องกับ MSB ดังนั้นสตริงจะต้องถูกย้อนกลับ Finito

ชำรุด

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ไม่มีผลต่อสองบิตที่ต่ำกว่าจึงสามารถละเว้นได้เมื่อทำการแยกทิศทาง ดังนั้นไม่จำเป็นต้องเก็บค่าไว้ในตัวแปรซึ่งจะช่วยประหยัด 5 ไบต์บนเคอร์เซอร์ init
  • ใช้~3แทนการ124บันทึกหนึ่งไบต์และอนุญาตให้เล่นกอล์ฟต่อไป:
  • การเริ่มต้นตัวนับลูป$k=3ภายในการ$pกำหนดจะบันทึกสองไบต์
    และไม่ทำให้เกิดเงื่อนไขล่วงหน้า (เนื่องจากค่าสูงสุดยังคงมีหนึ่งหลัก)
  • การใช้สตริงสำหรับผลลัพธ์มีการกำหนดค่าเริ่มต้นที่สั้นที่สุดและสามารถทำการพล็อตได้: เมื่ออักขระถูกตั้งค่าไว้ที่ส่วนท้ายของสตริง PHP จะตั้งค่าอักขระที่หายไปโดยปริยายให้เป็นช่องว่างโดยปริยาย และchunk_splitเป็นวิธีที่สั้นที่สุดในการแทรก linebreaks
    ฉันไม่ต้องการที่จะรู้ว่าจะมีอะไรอีกมาก
  • 7+($c&3?:-6)$c&3?$c%4+7:1เป็นหนึ่งไบต์สั้นกว่า
  • เพิ่มhexdec()(8 ไบต์) เพื่อตอบสนองข้อ จำกัด การป้อนข้อมูล

2

JavaScript, 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 บันทึก5 15 ไบต์ขอบคุณ @Arnauld บันทึกไบต์เพิ่มเติมโดยปรับแต่งตัวเลือกอักขระ


[0,1,2,3,4]สั้นกว่า
edc65

ฉันคิดว่าคุณสามารถบันทึก 4 ไบต์โดยใช้[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
หรือคุณสามารถใช้[..."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

@Arnauld คุณดูเหมือนจะมี undercounted ประหยัดของคุณโดยที่ 1 และฉันยังมีการจัดการการกอล์ฟออกไบต์พิเศษโดยใช้~แทน-34(เศร้าฉันตกเหม็นของ `\` ซึ่งเป็นเหตุผลที่ฉันทำไม่ได้บันทึก 2 bytes)
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ลูปนั้นอยู่นอกเหนือแบทช์ดังนั้นจึงจำเป็นต้องมีรูทีนย่อยของตัวเอง เนื่องจากมันไม่เห็นสิ่งใดเลยฉันจึงตกลงไปในนั้นเพื่อออก ~unquotes สตริงในวงด้านนอกช่วยให้ภายในวงห่วงมากกว่าตัวเลข ตัวเลขเป็นเพียง bitmasks สำหรับสถานที่ทั้งหมดที่oควรจะวาด


1

C, 267 262 260 256 ตัวอักษร

การนับจำนวน Escape เป็น 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

Befunge ขนาด 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 โดยประเมินว่าเป็นเลขฐานสิบหก ส่วนที่เหลือของรหัสเป็นเพียงการวนซ้ำสองเท่าเหนือพิกัด 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 ไม่ได้มีอะไรในลักษณะของการดำเนินงานการจัดการบิตเพื่อที่จะดึงบิตจากการป้อนข้อมูลที่เราเพียงแค่ซ้ำ ๆ evalating n%2แล้วn/=2ในขณะที่เราให้ทางเราผ่าน 20 การคำนวณสภาพ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.