1 পি 5: ভূমিকম্প!


13

ইউএসজিএসের সিসোমিটাররা সবেমাত্র একটি বড় ভূমিকম্প সনাক্ত করেছে! জরুরী প্রতিক্রিয়া দলগুলির ক্ষতিগ্রস্থদের সংখ্যার দ্রুত অনুমান করা দরকার। এই অনুমানটি গণনা করার জন্য একটি প্রোগ্রাম লিখুন।

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

ইনপুট

ভূমিকম্পের বর্ণনা দেওয়ার জন্য প্রথমে একটি লাইন, দোষের শুরু এবং শেষের পয়েন্টগুলির সাথে x, y স্থানাঙ্ক, সমালোচনামূলক দূরত্ব সমেত containing বিন্যাসটি হ'ল A_x A_y B_x B_y D। উদাহরণ স্বরূপ:

3.0 3.0 7.0 4.0 2.5

(৩.০,৩.০) থেকে (.0.০,৪.০) এবং 2.5 এর সমালোচনামূলক দূরত্বকে প্রবিষ্ট করে দোষটি এনকোড করে।

দ্বিতীয়ত, অঞ্চলে শহর প্রতি এক লাইন, শহর এবং এর জনসংখ্যার x, y স্থানাঙ্ক সমন্বিত। উদাহরণ স্বরূপ:

1.0 1.0 2500
5.0 7.0 8000
3.0 4.0 7500
9.0 6.0 3000
4.0 2.0 1000

এখানে চিত্র বর্ণনা লিখুন

আউটপুট

ক্ষতিগ্রস্থ এলাকায় বসবাসকারী মানুষের সংখ্যা। উপরের উদাহরণের জন্য কেবল তৃতীয় এবং পঞ্চম শহরগুলি বিপদ অঞ্চলে রয়েছে, সুতরাং আউটপুট হবে

8500

সংক্ষিপ্ততম কোড জিতেছে।

উদাহরণ 2

0.0 0.0 10.0 0.0 5.0
5.0 4.0 10000
5.0 -4.0 1000
5.0 6.0 100
11.0 2.0 10 
-4.0 4.0 1

উত্পন্ন

11010

আউটপুটটি কি কোনও পূর্ণসংখ্যা হতে হবে, বা 8500.0উদাহরণের জন্য ঠিক হবে ? এবং আমরা কি আরও কিছু টেস্টকেস পেতে পারি?
ভেন্টোরো

এছাড়াও, ইনপুট ধরণ কি? হিসাবে, এটি কত দশমিক স্থান হতে পারে? এটি এমন ভাষার জন্য প্রাসঙ্গিক যেগুলির ভাসমান বিন্দু নেই।
পিটার টেলর

আউটপুটটির পূর্ণসংখ্যা হওয়া দরকার, ভগ্নাংশের লোক থাকতে পারে না। ধরা যাক ইনপুটটি সর্বোচ্চ 2 দশমিক জায়গায়।
কিথ র্যান্ডাল

সমালোচনা ক্ষেত্রটি কি শেষ প্রান্তের চারপাশে একটি অর্ধবৃত্তে প্রসারিত হয়, বা এটি কেবল একটি আয়তক্ষেত্র?
পিটার ওলসন

@ পিটার: এটি অর্ধবৃত্তগুলিতে শেষ হয়, তাই পুরো জিনিসটি লজেন্স আকারের।
কিথ র্যান্ডাল

উত্তর:


11

রুবি, 171 152 155 153

u,v,a,b,d=gets.split.map &:to_f
a-=u;b-=v
p eval$<.map{|l|"(x=%f-u;t=(a*x+b*y=%f-v)/(a*a+b*b);d*d<(x-a*t=t<0?0:t>1?1:t)**2+(y-t*b)**2?0:%d)"%l.split}*'+'

এটি আমার প্রথম রুবি জমা এবং আমার প্রথম কোড-গল্ফ। সরাসরি কাজটির বাস্তবায়ন দয়া করে আমাকে কীভাবে উন্নতি করতে হবে তার কিছু ইঙ্গিত দিন (ভাসমানগুলি পড়ার জন্য আরও একটি ছোট উপায় থাকতে হবে ...)।


আপনার চারপাশের প্রথম বন্ধনী নির্মূল করে কয়েকটি অক্ষর সংরক্ষণ করতে পারবেন mapএবং eval, এবং ইনলাইনিং t। এবং যেহেতু আপনি ইতিমধ্যে উদ্দীপনা করছেন, আপনি পরিবর্তে ফর্ম্যাট স্ট্রিং ব্যবহার করতে পারেন .to_f, যাতে শেষ ব্লকটি সংক্ষিপ্ত করা যায়p eval$<.map{|l|"(x=%f-u;t=(x*a+b*y=%f-v)/(a**2+b**2);d*d<(x-t=t<0?0:t>1?1:t)**2+(y-t*b)**2?0:%d)"%l.split}*'+'
ভেন্টোরো

@ ভেন্তোরো আপনাকে ধন্যবাদ ইনলাইনিং tআবার আরও দুটি সংরক্ষণ করে।
হাওয়ার্ড

আমি এটি উদাহরণস্বরূপ # 2 তে কাজ করতে পারি না (সবেমাত্র যুক্ত করা হয়েছে), এটির সাথে ত্রুটি হয়undefined method > for nil:NilClass (NoMethodError)
কীথ র্যান্ডাল

@ কিথের এখন আপনার ইনপুটটিতেও কাজ করা উচিত।
হাওয়ার্ড

4

জাভাস্ক্রিপ্ট (437)

এটি সম্ভবত উল্লেখযোগ্যভাবে গল্ফ করা যেতে পারে, তবে রুবি দ্রবণটি বীট করার পক্ষে যথেষ্ট নয়।

p=$("#i").text().split("\n");for(i=0;i<p.length;i++){p[i]=p[i].split(" ")}
z=p[0];a=z[0];b=z[1];c=z[2];d=z[3];e=z[4];o=0;f=[a,b];g=[c,d];
function q(r,s){return Math.sqrt(Math.pow(s[0]-r[0],2)+Math.pow(s[1]-r[1],2))}
for(i=1;i<p.length;i++){w=p[i];u=((w[0]-a)*(c-a)+(w[1]-b)*(d-b))/Math.pow(q(f,g,2),2);
x=[(a*1)+u*(c-a),(b*1)+u*(d-b)];l=e;m=w[2]*1;u=w[0];w=w[1];v=[u,w];
o+=q(v,x)<l&&q(x,g)+q(x,f)==q(f,g)?m:q(v,f)<l?m:q(v,g)<l?m:0}alert(o);

আপনি এটি এখানে কর্মে দেখতে পাবেন ।


2
পেছনের সেমিকোলনটি সরিয়ে আপনি 1 অক্ষরের b-0পরিবর্তে 2 টি অক্ষর সংরক্ষণ করতে পারবেন (b*1)। অবশেষে, দিয়ে শুরু M=Mathএবং সমস্ত প্রতিস্থাপন Mathসঙ্গে গুলি M, 6 অক্ষর সংরক্ষণ। প্রোটোটাইপ ব্যবহার .valueকরে 2 টি অক্ষর ( #এবং একটি প্রথম বন্ধনী) সংরক্ষণ করে।
রাই-

4

সি # - 743 715

namespace System{using Linq;using m=Math;class P{public float X,Y;}class E{static void Main(){Func<string,float>p=s=>float.Parse(s);Func<P,P,double>d=(a,b)=>{return a.X*b.X+a.Y*b.Y;},c=(a,b)=>{return a.X*b.Y-a.Y*b.X;};Func<P,P,P>u=(a,b)=>{return new P{X=a.X-b.X,Y=a.Y-b.Y};};Func<P,P,P,double>g=(A,B,C)=>{return d(u(C,B),u(B,A))>0?m.Sqrt(d(u(B,C),u(B,C))):d(u(C,A),u(A,B))>0?m.Sqrt(d(u(A,C),u(A,C))):m.Abs(c(u(B,A),u(C,A))/m.Sqrt(d(u(B,A),u(B,A))));};var n=IO.File.ReadAllLines("i");var i=n[0].Split();var q=new{A=new P{X=p(i[0]),Y=p(i[1])},B=new P{X=p(i[2]),Y=p(i[3])},D=p(i[4])};Console.WriteLine((from l in n.Skip(1)let f=l.Split()let w=new P{X=p(f[0]),Y=p(f[1])}where g(q.A,q.B,w)<q.D select p(f[2])).Sum());}}}

অ Golfed:

namespace System
{
    using Linq;
    using m = Math;
    class Point { public float X, Y;}
    class Earthquake
    {
        static void Main()
        {
            Func<string, float> parse = s => float.Parse(s);
            Func<Point, Point, double> dotProduct = (a, b) => { return a.X * b.X + a.Y * b.Y; }, 
                                       crossProduct = (a, b) => { return a.X * b.Y - a.Y * b.X; };
            Func<Point, Point, Point> subtract = (a, b) => { return new Point { X = a.X - b.X, Y = a.Y - b.Y }; };
            Func<Point, Point, Point, double> getDistance = (A, B, C) => { 
                return dotProduct(subtract(C, B), subtract(B, A)) > 0 ? 
                        m.Sqrt(dotProduct(subtract(B, C), subtract(B, C))) : 
                        dotProduct(subtract(C, A), subtract(A, B)) > 0 ? 
                            m.Sqrt(dotProduct(subtract(A, C), subtract(A, C))) : 
                            m.Abs(crossProduct(subtract(B, A), subtract(C, A)) / m.Sqrt(dotProduct(subtract(B, A), subtract(B, A)))); 
            };
            var inputLines = IO.File.ReadAllLines("i"); 
            var quakeLine = inputLines[0].Split(); 
            var quake = new { 
                PointA = new Point { X = parse(quakeLine[0]), Y = parse(quakeLine[1]) }, 
                PointB = new Point { X = parse(quakeLine[2]), Y = parse(quakeLine[3]) }, 
                Distance = parse(quakeLine[4]) 
            };
            var affectedPopulations = (from line in inputLines.Skip(1) 
                                       let fields = line.Split() 
                                       let location = new Point { X = parse(fields[0]), Y = parse(fields[1]) } 
                                       let population = parse(fields[2])
                                       where getDistance(quake.PointA, quake.PointB, location) < quake.Distance 
                                       select population);
            Console.WriteLine(affectedPopulations.Sum());
        }
    }
}

কিছু golfed সংস্করণের সাথে, আমি একটি ত্রুটি যখন আমি কম্পাইল (পেতে ভুল quake.cs(1,254): error CS1525: Unexpected symbol ',', expecting 'from', 'group', 'join', 'let', 'orderby', 'select', or 'where')। অরোগল্ফড সংস্করণটি ভাল কাজ করে।
কিথ র্যান্ডাল

@ কিথরান্ডাল, উফ - খুব গল্ফিং!
রেবেকা চেরনফ

2

সি - 471 টি অক্ষর

#include <stdio.h>
#define F float
#define G getline(&v,&l,stdin)
F a[2],b[2],c[2],d[2],e[2],r,t,y,z;char*v;size_t l,n,p;
F s(F u[2],F v[2]){y=u[0]-v[0];z=u[1]-v[1];return y*y+z*z;}
j(F g[2],F h[2],F i[2]){*i=*g-*h;i[1]=g[1]-h[1];}
int i(){j(b,a,d);j(c,a,e);t=*d**e+d[1]*e[1];
return s(a,c)<=r||s(b,c)<=r||t>0&&t/s(a,b)<=1&&s(a,c)-t*t/s(a,b)<=r;}
int main(){G;sscanf(v,"%f %f %f %f %f",a,a+1,b,b+1,&r);r*=r;
while(G!=-1)sscanf(v,"%f %f %i",c,c+1,&p),n+=p*i();printf("%d\n",n);}

এটি ধরে নিয়েছে আপনার স্ট্যান্ডার্ড লাইব্রেরি আছে getline

অসম্পূর্ণ সংস্করণটিতে মন্তব্যে এই পদ্ধতিটি কিছুটা স্পষ্ট করা হয়েছে:

#include <stdio.h>

float a[2],b[2],c[2],d[2],e[2],r,t,y,z;
char*v;
size_t l,n,p;
float s(float u[2],float v[2]){ /* returns the square of the distance
                   between two points */
  y=u[0]-v[0];
  z=u[1]-v[1];
  return y*y+z*z;
}
j(float g[2],float h[2],float i[2]){ /* sets i=g-h */
  i[0]=g[0]-h[0];
  i[1]=g[1]-h[1];
}
int i/*sCLose*/(){
  j(b,a,d); /* d=b-a */
  j(c,a,e); /* e=c-a */
  t=d[0]*e[0]+d[1]*e[1]; /* dot product */ 
  return 
    (s(a,c)<=r) || /* near one end point */
    (s(b,c)<=r) || /* near the other */
    (  
     (t>0) && /* C lies more "towards" B than away */
     (t/s(a,b)<=1) && /* Nearest point on AB to C lies between A and B */
     (s(a,c)-t*t/s(a,b)<=r) /* length of the altitude less than R */
       ); 
}
int main(){
  getline(&v,&l,stdin);
  sscanf(v,"%f %f %f %f %f",a,a+1,b,b+1,&r);
  r*=r; /* r is now r squared, as that is the only way we use it */
  printf("(%f, %f); (%f, %f): %f\n",a[0],a[1],b[0],b[1],r);
  while (getline(&v,&l,stdin) != -1){
    sscanf(v,"%f %f %i",c,c+1,&p);
    printf("\t (%f, %f): %d\n",c[0],c[1],p);
    n+=p*i/*sClose*/();
  }
  printf("%d\n",n);
}

0

স্কেল: 660 অক্ষর:

object E extends App{
type I=Int
type D=Double
def b(h:D,i:D,x:I,y:I,d:D)=(x-h)*(x-h)+(y-i)*(y-i)<=d*d
def a(p:java.awt.Polygon,x:I,y:I,h:I,i:I,d:D,r:Array[String])={
val w=r(0).toDouble
val j=r(1).toDouble
val n=r(2).toInt
if (p.contains(w,j)||b(j,w,x,y,d)||b(j,w,i,h,d))n
else 0}
val s=new java.util.Scanner(System.in)
val b=s.nextLine.split(" ")
val c=b.map(_.toDouble)
val e=c.map(_.toInt)
val(x,h,y,i,d)=(e(0),e(2),e(1),e(3),c(4))
val f=List(x,h)
val g=List(y,i)
val p=new java.awt.Polygon((f:::f.reverse).toArray,(g.map(_-e(4)):::g.reverse.map(_+e(4))).toArray,4)
var r=0
while(s.hasNext){
val row=s.nextLine
r+=a(p,x,y,h,i,d,row.split(" "))}
println(r)}

ungolfed:

object Earthquake extends App {

  def bowContains (h: Double, i: Double, x:Int, y:Int, d: Double) : Boolean = {
    (x-h)*(x-h) + (y-i)*(y-i) <= d*d
  }

  import java.awt._    

  def affected (polygon: Polygon, x:Int, y:Int, h: Int, i: Int, d: Double, row: Array[String]) : Int = {
    val w = row (0).toDouble 
    val j = row (1).toDouble 
    val population = row (2).toInt
    if (polygon.contains (w, j) || bowContains (j, w, x, y, d) || bowContains (j, w, i, h, d))
      population 
    else 0 
  }
  val sc = new java.util.Scanner (System.in)
  val line = sc.nextLine.split (" ")

  val li = line.map (_.toDouble)
  val ll = li.map (_.toInt)

  val (x, h, y, i, d) = (ll (0), ll (2), ll (1), ll (3), li(4))
  val xs = List (x, h)
  val ys = List (y, i)

  val polygon = new Polygon ((xs ::: xs.reverse).toArray, (ys.map (_ - ll(4)) ::: ys.reverse.map (_ + ll(4))).toArray, 4)
  var res = 0 
  while (sc.hasNext) {
    val row = sc.nextLine
    println ("line: " + line) 
    res += affected (polygon, x, y, h, i, d, row.split (" "))     
  } 
  println (res)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.