10, 10, 10… আশা করি?


15

মুখবন্ধ

আজ আমি আগের ধনু ধীরে ধীরে 900 টি শ্যুটিং করার সময় (10 টি শেষ একটি তীরের শেষে 10 এবং শেষটি 3 তীরে একটি প্রান্তে, মোট 90 তীর এবং সর্বোচ্চ 900 এর স্কোর), আমি এই চ্যালেঞ্জটির কথা ভেবেছিলাম।

তীরন্দাজিতে (ধরে নিই যে আপনি ফিটা সরবরাহিত টার্গেট ফেস [আপনি যে অঙ্কিত কাগজের টুকর উপরে শুটিং করছেন]), প্রতিটি তীরের জন্য আপনি সর্বাধিক স্কোর 10 দাবি করতে পারবেন, টার্গেট ফেসে হ্রাস ব্যাসের 10 বা 11 টি রিং রয়েছে, একে অপরের ভিতরে বাসা বেঁধেছে। অভ্যন্তরীণ আংটিটি বাইরের দিকে, এটি 10 ​​পয়েন্ট থেকে এক বিন্দুতে গণনা করা হয় (এবং 11 টি রিংয়ের ক্ষেত্রে একটি গৌণতম অন্তঃস্থ রিং থাকে যা 'এক্স' হিসাবে গণনা করা হয়, যা 10 হিসাবে স্কোর হয় তবে টাই ব্রেকিংয়ের ক্ষেত্রে ব্যবহৃত হয় উচ্চতর মান)। পালন:

ফিটা লক্ষ্য স্কোরিং

অবশ্যই, আমি ফিটা মেট্রিক স্কোরিংকে উল্লেখ করছি, যেমন উপরের চিত্রটিতে দেখা গেছে। আপনি যদি ঘনিষ্ঠভাবে লক্ষ্য করেন তবে আপনি অন্তর্লতম রিংটি পর্যবেক্ষণ করতে পারবেন যা একটি বিবর্ণ বিন্দুযুক্ত রেখা, যার স্কোর চিহ্নিত নেই। এটিই 'এক্স' যা আমি উল্লেখ করছি, কিন্তু বোনাসের জন্য প্রতিযোগিতা না করা পর্যন্ত আপনাকে সেদিকে খেয়াল রাখতে হবে না।

চ্যালেঞ্জ

একটি ফাংশন তৈরি করুন (বা পুরো প্রোগ্রাম, যদি ভাষা ফাংশন সমর্থন করে না), যা পুরোপুরি বর্গক্ষেত্রের চিত্রটি ইনপুট হিসাবে (বা চিত্রের ফাইলের নাম, যদি প্রয়োজন হয়) প্রাপ্ত করে, যাতে কয়েকটি সংখ্যক সবুজ থাকে (HEX # 00FF00, আরজিবি (0, 255, 0)) কিছু আকারের বিন্দুগুলি এবং স্কোরটি দেয়। চিত্রটিতে সবুজ বিন্দু ছাড়া অন্য কোনও ডেটা থাকতে পারে তবে সবুজ সবসময় হুবহু একই শেডে থাকবে।

আপনি কল্পনা করতে পারেন যে বর্গক্ষেত্র চিত্রটি 4 টি পয়েন্টে শীর্ষ স্পর্শ করে (শীর্ষ কেন্দ্র, নীচের কেন্দ্র, ডানদিকে, বাম দিকে) ছোঁয়া লক্ষ্যবস্তুর প্রতিনিধিত্ব করে। উপস্থাপিত লক্ষ্যযুক্ত মুখটি সর্বদা একই অনুপাতের হবে, সমস্ত রিংয়ের সাথে ইনপুট টার্গেট চিত্রের প্রস্থের ঠিক 1/20 তম প্রস্থ থাকবে। উদাহরণস্বরূপ, 400px বাই 400px ইনপুট মাত্রাগুলির একটি ইনপুট চিত্র দেওয়া, আপনি ধরে নিতে পারেন যে প্রতিটি রিংটির অভ্যন্তরীণ প্রস্থ 20px রয়েছে, নীচে চিত্রিত হিসাবে:

কৃপণ উদাহরণ উদাহরণ

ব্যাখ্যা

  • যদি দুটি পৃথক রিং স্পর্শ করে তবে দুটি রিংয়ের উচ্চতর গণনা করা হয়
  • বোনাসটির জন্য চেষ্টা না করা হলে আপনাকে স্বয়ংক্রিয়ভাবে মিস বা 'এক্স' কেসের জন্য অ্যাকাউন্ট করতে হবে না
  • আপনি ধরে নিতে পারেন যে কোনও সবুজ চেনাশোনা ওভারল্যাপ করছে না
  • আপনি এটি ধরেও নিতে পারেন যে সবুজ ছায়ার আর কোনও পিক্সেল চিত্রটিতে নেই
  • চিত্রটি হয় পিএনজি, জেপিজি বা পিপিএম ফর্ম্যাটে থাকবে (আপনার পছন্দ)
  • বাহ্যিক চিত্র প্রক্রিয়াকরণ গ্রন্থাগারগুলি অনুমোদিত, যদি এই প্রশ্নটি পোস্ট করার আগে রচিত হয়
  • আপনি ধরে নিতে পারেন যে একটি লক্ষ্যতে সমস্ত সবুজ চেনাশোনা একই ব্যাস হবে same
  • ওভারল্যাপিং চেনাশোনা বোনাসের জন্য শুটিং (হাহ), আপনি ধরে নিতে পারেন যে চিত্রের কমপক্ষে একটি চেনাশোনাতে অন্যটি ওভারল্যাপিং নেই
  • স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়

পরীক্ষার মামলা

নিম্নলিখিত দুটি ক্ষেত্রে প্রতিটি স্কোর 52 (বা বোনাসের ক্ষেত্রে 52 এর 1 'x' এবং 1 মিস) হওয়া উচিত:

এবং এই শেষ পরীক্ষার কেসটি 25 স্কোর করা উচিত :

বোনাস

  • -২৫ বাইটস যদি আপনিও মিসের সংখ্যা (যেকোন রিংয়ের বাইরে) ফেরত দেন
  • -30 বাইট আপনি যদি X এর পরিমাণও ফেরত দেন (ধরে নিন যে অন্তর্নিহিত এক্সটি চিত্রের প্রস্থের 3/100 তম এবং 10 এর পরে চিত্রের প্রস্থের 2/100 ভাগ রয়েছে 1 1-9 অনুপাত অপরিবর্তিত রয়েছে)
  • ওভারল্যাপিং চেনাশোনাগুলির জন্য অ্যাকাউন্ট নিলে -35% বাইট গণনা

এটি কোড গল্ফ, তাই কমপক্ষে বাইটস জিতে। আনন্দ কর!


"30 টি একটি তীরের শেষে 30 টি, মোট 30 টি তীরের জন্য"? এটি 90 তীর হওয়া উচিত নয়?
ডেভিডসি

@ ডেভিডকারারহর আমি পোস্ট করার সাথে সাথে আমি ঠিক তা উপলব্ধি করেছিলাম। সংশোধন করা হয়েছে
বিশ্বব্যাপী

আমরা কোন চিত্রের ফর্ম্যাটগুলি ব্যবহার করতে পারি? পিএনজি? পিপিএম? আমাদের নিজস্ব কাস্টম ফর্ম্যাট? (আমি প্রথম দুটি ধরে ফেলব তবে তৃতীয় নয়, কেবল স্পষ্ট করার জন্য।)
ডুরকনব

সরলতার জন্য কেবল জেপিইজি বা পিএনজি বলি @ ডুরকনব 冰
বিশ্বব্যাপী

1
আমি মনে করি সবচেয়ে কঠিন বোনাস হ'ল নূন্যতম পুরষ্কার।
জাস্টিন 9

উত্তর:


4

প্রসেসিং 2, 448-25 = 423 বাইট

int x,y,w,b,v,c,m;color g;PImage i;void setup(){i=loadImage("f.png");w=i.width;size(w,w);g=#00ff00;image(i,0,0);b=v=x=y=c=m=0;loadPixels();while(y*w+x<w*w){if(pixels[y*w+x]==g){f(y,x);if(v>=0)c+=v;else m++;}v=-1;x++;if(x==w){x=0;y++;}}println(c+" "+m);}void f(int k,int l){pixels[k*w+l]=color(0);if(pixels[(k+1)*w+l]==g)f(k+1,l);if(pixels[k*w+l+1]==g)f(k,l+1);if(pixels[k*w+l-1]==g)f(k,l-1);k-=w/2;l-=w/2;b=10-(int)(sqrt(k*k+l*l)/(w/20));if(b>v)v=b;}

পিক্সেলগুলির মধ্য দিয়ে একটি চিত্র ফাইলের চ পড়তে পারা যায় যতক্ষণ না এটি সবুজ খুঁজে পায় ততক্ষণে বন্যা কেন্দ্রের নিকটতম পয়েন্টটি নির্ধারণ করে বৃত্তটি পূরণ করে। তারপরে মোট সেই স্কোর যুক্ত করে। যদি স্কোরটি নেতিবাচক হয় তবে এটি মিস কাউন্টারে যুক্ত হয়।

প্রোগ্রামটি 2 নম্বর আউটপুট দেবে, প্রথমটি স্কোর এবং দ্বিতীয়টি মিসের সংখ্যা।

  int x,y,w,b,v,c,m;
  color g;
  PImage i;
void setup()
{
  i=loadImage("f.png");
  w=i.width;
  size(w,w);
  g=#00ff00;
  image(i,0,0);
  b=v=x=y=c=m=0;  
  loadPixels();
  while(y*w+x<w*w)
  {
    if(pixels[y*w+x]==g)
    {
      f(y,x);
      if(v>=0)c+=v;
      else m++;
    }
    v=-1;
    x++;
    if(x==w){x=0;y++;}
  }
  print(c+" "+m);
}

void f(int k,int l)
{
  pixels[k*w+l]=color(0);
 if(pixels[(k+1)*w+l]==g)f(k+1,l);
 if(pixels[k*w+l+1]==g)f(k,l+1);
 if(pixels[k*w+l-1]==g)f(k,l-1); 
 k-=w/2;
 l-=w/2;
 b=10-(int)(sqrt(k*k+l*l)/(w/20));
 if(b>v)v=b;
}

আপনি এখানে প্রক্রিয়াজাতকরণ পেতে পারেন


4

পার্ল 5 + জিডি: 225 - 25 = 200

সম্পাদনা করুন: ইনডেক্সড পিএনজিগুলিতে ভুল পিক্সেল পড়ার কারণ খুঁজে পেয়েছে এবং একটি কার্যবিধির প্রয়োগ করেছে। জিডি লাইব্রেরির সাথে কোনও কারণে সবুজ পিক্সেল মানগুলি (4,254,4) হিসাবে পড়া হয়। আমি নিশ্চিত নই যে এটি প্রশ্নের মধ্যে অন্তর্ভুক্ত পিএনজি ফাইলগুলির সাথে নির্দিষ্ট কিনা। লাইন ব্রেকগুলি নীচের কোডে সরানো যেতে পারে।

use GD;$k=newFromPng GD::Image'-',1;
sub v{/ /;10-int((($'-@x/2)**2+($`-@x/2)**2)**.5/@x*20)}
map{v>0?($r+=v):$%++,fill$k @c,0if 65280==getPixel$k @c=split
}sort{v($_=$b)- v$_=$a}map{//;map"$_ $'",@x}@x=0..width$k-1;
print"$r $%"

ইনপুটটিতে একটি পিএনজি চিত্র নেয় এবং 2 টি মান মুদ্রণ করে: পয়েন্ট এবং মিসের সংখ্যা। উদাহরণ স্বরূপ:

perl arch.pl <arch52.png
52 1

শেষ মুহুর্তের পরিবর্তন:

সত্য রঙের মোডে আমার যেভাবেই রঙের সূচিগুলি প্রয়োজন getPixelএবং fillকেবলমাত্র পূর্ণসংখ্যার এনকোডড আরজিবি মানগুলি হয় তাই ব্যবহার করার দরকার নেই rgbএবংcolorAllocate প্রয়োজন এবং সেই ইনডেক্স থেকে রূপান্তর করবে।

ব্যাখ্যা:

  • সমস্ত পিক্সেল স্থানাঙ্কের তালিকা তৈরি করুন (স্থান পৃথক পৃথক সংখ্যার হিসাবে)।
  • সম্ভাব্য স্কোর অনুসারে বাছাই করুন ( sub vযার সাহায্যে প্যারামিটার লাগে$_ ছোট হওয়ায় পরিবর্তিত হয়)
  • প্রতিটি পিক্সেলের জন্য সর্বাধিক স্কোরিং থেকে শুরু করে যদি এটি সবুজ হয় ফলাফলের সাথে যোগ করে এবং বন্যার অবস্থানটি কালো পূরণ করে।

এটি চিত্র নয়; @ bubalou এর উত্তর সঠিকভাবে # হিসাবে 00ff00 রং পড়া
globby

@globby আমি জানি যে চিত্রগুলিতে রঙগুলি সঠিক (আমি চিত্র সম্পাদনা সফ্টওয়্যার দিয়ে পরীক্ষা করেছি), তবে রঙের স্থানটি ছাঁটাই করতে একই মেটা সম্পর্কিত তথ্যও থাকতে পারে।
নটকি

সম্ভবত। যদিও এটি অদ্ভুত
গ্লোবাই

3

হাস্কেল - 579-25 = 554 603-25-30 576-25-30 = 521 বাইট

কৌশল:

  • সমস্ত পিক্সেলের জন্য (d, x, y) ট্রিপলের একটি তালিকা তৈরি করুন (d মধ্যস্থানের দূরত্ব)
  • দূরত্ব অনুসারে তালিকাটি সাজান
  • সর্বাধিক দূরত্ব দিয়ে শুরু: পিক্সেলটি যদি কোনও ছোট পাড়ার একমাত্র সবুজ পিক্সেল থাকে তবে দূরত্বটিকে একটি তালিকায় রাখুন, অন্যথায় এটি কালো করুন
  • দূরত্বের তালিকা থেকে স্কোর গণনা করুন L

আউটপুট একটি ট্রিপল ist (স্কোর, মিস, এক্স), যেমন (52,1,1) পরীক্ষার ইমেজ।

কেন্দ্রটির নিকটতম একটি চেনাশোনাটির পিক্সেল অন্য বৃত্তের 3 পিক্সেলের মধ্যে থাকলে প্রোগ্রামটি ব্যর্থ হতে পারে।

import Data.List
import Codec.Picture
import Codec.Picture.RGBA8
import Codec.Picture.Canvas
z=fromIntegral
f(e,x,y)(v,h)|and$j x y:[not$j a b|a<-[x-3..x+3],b<-[y-3..y+3],not(a==x&&b==y)]=(v,e:h)|1<2=(setColor x y(PixelRGBA8 0 0 0 0)v,h)
 where j n m|PixelRGBA8 0 255 0 _<-getColor n m v=0<1|0<1=0>1
d k r(h,i,j)|r>10*k=(h,i+1,j)|r<k*3/5=(h+10,i,j+1)|1<2=(10-(floor$r/k)+h,i,j)
main=do
 i<-readImageRGBA8 "p.png"
 let(Right c)=imageToCanvas i;s=canvasWidth c;q=[3..s-4];(_,g)=foldr f(c,[])$sort[(sqrt$(z x-z s/2)^2+(z y-z s/2)^2,x,y)|x<-q,y<-q]
 print$foldr(d$z s/20)(0,0,0)g

একটি টিপ: all idএকই হিসাবে and, আপনি jপ্যাটার্ন j n m|PixelRGBA8 0 255 0 _<-getColor n m v=0<1|0<1=0>1
গার্ডগুলির

@ প্রফেসহেস্কিলার: হ্যাঁ, ধন্যবাদ!
নিমি

2

গণিত - 371 386 - 25 = 361

আরও অনুকূল সমাধান। আমার পাইথন সমাধানের চেয়ে উত্তরটি দ্রুত গতিতে।

i=IntegerPart;c=i/@((NestList[#+.01&,.1,10]~Prepend~1)*100);g[m_]:=Last@@c~Position~#-1&/@(i@Round@Last@#&/@(#*100&/@Riffle[RGBColor/@NestList[#+.01&,{.1,.1,.1},10],Table[Disk[{0,0},n],{n,1,.1,-.1}]]~Graphics~{ImageSize->ImageDimensions[m],PlotRangePadding->None}~ImageMultiply~ChanVeseBinarize[m,"TargetColor"->Green]~ComponentMeasurements~"Max"/.Rule[a_,b_]:>b))//{Total@#,#~Count~0}&

পিআইএল সহ পাইথন - একটি তুচ্ছ এবং অনুকূল নয়, 961 বাইট solution

সমস্যাটি সমাধান করার জন্য এটি কেবল একটি নির্বোধ দৃষ্টিভঙ্গি প্রদর্শনের চেষ্টা করা। প্রথম দুটি পরীক্ষার কেস চালাতে ~ 2 মিনিট সময় লাগে, এবং দ্রুত তৈরি, ভয়াবহ সংস্থান, এবং বিপরীতমুখীভাবে অ্যালগোরিদমিকভাবে জটিল বৃত্ত সনাক্তকারী কারণে আমার সিস্টেমে তৃতীয়টি চালাতে 20 মিনিট সময় লাগে। এটি সত্ত্বেও, এটি প্রয়োজনীয়তাগুলি পূরণ করে, যদিও এটি অবশ্যই সর্বোপরি গল্ফ হয় না। চিত্রটিতে যত সবুজ রয়েছে, এটি চালাতে আরও বেশি সময় নেয়।

from PIL import Image,ImageDraw
a=lambda x,y,w,h:filter(lambda x:0<=x[0]<w and 0<=x[1]<h,[(x-1,y-1),(x,y-1),(x+1,y-    1),(x-1,y),(x,y),(x+1,y),(x-1,y+1),(x,y+1),(x+1,y+1)])
def b(c):
 d=0,255,0;e,f=c.size;g=c.load();h,i=[],[];j=Image.new("RGB",(e,f));k=ImageDraw.Draw(j)
 for l in range(e):
  for m in range(e):
   n=g[l,m][:-1]
   if n==d and(l,m)not in i:
    o=[(l,m)];p=[];q=1
    while q:
     q=0;r=o[:]
     for s in o:
      t=filter(lambda x:g[x[0],x[1]][:-1]==d and(x[0],x[1]) not in r,a(s[0],s[1],e,f))
      if t:
       r+=t
       if len(t)<8:
        p+=[s]
       q=1
     o=r
    h+=[p]
    for u in o:
     i+=[u]
   i+=[(l,m)]
 p=map(lambda x:"#"+str(x)*6,'123456789ab');v=0;k.rectangle((0,0,e,f),fill=p[0])
 for n in p[1:]:
  w=e/20*v;x=e-w;k.ellipse((w,w,x,x),fill=n);v+=1
 y=j.load();z=0
 for l in h:
  v=[]
  for m in l:
   s=y[m[0],m[1]]
   if s not in v:
    v+=[s]
  v=max(v);z+=p.index("#"+''.join(map(lambda x:hex(x)[2:],v)))
 return z

একটি পিআইএল চিত্র অবজেক্ট নেয় এবং স্কোরটি দেয়।

এটি যে পদক্ষেপ নেয়:

  1. সবুজ চেনাশোনাগুলি বিচ্ছিন্ন করুন (অকার্যকর)
    • কিছু পিক্সেলের সমস্ত প্রতিবেশী সন্ধান করুন n , যদি কোনও গ্রিন পিক্সেল হয় তবে সেগুলি বৃত্তে যুক্ত করুন
    • 8 প্রতিবেশী রয়েছে এমন পিক্সেলগুলি ফিল্টার করে মোটামুটি রূপরেখা নির্ধারণ করুন
  2. একটি লক্ষ্য উপস্থাপনা আঁকুন
    • একটি ফাঁকা ক্যানভাস তৈরি করুন
    • একটি অনন্য রঙিন পটভূমি আঁকুন (মিসের বাস্তবায়ন সহজ)
    • অনন্য রঙযুক্ত নেস্টেড উপবৃত্তগুলি আঁকুন
  3. বৃত্তের নীচে যে লক্ষ্যটি হবে তার রঙ (গুলি) নির্ধারণ করে প্রতিটি বৃত্ত কোন স্কোরিং জোনে রয়েছে তা নির্ধারণ করুন
  4. স্কোরিং অঞ্চলগুলির উচ্চতর চয়ন করুন (একাধিক হলে) এবং মোটটিতে স্কোর যুক্ত করুন
  5. মোট ফিরিয়ে দাও

আপনার পাইথন ফাংশনটি aলিখিত হতে পারেa=lambda x,y,w,h:[(X,Y)for X in(x-1,x,x+1)for Y in(y-1,y,y+1)if w>X>-1<Y<h]
ovs
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.