বাউল গাদা গণনা উচ্চতা


19

বাটি পাইল উচ্চতা

এই ধাঁধাটির লক্ষ্য হ'ল একটি বাটিগুলির একটি স্তরের উচ্চতা গণনা করা।

বাটি একটি স্ট্যাক

একটি বাটি বেধ ব্যতীত রেডিয়ালি প্রতিসম ডিভাইস হিসাবে সংজ্ঞায়িত হয়। এর সিলুয়েট আকৃতি একটি এমনকি বহুভুজ। স্ট্যাকটি রেডিয়ির একটি তালিকা দ্বারা বর্ণনা করা হয়েছে, প্রতিটি কো-এফিসিয়েন্টের তালিকা হিসাবে ইনপুট হিসাবে দেওয়া হয় এমনক একটি বহু বহুবর্ষের সাথে যুক্ত, (উদাহরণস্বরূপ তালিকাটি 3.1 4.2বহুপদী 3.1x2+4.2x4 )।

বহুবর্ষে স্বেচ্ছাসেবী ডিগ্রি থাকতে পারে। সরলতার জন্য, স্তূপের উচ্চতা শীর্ষ-বাটিটির কেন্দ্রের উচ্চতা হিসাবে সংজ্ঞায়িত করা হয়েছে (একটি উদাহরণের উদাহরণ 3 এর প্লট দেখুন)।

পরীক্ষার কেসগুলি বিন্যাসে রয়েছে radius:coeff1 coeff2 ...: প্রতিটি লাইনটি বাটিটির ব্যাসার্ধের প্রতিনিধিত্ব করে একটি ফ্লোট সংখ্যা দিয়ে শুরু হয়, তারপরে একটি কোলন এবং একটি স্পেস-বিভাজিত তালিকা এমনকি পাওয়ার 2 দিয়ে শুরু করে, এমনকি শক্তির জন্য সহগের সমন্বিত একটি স্পেস-বিভাজিত তালিকা হয় (শূন্য ধ্রুবক অংশ বোঝানো হয়) । উদাহরণস্বরূপ, লাইনটি 2.3:3.1 4.2একটি বাটি ব্যাসার্ধ 2.3এবং আকৃতি-বহুপদী বর্ণনা করে 3.1 * x^2 + 4.2 * x^4

উদাহরণ 1

42:3.141

একক বাটিতে কোনও উচ্চতা না থাকায় শূন্য উচ্চতার এক স্তূপ বর্ণনা করে।

উদাহরণ 2

1:1 2
1.2:5
1:3

উচ্চতার একটি গাদা বর্ণনা করে 2.0(প্লট দেখুন)।

তিনটি বাটি স্ট্যাকের প্লট

উদাহরণ 3

1:1.0
0.6:0.2
0.6:0.4
1.4:0.2
0.4:0 10

উচ্চতা 0.8 একটি গাদা বর্ণনা (প্লট সবুজ তীর দেখুন)।

তিনটি বাটি স্ট্যাকের প্লট

এটি কোড গল্ফ, তাই সংক্ষিপ্ততম কোডটি জয়ী।

আমার রেফারেন্স কোড আছে

সম্পাদনা:

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

<ε

এই ধাঁধার আর একটি বৈকল্পিক হ'ল বাটিগুলি পুনরায় সাজিয়ে উচ্চতা হ্রাস করা। আমি নিশ্চিত না একটি দ্রুত সমাধান আছে কিনা (আমার ধারণা এটি এনপি-হার্ড)। কারও কাছে যদি আরও ভাল ধারণা থাকে (বা এনপি-সম্পূর্ণতা প্রমাণ করতে পারে), দয়া করে আমাকে বলুন!


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
মেগো

আপনার রেফারেন্স কোডে, আমি বিশ্বাস করি যে এর শরীরের is_maximumউদাহরণ হওয়া উচিত return evaluate(differentiate(shape_0), root) > 0.0। বর্তমানে এটি dd(আকারের মধ্যে পার্থক্যের ডেরাইভেটিভ) ব্যবহার করে মূলটির মূল্যায়ন করে , যা সর্বদা 0 (শিকড়ের জন্য) ফিরে আসা উচিত। ভাসমান পয়েন্টের ত্রুটির কারণে ফলাফলটি মাঝে মাঝে 0 এর কাছাকাছি একটি ইতিবাচক মান হয় যার কারণে কোডটি বেশ কিছু সময় একটি সঠিক বা আরও নির্ভুল ফলাফল আউটপুট করে। যে ইনপুটটি 1:0.2, 1:0.1 0.2আউটপুট করা উচিত তা চেক করুন0.0125
অযথা

@ রিডানডেনসি এটি আসলে যাইহোক রিডানডেন্ট। সর্বাধিক y মান নির্বাচন করা হয়েছে এবং 0 সর্বদা তুলনার মানগুলিতে থাকবে।
নিক কেনেডি

2
উদাহরণস্বরূপ 3, চূড়ান্ত উচ্চতা হওয়া উচিত 0.801। চূড়ান্ত দুটি বাটি ব্যাসার্ধে স্পর্শ করে 0.1
অ্যাটিনিট

হ্যাঁ, আমি একই ফলাফল পেয়েছি।
জোয়েল

উত্তর:


6

জেলি , 54 53 বাইট

J×$ÆrAƑƇ«⁹;⁹*€J{ḋ⁸ŻṀ
Œcz€0ḢṂç@I0;ⱮFƲƲ€ṚṁL’R€Ɗ;+Ṁ¥¥ƒ0Ṁ

এটি অনলাইন চেষ্টা করুন!

একটি মোনাডিক লিঙ্ক যা তার আর্গুমেন্ট হিসাবে ফর্ম্যাটটিতে উপরে থেকে নীচে পর্যন্ত বাটিগুলির তালিকা নেয় এবং শীর্ষ বাটিটির নীচের [[b1_radius, b1_coef1, ...], [b2_radius, b2_coef1, ...]]অংশের y অবস্থান প্রদান করে।

এখন সঠিকভাবে বাটিগুলি পরিচালনা করে যা সর্বনিম্ন ব্যাসার্ধ বাদে অন্য জায়গায় দেখা যায়।

ব্যাখ্যা

সহায়ক লিঙ্ক: l1 থেকে উপরের দিকের বাটি উপস্থাপন করে বহুবচনগুলির সহগের পার্থক্যগুলি বাম আর্গুমেন্ট হিসাবে গ্রহণ করে এবং এর ডান যুক্তিটি rসর্বনিম্ন ব্যাসার্ধকে গ্রহণ করে; দুটি বাটি যেখানে মিলবে সর্বাধিক y মান প্রদান করে

  $                   | Following as a monad:
J                     | - Sequence from 1..<len(l)>
 ×                    | - Multiply (by l)
   Ær                 | Roots of polynomial
     AƑƇ              | Keep only those invariant when passed through absolute function (excludes negative, imaginary and complex numbers)
        «⁹            | Min of these filtered roots and r
          ;⁹          | Concatenate r to the list
            *€        | Each root/radius to the power of:
              J{      | - Sequence from 1..<len(l)>
                ḋ⁸    | Dot product with l
                  Ż   | Prepend zero
                   Ṁ  | Maximum

প্রধান লিঙ্কটি তার তর্ক হিসাবে একটি বাটি গাদা নেয় এবং শীর্ষ বাটির বেসের y মান প্রদান করে

Œc                               | Combinations length 2
  z€0                            | Transpose each using 0 as a filler
               Ʋ€                | For each one, do the following as a monad:
     Ḣ                           | - Take the head (the radii)     
      Ṃ                          | - Minimum
       ç@     Ʋ                  | - Call the helper link with this (min radius) as right argument and the following as left argument:
         I                       |   - Increments (difference between second and first polynomial for each coefficient)
          0;Ɱ                    |   - Prepend each with a zero (odd coefficients are all zero)
             F                   |   - Flatten
                 Ṛ               | Reverse
                  ṁ    Ɗ         | Mould to the following as a monad:
                   L             | Length
                    ’            | Decrease by 1
                     R€          | Range of each (e.g. [1],[1,2],[1,2,3],[1,2,3,4]
                            ¥ƒ0  | Reduce using the following as a dyad and starting with 0
                        ;  ¥     | - Concatenate the following as a dyad
                         +       |   - Add
                          Ṁ      |   - Take the maximum
                               Ṁ | Finally take the overall maximum

পাইথন রেফারেন্স

অবশেষে, পাইথন রেফারেন্সের একটি টিআইও সংস্করণ এখানে @ পাসবি মূল সমস্যাটির জন্য অন্তর্ভুক্ত রয়েছে। এটা স্টাডিন থেকে পড়ে।


1
আমি ভাষাটি মোটেই বুঝতে পারি না। ব্যাখ্যার ভিত্তিতে, দেখে মনে হচ্ছে আপনি কেবল প্রতিটি বাটি জোড়া (r1, p1)এবং (r2, p2)বিন্দুটি তুলনা করছেন min(r1, r2)? যদি তা হয় তবে এটি একটি ভুল সমাধান হতে পারে কারণ দুটি বাটি 0এবং এর মধ্যে স্পর্শ করতে পারে min(r1, r2))। আপনি এটি প্রয়োজন max(p1(x)-p2(x), 0)সমগ্র পরিসীমা উপর [0, min(r1, r2)]জন্য x। এই কারণেই @ পাসবির রেফারেন্স সলিউশন স্থানীয় সর্বাধিক সন্ধানের জন্য ডেরিভেটিভগুলি গণনা করে।
জোয়েল

@ জোয়েল এখনই স্থির হয়েছে। সমস্ত আসল পরীক্ষার কেস স্পর্শ করেছে min(r1, r2)। এটি এখন @ অ্যাটিনেটের অতিরিক্ত চ্যালেঞ্জ সমাধান করে
নিক কেনেডি

1
আপনার যদি সময় থাকে তবে গল্ফিংয়ের ভাষা সম্পর্কে যাদের জ্ঞান নেই তাদের জন্য কোডটির একটি মন্তব্য করা সংস্করণটি দেখে ভাল লাগবে।
জোয়েল

আমি সময় পেলে জোয়েল এই কাজটি করবে
নিক কেনেডি

2

পাইথন 3 + নম্পি + স্কিপি, 248 240 বাইট

from scipy.optimize import*
from numpy import*
def f(b,i=0):
 for r,c in b:p=zeros(2*len(c)+1);p[-3::-2]=c;p[-1]=h=max([0,*(-fminbound(lambda x:polyval(polysub(p,d),x),0,min(s,r),full_output=1)[1]for s,d in b[:i])]);b[i][1]=p;i+=1
 return h

এটি অনলাইন চেষ্টা করুন!

-8 বাইট @xnor ধন্যবাদ

ফাংশনটি [radius, polynomial]ইনপুট হিসাবে জোড়াগুলির তালিকা নেয় এবং স্তূপের উচ্চতা প্রদান করে।

এই দ্রষ্টব্যটি রেফারেন্স কোড হিসাবে কম-বেশি একই অ্যালগরিদম ব্যবহার করে ব্যতীত এটি ডেরিভেটিভস ব্যবহার করে সর্বাধিক গণনা করে না। ইতিমধ্যে পাইথনে অন্তর্নির্মিত numpyএবং scipyফাংশনগুলি ব্যবহার করে এটি লেখা হয়েছে। নিরবচ্ছিন্ন সংস্করণটি নীচে দেখানো হয়েছে। যারা এই ধারণাটি দ্রুত ক্যাপচার করতে চান তাদের সংক্ষিপ্ত সংস্করণ চান তাদের জন্য এটি রেফারেন্স কোডের বিকল্প সংস্করণ হিসাবে কাজ করে।

from scipy.optimize import fminbound
import numpy as np

def compute_pile_height(bowl_data):
    for i, (r, curve) in enumerate(bowl_data):
        distances = [0]  # Initialize the distances array with 0 as the lower bound for max
        # Construct a complete polynominal coefficient array
        curve_poly = np.zeros(2 * len(curve) + 1)
        curve_poly[-3::-2] = curve
        
        # Iterate over all bowls under the current bowl
        for j in range(i):
            b_r, b_curve_poly = bowl_data[j]

            # Calculate the difference polynominal between the current bowl and bowl j
            diff = np.polysub(curve_poly, b_curve_poly)

            # Find the maximum height difference between bowl j and the current bowl in the range [0, min(b_r, r)]
            max_height_diff = -fminbound(lambda x:np.polyval(diff, x), 0, min(b_r, r), full_output=True)[1]
            distances.append(max_height_diff)

        # Compute the maximum distance as the height for the current bowl, 
        # update the polynominal using the height as the constant coefficient
        curve_poly[-1] = height = max(distances)

        # Update stored data for the current bowl
        bowl_data[i][1] = curve_poly
    return height

এটি অনলাইন চেষ্টা করুন!


হোয়াইটস্পেসে বাঁচাতে, আপনি সম্পূর্ণরূপে কোলনের পরে তার লাইনে লুপের জন্য রাখতে পারেন এবং optionচ্ছিক i=0যুক্তি হিসাবে রাখতে পারেন।
এক্সনোর

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

প্রযুক্তিগতভাবে এটি শিরোনামে পাইথন 3 + নম্পি + সিম্পি হিসাবে বর্ণনা করা উচিত কারণ পাইথন 3 ইনস্টল বেসের অংশ নয়।
নিক কেনেডি

@ নিক কেনেডি ধন্যবাদ বিবরণ আপডেট হয়েছে।
জোয়েল

1

ওল্ফ্রাম ভাষা (গণিত) , 104 93 বাইট

FoldPair[{(R=#;F=#2)&@@#2;H=Max[0,{#2-F,0<x<#~Min~R}~MaxValue~x&@@@#],#~Join~{R|H+F}}&,{},#]&

এটি অনলাইন চেষ্টা করুন!

{radius, polynomial}x

প্রতীকী আউটপুট পরিবর্তে দশমিকের জন্য, NMaxValueপরিবর্তে ব্যবহার করুন (বা কেবল Nফলাফলটি কল করুন)।

(* Step through a list of bowls: *)
(* At each step, calls a function taking {previous-bowls-list},current-bowl *)
(*  which returns {height,{bowls-list}} *)
(* and returns the final height *)
FoldPair[
  (R=#;F=#2)&@@#2;          (*  extract Radius and Function*)
  {
    H=Max[0,                (*  Height - at least zero; the greatest of *)
      MaxValue[{#2-F,       (*   the required heights *)
          0<x<#~Min~R},x]   (*     within the relevant domain *)
      &@@@#]                (*   given all previous bowls *)
  ,
    #~Join~{R|H+F}          (*   append to list of bowls *)
  }&,
  {},                       (* initial list of bowls (empty) *)
  #                         (* list of bowls *)
]&

1

আর , 451 436 বাইট

function(x){x=c(x[1],x);a=rev(pmax(0,c(combn(x,2,function(y,z=sapply(y,"length<-",max(lengths(y)))){z[is.na(z)]=0
b=rep(0,2*(n=nrow(z)-1))
b[2*1:n]=e=z[-1,2]-z[-1,1]
b=b*1:(2*n)
while(!c(b,1)[1])b=b[-1]
b=rev(b)
s=`if`(length(b)>1,eigen(rbind(-(b/b[1])[-1],cbind(diag(length(b)-2),0)))$va,0)
max(outer(c(pmin(abs(s[s==abs(s)]),r<-min(z[1,])),r),2*1:n,`^`)%*%e)}))))
o={}
for(i in seq(a=x[-1])){o=c(o,max(c(0,o)+a[1:i+F]));F=F+i}
max(o)}

এটি অনলাইন চেষ্টা করুন!

এটি অনলাইন চেষ্টা করুন!

আমার জেলির উত্তরের একটি আর বন্দরকে স্পষ্টভাবে বলছি, যেহেতু বেস আর এর বহুবচনগুলির শিকড় খুঁজে বের করার কোনও কার্যকারিতা নেই তবে এটি পাওয়া পদ্ধতিটি ব্যবহার করে এটি প্রয়োগ করা হয় polynom::solve.polynomial

স্তূপের শীর্ষ থেকে নীচে সংখ্যক ভেক্টরগুলির একটি তালিকা গ্রহণ করা একটি ক্রিয়া।

15 বাইট বন্ধ করে গল্ফ করার জন্য @ রবিনরাইডারকে ধন্যবাদ!


এখানে যা চলছে তা আমি বুঝতে পারি না (ব্যাখ্যাটি দুর্দান্ত হবে!) তবে এখানে একটি 436 বাইট সংস্করণ রয়েছে
রবিন রাইডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.