টেট্রহেড্রন সারফেস এরিয়া


16

চ্যালেঞ্জ

এই চ্যালেঞ্জটি খুব সোজা is চার ত্রি-মাত্রিক পয়েন্ট দেওয়া, তারা যে টিটারহেড্রন গঠন করে তার পৃষ্ঠের ক্ষেত্রফল গণনা করুন। এটি , তাই সংক্ষিপ্ততম কোড জয়ী। স্ট্যান্ডার্ড লুফোলগুলি প্রয়োগ করা হয়, যুক্ত শর্তের সাথে যে চারটি পয়েন্ট দেওয়া এই কাজটি করার জন্য কোনও বিল্ট-ইন ফাংশন নিষিদ্ধ।

আপনি ধরে নিতে পারেন যে চারটি পয়েন্ট পৃথক হবে এবং স্টাডিনের মাধ্যমে দেওয়া হবে, প্রতি লাইনে 1 পয়েন্ট। প্রতিটি পয়েন্টে তিনটি 16-বিট স্বাক্ষরযুক্ত পূর্ণসংখ্যার সমন্বয় করা হবে। প্রতিটি পয়েন্টের সঠিক ফর্ম্যাটটি পরিবর্তন করা যেতে পারে যদি এটি জিনিসগুলিকে আরও সহজ করে তোলে যেমন তিনটি স্থান পৃথক পূর্ণসংখ্যার হিসাবে। প্রতিটি পয়েন্ট পৃথক লাইনে থাকা বাধ্যতামূলক। আউটপুটটি STDOUT এর মাধ্যমে কমপক্ষে 2 দশমিক জায়গায় হওয়া উচিত।

আপনারা যারা জানেন না তাদের জন্য একটি টেট্রহেড্রন একটি 3-ডি সলিড, 4 টি ত্রিভুজাকার মুখ দ্বারা গঠিত।

উদাহরণ

# input (format is up to you, see clarification above)
[23822, 47484, 57901]
[3305, 23847, 42159]
[19804, 11366, 14013]
[52278, 28626, 52757]

# output
2932496435.95

আপনি যদি আমার গণিতটি ভুল বলে মনে করেন তবে দয়া করে একটি নোট রেখে দিন।


@ বেটাডেকে না, ধারণা এই যে তারা এসটিডিআইএন এর মাধ্যমে চারটি পৃথক লাইনে ইনপুট হবে। এটি পরিষ্কার করতে আমি প্রশ্নটি সম্পাদনা করব।
স্তম্ভিত

ইনপুট একটি হতে পারে [[list],[of],[lists]]?
ফোসগেন

@ ফসজিন আমি ভাবতে চাই ইনপুটটি পড়া চ্যালেঞ্জের অংশ, তাই আমি না বলব going আমি ভবিষ্যতের চ্যালেঞ্জগুলিতে ইনপুট স্পেসিফিকেশনগুলির সাথে আরও হালকা হওয়ার চেষ্টা করব।
stokastic

এটি কি নিয়মিত বা অনিয়মিত টেট্রহেড্রন?
জেমস উইলিয়ামস

@ জেমস উইলিয়ামস পোস্ট করা উদাহরণটি অনিয়মিত। আপনার প্রোগ্রামের নিয়মিত টেট্রেহেড্রন সহ যেকোন ইনপুট হ্যান্ডেল করা উচিত।
স্তম্ভিত

উত্তর:


5

পাইথন, 198 178 161 অক্ষর

V=eval('input(),'*4)
A=0
for i in range(4):F=V[:i]+V[i+1:];a,b,c=map(lambda e:sum((a-b)**2for a,b in zip(*e)),zip(F,F[1:]+F));A+=(4*a*b-(a+b-c)**2)**.5
print A/4

ইনপুট ফর্ম্যাট হিসাবে প্রশ্নে দেওয়া আছে।

এটি প্রতিটি মুখের সাথে সংলগ্ন প্রান্তগুলির দৈর্ঘ্য গণনা করে এবং তারপরে হেরনের সূত্র ব্যবহার করে ।


4

মতলব / অক্টোব 103

আমি মানগুলি ভেরিয়েবলে সংরক্ষণ করার জন্য ধরে নিই c। এটি এই সত্যটি ব্যবহার করে যে ত্রিভুজের ক্ষেত্রফলটি তার দুটি পাশের ভেক্টরের ক্রস প্রোডাক্টের অর্ধ দৈর্ঘ্য।

%input
[23822, 47484, 57901;
3305, 23847, 42159;
19804, 11366, 14013;
52278, 28626, 52757]



%actual code
c=input('');
a=0;
for i=1:4;
    d=c;d(i,:)=[];
    d=d(1:2,:)-[1 1]'*d(3,:);
    a=a+norm(cross(d(1,:),d(2,:)))/2;
end
a

প্রতিটি পয়েন্টকে স্ট্যান্ডার্ড ইনপুট হিসাবে পৃথক লাইনে প্রবেশ করতে হবে।
ডেভিডসি

আমি প্রথম ভেবেছিলাম মতলব-তে স্ট্যান্ডার্ড ইনপুট জাতীয় কোনও জিনিস নেই, তবে আমি একটি ফাংশন আবিষ্কার করেছি যা কমান্ড উইন্ডো দিয়ে এটি অনুকরণ করতে ব্যবহার করা যেতে পারে, তাই এখন আপনি অন্যান্য ভাষায় যেমন করতে পারেন তেমন ইনপুটটি পাস করতে পারেন।
flawr

মজাদার. ম্যাথমেটিকা ​​যে একই কমান্ডটি ব্যবহার করেছেন,Input[]
ডেভিডসি

আপনি কেন এটি আকর্ষণীয় বলে মনে করেন? 'ইনপুট' আমার কাছে মনে হয় এটি এমন কোনও ফাংশনের সুন্দর জেনেরিক নামের মতো।
flawr

গতকাল পর্যন্ত, আমি সত্যিই বুঝতে পারে না কি "স্ট্যান্ডার্ড ইনপুট" বোঝানো, এবং আমি যে ম্যাথামেটিকাল "মান" ইনপুট আছে না, যদিও আমি নিয়মিত ব্যবহার করেছিল Input[], InputString[], Import[], এবং ImportString[]
ডেভিডসি

4

এপিএল, 59

f←{+.×⍨⊃1 2-.⌽(⊂⍵)×1 2⌽¨⊂⍺}
.5×.5+.*⍨(f/2-/x),2f/4⍴x←⎕⎕⎕-⊂⎕

ক্রস পণ্য গণনা করে কাজ করে

ব্যাখ্যা
প্রথম লাইনটি একটি ফাংশন সংজ্ঞায়িত করে যা দুটি আর্গুমেন্ট গ্রহণ করে (ফলস্বরূপ নামকরণ এবং ), স্পষ্টতই তাদের দৈর্ঘ্য 3 এর সংখ্যাসূচক অ্যারে হিসাবে প্রত্যাশা করে, 3 ডি ভেক্টর হিসাবে গণ্য করে এবং স্কোয়ার গণনা করে তাদের ক্রস পণ্যটির দৈর্ঘ্য ।

                        ⊂⍺   # Wrap the argument in a scalar
                   1 2⌽¨     # Create an array of 2 arrays, by rotating `⊂⍺` by 1 and 2 places
             (⊂⍵)×           # Coordinate-wise multiply each of them with the other argument
        1 2-.⌽               # This is a shorthand for:
        1 2  ⌽               #   Rotate the first array item by 1 and the second by 2
           -.                #   Then subtract the second from the first, coordinate-wise
       ⊃                     # Unwrap the resulting scalar to get the (sorta) cross product
   +.×                       # Calculate the dot product of that...
      ⍨                      # ...with itself
f←{+.×⍨⊃1 2-.⌽(⊂⍵)×1 2⌽¨⊂⍺} # Assign function to `f`

দ্বিতীয় লাইন বাকি আছে।

                         ⎕⎕⎕-⊂⎕ # Take 4 array inputs, create an array of arrays by subtracting one of them from the other 3
                       x←        # Assign that to x
                     4⍴          # Duplicate the first item and append to the end
                  2f/            # Apply f to each consecutive pair
            2-/x                 # Apply subtraction to consecutive pairs in x
          f/                     # Apply f to the 2 resulting arrays
         (f/2-/x),2f/4⍴x←⎕⎕⎕-⊂⎕ # Concatenate to an array of 4 squared cross products
   .5+.*⍨                        # Again a shorthand for:
   .5  *⍨                        #   Take square root of each element (by raising to 0.5)
     +.                          #   And sum the results
.5×                              # Finally, divide by 2 to get the answer

আপনি যদি নিশ্চিত হন না যে এটি হায়ারোগ্লিফস বা কোনও দূষিত dll ফাইল কিনা এটি সম্ভবত এপিএল হতে চলেছে। এই চিহ্নগুলির মধ্যে কিছু কী আপনি সম্ভবত কিছুটা ব্যাখ্যা করতে পারেন? এটি যে আমি এটি শিখতে চাই তা নয় তবে আপনি এখনও
এইগুলি

@ ফ্লোয়ার আমি সাধারণত এটি করি কারণ এপিএলে গল্ফিং বেশিরভাগই অ্যালগরিদম ডিজাইনে নেমে আসে এবং সম্ভবত সমস্যার কোনও অস্বাভাবিক পদ্ধতির ফলস্বরূপ। তবে আমার মনে হয়েছে "ক্রস প্রোডাক্ট গণনা করা" এখানে অ্যালগরিদম সম্পর্কে যথেষ্ট বোঝায় ve আপনি যদি একটি পূর্ণ-অনুলিপি চান তবে আমি এটি পরে করব।
টুইনাইট

ক্রস পণ্য গণনা করার ধারণাটি স্পষ্ট ছিল, তবে কোডটি নিজেই আমাকে কোনও ক্লু ছাড়াই ছেড়ে দেয়, তাই আমি কোডের কিছু অংশ দুর্দান্ত কী করবে সে সম্পর্কে আমি কয়েকটি শব্দ ভেবেছিলাম তবে অবশ্যই আমি আপনাকে অনুরোধ করতে চাই না বিস্তারিত ব্যাখ্যা লিখুন!
flawr

3

পাইথন 3, 308 298 292 279 258 254

from itertools import*
def a(t,u,v):w=(t+u+v)/2;return(w*(w-t)*(w-u)*(w-v))**.5
z,x,c,v,b,n=((lambda i,j:(sum((i[x]-j[x])**2for x in[0,1,2]))**.5)(x[0],x[1])for*x,in combinations([eval(input())for i in">"*4],2))
print(a(z,x,v)+a(z,c,b)+a(b,v,n)+a(x,c,n))

এটি ব্যবহার করে:

  • পাইথাগোরিয়ান উপপাদ্য (3 ডি তে) প্রতিটি লাইনের দৈর্ঘ্যের জন্য কাজ করতে
  • প্রতিটি ত্রিভুজের ক্ষেত্রফল নিয়ে কাজ করতে হেরনের সূত্র

1
আমার সমাধানটি পরীক্ষা করার জন্য আমি একই পদ্ধতি ব্যবহার করেছি। আমাকে আমার গল্ফ করার চেষ্টা করতে হবে এবং এটি পরে পোস্ট করতে হবে।
stukistic

1
আপনার for i in">"*4চালাক
3:55

আপনি আপনার পরিসীমা ফাংশনে লেন (i) ব্যবহার না করে 3 টি দৈর্ঘ্যের হার্ড কোড করতে পারেন।
stokastic

1
আপনি স্কোয়ার রুটের x**0.5পরিবর্তে আরও কয়েকটি অক্ষর সংরক্ষণ করতে পারেন math.sqrt(x)
স্নোরফলোরপাগাস

1
আপনি নির্বাণ দুটি বাইট সংরক্ষণ করতে পারবেন def a(t,u,v)তাই মত এক লাইনে: def a(t,u,v):w=(t+u+v)/2;return(w*(w-t)*(w-u)*(w-v))**0.5
বিটা ক্ষয়

2

গণিত 168 154

এটি টেটারহেড্রনের প্রান্তগুলির দৈর্ঘ্যগুলি সন্ধান করে এবং মুখের অঞ্চলগুলি নির্ধারণ করতে হেরনের সূত্র ব্যবহার করে।

t = Subsets; p = Table[Input[], {4}];
f@{a_, b_, c_} := Module[{s = (a + b + c)/2}, N[Sqrt[s (s - #) (s - #2) (s -#3)] &[a, b, c], 25]]
  Tr[f /@ (EuclideanDistance @@@ t[#, {2}] & /@ t[p, {3}])]

আরও একটি সরাসরি রুট রয়েছে যার জন্য কেবলমাত্র 60 টি অক্ষর প্রয়োজন , তবে এটি অন্তর্নির্মিত ফাংশনটির সাথে প্রতিটি মুখের ক্ষেত্রটি গণনা করার কারণে এটি বিধিগুলি লঙ্ঘন করে Area:

p = Table[Input[], {4}];
N[Tr[Area /@ Polygon /@ Subsets[p, {3}]], 25]


0

পাইথন - 260

আমি নিশ্চিত না যে আপনার নিজের প্রশ্নের উত্তর পোস্ট করার শিষ্টাচারটি কী, তবে সে আমার সমাধান, যা আমি আমার উদাহরণ যাচাই করতে ব্যবহার করতাম, গল্ফড:

import copy,math
P=[input()for i in"1234"]
def e(a, b):return math.sqrt(sum([(b[i]-a[i])**2 for i in range(3)]))
o=0
for j in range(4):p=copy.copy(P);p.pop(j);a,b,c=[e(p[i],p[(i+1)%3])for i in range(3)];s=(a+b+c)/2;A=math.sqrt(s*(s-a)*(s-b)*(s-c));o+=A
print o

এটি লরেন্সভের মতো একই পদ্ধতি ব্যবহার করে।


4
থাম্বের নিয়ম হিসাবে, দর্শকদের অনুপ্রেরণাকে শীতল না করার জন্য আপনার নিজের প্রশ্নের উত্তর দেওয়ার আগে কয়েক দিন অপেক্ষা করা সেরা ধারণা।
ব্ল্যাকহোল 21

কয়েকটি টিপস: আপনি কিছু অক্ষর দ্বারা সংরক্ষণ করতে পারেন r=rangelambdaতুলনায় খাটো defmath.sqrtদ্বারা প্রতিস্থাপন করা যেতে পারে (…)**.5p=copy.copy(P);p.pop(j);সংক্ষিপ্ত করা যেতে পারে p=P[:j-1]+P[j:]Aশুধুমাত্র একবার ব্যবহার করা হয়।
Wrzlprmft

0

সি, 303

অপ্রয়োজনীয় সাদা স্থান বাদে। তবে, এখানে এখনও অনেক গল্ফ করা হবে (আমি ফিরে আসার চেষ্টা করব এবং পরে এটি করব)) আমি প্রথমবারের মতো একটি forলুপ ঘোষণা করেছি#define । এর আগে আমি সর্বদা লুপের সংখ্যা হ্রাস করার উপায় খুঁজে পেয়েছি।

আমি থেকে পরিবর্তন করতে হয়েছে floatথেকে doubleপরীক্ষা ক্ষেত্রে জন্য ওপি হিসাবে একই উত্তর পেতে। এর আগে, এটি ছিল 300 টি বৃত্তাকার।

scanf আপনার ইনপুটটি ফাঁকা জায়গা বা নিউলাইনগুলির সাথে পৃথক করে কিনা একই কাজ করে, তাই আপনি এটিকে আপনার পছন্দ মতো আরও কয়েকটি বা কয়েকটি লাইনে ফর্ম্যাট করতে পারেন।

#define F ;for(i=0;i<12;i++)
#define D(k) (q[i]-q[(i+k)%12])
double q[12],r[12],s[4],p,n;

main(i){
  F scanf("%lf",&q[i])
  F r[i/3*3]+=D(3)*D(3),r[i/3*3+1]+=D(6)*D(6)
  F r[i]=sqrt(r[i])
  F i%3||(s[i/3]=r[(i+3)%12]/2),s[i/3]+=r[i]/2
  F i%3||(p=s[i/3]-r[(i+3)%12]),p*=s[i/3]-r[i],n+=(i%3>1)*sqrt(p)   
  ;printf("%lf",n);       
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.