คะแนนเศษส่วนในบรรทัด


12

บางครั้งเมื่อฉันเบื่อจริง ๆ (เบื่อจริง ๆ ) ฉันชอบวาดส่วนของเส้นและวาดจุดบน

ก่อนอื่นฉันวาดส่วนของเส้นตรงในขนาดที่กำหนดซึ่งเท่ากับ 2 ^ N สำหรับค่าบางส่วนของ N เส้นจะถูกแทนด้วยชุด.อักขระ

................

จากนั้นฉันวางแผนจุดที่ด้านซ้าย คะแนนจะถูกแสดงโดยXตัวละคร

X...............

จากนั้นฉันก็ทำตามรูปแบบ เริ่มต้นที่จุดที่พล็อตล่าสุด (ซึ่งฉันจะเรียกว่า A) ฉันจะไปยังจุดที่พล็อตถัดไป (B) บนบรรทัด (ล้อมรอบตามความจำเป็น) จากนั้นฉันไปยังจุดที่วางแผนต่อไปในบรรทัด (C) จากนั้นฉันพล็อตจุดใหม่แบบครึ่งทางระหว่างจุดที่สามนี้ (C) และจุดที่วางแผนไว้แล้วถัดไป (D)

เมื่อใดก็ตามที่คุณล้อมรอบเส้น "กลาง" จะถูกกำหนดในลักษณะการห่อ จุดที่วางแผนใหม่นั้นอยู่ทางด้านขวาของ C เสมอ

สมมุติว่าบรรทัดต่อไปนี้เป็นบรรทัดปัจจุบันของฉัน นี่คือวิธีที่ฉันจะลงจุดสองจุดถัดไป สำหรับตัวอย่างนี้ฉันจะติดป้ายแต่ละจุดสำคัญด้วยตัวอักษร

X...A...X.X...X.
    ^

X...A...B.X...X.
        ^

X...A...B.C...X.
          ^

X...A...B.C...D.
            ^

X...X...X.X.A.X.
            ^

X...X...X.X.A.B.
              ^

C...X...X.X.A.B.
^

C...D...X.X.A.B.
  ^

X.A.X...X.X.X.X.
  ^

กลับไปที่ตัวอย่างก่อนหน้านี้จุดต่อไปจะได้รับการวางแผนในช่วงกลางของบรรทัด

X.......X.......

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

ด้านล่างเป็นชุดของจุดที่ฉันจะพล็อตในบรรทัดจากที่นี่ถึงจุดสิ้นสุด

X.......X.......
X.......X...X...
X.......X.X.X...
X...X...X.X.X...
X...X...X.XXX...
X.X.X...X.XXX...
X.X.X...XXXXX...

ไม่มีที่ว่างในการพล็อตจุดถัดไปอีกต่อไปเนื่องจากมันจะต้องถูก wedged ระหว่างจุดสองจุดที่อยู่ติดกันดังนั้นฉันถึงความลึกสูงสุดสำหรับค่าที่กำหนดเป็น N = 4 บรรทัดสุดท้ายในรายการด้านบนคือ "สมบูรณ์ ."

ความท้าทาย

เป้าหมายคือการเขียนฟังก์ชั่นโปรแกรม / ชื่อที่สั้นที่สุดที่จะพิมพ์ / คืนบรรทัดที่สมบูรณ์สำหรับค่าที่กำหนดของ N ด้านบนแสดง N = 4

อินพุต

ข้อมูลที่ป้อนจะเป็นจำนวนเต็มไม่ใช่ค่าลบเดียวความยาวของบรรทัดที่สร้างจะเป็น 2 ^ N

เอาท์พุต

เอาต์พุตจะเป็นบรรทัดความยาวที่เสร็จสมบูรณ์ 2 ^ N, จัดรูปแบบโดย.และXอักขระ ขึ้นบรรทัดใหม่ไม่สำคัญ

ตัวอย่าง I / O

0
X

1
XX

2
X.XX

3
X.X.XXX.

4
X.X.X...XXXXX...

5
X.X.X...X...X...X.XXX.XXX.......

คำตอบ:


4

Python 2, 137

n=input()
l=[0]*2**n;i=0
while~i%2:i=i/2%2**n;l[i]=1;i=sum([k for k,v in enumerate(l*4)if(k>i)*v][1:3])
print''.join(['.X'[x]for x in l])

ค่อนข้างตรงไปตรงมา

Pyth, 49

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

J*\.^2QW!%Z2K%/Z2lJ=JXJK\X=Zs<tf&q\X@JT>TKU*4J2)J

ลองมันออนไลน์

                         Q=input(); Z=0 #implicit
J*\.^2Q                  J = "."*(2^Q)
W!%Z2                    while !(Z%2):
  K%/Z2lJ                  K=(Z/2)%(len(J))
  =JXJK\X                  change J, the point at index K is changed to a "X"
       f          U*4J     filter all elements T in [0, 1, 2, ..., 4*len(J)-1]:
        &q\X@JT>TK           where J[T]=='X' and T>K
     <t               2    only us the second and third element
  =Zs                      and store the sum to Z
)J                       end while and print J


3

GolfScript (61 ไบต์)

~2\?,[]0{.@|$4*.@?2+1$>2<.+~<!4$,*++.2/\1&!}do;`{&!'X.'1/=}+%

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



2

Java, 209 207 195 191 ไบต์

ฉันประหลาดใจที่ฉันสามารถทำให้มันสั้นได้ อาจมีห้องพักสำหรับการปรับปรุง ตามปกติข้อเสนอแนะจะได้รับการชื่นชม :)

ผลตอบแทนchar[]นี้ a(n)เรียกใช้

char[]a;int b,c,d,e=2;char[]a(int f){java.util.Arrays.fill(a=new char[b=1<<f],'.');for(a[0]=88;d+1<e;c=(d+e)/2,a[c%b]=88)e=b(d=b(b(c)));return a;}int b(int f){for(;;)if(a[++f%b]>87)return f;}

เยื้อง:

char[] a;
int b, c, d, e = 2;

char[] a(int f){
    java.util.Arrays.fill(
            a = new char[
                    b = 1 << f
                    ]
            , '.'
    );
    for(
            a[0] = 88;
            d + 1 < e;
                c = (d + e) / 2,
                a[c % b] = 88
        )
        e = b(
                d = b(
                        b(c)
                )
        );
    return a;
}

int b(int f){
    for (;;)
        if (a[++f % b] > 87)
            return f;
}

12 ไบต์ขอบคุณ Peter :)
4 ไบต์ขอบคุณ TNT;)


(c%b+b)%b? คุณคาดหวังว่าcจะเป็นเชิงลบหรือไม่?
Peter Taylor

c=0และd=0สามารถลงไปเพียงและc ประเภทที่กำหนดในระดับชั้นจะเริ่มต้นโดยอัตโนมัติเป็น 0dint
TNT

1

Haskell, 182 ไบต์

(a:b)%(c:d)|a<c=a:b%(c:d)|1<2=c:(a:b)%d
f i=putStr$map(!(0:g[0,n..]))[0..n-1]where n=2^i;e!l|e`elem`l='X'|1<2='.';g(_:_:c:d:r)|m==c=[]|1<2=mod m n:g((d:r)%[m,m+n..])where m=div(c+d)2

การใช้งาน: f 5. ผลลัพธ์: X.X.X...X...X...X.XXX.XXX........

น่าเสียดายที่ Haskell ไม่มีฟังก์ชั่นการผสานในไลบรารีมาตรฐานดังนั้นฉันต้องจัดเตรียมของตัวเอง (-> %) โชคดีที่ฉันต้องรวมเฉพาะรายการที่ไม่มีที่สิ้นสุดดังนั้นฉันจึงไม่ต้องครอบคลุมกรณีพื้นฐานเช่นรายการที่ว่างเปล่า ยังคงมีค่าใช้จ่าย 40 ไบต์

มันทำงานอย่างไร: แทนที่จะตั้งค่าXs โดยตรงในอาร์เรย์ฉันจะเก็บรายการตำแหน่งที่พวกมันอยู่ ยิ่งไปกว่านั้นฉันไม่ได้พันไว้2^Nแต่ให้เพิ่มตำแหน่งไปทางอนันต์ (เช่นสำหรับ N = 2 โดยXที่ด้านหน้ารายการตำแหน่งดูเหมือน[0,4,8,12,16,20,…]) ฉันใช้องค์ประกอบที่ 3 และ 4 ( cและd) คำนวณตำแหน่งใหม่(c+d)/2เก็บไว้สำหรับรายการเอาท์พุทผสานรายการตำแหน่งเก่าจากตำแหน่ง 4 (the d) ไปกับตำแหน่งใหม่ที่เริ่มต้นด้วย(c+d)/2และเกิดขึ้นอีก ฉันหยุดเมื่อเท่ากับ(c+d)/2 cในที่สุดฉันก็เพิ่ม a 0ไปยังรายการเอาท์พุทและพิมพ์Xs ที่ตำแหน่งที่กำหนดและ.ที่อื่น ๆ

step by step example, N=2

step  position list       (c+d)/2  output     lists to merge (pos. list for next round)
                                   list       old list from d on / new list from (c+d)/2

  #1  [0,4,8,12,16,…]       10     [10]          [12,16,20,24,…] / [10,14,18,22,…]
  #2  [10,12,14,16,18,…]    15     [10,15]       [16,18,20,22,…] / [15,19,23,27,…]
  #3  [15,16,18,19,20,…]    18

stop here, because c equals (c+d)/2

add 0 to the output list: [0,10,15]
take all elements modulo 2^N: [0,2,3]
print X at position 0, 2 and 3 

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