ต่อแผ่นระนาบกับวงกลมที่ถูกดัดแปลงนี้


22

นำหน่วยวงกลมตรงกลางที่จุดกำเนิด ในจตุภาคที่อยู่ใกล้เคียงสองจุดให้สะท้อนโค้งของวงกลมข้ามเส้นที่เชื่อมระหว่างจุดตัดแกน x และ y

ด้วยรูปร่างที่ได้คุณสามารถเรียงแผ่นระนาบ:

Tessellation วงกลม

ฉันสร้างภาพนี้ด้วยกล่องทรายฟิสิกส์ 2D สุดยอด Algodoo !

เขียนโปรแกรมที่ให้ภาพคล้ายกับภาพนี้ในรูปแบบไฟล์ภาพ lossless ทั่วไปบางรูปแบบ คุณสามารถบันทึกภาพเป็นไฟล์ที่มีชื่อที่คุณเลือกหรือคุณอาจแสดงมัน ไม่ควรป้อนข้อมูลใด ๆ

กฎ:

  • ทั้งภาพจะต้อง tessellated กับกระเบื้องปรับเปลี่ยนวงกลมโดยใช้สองสี RGB ที่แตกต่างกันทางสายตาหนึ่งสำหรับกระเบื้องในแนวตั้งชี้หนึ่งสำหรับกระเบื้องแนวนอนชี้

  • รัศมีของแผ่นวงกลมควรมีอย่างน้อย 32 พิกเซล (รัศมีในภาพด้านบนมีประมาณ 110 พิกเซล)

  • รูปภาพควรมีขนาดอย่างน้อย 4 แผ่นและสูง 4 แผ่น สิ่งนี้รวมกับกฎข้างต้นหมายความว่ารูปภาพสามารถมีขนาดขั้นต่ำ 256 × 256 พิกเซล (ภาพด้านบนคือ 4 แผ่นโดย 4 แผ่น)

  • tessellation อาจถูกแปลด้วยจำนวนเงินใด ๆ ตัวอย่างเช่นมุมซ้ายบนของรูปภาพไม่จำเป็นต้องเป็นจุดสุดยอดที่แผ่นกระเบื้องมาบรรจบกัน (tessellation ไม่ควรหมุนอย่างไรก็ตาม)

  • คุณสามารถใช้ไลบรารีกราฟิกภายนอกที่มีคำสั่งสำหรับการวาดวงกลมและส่งภาพและไม่ชอบ

  • ส่วนโค้งควรประมาณวงอย่างที่สามารถทำได้ด้วยอัลกอริธึมวงกลมจุดกึ่งกลางซึ่งไลบรารีกราฟิกส่วนใหญ่จะทำเพื่อคุณ

  • การลบรอยหยักรอบ ๆ ขอบของแผ่นกระเบื้องนั้นทำได้ แต่ไม่จำเป็น

การส่งที่สั้นที่สุดในหน่วยไบต์ชนะ

คำตอบ:


4

gs2, 49 ไบต์

50 31 05 0d 1f 2a 48 0a 1e 2e 40 83 2c e8 64 2d
1e 73 ed 1e 33 40 20 30 9a a2 22 e8 e9 40 20 30
9a 30 40 20 30 ee 40 20 30 12 32 e9 12 32 55 e8
2b

สร้างภาพ PBM:

เอาท์พุต

จำ:

# Print header
"P1" space 256 double
2dup new-line

# Make 1/4 circle
64 range dup cartesian-product
square m1 sum sqrt 64 >= m6
64 /

# Make tile
dup reverse + transpose
@2 not m1 m2
dup reverse + transpose
+

# Make quarter of image
dup reverse + z1
dup reverse +

# Loop
2 * m2
2 *

# Format
show-words m1
unlines

36

POV-Ray, 199 163

Old version
camera{location -9*z}light_source{-9*z}#declare L=union{#for(X,-9,9,2)#for(Y,-9,9,2)cylinder{X*x+x+Y*y,<.001*pow(-1,(X+Y)/2),0,.1>+X*x+x+Y*y,1}#end#end}object{L pigment{color x}}object{L rotate z*90}

Same output, but golfed down further by using default light/camera, so I dont even need to specify them
#declare L=union{#for(X,-9,9,2)#for(Y,-9,9,2)cylinder{<X+1,Y,9>,<.001*pow(-1,(X+Y)/2),0,.1>+<X+1,Y,9>,1}#end#end}object{L pigment{color rgb x}rotate z*90}object{L}

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

camera{location 9*z look_at 0}
light_source{9*z color 1} 
#declare L=union{
    #for(X,-9,9,2)
        #for(Y,-9,9,2)
            cylinder{<1+X,Y,0>,                                 //central axis, start
                     <1+X,Y,0> + <.001*pow(-1,(X+Y)/2), 0, .1>, //central axis, end
                      1}                                        //radius
        #end         
    #end
}                         
object{L pigment{color x}} // x is the <1,0,0> vector, here interpreted as RGB
object{L rotate<0,0,90>}

เห็นได้ชัดว่าเกิดอะไรขึ้นเมื่อเราเพิ่มออฟเซ็ตของแกนทรงกระบอกและเปลี่ยนมุมมอง

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


1
ขอบจะไม่ผิดเพี้ยนเล็กน้อยเนื่องจากมุมมอง 3 มิติหรือไม่
orlp

6
ด้วยความสูง0.1และการชดเชยของ0.001ดิสก์ถูกเอียงโดย $ \ phi = \ arctan (0.01) = 0.57 ° $ มองจากด้านบนดิสก์ปรากฏบีบด้วยปัจจัย $ \ cos (\ phi) = 0.99995 $, นั่นน้อยกว่าหนึ่งพิกเซล
DenDenDo

@DenDenDo เป็น pov-ray ไม่สามารถใส่กล้องที่ไม่มีที่สิ้นสุด
Random832

@ Random832 camera{orthographic location -9z}มันสามารถมี แต่เนื่องจากฉากนั้นเป็นแบบ 2 มิติมันไม่ได้สร้างความแตกต่างเลยคุณจึงสามารถแสดงผลด้วยการชมangle 170โดยไม่ต้องเพี้ยนตาในผลลัพธ์
DenDenDo

11

Gnuplot, 182

ฉันสังเกตเห็นว่าขอบเขตระหว่างเซลล์มีลักษณะเป็นไซนัสมากดังนั้นฉันจึงไปหาวิธีวิเคราะห์ด้วยสมการพื้นฐานที่ง่ายมาก
ป้อนคำอธิบายรูปภาพที่นี่

set view map
set isosamples 900
f(x,y)=.3*sin(x*3.14)+y
splot(ceil(f(x,y))+ceil(f(y,x)))%2?1:NaN   #can only modulo integers

ป้อนคำอธิบายรูปภาพที่นี่
ในขณะที่มันดูคล้ายกันวงกลมนั้นแคบเกินไป กับความคิดเดียวกันผมเปลี่ยนsinจากเส้นโค้งที่ทำจากการตัดแบ่ง quartercircle-โค้งและหมุน 45 °โดยการเปลี่ยนxและyด้วยx+yและx-y

set view map
set samples 800
set isosamples 800
d=.5**.5
c(x,k)=(-1)**k*sqrt(1-(x-d*(1+2*k))**2)-(-1)**k*d  # k-th circle arc
# s(x)=c(x,floor(x/d/2))                           # circlified sinus
# f(x,y)=d*s(x/d)+y
f(x,y)=d*c(x/d,floor(x))+y                         # combined commented functions
splot(ceil(f(x+y,x-y))+ceil(f(x-y,x+y)))%2?1:NaN

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


9

บริบทฟรี 99 ไบต์

startshape d CF::Tile=[s 4]CF::Symmetry=CF::pmg,0,1,0path d{ARCTO(-1,1,1)ARCTO(1,1,-1)ARCTO(0,0,1)}

คุณสามารถเห็นผลในบริบทฟรีแกลลอรี่


Nice หนึ่งนั่นคือการใช้ Context Free ที่น่าอัศจรรย์ :)
Martin Ender

7

HTML + JavaScript, 277

<canvas id=C></canvas><script>r=50,C.width=C.height=9*r,T=C.getContext('2d');
for(f=1,P=Math.PI,i=0;i<45;f=-f,i+=i&7?1:2)x=2*r*(i%8-2),y=2*r*(i>>3),T.moveTo(x,y+f*r),
T.arc(x+r,y+f*r,r,P,-f*P/2,f<0),T.arc(x,y,r,0,P,f>0),T.arc(x-r,y+f*r,r,-f*P/2,0,f<0);
T.fill()</script>

ในการทดสอบให้บันทึกเป็นไฟล์ html และเปิดด้วยเบราว์เซอร์ มิฉะนั้นให้เรียกใช้ตัวอย่าง

r=50,C.width=C.height=9*r,T=C.getContext('2d')
for(f=1,P=Math.PI,i=0;i<45;f=-f,i+=i&7?1:2)
  x=2*r*(i%8-2),y=2*r*(i>>3),
  T.moveTo(x,y+f*r),
  T.arc(x+r,y+f*r,r,P,-f*P/2,f<0),
  T.arc(x,y,r,0,P,f>0),
  T.arc(x-r,y+f*r,r,-f*P/2,0,f<0)
T.fill()
<canvas id=C></canvas>

เนื่องจากความต้องการที่นิยมนี่คือภาพที่ส่งออก ไม่น่าตื่นเต้นนัก ...

กระเบื้อง


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

@ งานอดิเรกของ Calvin โอ้มันเร็วพอและทำงานได้ในทุกเบราว์เซอร์สมัยใหม่ ฉันจะทำให้ภาพใหญ่ขึ้นแทน
edc65

นั่นเป็นเรื่องจริง ฉันคิดว่ามันใช้=>เหมือนโพสต์ของคุณมากมายและจะใช้ได้เฉพาะใน Firefox เท่านั้น แต่ไม่ต้องกังวล
งานอดิเรกของ Calvin

1
เหตุผลที่ดีกว่าสำหรับการโพสต์ภาพ: ตัวอย่างเหล่านี้ทำงานได้ไม่ดีบนมือถือ :(
Sp3000

6

IDL 8.3, 201 193 183 ไบต์

ภาพจะถูกส่งออกไปยังหน้าต่างกราฟิก IDL; ฉันจับภาพหน้าจอด้านล่าง

แก้ไข: ขอบคุณ @AlexA และ @ Sp3000 ที่ช่วยให้ฉันโกนหนวดบางไบต์

p=!pi/99*[0:99]
q=p[49:0:-1]
o=p[99:50:-1]
window,xs=(ys=400)
for i=0,24 do cgpolygon,i mod 5*100+50*[cos(p),cos(q)-1,cos(o)+1],i/5*100+(-1)^i*50*[sin(p),sin(q)-1,sin(o)-1],/d,/fi
end

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


6

Mathematica: 86 ไบต์ (หรือ 82 ไบต์)

ขอบคุณ@alephalpha ที่ไม่มีที่สิ้นสุดสำหรับวิธีการแบบอาร์เรย์ที่ชาญฉลาด:

Image@ArrayFlatten@Array[DiskMatrix@32~RotateLeft~32/.a_/;OddQ@+##:>1-Thread@a&,{5,5}]

ภายในอาเรย์เป็นฟังก์ชั่นนิรนามซึ่งใช้เคล็ดลับอันชาญฉลาดเพื่อเพิ่มอาร์กิวเมนต์ ( +##) และพิจารณาว่าผลรวมเป็นเลขคี่หรือไม่ บูลีนนั้นถูกใช้เป็นเงื่อนไขกับรูปแบบที่แทนที่ทั้งแผ่น 'สีขาว' ทั้งหมดด้วยกระเบื้องที่แปลงรูป 'สีดำ' จากนั้นArrayFlattenเชื่อมต่อแผ่นกระเบื้องเข้าด้วยกันแล้วImageแสดงผล

หมายเหตุ: การใช้งานที่สั้นกว่าจะเข้ามาแทนที่Thread Transposeเรายังสามารถบันทึก 4 ไบต์โดยใช้สัญลักษณ์สลับแทน

ก่อนหน้านี้: 97 ไบต์ (หรือ 90 ไบต์)

Image@ArrayFlatten@Partition[
 Join@@Table[{#,1-Transpose@#}&@RotateLeft[DiskMatrix@32,32],{13}],5]

คุณสามารถลดจำนวนไบต์โดยแทนที่Transpose@#ด้วยสัญลักษณ์ superscript-t (codepoint U + F3C7, ทางลัดESCtrESC) UTF-8 ที่จะนำไปรวมกับ90 ไบต์ใน 88 ตัวอักษร

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

เราเริ่มต้นด้วยDiskMatrixซึ่งสร้างเมทริกซ์ไบนารี:

DiskMatrix@32 // Image

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

จากนั้นเราหมุนวงกลมของแถวของเมทริกซ์เพื่อสร้างเซลล์หน่วยสำหรับการเรียงต่อกัน:

RotateLeft[DiskMatrix@32, 32] // Image

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

หากเครื่องบินเป็นกระดานหมากรุกสี่เหลี่ยมเหล่านี้คือสี่เหลี่ยมสีขาว สำหรับสี่เหลี่ยม 'ดำ' เราต้องสลับสีและหมุน 90 องศา เราสามารถกลับด้านได้โดยการลบจาก 1 ( 1 - 1 -> 0และ1 - 0 -> 1) และหมุนโดยใช้การเปลี่ยนตำแหน่ง:

Image /@ {#, 1 - Transpose@#} &@RotateLeft[DiskMatrix@32, 32]

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

หากขนาดของภาพเท่ากัน (เช่นขนาดต่ำสุด, 4) ดังนั้นไทล์ที่ขอบด้านขวาจะเหมือนกันกับภาพถัดไปที่ขอบด้านซ้าย อย่างไรก็ตามการเพิ่มไทล์หนึ่งอันเพื่อให้มีขนาดคี่ (5) จากนั้นการต่อแถวเข้าด้วยกันจะทำให้เกิดลวดลายสลับกัน

Partitionนี้แสดงให้เห็นว่าเราจะได้รับรูปแบบโดยการตัดแถวเดียวของกระเบื้องสลับกับ เราใช้Tableในการทำรายการ13คู่กระเบื้องสีดำ / ขาวและJoinเพื่อขยายรายการคู่ให้เป็นรายการ 26 แผ่น จากนั้นเราจะPartitionแสดงรายการ5ตาม5เมทริกซ์ของแผ่นกระเบื้อง ( Partitionทิ้งส่วนที่ 26 ของส่วนต่อท้าย):

Map[Image] /@ 
  Partition[
   Join @@ Table[{#, 1 - #\[Transpose]} &@
      RotateLeft[DiskMatrix@32, 32], {13}], 5] // MatrixForm

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

ในที่สุดก็ArrayFlattenเปลี่ยนเมทริกซ์ของเมทริกซ์ไทล์เป็นเมทริกซ์แบบเรียบและImageแสดงผลลัพธ์

ก่อนหน้านี้: 111 ไบต์

Image[ArrayFlatten[{{#, #}, {#, #}}] &[
  Join[#, Reverse@#, 2] &[
   Join[1 - Transpose@#, #] &@RotateLeft[DiskMatrix[32], 32]]]]

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


Image@ArrayFlatten@Array[RotateLeft[DiskMatrix@32,32]/.a_/;OddQ[+##]:>1-Thread@a&,{5,5}]
alephalpha

4

Java, 550 540 508 504 ไบต์

นี่คือแอปเพล็ต java

import java.awt.*;public class T extends java.applet.Applet{int a=98,b=49,x,y;public void paint(Graphics g){for(x=0;x<5;x++)for(y=0;y<5;y++)a(g.create(x*a,y*a,a,a),x%2^y%2);}void a(Graphics g,int c){if(c>0){g.translate(a,0);((Graphics2D)g).scale(-1,1);}g.setColor(Color.red);g.fillRect(0,0,b,b);g.fillRect(b,b,b,b);g.setColor(Color.blue);g.fillRect(b,0,b,b);g.fillRect(0,b,b,b);g.fillArc(0,-b,a,a,180,90);g.fillArc(0,b,a,a,0,90);g.setColor(Color.red);g.fillArc(-b,0,a,a,0,-90);g.fillArc(b,0,a,a,90,90);}}

ขยายด้วยสำเร็จรูป:

import java.awt.*;
public class T extends java.applet.Applet{
    int a = 98, b = 49, x, y; //Make these larger for better quality pictures. a = b * 2
    public void paint(Graphics g) {
        for (x=0; x < 5; x++)      //Make these larger for more tiles.
            for (y=0; y < 5; y++)  //
                a(g.create(x * a, y * a, a, a), x % 2 ^ y % 2);
    }

    void a(Graphics g, int c) {
        if (c > 0) {
            g.translate(a, 0);
            ((Graphics2D) g).scale(-1, 1);
        }
        g.setColor(Color.red);            //Change colors for nicer looking colors.
        g.fillRect(0, 0, b, b);
        g.fillRect(b, b, b, b);
        g.setColor(Color.blue);
        g.fillRect(b, 0, b, b);
        g.fillRect(0, b, b, b);
        g.fillArc(0, -b, a, a, 180, 90);
        g.fillArc(0, b, a, a, 0, 90);
        g.setColor(Color.red);
        g.fillArc(-b, 0, a, a, 0, -90);
        g.fillArc(b, 0, a, a, 90, 90);
    }
}

Applet:โปรแกรมแอปพลิเคชันขนาดเล็กที่สามารถเรียกใช้ในขณะทำงานในแอปพลิเคชันอื่น

ภาพตัวอย่าง:

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

คำอธิบาย:

สิ่งนี้ทำงานโดยใช้วิธีการพิมพ์แต่ละไทล์ ก่อนที่จะสร้างวิธีการมันจะได้รับวัตถุกราฟิกที่ใช้ระบบพิกัดตรงกลางที่มุมซ้ายบนของแต่ละไทล์:

ในการสร้างไทล์เราใช้วิธีการต่อไปนี้:

void a(Graphics g, int c) {
    g.setColor(Color.red);
    g.fillRect(0, 0, b, b);
    g.fillRect(b, b, b, b);
    g.setColor(Color.blue);
    g.fillRect(b, 0, b, b);
    g.fillRect(0, b, b, b);
    g.fillArc(0, -b, a, a, 180, 90);
    g.fillArc(0, b, a, a, 0, 90);
    g.setColor(Color.red);
    g.fillArc(-b, 0, a, a, 270, 90);
    g.fillArc(b, 0, a, a, 90, 90);
}

อย่างไรก็ตามไทล์อื่น ๆ จะต้องสะท้อนในแนวนอนเพื่อให้ได้ภาพที่ถูกต้อง

เพื่อสะท้อนถึงกระเบื้องเราเพียงแค่ปรับเปลี่ยนgraphicsวัตถุที่ให้มาด้วยรหัสนี้:

g.translate(a, 0);
((Graphics2D) g).scale(-1, 1);

ขอบคุณ @CoolGuy เป็นเวลา 4 ไบต์


1
คุณสามารถตีกอล์ฟได้มากขึ้นโดยการประกาศxและyเป็นสนามของคลาส:int a = 98, b = 49,x,y;
Spikatrix

4

Mathematica 299 256

พูดเก่ง แต่ก็ดีที่จะคิด

ไทล์พื้นฐานคือ r (แสดงด้านล่าง) ซึ่งเป็นพื้นที่ที่แสดงโดย RegionPlot ภาพสะท้อนซ้ายขวาของแผ่นกระเบื้องถูกสร้างขึ้นและเชื่อมต่อกับ r จากนั้นทั้งสองรูปประกอบกระเบื้องจะทำซ้ำเพื่อกระเบื้องพื้นที่

R

a_~f~b_ := (x + a)^2 + (y + b)^2 <= 1;
a = ImageAssemble;
r = RegionPlot[(0~f~0 && y <= 0 && ! f[-1, 1]) \[Or] (0~f~2 && 
      y >= -2 && ! f[1, 1]), {x, -1, 1}, {y, -2, 0}, Frame -> False,
    BoundaryStyle -> None];
s = ImageCrop@Rasterize@r;
t = s~ImageReflect~Right;
i = a@{s, t};
j = a@{t, s};
a@{k = {i, i, i, i}, m = {j, j, j, j}, k, m, k, m}

กระเบื้อง


1

C, 237 209 180 ไบต์

180 ไบต์ รุ่นนี้รวมถึงการเปลี่ยนแปลงที่แนะนำโดย edc65 ในความคิดเห็น มันให้คำเตือนคอมไพเลอร์ 9 เมื่อสร้างบน Mac ด้วยตัวเลือกเสียงดังกราวและตัวเลือกเริ่มต้น

a,b,c,d,x,y;main(){for(puts("P1 256 256");b=a+32&64,a<256;++a){for(c=0;d=c+32&64,x=(a&64)-d?31-a&31:a&31,y=(c&64)-b?c&31:31-c&31,c++<256;)putchar(48+(x*x+y*y<962^b==d));puts("");}}

209 ไบต์ใช้คำแนะนำจากความคิดเห็นโดย Martin รวบรวมโดยไม่มีคำเตือนด้วยเสียงดังกราว:

#include <stdio.h>
int a,b,c,d,x,y;int main(){puts("P1 256 256");for(;b=a+32&64,a<256;++a){for(c=0;d=c+32&64,x=(a&64)-d?31-a&31:a&31,y=(c&64)-b?c&31:31-c&31,c<256;++c)putchar(48+(x*x+y*y<962^b==d));puts("");}}

รุ่นดั้งเดิม, 237 ไบต์:

#include <stdio.h>
int main(){puts("P1 256 256");for(int a=0;a<256;++a){int b=a+32&64;for(int c=0;c<256;++c){int d=c+32&64;int x=(a&64)-d?31-a&31:a&31;int y=(c&64)-b?c&31:31-c&31;putchar(48+(x*x+y*y<962^b==d));}puts("");}}

ผลลัพธ์ (256x256):

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

รหัสต้นฉบับพร้อมช่องว่างเพื่อให้อ่านง่ายขึ้น:

#include <stdio.h>
int main()
{
    puts("P1 256 256");
    for (int a = 0; a < 256; ++a)
    {
        int b = a + 32 & 64;
        for (int c = 0; c < 256; ++c)
        {
            int d = c + 32 & 64;
            int x = (a & 64) - d ? 31 - a & 31 : a & 31;
            int y = (c & 64) - b ? c & 31 : 31 - c & 31;
            putchar(48 + (x * x + y * y < 962 ^ b == d));
        }
        puts("");
    }
}

สิ่งนี้ไม่ได้ใช้ไลบรารีกราฟิกใด ๆ การเรนเดอร์นั้นมีอยู่ในโค้ดอย่างสมบูรณ์

แนวคิดพื้นฐานคือการวนซ้ำทั้งหมด 256x256 พิกเซลและดูว่าพวกเขาอยู่ภายใน / ภายนอกส่วนโค้งกลมของสี่เหลี่ยมย่อย 32x32 ที่พวกเขาอยู่หรือไม่ 5 บิตด้านล่างของพิกัดพิกเซลโดยรวมกำหนดพิกัดสัมพันธ์ของพิกเซลภายใน ตารางย่อย การทดสอบด้านใน / ด้านนอกของ(x, y)การอยู่ภายในส่วนโค้งด้วยรัศมีrจึงเป็นมาตรฐาน:

x * x + y * y < r * r

ตรรกะส่วนใหญ่ใช้สำหรับวางจุดศูนย์กลางของส่วนโค้งในมุมที่ถูกต้องของตารางย่อยและกำหนดสีที่อยู่ภายใน / ภายนอก

ความคิดเห็นบางส่วนเกี่ยวกับการแก้ปัญหา:

  • รหัสสร้างภาพในรูปแบบ PBM ASCII ฉันโหลดผลลัพธ์ลงใน GIMP และคัดลอก & วางลงใน 'ระบายสี' เพื่อสร้างไฟล์จริงที่ฉันโพสต์ไว้ที่นี่ ดังนั้นรูปแบบจึงถูกแปลง แต่เนื้อหาตรงกับผลลัพธ์ดั้งเดิม
  • หากคุณดูอย่างใกล้ชิดคุณอาจสังเกตเห็นว่าคุณภาพไม่ดี นี่เป็นเพราะการคำนวณภายใน / ภายนอกทำที่มุมของพิกเซลแทนที่จะเป็นจุดศูนย์กลางของพิกเซลทำให้สิ่งทั้งหมดอยู่ที่ 1/2 พิกเซล ฉันไม่คิดว่ามันจะเป็นการยากที่จะทำได้ดีขึ้น แต่มันจะทำให้โค้ดยาวขึ้น และเนื่องจากไม่มีข้อกำหนดด้านคุณภาพที่เฉพาะเจาะจงฉันเชื่อว่านี่เพียงพอแล้ว
  • โค้ดถูกคอมไพล์โดยใช้เสียงดังกราวบน Mac รุ่นล่าสุดให้คำเตือนรุ่นแรกไม่ได้
  • นี่เป็นครั้งแรกที่ฉันได้ลองทำอย่างใดอย่างหนึ่งเหล่านี้ดังนั้นฉันอาจพลาดเทคนิคเล็กน้อยเพื่อบันทึกไบต์สุดท้ายที่เป็นไปได้

3
ยินดีต้อนรับสู่ PPCG! ฉันไม่ใช่นักกอล์ฟตัวยง C แต่ฉันคิดว่าฉันสามารถเห็นการปรับปรุงบางอย่างได้: จัดกลุ่มการประกาศของคุณเช่นint a,b,c,d,x,y;... ฉันคิดว่าคุณอาจจะสามารถทำได้main(a,b,c,d,x,y)ฉันจำสิ่งที่ประเภทเริ่มต้นนั้นเป็น int เมื่อคุณกำจัดสิ่งนั้นแล้วคุณสามารถย้ายการมอบหมายไปยัง d, x และ y ไปยังforคำสั่งที่เพิ่มขึ้นของภายในเช่นd=c+32&64,...,++c(อาจย้ายไปยังที่++อื่นที่คุณพูดถึงcอยู่แล้ว) จากนั้นคุณสามารถละเว้นวงเล็บปีกกาของ forภายใน เป็นคนดีมาก btw! :)
Martin Ender

ขอบคุณ! ฉันเห็นเคล็ดลับในการประกาศข้อโต้แย้งที่ไม่มีประเภทในรายการเคล็ดลับ แต่ดูเหมือนว่าสกปรกมากจนฉันไม่สามารถไปที่นั่นได้ ;) ฉันไม่คิดว่าการมีข้อโต้แย้งที่ไม่เป็นมาตรฐานสำหรับmain()นั้นเป็นไปตามมาตรฐาน ฉันควรจัดกลุ่มคำประกาศอย่างแน่นอน และการย้ายส่วนเพิ่มจะช่วยประหยัดสองสามไบต์เช่นกัน puts()สำหรับการขึ้นบรรทัดใหม่ที่อยู่ในวงรอบนอกดังนั้นฉันไม่แน่ใจว่าฉันจะได้รับการกำจัดของการจัดฟัน
Reto Koradi

เรามักจะโอเคกับมันตราบใดที่คอมไพล์ในคอมไพเลอร์ทั่วไปบางอัน (ดังนั้นมันไม่จำเป็นต้องเป็นมาตรฐาน C ทั้งหมด) ใช่ฉันไม่คิดว่าคุณสามารถกำจัดวงเล็บปีกกาด้านนอก แต่คุณควรจะสามารถที่จะลบวงเล็บด้านใน
Martin Ender

รับไปจนถึง 210 ไบต์ ขอบคุณสำหรับความคิด
Reto Koradi

1
คำแนะนำ: stdioไม่ต้องการใช้การประกาศฟังก์ชันเริ่มต้น intเป็นค่าเริ่มต้นสำหรับ globals และสามารถละเว้นได้ (ตัวแปรและหลัก) ก่อนอื่นputsสามารถเข้าไปข้างในเพื่อ ไม่ได้ใช้ c var ภายในวงด้านในดังนั้นการเพิ่มขึ้นของสภาพ 180: a,b,c,d,x,y;main(){for(puts("P1 256 256");b=a+32&64,a<256;++a){for(c=0;d=c+32&64,x=(a&64)-d?31-a&31:a&31,y=(c&64)-b?c&31:31-c&31,c++<256;)putchar(48+(x*x+y*y<962^b==d));puts("");}}(คอมไพล์ด้วยคำเตือนมากมาย แต่รัน)
edc65
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.