พิมพ์ต้นไม้ไบนารี


18

แรงบันดาลใจจากคำถามล่าสุดเกี่ยวกับ SO ...

เขียนฟังก์ชั่นเพื่อพิมพ์ต้นไม้ไบนารีในรูปแบบต่อไปนี้:

   3
 /   \
1     5
 \   / \
  2 4   6
  1. ผลลัพธ์ควรประกอบด้วยบรรทัดของโหนดตามด้วยบรรทัดของ/และ\อักขระที่ระบุความสัมพันธ์ตามด้วยบรรทัดของโหนด ฯลฯ
  2. คุณสามารถสมมติว่าโหนดทั้งหมดสามารถแสดงได้เป็นอักขระเดียว
  3. โหนดที่อยู่ติดกันในระดับต่ำสุดควรถูกคั่นด้วยพื้นที่อย่างน้อยหนึ่งโหนดโหนดที่อยู่ไกลออกไปควรแยกออกจากกันตามความเหมาะสม
  4. ควรวางโหนดที่มีลูกสองคนไว้ตรงกลางของลูกที่อยู่ตรงกลาง
  5. เครื่องหมายทับความสัมพันธ์ควรอยู่กึ่งกลางระหว่างผู้ปกครองและเด็กที่เหมาะสม (รอบใดก็ตามที่คุณต้องการ)

การป้อนข้อมูล:

อินพุตจะถูกจัดเตรียมไว้เป็นอาร์กิวเมนต์สำหรับฟังก์ชันของคุณ ฉันจะไม่ระบุโครงสร้างที่แน่นอนของต้นไม้อย่างไรก็ตามมันต้องใช้งานได้เป็นต้นไม้ไบนารีจริง ไม่มี "ต้นไม้แสดงอยู่ในโปรแกรมของฉันเนื่องจากสตริงมีลักษณะเหมือนผลลัพธ์ที่คาดหวัง"

คุณอาจพิมพ์ไปที่กระแสออกหรือส่งกลับสตริงที่มีเอาท์พุทที่คุณเลือก

คะแนนสำหรับรหัสที่สั้นที่สุด แต่ฉันต้องการโซลูชันที่ใช้งานได้ยาวนานกว่า short-working 90%


อัพเดทสำหรับรางวัล:

สำหรับเงินรางวัลฉัน (เครื่องมือเพิ่มประสิทธิภาพ) กำลังทำการเปลี่ยนแปลงเล็กน้อย:

  • อินพุตอาจมาจาก STDIN, ARGV หรืออาร์กิวเมนต์ของฟังก์ชัน
  • เอาต์พุตต้องอยู่ใน STDOUT (หรือconsole.logสำหรับ JS)
  • คุณสามารถสันนิษฐานได้ว่าอินพุตนั้นอยู่ในรูปของอาร์เรย์ตัวอย่างเช่น [1,2,3]หรือ[1 2 3]

อัพเดท 2 - ต้นไม้ไบนารีควรเป็นต้นไม้ค้นหาแบบทวิภาค เนื่องจากฉันไม่ได้พูดถึงเรื่องนี้ในตอนแรกฉันจะอนุญาตให้ผู้ใช้จัดการการแปลงอาร์เรย์ปกติเป็นอาร์เรย์การค้นหาต้นไม้แบบทวิภาคเป็นโปรแกรมแยกต่างหากและการนับไบต์สุดท้ายจะเป็นเพียงโปรแกรมที่จะใช้ในอาร์เรย์เป็นอาร์กิวเมนต์และพิมพ์ เหมือนต้นไม้ไบนารี


เราควรใช้เครื่องหมายทับความสัมพันธ์หลายอย่างเหมาะสมหรือไม่ เราต้องใช้จำนวนเครื่องหมายทับที่น้อยที่สุดหรือไม่ คนเราควรแยกแยะระหว่างการมีลูกซ้ายคนเดียวกับเด็กที่มีลูกใช่ มันจะดีไหมถ้ามีช่องว่างนำหน้าในทุกบรรทัดเอาต์พุต?

เราจะทำอย่างไรถ้าต้นไม้ไม่สมบูรณ์ (2 ^ n-1 โหนดสำหรับบาง n) บางโหนด (อันไหน?) มีลูกเพียงคนเดียว แต่ถ้าเราได้รับอนุญาตให้มีโหนดที่มีลูกเพียงคนเดียวต้นไม้ที่เสื่อมโทรมก็สามารถทำได้ง่าย (1-2-3-4-5-6 ลงไปทางขวาพูดได้)
Keith Randall

คุณวาดให้เป็นจำนวนมากได้อย่างไร? ตัวอย่างเช่น30000,1000,499999
Mohsen

คำตอบ:


9

Fortran 77 - 1,085 ตัวอักษร

      subroutine q(u,t)
      implicit integer(i-z)
      character*33 f,g
      dimension t(u)
      m=ceiling(log(real(u))/log(2.))
      v=2**(m+1)-1
      do l=1,m
         n=2**(l-1)
         k=2**(m-l+2)-3
         w=(3+k)*2**(l-1)-k
         p=1+(v-w)/2
         if(l.ne.1)then
            write(f,'(A,I3,A)')'(A',p,',$)'
            print f,' '
            write(f,'(A5,I3,A3)')'(A3,A',k,',$)'
            do j=2**(l-1),2**l-1
               if(t(j/2).lt.0.or.t(j).lt.0)then
                  print f,'   ',' '
               elseif(mod(j,2).eq.0)then
                  print f,'  /',' '
               else
                  print f,' \ ',' '
               endif
            enddo
            print*
         endif
         write(f,'(A,I3,A)')'(A',p,',$)'
         print f,' '
         write(f,'(A5,I3,A3)')'(I3,A',k,',$)'
         write(g,'(A2,I3,A3)')'(A',k+3,',$)'
         do j=2**(l-1),2**l-1
            if(t(j).ge.0)then
               print f,t(j),' '
            else 
               print g,' '
            endif
         enddo
         print*
      enddo
      end

ต้นไม้ถูกแสดงในแถวลำดับtตามปกติ, รากที่ 1, ราก -> ซ้ายที่ 2, ราก -> ขวาที่ 3 ราก -> ซ้าย -> ซ้ายที่ 4 ...

เอาต์พุตควรพอดีกับเทอร์มินัลทั่วไปสูงสุด 5 ระดับ

ฉันใช้เครื่องหมายสแลชหนึ่งอันระหว่างแต่ละคู่ของโหนดซึ่งดูไร้สาระใกล้กับด้านบนเมื่อมีสี่ระดับขึ้นไป ฉันอนุญาตให้ใช้โหนดได้สูงสุดสามหลัก

โปรแกรมเต็มรูปแบบที่มีความคิดเห็นและนั่งร้านเปิดตัว:

      program tree

      parameter (l=8)          ! How many nodes to support
      dimension i(l)

c     Initialize the array to all empty nodes
      do j=1,l
         i(j)=-1
      end do
c     Fill in some values
      i(1)=3
      i(2)=1
      i(3)=5
      i(5)=2
      i(6)=4
      i(7)=7
c      i(14)=6
c      i(15)=8
c     Call the printing routine
      call q(l,i)

      stop
      end

c     Print an ASCII representation of the tree
c
c     u the length of the array containing the tree
c     t an integer array representing the tree.
c
c     The array contains only non-negative values, and empty nodes are
c     represented in the array with -1.
c
c     The printed representation uses three characters for every node,
c     and places the (back) slash equally between the two node-centers.
      subroutine q(u,t)
      implicit integer(i-z)
      character*33 f,g
      dimension t(u)
      m=ceiling(log(real(u))/log(2.)) ! maximum depth of the tree
      v=2**(m+1)-1              ! width needed for printing the whole tree
                                ! Optimized from 3*2**m + 1*((2**m)-1) at
                                ! the bottom level
      do l=1,m
         n=2**(l-1)             ! number of nodes on this level
         k=2**(m-l+2)-3         ! internode spacing
         w=(3+k)*2**(l-1)-k     ! width needed for printing this row
                                ! Optimized from 3*2**l + k*((2**l)-1) at
                                ! the bottom level
         p=1+(v-w)/2            ! padding for this row
c     Print the connecting lines associated with the previous level
         if(l.ne.1)then         ! Write the connecting lines
            write(f,'(A,I3,A)')'(A',p,',$)'
            print f,' '
            write(f,'(A5,I3,A3)')'(A3,A',k,',$)'
            do j=2**(l-1),2**l-1
               if(t(j/2).lt.0.or.t(j).lt.0)then
                  print f,'   ',' '
               elseif(mod(j,2).eq.0)then
                  print f,'  /',' '
               else
                  print f,' \ ',' '
               endif
            enddo
            print*
         endif
c     Print the nodes on this level
         write(f,'(A,I3,A)')'(A',p,',$)'
         print f,' '
         write(f,'(A5,I3,A3)')'(I3,A',k,',$)'
         write(g,'(A2,I3,A3)')'(A',k+3,',$)'
         do j=2**(l-1),2**l-1
            if(t(j).ge.0)then
               print f,t(j),' '
            else 
               print g,' '
            endif
         enddo
         print*
      enddo
      end

เอาต์พุตที่มีอินพุตเทียบเท่ากับตัวอย่าง:

$ ./a.out 
         3             
     /      \      
     1       5     
      \    /  \  
       2   4   7 

ช่วยด้วยทำไมภาษานี้
tomsmeding

9
เพราะมันไม่เหมาะกับการเล่นกอล์ฟมากนัก
dmckee

5

CJam, 100 99 ไบต์

q~_,2b,)2\#:Q1@{_2$<Q(S*:T*TQ2/:Q@ts[N+_0@{@1$' >{2$St2$_Q3*&2/^_4$>"\/"=t}*@)}/;U*o]o1:U$>\2*\}h];

อินพุตต้องเป็นรายการอักขระโดยไม่มีอักขระควบคุม ASCII ช่องว่างจะถูกเขียนแทนด้วยช่องว่าง มันจะต้องเป็นต้นไม้ไบนารีที่สมบูรณ์แบบที่มี 2 n -1 โหนด

ตัวอย่าง:

['6 '3 '7 '1 '4 '  '9 '0 '2 '  '5 '  '  '8 ' ]

หรือเพียงแค่ใช้สตริง:

"63714 902 5  8 "

เอาท์พุท:

                6              
            /       \          
        3               7      
      /   \               \    
    1       4               9  
   / \       \             /   
  0   2       5           8    

คำอธิบาย

q~                        " Read input. ";
_,2b,                     " Get tree height. ";
)2\#:Q                    " Get (displayed) tree width and save it in Q. ";
1@                        " Push X=1 and rotate the input to top. ";
{                         " Do: ";
    _2$<                  " Get first X characters from the input. ";
    Q(S*:T                " T = (Q-1) spaces. ";
    *                     " Separate the X characters by T. ";
    TQ2/:Q@t              " Put the string in the middle of T, and divide Q by 2. ";
    s                     " Concatenate everything into a string.
                            This is the line of node labels. ";
    [
        N+                " Append a newline. ";
        _                 " Duplicate. ";
        0@                " Push a 0 and rotate the original string to top. ";
        {                 " For each character: ";
            @             " Rotate the duplicate to top. ";
            1$' >         " Test if the current character is greater than a space. ";
            {             " If true: ";
                2$St      " Set the current character in the duplicate to space. ";
                2$        " Copy the current position I (the number initialized with 0). ";
                _Q3*&2/^  " Calculate I ^ ((I & (3*Q))>>1),
                            the position of the relationship character. ";
                _4$>      " Test if it is greater than the current position. ";
                "\/"=     " Select the relationship character. ";
                t         " Change the character in the duplicate. ";
            }*
            @)            " Increment the current position. ";
        }/
                          " The last two items are the line of relationship characters
                            and the tree width. ";
        ;                 " Discard the tree width. ";
        U*                " If it is the first line, empty the line of
                            relationship characters. ";
        o                 " Output. ";
    ]o                    " Output the line of node labels. ";
    1:U                   " Mark it not the first line. ";
    $>                    " Remove the first X characters from the input. ";
    \2*\                  " Multiply X by 2. ";
}h                        " ...while the input is not empty. ";
];                        " Discard everything in the stack. ";

สคริปต์การแปลง

[[0LL]W]
[q~{_a_:i={'0+}*}%La2*f+
_,,]z$
1$a+
{
    {
        1$1=1$1=>:T
        {
            ~@0=2 3$1=t
            @1@ta\+
        }*
        T
    }g
}*
0=1=a
{
    {
        (M\+:M;
        La[' LL]aer~
    }%
    _[' LL]a-
}g
];
M0+`-3<']+

ยอมรับทั้งตัวละครหรือตัวเลขหลักเดียว

ตัวอย่าง (เหมือนกันทั้งหมด):

['6 '7 '9 '3 '1 '2 '8 '4 '0 '5]
[6 7 9 3 1 2 8 4 0 5]
"6793128405"

เอาท์พุท:

['6 '3 '7 '1 '4 ' '9 '0 '2 ' '5 ' ' '8 ' ]

มันเป็นการก่อสร้างต้นไม้คาร์ทีเซียนที่อยู่ตรงหน้า


คุณสามารถเพิ่มอีกสองไบต์และป้อนข้อมูลสคริปต์การแปลงเป็นจำนวนเต็มแทนอักขระ :)
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer แก้ไขเพื่อสนับสนุนทั้งสอง ฉันคิดว่าตัวละครมีเหตุผลมากกว่านี้เพราะรองรับเฉพาะชื่อโหนดที่มีตัวอักษรเดียว มีจำนวนอักขระมากกว่าตัวเลขหลักเดียว
jimmy23013

2

Python 2, 411 ไบต์

import math
def g(a,o,d,l,b):
 if l<0:
    return
 c=2*b+1
 k=2*l+1
 o[k]=' '*b
 n=d-l
 p=1 if n==0 else 3*2**n-1
 o[k-1]=p/2*' '
 i=0
 for v in a[2**l-1:2**l*2-1]:
    v=' ' if v==None else v
    o[k]+=v+' '*c
    m=' ' if v==' ' else '/' if i%2==0 else '\\'
    o[k-1]+=m+max(1,b)*' ' if i%2==0 else m+p*' '
    i+=1

 g(a,o,d,l-1,c)
def f(a):
 d=int(math.log(len(a),2))
 o=['']*(d*2+2)
 g(a,o,d,d,0)
 print '\n'.join(o[1:])

หมายเหตุ: ระดับการเยื้องครั้งแรกคือ 1 ช่องว่างที่สองคือหนึ่งแท็บ

โทรfด้วยรายการสตริงหนึ่งตัวอักษรหรือNoneเช่น f(['1',None,'3']). รายการต้องไม่ว่างเปล่า

สิ่งนี้ควรปฏิบัติตามกฎสำหรับเงินรางวัล

สคริปต์ตัวแปลง:

แปลงและอาร์เรย์เป็นรูปแบบที่ใช้โดยเครื่องพิมพ์ต้นไม้ไบนารี ตัวอย่าง:

$ python conv.py [3,5,4,6,1,2]
['3', '1', '5', None, '2', '4', '6']

-

import sys

def insert(bt, i):
    if i < bt[0]:
        j = 0
    else:
        j = 1

    n = bt[1][j]
    if n == [None]:
        bt[1][j] = [i, [[None], [None]]]
    else:
        insert(bt[1][j], i)

def insert_empty(bt, i):
    if i == 0:
        return
    if bt == [None]:
        bt += [[[None], [None]]]

    insert_empty(bt[1][0], i - 1)
    insert_empty(bt[1][1], i - 1)

def get(l, level):
    if level == 0:
        if type(l) == list:
            return ([], l)
        else:
            return ([l], [])
    elif type(l) != list:
        return ([], [])

    res = []
    left = []

    for r, l in  [get(i, level - 1) for i in l]:
        res += r
        left += l

    return (res, left)

if __name__ == '__main__':
    l = eval(sys.argv[1])
    bt = [l[0], [[None], [None]]]
    map(lambda x: insert(bt, x), l[1:])

    depth = lambda l: 0 if type(l) != list else max(map(depth, l)) + 1
    d = (depth(bt) + 1) / 2

    insert_empty(bt, d - 1)

    flat = []
    left = bt
    i = 0
    while len(left) > 0:
        f, left = get(left, 1)
        flat += f

        i += 1

    for i in range(len(flat) - 1, -1, -1):
        if flat[i] == None:
            flat.pop()
        else:
            break

    flat = map(lambda x: None if x == None else str(x), flat)

    print flat

ตัวอย่าง:

เมื่อต้องการเรียกใช้เหล่านี้คุณควรจะมีไฟล์หลักชื่อและแปลงไฟล์ที่มีชื่อbt.pyconv.py

$ python conv.py [3,5,4,6,1,2] | python -c 'import bt; bt.f(input())'
   3
  / \
 1   5
  \ / \
  2 4 6
$ python conv.py [5,4,3,7,9] | python -c 'import bt; bt.f(input())'
   5
  / \
 4   7
/     \
3     9
$ python conv.py [1,2,3,4,5,6] | python -c 'import bt; bt.f(input())'
                               1
                                       \
                                               2
                                                   \
                                                       3
                                                         \
                                                           4
                                                            \
                                                             5
                                                              \
                                                              6
$ python conv.py [6,5,4,3,2,1] | python -c 'import bt; bt.f(input())'
                                   6
                       /
               5
           /
       4
     /
   3
  /
 2
/
1

คุณไม่ได้สร้างต้นไม้ไบนารี เพียงพิมพ์อาร์เรย์เป็นต้นไม้ไบนารี ผลลัพธ์ของ['1','2','3','4','5','6','7','8','9']อาร์เรย์ไม่ใช่สิ่งที่คุณแสดง มันควรจะมี3ลูกที่ถูกต้อง2ซึ่งเป็นลูกที่ถูกต้อง1ซึ่งเป็นองค์ประกอบที่สำคัญ
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer จากคำถาม: "อินพุตจะถูกระบุเป็นอาร์กิวเมนต์สำหรับฟังก์ชันของคุณฉันจะไม่ระบุโครงสร้างที่แน่นอนของทรี แต่จะต้องใช้งานได้เหมือนต้นไม้ไบนารีจริง" ฉันไม่เห็นคำจำกัดความเฉพาะของรูปแบบอาร์เรย์ที่ใช้
Tyilo

คำถามเดิมเป็นเรื่องเกี่ยวกับการพิมพ์ต้นไม้ไบนารี ผลลัพธ์ของคุณไม่ใช่ต้นไม้ไบนารี รูปแบบของอาเรย์นั้นไม่เกี่ยวข้องกับมัน
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer พวกมันไม่ใช่ต้นไม้ไบนารีอย่างไร? จากวิกิพีเดีย: ต้นไม้ไบนารีเป็นโครงสร้างข้อมูลต้นไม้ที่แต่ละโหนดมีลูกสองคนมากที่สุด โหนดใดมีโหนดย่อยมากกว่าสองโหนดหรือไม่?
Tyilo

อุ๊บ ฉันเห็นแล้ว ฉันคิดว่ามีคำที่เข้าใจผิดที่นี่ แม้จะอยู่ในตัวอย่างเริ่มต้นออกเป็นรูปแบบของไบนารีค้นหาต้นไม้ และความโปรดปรานของฉันก็มีไว้สำหรับแผนภูมิการค้นหาแบบไบนารี่เท่านั้น ขออภัยในความสับสนนั้น
เครื่องมือเพิ่มประสิทธิภาพ

1

APL, 125 ตัวอักษร

{⍵{x←⍵[0;d←⌈2÷⍨1⌷⍴⍵]←↑⍺
2 1∇{x[2↓⍳↑⍴x;(⍳d)+d×⍺-1]←⍵(⍺⍺⍣t←0≠⍴⍵)2↓x[;⍳d]
x[1;d+(⌈d÷4)ׯ1*⍺]←' /\'[t×⍺]}¨⍺[2 1]
x}' '⍴⍨2(×,*)≡⍵}

ตัวอย่าง:

{⍵{x←⍵[0;d←⌈2÷⍨1⌷⍴⍵]←↑⍺
2 1∇{x[2↓⍳↑⍴x;(⍳d)+d×⍺-1]←⍵(⍺⍺⍣t←0≠⍴⍵)2↓x[;⍳d]
x[1;d+(⌈d÷4)ׯ1*⍺]←' /\'[t×⍺]}¨⍺[2 1]
x}' '⍴⍨2(×,*)≡⍵}('1' ('2' ('3' ('4' ()()) ('5' ()())) ('6' ()('7' ()())))('8' ()('9' ('0' ()())())))

ทดสอบที่นี่


นี่เป็นสคริปต์การแปลงหรือไม่
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer มันใช้รูปแบบอินพุตที่ซ้อนกันของอาร์เรย์ซึ่งสามารถใช้เป็นแผนผังการค้นหาแบบไบนารี (แต่ฉันไม่แน่ใจเกี่ยวกับความซับซ้อน) ถ้าฉันต้องใช้รูปแบบปกติมากกว่านี้ ... บางทีฉันจะทำทีหลัง
jimmy23013

@Optimizer ตอนนี้อ่านคำถามอีกครั้ง "binary search tree array" หมายถึงอาร์เรย์ของ binary tree ที่สมบูรณ์ตามลำดับความลึก (หรืออย่างอื่น) หรือไม่ ฉันไม่คิดว่ามันจะเป็นอะไรที่เฉพาะเจาะจง และการค้นหาคำนี้ไม่ได้ให้ประโยชน์อะไรเลย
jimmy23013


@Optimizer ดีนั่นเป็นสิ่งที่ฉันหมายถึง แต่ฉันไม่คิดว่ามันมักจะเรียกว่า "อาร์เรย์การค้นหาต้นไม้แบบทวิภาค" แต่มีเพียง "การจัดเก็บแบบอาร์เรย์ของต้นไม้ไบนารี" อาจต้องมีการชี้แจง ... และฉันอาจจะแก้ไขคำตอบนี้ในวันต่อมาอาจเป็นภาษาอื่น ...
jimmy23013

0

Ruby, 265 ไบต์

def p(t);h=Math.log(t.length,2).to_i;i=-1;j=[];0.upto(h){|d|s=2**(h-d)-1;c=2**d;if d>0;m=' '*(s+s/2)+'I'+' '*(s-s/2);1.upto(d){m+=' '+m.reverse};w=i;puts m.gsub(/I/){|o|t[w+=1]?(w%2==0?'\\':'/'):' '};end;puts (0...c).map{' '*s+(t[i += 1]or' ').to_s+' '*s}*' ';};end

รุ่น @proudhaskeller ขนาด 269 ไบต์

def p(t);h=Math.log(t.length,2).to_i;i=-1;j=[];0.upto(h){|d|s=(z=2**(h-d))-1;c=2**d;if d>0;m=' '*(s+z/2)+'I'+' '*(s-z/2);1.upto(d){m+=' '+m.reverse};w=i;puts m.gsub(/I/){|o|t[w+=1]?(w%2==0?'\\':'/'):' '};end;puts (0...c).map{' '*s+(t[i += 1]or' ').to_s+' '*s}*' ';};end

ชี้แจง

รุ่น verbose:

def p(t)
  depth = Math.log(t.length, 2).floor
  i = -1
  j = []
  (0..depth).each do |d|
    s = 2 ** (depth-d)-1
    c = 2 ** d

    if d > 0
      m = ' '*(s+s/2) + '|' + ' '*(s-s/2)
      w = i
      1.upto(d) { m += ' ' + m.reverse }
      puts m.gsub(/\|/) { |o| t[w+=1] ? (w%2==0 ? '\\' : '/') : ' ' }
    end

    puts (0...c).map{' '*s+(t[i += 1]or' ').to_s+' '*s}*' '
  end
end

ตัวอย่าง

n = nil
p([
  1, 2, 3, 4, 5,
  n, 7, 8, 9, 0,
  1, n, n, 4, 5,
  6, 7, 8, 9, 0,
  1, 2, 3, n, n,
  n, n, 8, 9, n,
  n
])

ให้:

               1               
          /         \          
       2               3       
    /     \               \    
   4       5               7   
 /   \   /   \           /   \ 
 8   9   0   1           4   5 
/ \ / \ / \ / \         / \    
6 7 8 9 0 1 2 3         8 9   

(ฉันยังไม่ได้เขียนสคริปต์การแปลง)


เครื่องหมายทับของคุณไม่ตรงกลาง
ภูมิใจ haskeller

@proudhaskeller "ปัดเศษตามที่คุณต้องการ" ฉันคิดว่ามันดูเท่ห์กว่าแบบนี้ คุณสามารถแทนที่ s / 2 ด้วย (s + 1) / 2 หากคุณต้องการ
AlexRath

ไม่ทับในแถวแรกไม่ตรงกลางเขาในแถวนี้ไม่เป็นเรื่องของการปัดเศษ
ภูมิใจ haskeller

@proudhaskeller หากคุณแทนที่ s / 2 ด้วย (s + 1) / 2 พวกเขาจะอยู่ตรงกลาง แต่ฉันยังคงชอบวิธีนี้เพราะมันทำให้สาขาซ้ายและขวาสุดดูรอบ
AlexRath

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