มุมนั้นคืออะไร?


12

เป้าหมายของความท้าทายนี้คือการกำหนดมุมของเส้นในภาพ

กฎเกี่ยวกับภาพ:

  • พื้นหลังของภาพจะเป็นสีขาว ( #FFFFFF)
  • จังหวะของเส้นจะเป็นสีดำ ( #000000)
  • บรรทัดจะไม่ถูกต่อต้านนามแฝง
  • รูปภาพจะมีขนาด 100x100 พิกเซล
  • เส้นจะเริ่มที่กึ่งกลางของภาพ
  • บรรทัดจะเริ่มชี้ลง (6-OClock)
  • บรรทัดจะมีความยาว 50 พิกเซล
  • มุมของเส้นจะถูกวัดจากทวนเข็มนาฬิกาจากตำแหน่งเริ่มต้น
  • ตัวแปลงสัญญาณรูปภาพจะเป็นอย่างใดอย่างหนึ่ง.jpgหรือ.png

รูปแบบการป้อนข้อมูลจะเป็นชื่อไฟล์ที่ส่งผ่านโดย ARG บรรทัดคำสั่งอินพุตสคริปต์หรือฟังก์ชั่นหาเรื่อง รูปแบบผลลัพธ์ง่ายมากเพียงแสดงจำนวนองศา (เช่น90)

คำตอบอาจเป็น± 1 องศาของการวัดที่ระบุไว้ นี่คือภาพตัวอย่างบางส่วน:

1

รูปภาพอ้างอิงที่ 45 องศาพร้อมพื้นหลังสีเทา

1

0 องศา

2

45 องศา

3

50 องศา

4

130 องศา

6

230 องศา

7

324 องศา

นี่คือรหัสที่ใช้ในการสร้างภาพ (รหัสนี้มีการประมวลผล ):

int deg = 45;

int centX = width/2, centY = height/2;

background(255);
noSmooth();
line(centX,
     centY,
     centX + sin(radians(deg))*50,
     centY + cos(radians(deg))*50);

saveFrame("line-"+deg+".png");// image codec can be changed here. use '.png' or '.jpg'

1
ฉันได้รับ downvote หรือไม่? ถ้าเป็นเช่นนั้นผู้มีสิทธิเลือกตั้งอธิบายได้ว่าทำไม?
J Atkin

เราสามารถแสดงมันไม่บันทึกลงในไฟล์ได้หรือไม่?
ev3commander

แน่นอนนั่นเป็นวิธีที่คำตอบอื่น ๆ ทำ เพียงพิมพ์ไปที่คอนโซลคำตอบที่โปรแกรมของคุณสร้างขึ้น
J Atkin

1
@JAtkin ฉันจะไม่กังวลเกี่ยวกับ downvotes ในโพสต์ upvoted ทั่วไป c: เราทุกคนได้รับมัน
Addison Crump

อ้อเข้าใจแล้ว. ฉันสงสัยว่าทำไมฉันถึงได้ ...
J Atkin

คำตอบ:


7

Pyth - 28 26 ไบต์

ใช้กลยุทธ์กำลังดุร้ายแบบเดียวกับ js answer

f!@F+]'zm+50s*48.t.tT7d_U2

ใช้อินพุตเป็นชื่อไฟล์จาก stdin

f                     Filters from 1 till predicate is matched
 !                    Boolean not so that only pixel with zero value matched
  @F+]                Folds by indexing to get pixel value  
   'z                 Reads image filename input
   m         _U2      Maps over both trig ratios
    +50               Adds 50 to pixel value
     *48              Multiplies pixel value by 48
      .t    d         Takes trig ratio with appropriate option
        .t 7          Degrees to radians
          T           Filter var

ว้าวนี่มันเจ๋ง แต่ฉันไม่พูด pyth คุณจะช่วยเพิ่มคำอธิบายได้ไหม?
J Atkin

1
ฉันหวังว่าจาวาสคริปต์จะมีจำนวนไบต์เดียวกันในทางกลับกัน
insertusername ที่นี่

@insertusername ที่นี่ฉันหวังว่า groovy หรือ scala สามารถเล่นกอล์ฟชนิดนี้ได้เช่นกัน
J Atkin

@JAtkin เพิ่มคำอธิบายแล้ว รู้สึกอิสระที่จะส่งข้อความฉันในการแชทถ้าคุณมีคำถามใด ๆ
Maltysen

9

JavaScript (ES6), 225 227 244ไบต์

มารับลูกบอลกลิ้งกัน:

f=s=>{(i=new Image).src=s;c=document.createElement`canvas`.getContext`2d`;c.drawImage(i,0,0,100,100);for(a=360;a--,r=a/180*(m=Math).PI;)if(!c.getImageData(50+48*m.cos(r),50+48*m.sin(r),1,1).data[1]){alert((450-a)%360);break}}

เพียงส่ง URL ของภาพไปยังฟังก์ชัน:

f('90deg.png');

แจ้งเตือนองศาภายในช่วง± 1 ผ่านกรณีทดสอบทั้งหมด

Ungolfed

f=s=>{
    // create new image and set source
    (i=new Image).src=s;
    // create canvas and get context
    c=document.createElement`canvas`.getContext`2d`;
    // set width/height to 100px and draw image on canvas
    c.drawImage(i,0,0,100,100);
    // check whether for any degree on the theoretical circle a black pixel is found
    for(a=360;a--,r=a/180*(m=Math).PI;)
        if(!c.getImageData(50+48*m.cos(r),50+48*m.sin(r),1,1).data[1]){
            // wait, it should be ccw and the board is rotated 90 degrees
            alert((450-a)%360);
            break
        }
}

การแก้ไข

  • บันทึกแล้ว 17 ไบต์ - คิดฉันไม่จำเป็นต้องตั้งค่าความกว้างและความสูงขององค์ประกอบแคนวาส
  • บันทึก 2 ไบต์โดยปฏิเสธเงื่อนไข

ฉันคิดว่านี่น่าจะใช้ได้ (ยังไม่ได้ทดสอบ) 206 ไบต์:s=>{(i=new Image).src=s;with(Math)with(document.createElement`canvas`.getContext`2d`)for(drawImage(i,0,0,100,100),a=360;r=--a/180*PI;)getImageData(50+48*cos(r),50+48*sin(r),1,1).data[1]||alert((450-a)%360)}
user81655

1
รหัสนี้ใช้งานได้เพราะคุณโชคดี ผ้าใบจะเสียเกือบทุกครั้ง file://เป็นพิเศษด้วย คุณต้องตั้งค่าcrossOriginคุณสมบัติ นอกจากนี้มันจะไม่ทำงานหากการโหลดภาพใช้เวลามากกว่า 0.00001 วินาทีในการสร้างภาพวาด นอกจากนี้คุณไม่จำเป็นต้องf=ตัด 2 ไบต์ แต่มันเป็นทางออกที่ดีอย่างแน่นอน !!! upvote ของฉันสำหรับมัน
Ismael Miguel

@IsmaelMiguel ขอบคุณสำหรับข้อเสนอแนะโดยละเอียดของคุณ คุณพูดถูกเกี่ยวกับผืนผ้าใบ ในตอนแรกฉันพยายามหมุนและสะท้อนภาพเพื่อไม่ให้ต้องเปลี่ยนมุม คุณสามารถบอกลาไปได้! เบลอไม่สามารถหาพิกเซลที่เหมาะสม ฉันได้ข้ามonloadส่วนนี้ไปเพราะฉันถูกตัดราคาในความท้าทายอื่นเพราะเรื่องนี้ ดังนั้นฉันคิดว่ามันโอเคที่จะคิดว่ามันโหลดเร็วพอ เกี่ยวกับฟังก์ชั่นไม่ระบุชื่อฉันไม่แน่ใจว่าจะนับมันอย่างไร ถ้าผมตัดออกไปf=และฉันต้องการที่จะเรียกมันฉันต้องห่อไว้ในเช่น() (s=>{})('arg');ฉันจะเพิกเฉยต่อจำนวนไบต์ได้ไหม?
นี่

@insertusername ที่นี่ใช่คุณสามารถละเว้นจำนวนไบต์ได้ แต่คุณต้องระบุว่ามันเป็นฟังก์ชั่นนิรนาม
Ismael Miguel

5

Matlab, 118 104 ไบต์

ฉันสร้างเมทริกซ์ที่มีขนาดเดียวกับภาพที่มีจำนวนเชิงซ้อน (0 ตรงกลาง) และตัดค่าเมทริกซ์ที่อยู่บนเส้นออกจากเมทริกซ์นั้น อาร์กิวเมนต์ของค่าเฉลี่ยของสิ่งเหล่านั้นจะปรากฏขึ้น

ขอบคุณ @ThomasKwa สำหรับการแนะนำการปรับปรุงความแม่นยำซึ่งทำให้รหัสสั้นลง !!!

I=imread(input('','s'));
[y,x]=ndgrid(-50:49);
c=y+i*x;
disp(mod(angle(mean(c(~I(:,:,1))))*180/pi+360,360))

1
จะสั้นกว่าหรือเปล่าที่จะหาข้อโต้แย้งเกี่ยวกับค่าเฉลี่ยของคะแนนทั้งหมดในบรรทัด?
lirtosiast

ว้าวนี่สั้นกว่าที่ฉันคาดไว้มากเป็นงานที่ดี!
J Atkin

@ThomasKwa อย่างแน่นอน แต่ก็ไม่ถูกต้องเนื่องจากพิกเซลที่อยู่ใกล้กับศูนย์กลางนั้นไม่ถูกต้องอย่างแน่นอน หากคุณต้องการลองคุณสามารถเรียกใช้รหัสนี้ใน Octave ด้วยฉันคิดว่า!
ข้อบกพร่อง

อาร์กิวเมนต์ของค่าเฉลี่ย (ซึ่งควรให้อาร์กิวเมนต์ของจุดกึ่งกลางของบรรทัดมีความแม่นยำที่ดีงาม) ไม่ใช่ค่าเฉลี่ยของอาร์กิวเมนต์ ฉันไม่รู้ว่าความแม่นยำจะเป็นที่ยอมรับได้หรือไม่
lirtosiast

1
@ThomasKwa ความคิดที่ยอดเยี่ยมขอบคุณ! ความถูกต้องจะดียิ่งขึ้นในขณะนี้และรหัสที่เป็นไม่กี่ไบต์สั้น =)
flawr

5

Matlab, 86 77 ไบต์

นี่เป็นอีกวิธีในการใช้ Matlab:

[I,J]=find(~im2bw(imread(input('','s'))));mode(mod(round(atan2d(J-51,I-51)),360))

สิ่งนี้จะอ่านไฟล์ (ถูกขโมยจากข้อบกพร่อง ) และค้นหาดัชนีของพิกเซลสีดำ จากนั้นมันจะหาเวกเตอร์ที่ชี้จากจุดศูนย์กลางของภาพไปยังแต่ละพิกเซลสีดำและใช้atan2dเพื่อหามุมการปัดเศษเพื่อให้ได้มุมที่เป็นจำนวนเต็มและทำmod(...,360)เพื่อให้ได้ผลลัพธ์ในช่วงที่ถูกต้อง เพื่อให้ได้มุมที่ถูกต้อง (มีข้อผิดพลาดเล็กน้อยสำหรับพิกเซลที่อยู่ใกล้กับศูนย์กลาง) ให้ใช้มุมที่คำนวณได้มากที่สุด

ขอบคุณslvrbldสำหรับim2bwคำแนะนำ!


1
รหัสของคุณสามารถลดลงได้ถึง77 ไบต์โดยแทนที่ส่วนก่อนโหมด (... ) ด้วย[I, J] = find (~ im2bw (imread (อินพุต (''))));
slvrbld

ทำได้ดีนี่! ขอบคุณฉันแน่ใจว่ามีวิธีที่จะทำได้ง่ายขึ้น แต่จำไม่ได้
David

3

Labview, 10098 Bytes

ลองใส่รหัส labview อีกอันออก

เนื่องจากไม่มีวิธีที่เป็นทางการในการนับจำนวนไบต์ใน labview ฉันใช้ขนาดของไฟล์เมื่อบันทึก อีกทางเลือกหนึ่งนับทุกสายและฟังก์ชั่นเป็น 1 และกรณีเป็น 2 มันจะออกมาถึง 71

1

โหลดภาพย่อให้เป็น 1D สแกนหา 0s จากทั้งสองข้างและถ่ายภาพแรกแล้วคำนวณกลับไปที่จุดและใช้รูปทรงเรขาคณิตเพื่อให้ได้มุม


1
นีซมันน่าสนใจ คุณอาจต้องการถามเกี่ยวกับวิธีการให้คะแนนโปรแกรม labview
J Atkin

มีหัวข้อเกี่ยวกับวิธีการทำคะแนนอยู่แล้ว แต่น่าเสียดายที่ยังไม่มีคำตอบ
Eumel

อ้อเข้าใจแล้ว. ฉันเพิ่งแก้ไขโพสต์ของคุณเพื่อให้จำนวนไบต์เข้าใจได้มากขึ้นในสหรัฐอเมริกาของ A.
J Atkin

@JAtkin ในฐานะเพื่อนชาวยุโรปมันทำให้ฉันเกาหัวฉันสงสัยว่าเขาได้รับเศษส่วนของไบต์เหล่านั้นอย่างไร จะไม่ใช้ช่องว่างโปรดทุกด้านหรือ
แอรอน

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